{ "info": { "author": "David Eyk", "author_email": "david.eyk@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Topic :: Software Development :: Libraries" ], "description": "nonobvious\n==========\n\nThe first python package to jump across the English Channel!\n\n.. image:: https://travis-ci.org/eykd/nonobvious.svg?branch=master\n :target: https://travis-ci.org/eykd/nonobvious\n\n.. image:: https://coveralls.io/repos/eykd/nonobvious/badge.png\n :target: https://coveralls.io/r/eykd/nonobvious\n\n\nThis package attempts to implement the \"functional core, imperative shell\"\npattern described in `Gary Bernhardt's talk on Boundaries`_, using some ideas\nfound in the Ruby `obvious`_ project.\n\n.. _Gary Bernhardt's talk on Boundaries: https://www.destroyallsoftware.com/talks/boundaries\n.. _obvious: http://obvious.retromocha.com/\n\n\nFunctional Core, Imperative Shell\n---------------------------------\n\nThe basic idea is that your core domain model implements business logic using\nfunctional techniques, with immutable values and copy-on-write. The functional\ncore is wrapped by an imperative shell which drives the core models and\ninteracts across the boundary with the outside world through \"primitive\"\nvalues. The immutable domain models can be easily converted to primitive data\nstructures whose state has no affect on the immutable core.\n\n``nonobvious.models`` and ``nonobvious.fields`` provide a declarative modeling\nlanguage, similar to Django's model objects, but without an ORM. We can easily\nuse validators and adaptors from the ``valideer`` project to ensure that the\nmodels are always in a valid state and can easily be constructed from standard\npython data structures.\n\nBy making use of ``concon.frozendict``, ``concon.frozenlist``, and\n``concon.frozenset`` within model adaptors allows us to model complex data\nstructures guaranteed to be correctly formed at all times.\n\nAs for the imperative shell, at present, you're on your own!", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/eykd/nonobvious", "keywords": null, "license": "BSD", "maintainer": null, "maintainer_email": null, "name": "nonobvious", "package_url": "https://pypi.org/project/nonobvious/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/nonobvious/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/eykd/nonobvious" }, "release_url": "https://pypi.org/project/nonobvious/0.1/", "requires_dist": null, "requires_python": null, "summary": "A simple, but non-obvious approach to setting boundaries.", "version": "0.1" }, "last_serial": 1110565, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "f9e6c2ff94f340514165227d319a9a2b", "sha256": "949b1fb5fb344ba0c05df1cfc37fe4340ad1f1a798a19750682a0c8670f47685" }, "downloads": -1, "filename": "nonobvious-0.1.tar.gz", "has_sig": false, "md5_digest": "f9e6c2ff94f340514165227d319a9a2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4635, "upload_time": "2014-06-01T20:21:03", "url": "https://files.pythonhosted.org/packages/d7/4e/8abf38ea4acc8a220ca5429acc717a6818767b1813c54175d842f730d50c/nonobvious-0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f9e6c2ff94f340514165227d319a9a2b", "sha256": "949b1fb5fb344ba0c05df1cfc37fe4340ad1f1a798a19750682a0c8670f47685" }, "downloads": -1, "filename": "nonobvious-0.1.tar.gz", "has_sig": false, "md5_digest": "f9e6c2ff94f340514165227d319a9a2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4635, "upload_time": "2014-06-01T20:21:03", "url": "https://files.pythonhosted.org/packages/d7/4e/8abf38ea4acc8a220ca5429acc717a6818767b1813c54175d842f730d50c/nonobvious-0.1.tar.gz" } ] }