{ "info": { "author": "Lele Gaifax", "author_email": "lele@metapensiero.it", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Utilities" ], "description": ".. -*- coding: utf-8 -*-\n.. :Project: metapensiero.sqlalchemy.dbloady -- YAML based data loader\n.. :Created: ven 1 gen 2016, 16.19.54, CET\n.. :Author: Lele Gaifax \n.. :License: GNU General Public License version 3 or later\n.. :Copyright: \u00a9 2016, 2017, 2019 Lele Gaifax\n..\n\n=================================\n metapensiero.sqlalchemy.dbloady\n=================================\n\n----------------------\nYAML based data loader\n----------------------\n\n :author: Lele Gaifax\n :contact: lele@metapensiero.it\n :license: GNU General Public License version 3 or later\n\n.. contents::\n\nData loader\n===========\n\nLoad new instances in the database, or update/delete existing ones, given a data structure\nrepresented by a YAML stream, as the following::\n\n - entity: gam.model.Fascicolo\n key: descrizione\n # no data, just \"declare\" the entity\n\n - entity: gam.model.TipologiaFornitore\n key: tipologiafornitore\n rows:\n - &tf_onesto\n tipologiafornitore: Test fornitori onesti\n\n - entity: gam.model.ClienteFornitore\n key: descrizione\n rows:\n - descrizione: Test altro fornitore onesto\n tipologiafornitore: *tf_onesto\n partitaiva: 01234567890\n - &cf_lele\n codicefiscale: GFSMNL68C18H612V\n descrizione: Dipendente A\n\n - entity: gam.model.Dipendente\n key: codicefiscale\n rows:\n - &lele\n codicefiscale: GFSMNL68C18H612V\n nome: Emanuele\n cognome: Gaifas\n clientefornitore: *cf_lele\n foto: !File {path: ../img/lele.jpg}\n\n - entity: gam.model.Attrezzature\n key: descrizione\n rows:\n - &macchina\n descrizione: Fiat 500\n foto: !File\n compressor: lzma\n content: !!binary |\n /Td6WFoAAATm1rRGAgAhA...\n\n - entity: gam.model.Prestiti\n key:\n - dipendente\n - attrezzatura\n rows:\n - dipendente: *lele\n attrezzatura: *macchina\n\nAs you can see, the YAML document is a sequence of entries, each one defining the content of a\nset of *instances* of a particular *entity*.\n\nThe ``entity`` must be the fully qualified dotted name of the SQLAlchemy mapped class.\n\nThe ``key`` entry may be either a single attribute name or a list of them, not necessarily\ncorresponding to the primary key of the entity, provided that it uniquely identifies a single\ninstance. To handle the simplest case of structured values (for example, when a field is\nbacked by a PostgreSQL HSTORE), the key attribute name may be in the form ``name->slot``::\n\n - entity: model.Product\n key: description->en\n rows:\n - &cage\n description:\n en: \"Roadrunner cage\"\n it: \"Gabbia per struzzi\"\n\nThe ``rows`` (or ``data``) may be either a single item or a list of them, each containing\nthe data of a single instance, usually a dictionary.\n\n.. _fields:\n\nWhen all (or most of) the instances share the same fields, a more compact representation may be\nused::\n\n - entity: model.Values\n key:\n - product\n - attribute\n fields: [ product, attribute, value ]\n rows:\n - [ *cage, *size, 110cm x 110cm x 120cm ]\n - [ *cage, *weight, 230kg ]\n\nwhere ``fields`` contains a list of field names and ``rows`` is a sequence of lists, each\ncontaining the values of a single instance. The two sintaxes may be mixed though, so you can\nsay::\n\n - entity: model.Person\n key: [ lastname, firstname ]\n fields: [ lastname, firstname, password ]\n rows:\n - [ gaifax, lele, \"123456\" ]\n - [ foobar, john, \"abcdef\" ]\n - lastname: rossi\n firstname: paolo\n birthdate: 1950-02-03\n\nIf you have a `tab-separated-values`__ file, you may say::\n\n - entity: model.Cities\n key:\n - name\n - country\n fields: [ name, country ]\n rows: !TSV {path: ../data/cities.txt, encoding: utf-8}\n\nand if the field names are included in the the first row of the file, simply omit the\n``fields`` slot::\n\n - entity: model.Countries\n key:\n - code\n rows: !TSV {path: ../data/countries.txt, encoding: utf-8}\n\nThe ``dbloady`` tool iterates over all the entities, and for each instance it determines if it\nalready exists querying the database with the given *key*: if it's there, it updates it\notherwise it creates a new one and initializes it with its data.\n\n__ https://en.wikipedia.org/wiki/Tab-separated_values\n\n\nTest fixture facility\n---------------------\n\nWith the option ``--save-new-instances`` newly created instances will be written (actually\nadded) to the given file in YAML format, so that at some point they can be deleted using the\noption ``--delete`` on that file. Ideally\n\n::\n\n dbloady -u postgresql://localhost/test -s new.yaml fixture.yaml\n dbloady -u postgresql://localhost/test -D new.yaml\n\nshould remove fixture's traces from the database, if it contains only new data.\n\n\nPre and post load scripts\n-------------------------\n\nThe option ``--preload`` may be used to execute an arbitrary Python script before any load\nhappens. This is useful either to tweak the YAML context or to alter the set of file names\nspecified on the command line (received as the `fnames` global variable).\n\nThe following script registers a custom costructor that recognizes the tag ``!time`` or a value\nlike ``T12:34`` as a ``datetime.time`` value::\n\n import datetime, re\n from ruamel import yaml\n\n def time_constructor(loader, node):\n value = loader.construct_scalar(node)\n if value.startswith('T'):\n value = value[1:]\n parts = map(int, value.split(':'))\n return datetime.time(*parts)\n\n yaml.add_constructor('!time', time_constructor)\n yaml.add_implicit_resolver('!time', re.compile(r'^T?\\d{2}:\\d{2}(:\\d{2})?$'), ['T'])\n\nAs another example, the following script handles input files with a ``.gpg`` suffix decrypting\nthem on the fly to a temporary file that will be deleted when the program exits::\n\n import atexit, os, subprocess, tempfile\n\n def decipher(fname):\n print(\"Input file %s is encrypted, please enter passphrase\" % fname)\n with tempfile.NamedTemporaryFile(suffix='.yaml') as f:\n tmpfname = f.name\n subprocess.run(['gpg', '-q', '-o', tmpfname, fname], check=True)\n atexit.register(lambda n=tmpfname: os.unlink(n))\n return tmpfname\n\n fnames = [decipher(fname) if fname.endswith('.gpg') else fname for fname in fnames]\n\nThen you have::\n\n dbloady -u postgresql://localhost/test -p preload.py data.yaml.gpg\n Input file data.yaml.gpg is encrypted, please enter passphrase\n /tmp/tmpfhjrdqgf.yaml: ......\n Committing changes\n\nThe option ``--postload`` may be used to perform additional steps *after* all YAML files have\nbeen loaded but *before* the DB transaction is committed.\n\nThe pre/post load scripts are executed with a context containing the following variables:\n\n`session`\n the SQLAlchemy session\n\n`dry_run`\n the value of the ``--dry-run`` option\n\n`fnames`\n the list of file names specified on the command line\n\n\nGeneric foreign keys\n--------------------\n\nVersion 1.6 introduced rudimentary and experimental support for the `generic foreign keys`__\ntrick. It assumes that they are implemented with a `hybrid property`__ that exposes a `custom\ncomparator`__. See ``tests/generic_fk/model.py`` for an example.\n\n__ http://docs.sqlalchemy.org/en/latest/_modules/examples/generic_associations/generic_fk.html\n__ http://docs.sqlalchemy.org/en/rel_1_1/orm/extensions/hybrid.html\n__ http://docs.sqlalchemy.org/en/rel_1_1/orm/extensions/hybrid.html#building-custom-comparators\n\nWith a proper configuration, the following works::\n\n - entity: model.Customer\n key: name\n data:\n - &customer\n name: Best customer\n\n - entity: model.Supplier\n key: company_name\n data:\n - &supplier\n company_name: ACME\n\n - entity: model.Address\n key:\n - related_object\n - street\n data:\n - related_object: *customer\n street: 123 anywhere street\n - related_object: *supplier\n street: 321 long winding road\n\n\nDirect assignment of primary keys\n---------------------------------\n\nWhen the attribute does not correspond to a relationship property, assignment of an instance\nreference will set the attribute to the instance's primary key::\n\n - entity: model.Person\n key:\n - lastname\n - firstname\n fields:\n - lastname\n - firstname\n data:\n - &johndoe [ Doe, John ]\n\n - entity: model.CannedFilter\n key: description\n data:\n - &onlyjohndoe\n description: \"Only John Doe\"\n\n - entity: model.Condition\n key:\n - filter\n - fieldname\n data:\n - filter: *onlyjohndoe\n fieldname: \"persons.id\"\n fieldvalue: *johndoe\n\nRaw SQL values\n--------------\n\nSometime a value requires executing an arbitrary query on the database, maybe because it is\ncomputed by a trigger or more generally because it cannot be determined by the YAML content::\n\n - entity: model.Number\n key:\n id\n data:\n - id: 1\n absolute: !SQL {query: \"SELECT abs(:num)\", params: {num: -1}}\n - id: !SQL {query: \"SELECT abs(:num)\", params: {num: -2}}\n absolute: !SQL {query: \"SELECT abs(:num)\", params: {num: -2}}\n - id: 3\n absolute: !SQL {query: \"SELECT count(*) FROM numbers\"}\n\nThe specified query must return a single value, as it is executed with `session.scalar()`__.\n\n__ http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.scalar\n\n\nData dumper\n===========\n\nWith the complementary tool, ``dbdumpy``, you can obtain a YAML representation out\nof a database in the same format used by ``dbloady``. It's rather simple and in particular it\ndoes not handle reference cycles.\n\nThe tool is driven by a `specs file`, a YAML document composed by two parts: the first defines\nthe `pivots` instances (that is, the entry points), the second describes how each entity must\nbe serialized and in which order.\n\nConsider the following document::\n\n - entity: model.Result\n ---\n - entity: model.Person\n key:\n - lastname\n - firstname\n\n - entity: model.Exam\n fields: description\n key: description\n\n - entity: model.Result\n key:\n - person\n - exam\n other:\n - vote\n\nIt tells ``dbdumpy`` to consider *all* instances of ``model.Result`` as the pivots, then\ndefines how each entity must be serialized, simply by listing the ``key`` attribute(s) and any\nfurther ``other`` field. Alternatively, you can specify a list of ``fields`` names, to obtain\nthe more compact form described `above`__.\n\n__ fields_\n\nExecuting\n\n::\n\n dbdumpy -u sqlite:////foo/bar.sqlite spec.yaml\n\nwill emit the following on stdout::\n\n - entity: model.Person\n key:\n - lastname\n - firstname\n rows:\n - &id002\n firstname: John\n lastname: Doe\n - &id003\n firstname: Bar\n lastname: Foo\n - entity: model.Exam\n fields: description\n key: description\n rows:\n - &id001\n - Drive license\n - entity: model.Result\n key:\n - person\n - exam\n rows:\n - exam: *id001\n person: *id002\n vote: 10\n - exam: *id001\n person: *id003\n vote: 5\n\n\n.. -*- coding: utf-8 -*-\n\nChanges\n-------\n\n2.9 (2019-06-24)\n~~~~~~~~~~~~~~~~\n\n- Mimic how PostgreSQL decodes ``\\N`` as ``None`` in the TSV tag\n\n\n2.8 (2019-06-24)\n~~~~~~~~~~~~~~~~\n\n- Ability to load data from an external tab-separated-values file\n\n\n2.7 (2019-05-10)\n~~~~~~~~~~~~~~~~\n\n- Emit a critical log on attribute assignment failure, to aid debugging bad input\n\n\n2.6 (2018-04-17)\n~~~~~~~~~~~~~~~~\n\n- Remove the fixup to progressbar2 `issue #162`__, solved in its 3.7.1 release\n\n__ https://github.com/WoLpH/python-progressbar/issues/162\n\n\n2.5 (2018-04-09)\n~~~~~~~~~~~~~~~~\n\n- Try to fix different behaviour in progressbar2 3.7.0 w.r.t. multiple progress bars\n\n\n2.4 (2018-04-08)\n~~~~~~~~~~~~~~~~\n\n- Now File elements can read text files\n\n- Support dumping hstore values (not tested enough, though)\n\n\n2.3 (2017-06-07)\n~~~~~~~~~~~~~~~~\n\n- Fix handling of property based attributes\n\n\n2.2 (2017-05-18)\n~~~~~~~~~~~~~~~~\n\n- The File elements may now contain their content, without accessing external files\n\n\n2.1 (2017-05-02)\n~~~~~~~~~~~~~~~~\n\n- New ``--quiet`` option to omit the progress bar\n\n\n2.0 (2017-04-06)\n~~~~~~~~~~~~~~~~\n\n- Require `ruamel.yaml`__ instead of PyYAML__\n\n__ https://pypi.python.org/pypi/ruamel.yaml\n__ https://pypi.python.org/pypi/PyYAML\n\n\n1.11 (2017-03-22)\n~~~~~~~~~~~~~~~~~\n\n- Spring cleanup, no externally visible changes\n\n\n1.10 (2016-11-16)\n~~~~~~~~~~~~~~~~~\n\n- Reduce load noise by using progressbar2__\n\n__ https://pypi.python.org/pypi/progressbar2\n\n\n1.9 (2016-11-15)\n~~~~~~~~~~~~~~~~\n\n- Ability to execute raw SQL statements to fetch a value from the database\n\n\n1.8 (2016-11-15)\n~~~~~~~~~~~~~~~~\n\n- Better tests\n\n- Handle assignments to non-relationship properties\n\n\n1.7 (2016-11-05)\n~~~~~~~~~~~~~~~~\n\n- Make Python 3 happy by explicitly use binary mode to read external files\n\n\n1.6 (2016-10-29)\n~~~~~~~~~~~~~~~~\n\n- Quick&approximated solution to load `generic associations`__\n\n__ http://docs.sqlalchemy.org/en/latest/_modules/examples/generic_associations/generic_fk.html\n\n\n1.5 (2016-03-12)\n~~~~~~~~~~~~~~~~\n\n- New complementary dump functionality, exposed by a new cli tool, dbdumpy\n\n- Cosmetic, backward compatible, changes to the YAML format, for nicer sorting\n\n\n1.4 (2016-02-10)\n~~~~~~~~~~~~~~~~\n\n- Data files and preload/postload scripts may be specified also as package relative resources\n\n\n1.3 (2016-01-14)\n~~~~~~~~~~~~~~~~\n\n- New --preload and --postload options to execute arbitrary Python scripts before or after the\n load\n\n\n1.2 (2016-01-09)\n~~~~~~~~~~~~~~~~\n\n- Fix source distribution\n\n\n1.1 (2016-01-09)\n~~~~~~~~~~~~~~~~\n\n- Fix data refs when loading from compact representation\n\n\n1.0 (2016-01-07)\n~~~~~~~~~~~~~~~~\n\n- Allow more compact representation when all instances share the same fields\n\n- Extract dbloady from metapensiero.sphinx.patchdb 1.4.2 into a standalone package", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.com/metapensiero/metapensiero.sqlalchemy.dbloady.git", "keywords": "", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "metapensiero.sqlalchemy.dbloady", "package_url": "https://pypi.org/project/metapensiero.sqlalchemy.dbloady/", "platform": "", "project_url": "https://pypi.org/project/metapensiero.sqlalchemy.dbloady/", "project_urls": { "Homepage": "https://gitlab.com/metapensiero/metapensiero.sqlalchemy.dbloady.git" }, "release_url": "https://pypi.org/project/metapensiero.sqlalchemy.dbloady/2.9/", "requires_dist": null, "requires_python": "", "summary": "YAML based data loader", "version": "2.9" }, "last_serial": 5442044, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "5735866b85cb91c652e99b024f9c1012", "sha256": "63e7d98e33fd6078bab4773b1f413ec926fc3a409ba38dfbbd9ad7f790b2b7a8" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.0.tar.gz", "has_sig": false, "md5_digest": "5735866b85cb91c652e99b024f9c1012", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10840, "upload_time": "2016-01-07T11:34:12", "url": "https://files.pythonhosted.org/packages/3f/e4/80b90ffc6fd45b0ea512cc7165b03b37d797bf007b95c84d2a41efd9f020/metapensiero.sqlalchemy.dbloady-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "67061812a9eb7fcf809e1e9d17a499e2", "sha256": "be26b5f8dfb91244ddf92f283ab324529f69c658ad839f7bffa04b074dd95152" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.1.tar.gz", "has_sig": false, "md5_digest": "67061812a9eb7fcf809e1e9d17a499e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9938, "upload_time": "2016-01-09T11:32:05", "url": "https://files.pythonhosted.org/packages/e0/de/0a7be733db875b82b9f08c0d3b4907e9e3160e48e4db1fd3c1bae640b81c/metapensiero.sqlalchemy.dbloady-1.1.tar.gz" } ], "1.10": [ { "comment_text": "", "digests": { "md5": "508b2ff979087c32e77fc3c240b8f7c7", "sha256": "3916fd6a227e4953f35f204bfc8bee32b08267aa93eeb2b80fc51f5072852bef" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.10.tar.gz", "has_sig": false, "md5_digest": "508b2ff979087c32e77fc3c240b8f7c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27261, "upload_time": "2016-11-16T22:21:59", "url": "https://files.pythonhosted.org/packages/dc/4f/8259e03759fde3659cfcb9f0c10418e0eb6f2beaf66e97f4336c6d403c79/metapensiero.sqlalchemy.dbloady-1.10.tar.gz" } ], "1.11": [ { "comment_text": "", "digests": { "md5": "f108ffa43b9adffb85294605a2b8379a", "sha256": "917d83f83a75914b4b5cbf165a5d04dd76230f20be0f2c99f14cbd8f96439c5e" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.11.tar.gz", "has_sig": false, "md5_digest": "f108ffa43b9adffb85294605a2b8379a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27529, "upload_time": "2017-03-22T20:03:10", "url": "https://files.pythonhosted.org/packages/1b/c6/ce0ca9f80a2eb6737e1f5fcac3f8656f6fb86730c660112decaa5429632a/metapensiero.sqlalchemy.dbloady-1.11.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "e54149ef07a7368ab5448763238d1578", "sha256": "864a16166e77eda7fcfafefccd1b295f218d6c9b56754a8ac77c678e80254c00" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.2.tar.gz", "has_sig": false, "md5_digest": "e54149ef07a7368ab5448763238d1578", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12047, "upload_time": "2016-01-09T11:36:04", "url": "https://files.pythonhosted.org/packages/b7/aa/7d9295db87b5228fd06596de4667a19782619f624209b8cf6724795e6389/metapensiero.sqlalchemy.dbloady-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "20806802fefe7f6334fb00eb5a531081", "sha256": "218facb4bd22a9dcea101ec0de110302b4247f20740c93bb76012b97fa6026cf" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.3.tar.gz", "has_sig": false, "md5_digest": "20806802fefe7f6334fb00eb5a531081", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14482, "upload_time": "2016-01-14T11:12:00", "url": "https://files.pythonhosted.org/packages/b7/1f/18290c4c54beb96faa2f935832a98d14594a6e00c64bae833d52cdf4c4f9/metapensiero.sqlalchemy.dbloady-1.3.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "c14e8b47de58ae06c39ecbd59f1265f8", "sha256": "1a5101ca36b740d7a487dd2d37913fd050113c977270cb9b39ce3f7f463d7416" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.4.tar.gz", "has_sig": false, "md5_digest": "c14e8b47de58ae06c39ecbd59f1265f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15193, "upload_time": "2016-02-10T09:44:45", "url": "https://files.pythonhosted.org/packages/a9/ea/06ecbf7fd9c015f684c647fa8fbd267f46b6704818fde56888f4bc8f9383/metapensiero.sqlalchemy.dbloady-1.4.tar.gz" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "45d47fe0e31fc5fe9747e0d5a6cb6c8b", "sha256": "131915403a7f2cb6c492dc9b7029bb8550cff89ecfab9ecf73d2c2fc2cf63000" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.5.tar.gz", "has_sig": false, "md5_digest": "45d47fe0e31fc5fe9747e0d5a6cb6c8b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20322, "upload_time": "2016-03-12T11:18:06", "url": "https://files.pythonhosted.org/packages/64/0c/185459a49ba799bb6d1af80ffc1071193c924295a7ae6f67e02fe11d4356/metapensiero.sqlalchemy.dbloady-1.5.tar.gz" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "fee4e0a38e3cb0b218988ce7284f0ccc", "sha256": "b0e44d2c67ac7f1db35a5242c7700d5e1676abd08f0670b052ecec358240f181" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.6.tar.gz", "has_sig": false, "md5_digest": "fee4e0a38e3cb0b218988ce7284f0ccc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22508, "upload_time": "2016-10-29T09:19:45", "url": "https://files.pythonhosted.org/packages/b0/06/6fbe1b815829f69313e526558e5d38b52899a497dee6f1154f021ce7ca4d/metapensiero.sqlalchemy.dbloady-1.6.tar.gz" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "f7979383ea912e3242a32e962c8a8e5b", "sha256": "4a89dac81a829c79fbdc4168241b35277eafe646cf0e9492efcaa005dc8f4333" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.7.tar.gz", "has_sig": false, "md5_digest": "f7979383ea912e3242a32e962c8a8e5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22618, "upload_time": "2016-11-05T00:39:34", "url": "https://files.pythonhosted.org/packages/64/a6/9a8e458fb97ca5df6e8a08148b3c20544c1314a44e2aaa64f67f22495ddd/metapensiero.sqlalchemy.dbloady-1.7.tar.gz" } ], "1.8": [ { "comment_text": "", "digests": { "md5": "2c21f50ecf655b87c2e2fa532a53c1f6", "sha256": "5ad12435c53083c776ed42de1191f7c3aa5b9e91423d9d5516b7a327b8097a60" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.8.tar.gz", "has_sig": false, "md5_digest": "2c21f50ecf655b87c2e2fa532a53c1f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25774, "upload_time": "2016-11-15T11:22:12", "url": "https://files.pythonhosted.org/packages/9d/8a/75ba52ecfea2dad577d0db1cbcc700d640f76edaabc25f3dda8d936ea5bd/metapensiero.sqlalchemy.dbloady-1.8.tar.gz" } ], "1.9": [ { "comment_text": "", "digests": { "md5": "c38c9d0033c5d64192ccb9c4dc18585e", "sha256": "fd99e7600c23b7cccf8e130684dd612ac84ef76d2b4a4e529203a6598ff0c9fc" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-1.9.tar.gz", "has_sig": false, "md5_digest": "c38c9d0033c5d64192ccb9c4dc18585e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26945, "upload_time": "2016-11-15T13:57:12", "url": "https://files.pythonhosted.org/packages/d3/49/a424ff1a16207f56e050409865902bfeced450e535303cd48b00e5371c11/metapensiero.sqlalchemy.dbloady-1.9.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "e8e82c8cdbb6fdfb531d5fbc8d911d24", "sha256": "4ba44494bca6f0ede7366fb3a16d969ad8baf616bd2a28bb8024b8c85fa80de2" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.0.tar.gz", "has_sig": false, "md5_digest": "e8e82c8cdbb6fdfb531d5fbc8d911d24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27554, "upload_time": "2017-04-06T00:09:10", "url": "https://files.pythonhosted.org/packages/27/0b/65c6bfd106a1f518c86c55931c60c29a00ea553a2408e6cc58f329a1f380/metapensiero.sqlalchemy.dbloady-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "06a0f6579a997d237ac83cd1188d09c0", "sha256": "036694f432f83416f2b7a8eb4c978c1aaa8ca1c9c756aafc85f2bb296eeb581b" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.1.tar.gz", "has_sig": false, "md5_digest": "06a0f6579a997d237ac83cd1188d09c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27662, "upload_time": "2017-05-02T16:23:52", "url": "https://files.pythonhosted.org/packages/6d/0b/9c2b38c3a359a70b2a246aaa8e50d815b66bc3f90819493a20530a0c569b/metapensiero.sqlalchemy.dbloady-2.1.tar.gz" } ], "2.2": [ { "comment_text": "", "digests": { "md5": "c46760784f691a3f56b8f1c3bcc2f2a3", "sha256": "30d3014c1e769f29d2a2fe358074f9a3728576cc92c21f83ea2df944bb3058bd" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.2.tar.gz", "has_sig": false, "md5_digest": "c46760784f691a3f56b8f1c3bcc2f2a3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28099, "upload_time": "2017-05-18T01:01:11", "url": "https://files.pythonhosted.org/packages/8c/c3/e726ded5cec4cbfd5851ebd2a687604bde0daf6a489ebdc568f76de30774/metapensiero.sqlalchemy.dbloady-2.2.tar.gz" } ], "2.3": [ { "comment_text": "", "digests": { "md5": "2ef06b223959444fd2ef958f3e1c59e7", "sha256": "82cb5d5a9b9eb5b4615f021b38acfc197a9724ca6c8c35424da9a5248b343994" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.3.tar.gz", "has_sig": false, "md5_digest": "2ef06b223959444fd2ef958f3e1c59e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28562, "upload_time": "2017-06-07T12:46:59", "url": "https://files.pythonhosted.org/packages/be/c8/8000f53e544643d9d7b397f53af3cb082a88e16570a45d78d5c9d3e39802/metapensiero.sqlalchemy.dbloady-2.3.tar.gz" } ], "2.4": [ { "comment_text": "", "digests": { "md5": "64a44209999d2bde8129fcabc7d92869", "sha256": "4a7875e3600e12606d56b828aab26589a32f8a999a5f0c5d1364cf223b7d9f7c" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.4.tar.gz", "has_sig": false, "md5_digest": "64a44209999d2bde8129fcabc7d92869", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29693, "upload_time": "2018-04-08T13:24:15", "url": "https://files.pythonhosted.org/packages/9d/b4/af6160b0761884743edf21db54ed43cbed3c75f4be50ed710bf822498e89/metapensiero.sqlalchemy.dbloady-2.4.tar.gz" } ], "2.5": [ { "comment_text": "", "digests": { "md5": "d904152731249379fa671ee28d56fce0", "sha256": "ae9943d915dad70cbd37f68d48a30c3d5ea468760554096a722a02015719cee5" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.5.tar.gz", "has_sig": false, "md5_digest": "d904152731249379fa671ee28d56fce0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29811, "upload_time": "2018-04-08T23:47:03", "url": "https://files.pythonhosted.org/packages/c3/a6/03c809bd72e58a823d3ee5c2530f44c1190bf3859082bb548a985baa0372/metapensiero.sqlalchemy.dbloady-2.5.tar.gz" } ], "2.6": [ { "comment_text": "", "digests": { "md5": "65224d9ad113e5002293c35deaf75493", "sha256": "bb777d812fb6b1b9ab77863f6f799af1405bdd3ba81616d2413a520742c86cee" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.6.tar.gz", "has_sig": false, "md5_digest": "65224d9ad113e5002293c35deaf75493", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29984, "upload_time": "2018-04-17T08:45:54", "url": "https://files.pythonhosted.org/packages/7e/95/fa1432c10c9191f795b5ba44ec580cdfa2eaebb9cffc8e5c640957f75790/metapensiero.sqlalchemy.dbloady-2.6.tar.gz" } ], "2.7": [ { "comment_text": "", "digests": { "md5": "79f8d1e4a44d79dc64d91303b9ed9d6b", "sha256": "ea757c6bef47830a312d0e003d560a552291335c166ce5ead7b7c29004b9a322" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.7.tar.gz", "has_sig": false, "md5_digest": "79f8d1e4a44d79dc64d91303b9ed9d6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30458, "upload_time": "2019-05-10T15:09:03", "url": "https://files.pythonhosted.org/packages/6b/66/aad324b68041be48530901465fc25db0789b9250a6c63dae28a1d0ee48d4/metapensiero.sqlalchemy.dbloady-2.7.tar.gz" } ], "2.8": [ { "comment_text": "", "digests": { "md5": "cb2c8b120a47bc9b33bb1b950f7888e2", "sha256": "648f011784c2f0b0404d87cca090426dae5080c9166062baa0625a3fb124664e" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.8.tar.gz", "has_sig": false, "md5_digest": "cb2c8b120a47bc9b33bb1b950f7888e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31546, "upload_time": "2019-06-24T16:59:15", "url": "https://files.pythonhosted.org/packages/9b/b5/4b7f0e5d00c309f932f18b8feaffb4903d5365979698bd5bcee3d01b2cda/metapensiero.sqlalchemy.dbloady-2.8.tar.gz" } ], "2.9": [ { "comment_text": "", "digests": { "md5": "96da8b844e4072bade95e87bcfdb0fd8", "sha256": "d1737c56bd66b77b49b07d99b548d5be6ac69b11d699e87c9e514c6616a20e8e" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.9.tar.gz", "has_sig": false, "md5_digest": "96da8b844e4072bade95e87bcfdb0fd8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31860, "upload_time": "2019-06-24T18:19:05", "url": "https://files.pythonhosted.org/packages/07/80/fd5f4821182362cb5b475bbd6a4f6f842a21eb857e2d642542cc3d7455a5/metapensiero.sqlalchemy.dbloady-2.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "96da8b844e4072bade95e87bcfdb0fd8", "sha256": "d1737c56bd66b77b49b07d99b548d5be6ac69b11d699e87c9e514c6616a20e8e" }, "downloads": -1, "filename": "metapensiero.sqlalchemy.dbloady-2.9.tar.gz", "has_sig": false, "md5_digest": "96da8b844e4072bade95e87bcfdb0fd8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31860, "upload_time": "2019-06-24T18:19:05", "url": "https://files.pythonhosted.org/packages/07/80/fd5f4821182362cb5b475bbd6a4f6f842a21eb857e2d642542cc3d7455a5/metapensiero.sqlalchemy.dbloady-2.9.tar.gz" } ] }