On Nov 13, 2014, at 12:44 PM, Sébastien de Menten <sdemen...@gmail.com> wrote:

> 
> On 2014-11-13 19:25, John Ralls wrote:
>> On Nov 13, 2014, at 9:31 AM, Sébastien de Menten <sdemen...@gmail.com> wrote:
>> 
>>> Indeed, it may be worth to explain what are the goals (and the limits).
>>> 
>>> I have tried to use the official python bindings and had the following 
>>> issues:
>>> - need swig + compilations to make them work => pyscash is pure python and 
>>> has only sqlalchemy as main dependency (which is rather supported/standard 
>>> package)
>>> - python binding is a mapping if C API with a thin layer python friendly 
>>> layer => I do not find the resulting python scripts very pythonic
>>> 
>>> [...]
>>> So, to sum up, goals of pyscash :
>>> - easy installation as pure python module (no compilation, no swig, ...)
>>> - easy to contribute as pure python and based on de facto standard ORM for 
>>> SQL in python (sql alchemy)
>>> - pythonic implementation by leveraging SQL Alchemy features (transparent 
>>> handling of guid, free commit/rollback/transaction support, automatic 
>>> parent-children relation handling, etc)
>>> - pythonic interface for CRUD operations on a GnuCash Book
>>> 
>>> The last point is important as the goal is not at all to reimplement the 
>>> whole GnuCash engine but only to be able to manipulate (CRUD operations) 
>>> the different GnuCash entities (book, account, currency, etc) in an easy 
>>> pythonic way.
>>> For instance, I do not plan to reimplement functions like GetBalance, 
>>> GetReconciledBalance, GetPresentBalanceInCurrency, GetAccountBalance, etc
>>> 
>>> Is the goal of the project clearer ?
>>> Do you see complexities in reimplementing the pure CRUD operations (except 
>>> the basic complexities of leaving a GnuCash book in a consistent status) ?
>>> 
>>> On the name issue, you are definitely right ! I had in mind a pie-ess-cash 
>>> pronounciation (the S for SQL) as pygnucash was already taken. Any 
>>> suggestion ? pysacash (python sqlalchemy gnucash interface) ? or is it even 
>>> worse :-) ?
>>> 
>>> kind regards,
>>> 
>>> Sebastien
>>> 
>>> ps: and thank you for clarifying the announce on the user mailing list ! I 
>>> should have thought about that myself to avoid confusion…
>> Sébastien,
>> 
>> Please remember to copy the list on all replies.
>> 
>> The goal of the project is clearer but is in my mind severely misguided. 
>> Object persistence is always a side effect of a non-trivial program, and 
>> GnuCash is a non-trivial program.
> If you see GnuCash from the (limited) perspective of an editor for a Book 
> document (as LibreOffice Writer is an editor for a ODT document), object 
> persistence is central. And luckily we have both a very clean and well 
> designed object model in GnuCash as well as standard persistence formats 
> (xml, SQL  and not an obscure binary format).

I don’t share either opinion, especially about the object model in GnuCash. 

