{ "info": { "author": "Cyril MORISSE", "author_email": "cmorisse@boxes3.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python", "Topic :: Text Processing :: Markup :: SGML" ], "description": "Detailed Documentation\n######################\n\n===============\nEDOFX Framework\n===============\n\nEDOFX is a python framework / DSL to manipulate OFX **Version 1** files.\n\nEDOFX has no dependencies other than Python standard library. \n\nEDOFX has been tested with python 2.5 to 2.7. \n\nPython 3 is not supported yet.\n\n--------------------\nContent of this file\n--------------------\n\n- Licence\n- Installation\n- Usage\n - Parse an OFX file or string\n - Inspect and manipulate OFX file\n * Navigate OFX tree\n * [[Home|Iterators]] \n * Indexers\n * Delete Nodes\n * Modify Nodes\n\n - OFX tree display and export\n\n- Package Description\n - edofx.py \n * OFXNode\n * OFXParser\n * OFXObfuscator\n - edofx_integration.py\n - test directory description\n\nLicense\n=======\n\nEDOFX is licensed under MIT License. See LICENCE.txt\n\nInstallation\n============\n\nFrom pypi\n---------\n\nUse pip or easy_install:\n\n::\n\n $ pip install inouk.edofx \n or\n $ easy_install inouk.edofx \n\nFrom source\n-----------\n\nGit clone from the official repository then install with:\n\n::\n\n python setup.py install\n\n \n\nUsage\n=====\n\nParse an OFX file or string\n---------------------------\n\nTo experiment, create a virtualenv, install inouk.edofx then launch python and use:\n\n>>> from inouk import edofx\n>>> f = open('test/fixtures/multi_account_file.ofx', 'U') # Files must be opened using 'U' mode as the parser do not manage \\r\\n EOL\n>>> OFX = edofx.OFXParser(f.read()).parse()\n>>> OFX\n...\n\nOFX now contains an OFXNode's tree representation of test/fixtures/multi_account_file.ofx.\n\nInspect and manipulate the OFX tree\n-----------------------------------\n\n**To navigate OFX tree, use :**\n\n>>> OFX.children \n[..., ..., ...]\n>>> OFX.SIGNONMSGSRSV1.children\n[...]\n>>> OFX.SIGNONMSGSRSV1.SONRS.children\n[..., 20100305094649, FRA]\n>>> OFX.SIGNONMSGSRSV1.SONRS.DTSERVER\n20100305094649\n>>> OFX.SIGNONMSGSRSV1.SONRS.DTSERVER.value\n'20100305094649' # This is the raw value as a string\n>>> OFX.SIGNONMSGSRSV1.SONRS.DTSERVER.val # returns date or float when appropriate \ndatetime.date(2010, 3, 5)\n\n**Iterators are ok:**\n\n>>> # To list account numbers present in file \n>>> for account in OFX.BANKMSGSRSV1.STMTTRNRS:\n... print 'account #', account.TRNUID.val\n... \naccount # 34995678052\naccount # 85576218690\naccount # 44498008728\naccount # 42025380697\naccount # 62631064788\n\n**Indexers are ok:**\n\n>>> OFX.BANKMSGSRSV1.STMTTRNRS[2].TRNUID.val\n'44498008728'\n>>> len(OFX.BANKMSGSRSV1.STMTTRNRS)\n5\n\n**Modify nodes**\n\n*To delete nodes:*\n\n>>> OFX.children\n[..., ..., ...]\n>>> del OFX.CREDITCARDMSGSRSV1 # Warning does not work (yet) on indexed items\n>>> OFX.children\n[..., ...]\n\n*To modify nodes:*\n\nFor that purpose, you must let '.value' with a string. \nNote that '.val' attribute is not ( yet ) writable. \n\n>>> OFX.SIGNONMSGSRSV1.SONRS.LANGUAGE\nFRA\n>>> OFX.SIGNONMSGSRSV1.SONRS.LANGUAGE.value = 'Italian'\n>>> OFX.SIGNONMSGSRSV1.SONRS.LANGUAGE\nItalian\n>>> \n\n*To alter Tree structure:*\n\n>>> OFX.SIGNONMSGSRSV1.SONRS.children.append(edofx.OFXNode(name='COLOR', value='blue')) # insert is ok too\n>>> OFX.SIGNONMSGSRSV1.SONRS.children\n[..., 20100305094649, Italian, blue]\n\n\nOFX tree display and export\n---------------------------\n\nOFXNode supports 3 output / dump formats :\n\n* OFX ; to re-export as OFX after tree/nodes modifications\n* XML ; easier to read\n* Obfuscated ; re-export as OFX with all sensitive information jammed. \n\n**Important information**: Nodes 'ACCTTYPE', 'CODE', 'STATUS', 'SEVERITY', 'LANGUAGE', 'CURDEF', 'TRNTYPE' are not obfuscated.\n\nExamples\n........\n\n>>> print OFX.ofx_repr()\n\n\n\n\n0\nINFO\n\n20100305094649\nItalian\nblue\n\n...\n\n>>> print OFX.obfuscated_ofx_repr()\n\n\n\n\n0\nINFO\n\n20100305094649\nItalian\nBHVB\n\n\n>>> print OFX.xml_repr()\n\n \n \n \n 0\n INFO\n \n 20100305094649\n XXL\n Italian\n blue\n \n\n\nOFX Headers\n...........\n\nOFX Headers are available as a dict.\n\n\nHeaders can be parsed in two ways:\n\n* if the parse() has been called, they can be retrieved using attribute OFX_headers of the parser object.\n* OFXParser can de asked to parse only the headers (not the content) with the parse_headers() method (Cf. tests 7,8 and 9 of test_01_parser.py for an example).\n\nPackage description\n===================\n\nThis package contains :\n\n* edofx/__init__.py ; the framework\n* tests ; contains Python unit-test classes\n - edofx_integration.py ; an example demonstrating how to parse an OFX source into specific classes.\n\n\nedofx/__init__.py\n-----------------\n\nThe framework by itself is structured in 3 classes:\n\n* OFXNode\n* OFXParser\n* OFXObfuscator\n\nUse python help for method level description. (Even if I'm slightly optimistic about the python help content quality...)\n\nOFXNode\n-------\n\nOFXNode is used to store parsed OFX sources.\n\nOFXParser\n---------\n\nOFXParser builds OFXNode tree from a string containing some OFX content.\n\nOFXObfuscator\n-------------\n\nOFXObfuscator is a naive obfuscator based on lexical analysis. \nOFXObfuscator is able to obfuscate OFX sources OFXParser has been unable to parse. \nUse this if you want to sent me some OFX files that OFXParser fails to process.\n\ntests\n-----\n\nThere you will find 3 examples and some unittests:\n\n- edofx_integration.py (see below)\n- edofx2csv.py ; shows how to export andofx file to csv in \n- ofxplode.py ; shows how to generate a single account OFX file from a multi account one \n- unit tests\n\nedofx_integration.py\n....................\n\nThis file shows how to parse a multi account type / multi account OFX file into Statement and StatementTransaction classes and export everything into a set of per account csv files.\n\nMost interesting part is the render_as_DOT() function.\n\nFollowing render_as_DOT() code snippet shows how OFXNode makes it easy to load OFX content into arbitrary python objects:\n\n::\n\n if OFX.BANKMSGSRSV1 :\n # For each account statement...\n for aSTMTTRNRS in OFX.BANKMSGSRSV1.STMTTRNRS:\n stmt = Statement('CHECKING')\n stmt.currency = aSTMTTRNRS.STMTRS.CURDEF.val\n stmt.bank_id = aSTMTTRNRS.STMTRS.BANKACCTFROM.BANKID.val\n stmt.branch_id = aSTMTTRNRS.STMTRS.BANKACCTFROM.BRANCHID.val\n stmt.account_id = aSTMTTRNRS.STMTRS.BANKACCTFROM.ACCTID.val\n stmt.start_date = aSTMTTRNRS.STMTRS.BANKTRANLIST.DTSTART.val # returned as date\n stmt.end_date = aSTMTTRNRS.STMTRS.BANKTRANLIST.DTEND.val # returned as date\n # for each transaction in statement\n for s in aSTMTTRNRS.STMTRS.BANKTRANLIST.STMTTRN:\n st = StatementTransaction()\n st.fitid = s.FITID.val\n st.type = s.TRNTYPE.val\n st.date = s.DTPOSTED.val # returned as date\n st.amount = s.TRNAMT.val # returned as float\n st.name = s.NAME.val\n st.memo = s.MEMO.val\n stmt.transaction_list.append(st)\n \n stmt.balance = aSTMTTRNRS.STMTRS.LEDGERBAL.BALAMT.val # returned as float\n stmt.balance_date = aSTMTTRNRS.STMTRS.LEDGERBAL.DTASOF.val # returned as date\n statement_list.append(stmt)\n\n\nedofx2csv.py\n............\n\nShows how to export an edofx file to csv format.\n\n\nofxplode.py \n...........\n\nTakes a multi account OFX file and generates:\n\n- a single account OFX file\n- an XML representation of the single OFX file\n\nunittests\n..........\n\n* Parser tests (test_01_parser.py)\n* OFXTree export tests (test_02_OFXNode_export.py)\n* Obfuscation tests (test_03_obfuscation.py)\n\nDirectory tests/fixtures contains a set of OFX file.real_file.ofx and multi_account_file.ofx have been built from real files using OFXNode.obfuscated_ofx_repr()\n\n=======\n\n**Disclaimer: EDOFX was my very first python code !! So many things I would have not written like this today.**\n\nContributors\n############\n\n- Cyril MORISSE\n\nChange history\n##############\n\n==============\n0.3.8 -> 0.3.9\n==============\n\nOn 22/03/2017:\n\n- Fix import of formatted OFX files (ie. with indented tags)\n\n\n==============\n0.3.6 -> 0.3.8\n==============\n\nOn 06/11/2015:\n\n- Improve PEP8 Compliance\n- Manage file encoding based on OFX Header content\n- Fix problem with file names in uppercase (eg. README.rst)\n\n=====\n0.3.5\n=====\n\n- Port from mercurial to git.\n- Move from bitbucket to github.\n- Publish on Pypi.\n- Rework some code (4 years after)\n- Pypi and classifiers setup", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/cmorisse/inouk.edofx", "keywords": "ofx", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "inouk.edofx", "package_url": "https://pypi.org/project/inouk.edofx/", "platform": "", "project_url": "https://pypi.org/project/inouk.edofx/", "project_urls": { "Homepage": "https://github.com/cmorisse/inouk.edofx" }, "release_url": "https://pypi.org/project/inouk.edofx/0.3.9/", "requires_dist": null, "requires_python": "", "summary": "A framework to read and write OFX files Version 1.", "version": "0.3.9" }, "last_serial": 2722414, "releases": { "0.3.5": [ { "comment_text": "", "digests": { "md5": "d0bc8ab2726d47f8b24a17e046420fe8", "sha256": "436acf51e5e228a28ad3756c280c1b81fb0a1baf7f0a5d26adffa98b24303743" }, "downloads": -1, "filename": "inouk.edofx-0.3.5.tar.gz", "has_sig": false, "md5_digest": "d0bc8ab2726d47f8b24a17e046420fe8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13147, "upload_time": "2015-04-20T11:09:32", "url": "https://files.pythonhosted.org/packages/8a/f0/a8915b40b9c907036af88ec28acbe8d80a16720da8b6a8bc82b8f1a5497a/inouk.edofx-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "42b4a048f3f92c1a5bc4c11527682f01", "sha256": "b05f03799a0bd2c7d1becc610b86312c8594aedca86e0c8335c1f4f91d7eaa05" }, "downloads": -1, "filename": "inouk.edofx-0.3.6.tar.gz", "has_sig": false, "md5_digest": "42b4a048f3f92c1a5bc4c11527682f01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13274, "upload_time": "2015-06-11T05:24:06", "url": "https://files.pythonhosted.org/packages/c9/4d/a422d89d40f2f63ad3850efac51da0642750ced0ef39b1cefbfce002cbf5/inouk.edofx-0.3.6.tar.gz" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "e6326037447a0b6f501672223e829885", "sha256": "b23f7489ab63f5b17d12b1f3a6c035f653f9b1145ea30f902a0d7debfe368014" }, "downloads": -1, "filename": "inouk.edofx-0.3.8.tar.gz", "has_sig": false, "md5_digest": "e6326037447a0b6f501672223e829885", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13378, "upload_time": "2015-06-11T06:14:54", "url": "https://files.pythonhosted.org/packages/cb/a4/8971f5e610aa11d6741e27e6aa756f0fb7688fb15843540c441a9d80165d/inouk.edofx-0.3.8.tar.gz" } ], "0.3.9": [ { "comment_text": "", "digests": { "md5": "92b42c5ad7eb687efe5f9570b0ecdab2", "sha256": "bde8a3dded2019611d7ebbe369c490a0b5df5831445910fb20fb09de20676de5" }, "downloads": -1, "filename": "inouk.edofx-0.3.9.tar.gz", "has_sig": false, "md5_digest": "92b42c5ad7eb687efe5f9570b0ecdab2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13521, "upload_time": "2017-03-22T07:09:23", "url": "https://files.pythonhosted.org/packages/d9/ed/feecc75fbfd20c17abafe38b53c2f0640cc105c74e252c72b2ae20d5fa8b/inouk.edofx-0.3.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "92b42c5ad7eb687efe5f9570b0ecdab2", "sha256": "bde8a3dded2019611d7ebbe369c490a0b5df5831445910fb20fb09de20676de5" }, "downloads": -1, "filename": "inouk.edofx-0.3.9.tar.gz", "has_sig": false, "md5_digest": "92b42c5ad7eb687efe5f9570b0ecdab2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13521, "upload_time": "2017-03-22T07:09:23", "url": "https://files.pythonhosted.org/packages/d9/ed/feecc75fbfd20c17abafe38b53c2f0640cc105c74e252c72b2ae20d5fa8b/inouk.edofx-0.3.9.tar.gz" } ] }