{ "info": { "author": "Zope Project", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "*********\nzc.freeze\n*********\n\nThe `zc.freeze` package provides a pattern for freezing objects.\nState is informational--enforcement unspecified.\nSome enforcement approaches and helpers are included.\n\n.. See ``src/zc/zc.freeze/README.txt`` for details.\n\n\n.. contents::\n\nDetailed Documentation\n**********************\n\n========\nFreezing\n========\n\nThis package implements basic functionality for freezing objects:\nspellings to query whether an object can be frozen, to query whether it\nhas been frozen, and to actually freeze an object. Further policies may\nbe implemented above the basic code in this package; and much of the\ncode in this package is offered as pluggable choices which can be\nomitted while still keeping the basic API.\n\nTo discover whether an object is freezable, client code should ask if it\nprovides zc.freeze.interfaces.IFreezable.\n\nSite configurations or code that declares that an object is IFreezable\nis assuring that the object provides or can be adaptable to\nzc.freeze.interfaces.IFreezing. This interface has only three elements:\n_z_frozen is a readonly boolean that returns whether the object has been\nversioned; _z_freeze_datetime is a readonly datetime in pytz.utc\nspecifying when the object was frozen (or None, if it is not yet\nfrozen); and _z_freeze is a method that actually freezes the object. If\nthe object is already frozen, it raises\nzc.freeze.interfaces.FrozenError. If the object is not in a state to be\nfrozen, it may raise zc.freeze.interfaces.FreezeError. If the freezing\nmay succeed, the method should send a\nzc.freeze.interfaces.IObjectFrozenEvent (such as\nzc.freeze.interfaces.ObjectFrozenEvent).\n\nThat's the heart of the package: an API and an agreement, with nothing to test\ndirectly. One policy that this package does not directly support is that\nfreezing an object might first create a copy and then version the copy\nrather than the original; or version the original but replace the copy in the\nlocation of the original; or make any other choices. These approaches are\nintended to be implemented on top of--above--the zc.freeze API. This\npackage provides much simpler capabilities.\n\nConveniences\n============\n\nThe package does provide two default implementations of IFreezing, and a few\nconveniences.\n\nOne IFreezing implementation is for objects that are directly aware of this\nAPI (as opposed to having the functionality assembled from adapters and other\ncomponents).\n\n >>> import zc.freeze\n >>> v = zc.freeze.Freezing()\n >>> from zc.freeze import interfaces\n >>> from zope.interface.verify import verifyObject\n >>> verifyObject(interfaces.IFreezing, v)\n True\n >>> verifyObject(interfaces.IFreezable, v)\n True\n >>> v._z_frozen\n False\n >>> v._z_frozen = True\n Traceback (most recent call last):\n ...\n AttributeError: can't set attribute\n >>> import pytz\n >>> import datetime\n >>> before = datetime.datetime.now(pytz.utc)\n >>> v._z_freeze()\n >>> before <= v._z_freeze_timestamp <= datetime.datetime.now(pytz.utc)\n True\n >>> v._z_frozen\n True\n >>> interfaces.IObjectFrozenEvent.providedBy(events[-1])\n True\n >>> events[-1].object is v\n True\n >>> v._z_freeze()\n Traceback (most recent call last):\n ...\n FrozenError\n\nAnother available implementation is an adapter, and stores the information in\nan annotation. Here's a quick demo.\n\n >>> import zope.annotation.interfaces\n >>> from zope import interface, component\n >>> class Demo(object):\n ... interface.implements(zope.annotation.interfaces.IAnnotatable)\n ...\n >>> import UserDict\n >>> class DemoAnnotations(UserDict.UserDict):\n ... interface.implements(zope.annotation.interfaces.IAnnotations)\n ... component.adapts(Demo)\n ... def __init__(self, context):\n ... self.context = context\n ... self.data = getattr(context, '_z_demo', None)\n ... if self.data is None:\n ... self.data = context._z_demo = {}\n ...\n >>> component.provideAdapter(DemoAnnotations)\n >>> component.provideAdapter(zc.freeze.FreezingAdapter)\n >>> d = Demo()\n >>> verifyObject(interfaces.IFreezing, interfaces.IFreezing(d))\n True\n >>> verifyObject(interfaces.IFreezable, interfaces.IFreezing(d))\n True\n >>> interfaces.IFreezing(d)._z_frozen\n False\n >>> interfaces.IFreezing(d)._z_frozen = True\n Traceback (most recent call last):\n ...\n AttributeError: can't set attribute\n >>> before = datetime.datetime.now(pytz.utc)\n >>> interfaces.IFreezing(d)._z_freeze()\n >>> (before <= interfaces.IFreezing(d)._z_freeze_timestamp <=\n ... datetime.datetime.now(pytz.utc))\n True\n >>> interfaces.IFreezing(d)._z_frozen\n True\n >>> interfaces.IObjectFrozenEvent.providedBy(events[-1])\n True\n >>> events[-1].object is d\n True\n >>> interfaces.IFreezing(d)._z_freeze()\n Traceback (most recent call last):\n ...\n FrozenError\n\nThe zc.freeze module also contains three helpers for writing properties and\nmethods that are freeze-aware.\n\nA 'method' function can generate a freeze-aware method that raises a\nFrozenError if the object has been frozen.\n\n'setproperty' and 'delproperty' functions can generate a freeze-aware\ndescriptor that raises a FrozenError if the set or del methods are called\non a frozen object. These are rwproperties.\n\n'makeProperty' generates a freeze-aware descriptor that does a simple\nget/set but raises FrozenError if the set is attempted on a frozen\nobject.\n\n >>> class BiggerDemo(Demo):\n ... counter = 0\n ... @zc.freeze.method\n ... def increase(self):\n ... self.counter += 1\n ... _complex = 1\n ... @property\n ... def complex_property(self):\n ... return str(self._complex)\n ... @zc.freeze.setproperty\n ... def complex_property(self, value):\n ... self._complex = value * 2\n ... zc.freeze.makeProperty('simple_property')\n ...\n >>> d = BiggerDemo()\n >>> d.counter\n 0\n >>> d.complex_property\n '1'\n >>> d.simple_property # None\n >>> d.increase()\n >>> d.counter\n 1\n >>> d.complex_property = 4\n >>> d.complex_property\n '8'\n >>> d.simple_property = 'hi'\n >>> d.simple_property\n 'hi'\n >>> interfaces.IFreezing(d)._z_frozen\n False\n >>> interfaces.IFreezing(d)._z_freeze()\n >>> interfaces.IFreezing(d)._z_frozen\n True\n >>> d.counter\n 1\n >>> d.increase()\n Traceback (most recent call last):\n ...\n FrozenError\n >>> d.counter\n 1\n >>> d.complex_property\n '8'\n >>> d.complex_property = 10\n Traceback (most recent call last):\n ...\n FrozenError\n >>> d.complex_property\n '8'\n >>> d.simple_property\n 'hi'\n >>> d.simple_property = 'bye'\n Traceback (most recent call last):\n ...\n FrozenError\n >>> d.simple_property\n 'hi'\n\n\n=======\nCHANGES\n=======\n\n1.2 (2011-04-08)\n================\n\n- Updated tests to run with ZTK 1.0.\n\n- Using Python's `doctest` module instead of the deprecated\n `zope.testing.doctest`.\n\n- Depend on a newer bug-fix version of `zope.locking`.\n\n\n1.1\n===\n\n(supports Zope 3.4/eggs)\n\n1.1b\n----\n\nSwitched to supporting eggs\n\n1.0\n===\n\n(supports Zope 3.3/no eggs)\n\n1.0.1\n-----\n\nRemoved the included rwproperty.py and added a dependency instead, as\nrwproperty is now available from pypi.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/zc.freeze", "keywords": "Zope Zope3 version freeze", "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "zc.freeze", "package_url": "https://pypi.org/project/zc.freeze/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/zc.freeze/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/zc.freeze" }, "release_url": "https://pypi.org/project/zc.freeze/1.2/", "requires_dist": null, "requires_python": null, "summary": "Pattern for freezing objects", "version": "1.2" }, "last_serial": 802176, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "e865241816d7eda4b883ae04b757e361", "sha256": "d7d3d2631872ce74e2ed29f6a86aa9efaf1be2e698abdecb790430dfd8014a2e" }, "downloads": -1, "filename": "zc.freeze-1.0-py2.4.egg", "has_sig": false, "md5_digest": "e865241816d7eda4b883ae04b757e361", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 18528, "upload_time": "2006-12-01T14:46:00", "url": "https://files.pythonhosted.org/packages/f8/bf/f86384b6b8b4c8cd89b390ed3815fb79d7e40b951f5d04315678da112002/zc.freeze-1.0-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "d2e06d9dbe8bed4c4b58c4abecedd887", "sha256": "1e257007c20883b56f0d773b48a1a6adaa460d978751b1d0f2c0b5d6b2467423" }, "downloads": -1, "filename": "zc.freeze-1.0.tar.gz", "has_sig": false, "md5_digest": "d2e06d9dbe8bed4c4b58c4abecedd887", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10737, "upload_time": "2006-12-01T04:42:55", "url": "https://files.pythonhosted.org/packages/3f/07/3e15175a4be1a02cb3dc991b5cb23251aa52e47802c3831d485c88d3d2ae/zc.freeze-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "432ce9b119021a56bc88bbc5722bf107", "sha256": "29a56d8c3e4f108f195f47e3ce18370a4b2048346d45e5de1d1287a9c9343bfe" }, "downloads": -1, "filename": "zc.freeze-1.0.1-py2.4.egg", "has_sig": false, "md5_digest": "432ce9b119021a56bc88bbc5722bf107", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 18889, "upload_time": "2007-07-04T19:04:53", "url": "https://files.pythonhosted.org/packages/60/81/85e5e692379aaf9ad0049672a1cd9ff8dc546016775e5b048bdf4bd8a253/zc.freeze-1.0.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "e272b180d013c835c823b92003d93e56", "sha256": "930ed65288cffaa8f552e3a62fe890be57de1bfbfbc5112e62c6b2739ee9b6ff" }, "downloads": -1, "filename": "zc.freeze-1.0.1.tar.gz", "has_sig": false, "md5_digest": "e272b180d013c835c823b92003d93e56", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10412, "upload_time": "2007-07-04T19:04:51", "url": "https://files.pythonhosted.org/packages/0b/3c/2f4a00da5cd8d7aec240cd6eec6e003c2a3c8d85339fdf2fef43a021cd64/zc.freeze-1.0.1.tar.gz" } ], "1.1b": [ { "comment_text": "", "digests": { "md5": "dff29027783b3989e69b56c7e6ff5c74", "sha256": "706ec8f0d0e74568ca9ef1c291107552928a2bec3ca36d87bcae4a535bc6ce8c" }, "downloads": -1, "filename": "zc.freeze-1.1b-py2.4.egg", "has_sig": false, "md5_digest": "dff29027783b3989e69b56c7e6ff5c74", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 19168, "upload_time": "2007-07-05T06:45:14", "url": "https://files.pythonhosted.org/packages/1a/09/bfc5b597a1ab3861ab59a18920f6fcf63c192cbca9907832c8913b55ee1d/zc.freeze-1.1b-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "88dd8b380fb1cfc9f199b07a80f3ce1b", "sha256": "f4593c6542a4ec0616213c6fc060cde8d1e3bea6bcca048adc0edeb4149489ac" }, "downloads": -1, "filename": "zc.freeze-1.1b.tar.gz", "has_sig": false, "md5_digest": "88dd8b380fb1cfc9f199b07a80f3ce1b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10754, "upload_time": "2007-07-05T06:45:13", "url": "https://files.pythonhosted.org/packages/02/04/946d5306495a1b4317a1813f48dc9b10f7883e3dccd500cfde84f4920e76/zc.freeze-1.1b.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "f95e46bef5357fbd6d3f19410de14ecb", "sha256": "da4bff1bb1ec3e98987a60fcc834032303df5c088fed3612aeb12a2723cab155" }, "downloads": -1, "filename": "zc.freeze-1.2.tar.gz", "has_sig": false, "md5_digest": "f95e46bef5357fbd6d3f19410de14ecb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10154, "upload_time": "2011-04-08T21:13:06", "url": "https://files.pythonhosted.org/packages/03/69/4c5036e97ab82ecec7e8bdb138796c02684178ca50a44b621a6b36407304/zc.freeze-1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f95e46bef5357fbd6d3f19410de14ecb", "sha256": "da4bff1bb1ec3e98987a60fcc834032303df5c088fed3612aeb12a2723cab155" }, "downloads": -1, "filename": "zc.freeze-1.2.tar.gz", "has_sig": false, "md5_digest": "f95e46bef5357fbd6d3f19410de14ecb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10154, "upload_time": "2011-04-08T21:13:06", "url": "https://files.pythonhosted.org/packages/03/69/4c5036e97ab82ecec7e8bdb138796c02684178ca50a44b621a6b36407304/zc.freeze-1.2.tar.gz" } ] }