> 
> The GnuCash documentation states that the XML document can be used to get the 
> GnuCash data in whatever other format (see "Converting XML GnuCash File" 
> http://www.gnucash.org/docs/v2.6/C/gnucash-guide/appendixa_xmlconvert1.html) 
> through XLST transformation and vice-versa (so generating a new/transformed 
> gnucash XML file from a LibreOffice spreadsheet).

No matter what the GnuCash documentation might say, only someone with a deep 
understanding of GnuCash could successfully create a correct GnuCash data file 
from a spreadsheet document using XSLT. I’m not familiar with LibreOffice’s ODS 
format, but I expect that it would take deep knowledge of that format to 
successfully extract useful data from it with XSLT as well.

> 
> PieCash (I like your name !) aims to fulfill exactly this purpose, no more, 
> no less. As with the XLST transforms, it allows to do CRUD operations on the 
> objects within a GnuCash Book.

CRUD operations on a GnuCash database will corrupt it. The GnuCash schema is 
not normalized, and not all of the necessary data is stored in the table 
associated with the objects.

> 
> Has this stance on the manipulation outside GnuCash of a GnuCash document 
> evolved since it was written ? Would this still be supported after the C++ 
> rewrite ?

It isn’t supported now. It never has, and it is unlikely that it ever will be, 
even if we are able, after several development cycles, to actually migrate to a 
3N database schema. There is too much logic that is encoded in the program and 
which cannot be portably encoded in a SQL database, to make that feasible.

>>  your complaint about the python bindings is that they’re not pythonic I 
>> think that your efforts would be better spent improving that. It should 
>> become easier as we progress through the C++ rewrite which will produce a 
>> much more object-oriented architecture where that’s appropriate. That said, 
>> it’s also worth noting that C++ is a far more versatile language than either 
>> C or Python in that it supports generic and functional programming as well 
>> as the structured and OO paradigms that Python supports. In moving away from 
>> GObject we’ll also be enforcing type safety much more rigorously. Since 
>> that’s a notorious weakness (though casual hackers think it’s a feature) of 
>> Python, having thin Python wrappers around C++ objects will provide for much 
>> safer Python add ons than does the current code base.
> The python binding are not pure python bindings (and will probably never be 
> as they should interface C or C++ code). This makes them not easily 
> accessible on Windows platforms (complexity in compilation) and more complex 
> to hack (for non C/C++ programmers). However, they offer the ability to call 
> any function of the engine and to be independent of the backend (XML, 
> SQL,...) as long as it is interfaced so may be the only solution in some 
> cases.
> 
> On the other side, PieCash is pure python. The code required to interface an 
> entity is almost trivial. For instance, the full interface to the Commodity 
> entity is
> 
>    class Commodity(DeclarativeBaseGuid):
>        __tablename__ = 'commodities'
>        __table_args__ = {}
> 
>        # column definitions
>        cusip = Column('cusip', TEXT(length=2048))
>        fraction = Column('fraction', INTEGER(), nullable=False)
>        fullname = Column('fullname', TEXT(length=2048))
>        mnemonic = Column('mnemonic', TEXT(length=2048), nullable=False)
>        namespace = Column('namespace', TEXT(length=2048), nullable=False)
>        quote_flag = Column('quote_flag', INTEGER(), nullable=False)
>        quote_source = Column('quote_source', TEXT(length=2048))
>        quote_tz = Column('quote_tz', TEXT(length=2048))
> 
> All the rest is handled automatically thanks to the SQLAlchemy layer (link 
> between objects, cascade delete, locking and transactions, generation of GUID 
> key, …).

Won’t work. SQLAlchemy can’t automatically generate a correct class from the 
schema nor can it derive a correct table description from the C headers.

You’ll get closer working with the XML schema. There’s a reasonably up-to-date 
version in src/doc/xml/gnucash-v2.rnc.

> 
> So, I admit, the main effort in this project consisted in writing for each 
> entity (book, account, etc) the equivalent here above code as well as the 
> relationships between entities. The later is done with a syntax like
> 
>    class Split(DeclarativeBaseGuid):
>        [...]
>        account = relation('Account', backref=backref('splits', cascade='all, 
> delete-orphan'))
> 
> 
>> It’s also very dangerous to attempt to select what parts of GnuCash’s 
>> internal functions to reimplement. To take your example of balances, it’s an 
>> integral part of GnuCash’s internal checks to compute and compare balances. 
>> Leaving that out greatly increases the risk of introducing corrupt data.
> I may have not be totally clear in my previous email but I do not indeed see 
> any common sense in implementing the Balance calculations in PieCash. These 
> results are part of the GnuCash application logic and are not saved in the 
> GnuCash XML/SQL files. They are neither part of the object model itself but 
> transient calculations.

You’re confusing the object model with the persistence model. They’re rather 
different.

Regards,
John Ralls



_______________________________________________
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel

Reply via email to