{ "info": { "author": "Andrey Tkachenko", "author_email": "falko.lab@gmail.com", "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 :: Software Development :: User Interfaces" ], "description": "falkolab.resource components\r\n============================\r\n\r\nThis is set of components for extensible resources\r\n\r\n >>> from zope import component, interface\r\n >>> from falkolab.resource import interfaces, resourcetypes\r\n\r\n >>> import falkolab.resource\r\n >>> import os, os.path\r\n\r\n >>> import tempfile\r\n >>> scriptFileName = tempfile.mktemp('script.js')\r\n >>> open(scriptFileName, 'w').write('script data')\r\n >>> imageFileName = tempfile.mktemp('image.jpg')\r\n >>> open(imageFileName, 'w').write('jpg image data')\r\n >>> ptFileName = tempfile.mktemp('template.pt')\r\n >>> open(ptFileName, 'w').write('zope page template')\r\n\r\nNow we can register resources:\r\n\r\n >>> from zope.configuration import xmlconfig\r\n >>> import falkolab.resource\r\n >>> import zope.app.zcmlfiles\r\n \r\n >>> context = xmlconfig.file('configure.zcml', zope.app.zcmlfiles, execute=True)\r\n >>> context = xmlconfig.file('configure.zcml', zope.app.schema, context=context, execute=True) \r\n >>> context = xmlconfig.file('meta.zcml', falkolab.resource, context=context, execute=True)\r\n >>> context = xmlconfig.file('configure.zcml', falkolab.resource, context=context, execute=True) \r\n \r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ... \r\n ... \r\n ... \"\"\" % scriptFileName, context=context, execute=True)\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ... \r\n ... \r\n ... \"\"\" % imageFileName, context=context, execute=True)\r\n\r\nCheck if adapters are regitered:\r\n \r\n >>> from zope.publisher.browser import TestRequest\r\n >>> request = TestRequest()\r\n >>> response = request.response\r\n\r\n >>> resource = component.getAdapter(\r\n ... request, interface.Interface, name='resource.js')\r\n\r\n >>> resource\r\n \r\n\r\n >>> isinstance(resource.context, resourcetypes.File)\r\n True\r\n\r\n >>> resource = component.getAdapter(\r\n ... request, interface.Interface, name='image-resource')\r\n\r\n >>> resource\r\n \r\n\r\n >>> isinstance(resource.context, resourcetypes.Image)\r\n True\r\n\r\nWe can specify resource type explicitly\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ... \r\n ... \r\n ... \"\"\" % scriptFileName, context=context, execute=True)\r\n\r\n >>> resource = component.getAdapter(\r\n ... request, interface.Interface, name='image2-resource')\r\n\r\n >>> isinstance(resource.context, resourcetypes.Image)\r\n True\r\n\r\n\r\nCustom resource types\r\n---------------------\r\n\r\nWe can implement custom resource type. All you need is to define a class \r\nthat implement interface IResourceFactory.\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\t\t\r\n ... \r\n ... \"\"\", context=context, execute=True)\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ... \r\n ... \r\n ... \"\"\" %scriptFileName, context=context, execute=True)\r\n\r\n >>> resource = component.getAdapter(\r\n ... request, interface.Interface, name='custom-resource')\r\n\r\n >>> resource\r\n \r\n\r\n\r\nType substitution\r\n-----------------\r\n\r\nWe can substitute earlier registered type:\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\t\t\r\n ... \r\n ... \"\"\", context=context, execute=True)\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ... \r\n ... \r\n ... \"\"\" %ptFileName, context=context, execute=True)\r\n\r\n >>> resource = component.getAdapter(\r\n ... request, interface.Interface, name='pt-resource')\r\n\r\n >>> resource\r\n \r\n\r\n >>> os.unlink(scriptFileName)\r\n >>> os.unlink(imageFileName)\r\n >>> os.unlink(ptFileName)\r\n \r\n\r\nZRT resource\r\n------------\r\n\r\nFile names for ZRT resources must match one of following mask: *.zrt.css *.zrt.js *.zrt\r\nOr you must set type attribute: type=\"zrt\" \r\n\r\n >>> zrtFileName = tempfile.mktemp('style.zrt.css')\r\n >>> open(zrtFileName, 'w').write('''\\\r\n ... /* zrt-replace: \"foo\" \"bar\" */\r\n ... foo foo foo foo foo''')\r\n \r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ... \r\n ... \r\n ... \"\"\" %zrtFileName, context=context, execute=True)\r\n\r\n >>> resource = component.getAdapter(\r\n ... request, interface.Interface, name='zpt-resource')\r\n\r\n >>> resource\r\n \r\n\r\n >>> print resource.GET()\r\n bar bar bar bar bar\r\n \r\n >>> os.unlink(zrtFileName)\r\n \r\nWe can specify zrt commant with `property` subdirective. We also can cpecify\r\nresource type if file extension is not match zrt resource mask.\r\n \r\n >>> zrtFileName = tempfile.mktemp('style.css')\r\n >>> open(zrtFileName, 'w').write('''\\\r\n ... foo foo foo foo foo''')\r\n \r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ... \r\n ... \r\n ... \r\n ... \r\n ... \"\"\" %zrtFileName, context=context, execute=True)\r\n \r\n >>> resource = component.getAdapter(\r\n ... request, interface.Interface, name='zpt-resource-with-property')\r\n\r\n >>> print resource.GET()\r\n muu muu muu muu muu \r\n\r\n >>> os.unlink(zrtFileName)\r\n\r\n\r\nDirectory resource\r\n------------------\r\n\r\n >>> dirName = tempfile.mkdtemp()\r\n >>> os.mkdir(os.path.join(dirName, 'subfolder'))\r\n >>> open(os.path.join(dirName, 'script.js'), 'w').write('script data')\r\n >>> open(os.path.join(dirName, 'style.css'), 'w').write('style data')\r\n >>> open(os.path.join(dirName, 'image.png'), 'w').write('png image data')\r\n\r\nWe can register resource directory and specify allowed resource types:\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ...\t\t\r\n ...\r\n ... \r\n ... \"\"\" %(dirName + '_'), context=context, execute=True)\r\n Traceback (most recent call last):\r\n ...\r\n ZopeXMLConfigurationError: ...\r\n ConfigurationError: Directory ... does not exist\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ...\t\t\r\n ...\r\n ... \r\n ... \"\"\" %dirName, context=context, execute=True)\r\n\r\n\r\n >>> dirResource = component.getAdapter(\r\n ... request, interface.Interface, name='resdir')\r\n >>> dirResource\r\n \r\n\r\n >>> dirResource.browserDefault(request)\r\n (, ())\r\n\r\n >>> resource = None\r\n >>> resource = dirResource.publishTraverse(request, 'style.css')\r\n\r\n >>> resource\r\n \r\n\r\n >>> isinstance(resource.context, resourcetypes.File)\r\n True\r\n\r\n >>> print resource.GET()\r\n style data\r\n >>> print dirResource['style.css'].GET()\r\n style data\r\n\r\n >>> dirResource['notpresent.css']\r\n Traceback (most recent call last):\r\n ...\r\n KeyError: 'notpresent.css'\r\n\r\n >>> resource = None\r\n >>> resource = dirResource.publishTraverse(request, 'notpresent.css')\r\n Traceback (most recent call last):\r\n ...\r\n NotFound: ...\r\n\r\n >>> resource = dirResource.publishTraverse(request, 'image.png')\r\n >>> resource\r\n \r\n\r\n >>> isinstance(resource.context, resourcetypes.Image)\r\n True\r\n\r\n >>> print resource.GET()\r\n png image data\r\n\r\n >>> subdir = dirResource.publishTraverse(request, 'subfolder')\r\n >>> subdir\r\n \r\n\r\nWe can specify allowed resource types for directory:\r\n\r\n >>> context = xmlconfig.string(\"\"\"\r\n ... \r\n ...\r\n ...\t\t\r\n ...\t\t\t\r\n ...\t\t\r\n ...\r\n ... \r\n ... \"\"\" %dirName, context=context, execute=True)\r\n\r\n >>> dirResource = None\r\n >>> dirResource = component.getAdapter(\r\n ... request, interface.Interface, name='resdir2')\r\n\r\n >>> dirResource.types\r\n [u'image']\r\n\r\n >>> resource = dirResource.publishTraverse(request, 'style.css')\r\n Traceback (most recent call last):\r\n ...\r\n NotFound: ...\r\n\r\n >>> resource = dirResource.publishTraverse(request, 'image.png')\r\n >>> resource\r\n \r\n\r\n >>> isinstance(resource.context, resourcetypes.Image)\r\n True \r\n\r\n >>> os.unlink(os.path.join(dirName, 'script.js'))\r\n >>> os.unlink(os.path.join(dirName, 'style.css'))\r\n >>> os.unlink(os.path.join(dirName, 'image.png'))\r\n >>> os.rmdir(os.path.join(dirName, 'subfolder'))\r\n >>> os.rmdir(dirName)\r\n\r\nCHANGES\r\n=======\r\n\r\n1.0.3 (2009-08-21)\r\n------------------\r\n- Update tests\r\n- Some minor fixes\r\n\r\n1.0.2 (2009-03-13)\r\n------------------\r\n\r\n- BUGFIX: ZRT resource invalid property assignment\r\n\r\n1.0.1 (2009-03-13)\r\n------------------\r\n\r\n- BUGFIX: Impossibile to register two same named resources for different layers\r\n with same named property subdirectives\r\n\r\n1.0.0 (2009-03-11)\r\n------------------\r\n\r\n- First release", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "ZPL 2.1", "maintainer": "", "maintainer_email": "", "name": "falkolab.resource", "package_url": "https://pypi.org/project/falkolab.resource/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/falkolab.resource/", "project_urls": { "Download": "UNKNOWN" }, "release_url": "https://pypi.org/project/falkolab.resource/1.0.3/", "requires_dist": null, "requires_python": null, "summary": "Alternative extensible resource implementation.", "version": "1.0.3" }, "last_serial": 1675632, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "fc6906750c23e3e30fb0043b61b41e73", "sha256": "9724182b5c765035776da057c22dd196c109c983be91a96407124ca60de3aadd" }, "downloads": -1, "filename": "falkolab.resource-1.0.0-py2.4.egg", "has_sig": false, "md5_digest": "fc6906750c23e3e30fb0043b61b41e73", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 43638, "upload_time": "2009-03-11T11:18:50", "url": "https://files.pythonhosted.org/packages/3a/07/0d88a75ef7259bcebaffcd11d5a20fb58b38520ccbdc87a0d00fbaa7d921/falkolab.resource-1.0.0-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "2bd9cd1fe437b269241dbab3afec3a73", "sha256": "a0ca8aa9b5c74edc79f56d3a5fcb9ad18712e8adbf68df140597bab4005c4696" }, "downloads": -1, "filename": "falkolab.resource-1.0.0-py2.5.egg", "has_sig": false, "md5_digest": "2bd9cd1fe437b269241dbab3afec3a73", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 43205, "upload_time": "2009-03-11T11:18:45", "url": "https://files.pythonhosted.org/packages/d9/b4/24db9996a2e7745456f95e375ad0a37b6764f75e74223e98778d86082691/falkolab.resource-1.0.0-py2.5.egg" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "73ad76380fb961756d1c06c3c20bd996", "sha256": "d878f2e7e8d5c07b2e360baa461e299521b94d0aed0ec1dfce4c940581088af2" }, "downloads": -1, "filename": "falkolab.resource-1.0.1-py2.4.egg", "has_sig": false, "md5_digest": "73ad76380fb961756d1c06c3c20bd996", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 43728, "upload_time": "2009-03-13T10:14:52", "url": "https://files.pythonhosted.org/packages/60/d5/d6b7f8480ecf05714b7ec5d9aeea983f8b669d73bcfcb91c47ca5c578dd2/falkolab.resource-1.0.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "c1144e922e4c2f2ee3f9e001e7a5a0b0", "sha256": "6db6000938907e42ffb6ade98664dda293f6243c20d08aa7d99750d4eb5e8c02" }, "downloads": -1, "filename": "falkolab.resource-1.0.1-py2.5.egg", "has_sig": false, "md5_digest": "c1144e922e4c2f2ee3f9e001e7a5a0b0", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 43305, "upload_time": "2009-03-13T10:15:06", "url": "https://files.pythonhosted.org/packages/27/2e/9d376e869ed4919ff1c8b4fab33b47c2f5cecfe4b43e9c7483af95261350/falkolab.resource-1.0.1-py2.5.egg" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "4aa8c440b53568ddfc2261d8b932b657", "sha256": "38230c755b30cf4cb102b97b69e5f4e4424a08b3bb897ed342c07fb425813134" }, "downloads": -1, "filename": "falkolab.resource-1.0.2-py2.4.egg", "has_sig": false, "md5_digest": "4aa8c440b53568ddfc2261d8b932b657", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 43783, "upload_time": "2009-03-16T07:13:36", "url": "https://files.pythonhosted.org/packages/d1/9c/c7c26938d811c8b19b0ce68b11ac555b16eac6a369c0371b5eb72acd4b80/falkolab.resource-1.0.2-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "c72fa8dbf658d3773d706e4cff0055ed", "sha256": "c1422ca61a0edbb073327760df17af6f68e89eb105c14638eb7b7ef553c340ee" }, "downloads": -1, "filename": "falkolab.resource-1.0.2-py2.5.egg", "has_sig": false, "md5_digest": "c72fa8dbf658d3773d706e4cff0055ed", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 43361, "upload_time": "2009-03-16T07:13:31", "url": "https://files.pythonhosted.org/packages/c0/94/25c70d3e72d1dc035b65bbb83053a3ddc791820be64d4a155f20971f9283/falkolab.resource-1.0.2-py2.5.egg" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "2cac9eb45a4398bc28284741fb5f0e99", "sha256": "a6d24d5e818e70d13c2fb06b827cd82290913079e3162553129ae68dbf310fd2" }, "downloads": -1, "filename": "falkolab.resource-1.0.3-py2.4.egg", "has_sig": false, "md5_digest": "2cac9eb45a4398bc28284741fb5f0e99", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 41225, "upload_time": "2009-08-21T20:56:46", "url": "https://files.pythonhosted.org/packages/fd/15/9ab52bdb5f9dfbc23fe2b0bebbe9e3abd4a0e911d5446d4092d6bff73f75/falkolab.resource-1.0.3-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "0507fb3b9c9fb7ce0806d9c24052d736", "sha256": "03c40ae94c8c4de65efffc97bb4752139150718a3ee73fdc021b36356a1355d1" }, "downloads": -1, "filename": "falkolab.resource-1.0.3-py2.5.egg", "has_sig": false, "md5_digest": "0507fb3b9c9fb7ce0806d9c24052d736", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 40841, "upload_time": "2009-08-21T20:55:44", "url": "https://files.pythonhosted.org/packages/06/95/55c4337359f5ddc6f9ecc9973faa2b049d2c2af56e22e8f1cd2ebc2e6e12/falkolab.resource-1.0.3-py2.5.egg" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "2cac9eb45a4398bc28284741fb5f0e99", "sha256": "a6d24d5e818e70d13c2fb06b827cd82290913079e3162553129ae68dbf310fd2" }, "downloads": -1, "filename": "falkolab.resource-1.0.3-py2.4.egg", "has_sig": false, "md5_digest": "2cac9eb45a4398bc28284741fb5f0e99", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 41225, "upload_time": "2009-08-21T20:56:46", "url": "https://files.pythonhosted.org/packages/fd/15/9ab52bdb5f9dfbc23fe2b0bebbe9e3abd4a0e911d5446d4092d6bff73f75/falkolab.resource-1.0.3-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "0507fb3b9c9fb7ce0806d9c24052d736", "sha256": "03c40ae94c8c4de65efffc97bb4752139150718a3ee73fdc021b36356a1355d1" }, "downloads": -1, "filename": "falkolab.resource-1.0.3-py2.5.egg", "has_sig": false, "md5_digest": "0507fb3b9c9fb7ce0806d9c24052d736", "packagetype": "bdist_egg", "python_version": "2.5", "requires_python": null, "size": 40841, "upload_time": "2009-08-21T20:55:44", "url": "https://files.pythonhosted.org/packages/06/95/55c4337359f5ddc6f9ecc9973faa2b049d2c2af56e22e8f1cd2ebc2e6e12/falkolab.resource-1.0.3-py2.5.egg" } ] }