{ "info": { "author": "Zope Foundation and Contributors", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 6 - Mature", "Environment :: Web Environment", "Framework :: Zope :: 2", "Framework :: Zope :: 4", "License :: OSI Approved :: Zope Public License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "Overview\n========\n\nBTreeFolder2 is a Zope product that acts like a Zope 2 OFS folder but can\nstore many more items.\n\nWhen you fill a Zope folder with too many items, both Zope and your\nbrowser get overwhelmed. Zope has to load and store a large folder\nobject, and the browser has to render large HTML tables repeatedly.\nZope can store a lot of objects, but it has trouble storing a lot of\nobjects in a single standard folder.\n\nZope Corporation once had an extensive discussion on the subject. It\nwas decided that we would expand standard folders to handle large\nnumbers of objects gracefully. Unfortunately, Zope folders are used\nand extended in so many ways today that it would be difficult to\nmodify standard folders in a way that would be compatible with all\nZope products.\n\nSo the BTreeFolder product was born. It stored all subobjects in a\nZODB BTree, a structure designed to allow many items without loading\nthem all into memory. It also rendered the contents of the folder as\na simple select list rather than a table. Most browsers have no\ntrouble rendering large select lists.\n\nBut there was still one issue remaining. BTreeFolders still stored\nthe ID of all subobjects in a single database record. If you put tens\nof thousands of items in a single BTreeFolder, you would still be\nloading and storing a multi-megabyte folder object. Zope can do this,\nbut not quickly, and not without bloating the database.\n\nBTreeFolder2 solves this issue. It stores not only the subobjects but\nalso the IDs of the subobjects in a BTree. It also batches the list\nof items in the UI, showing only 1000 items at a time. So if you\nwrite your application carefully, you can use a BTreeFolder2 to store\nas many items as will fit in physical storage.\n\nThere are products that depend on the internal structure of the\noriginal BTreeFolder, however. So rather than risk breaking those\nproducts, the product has been renamed. You can have both products\ninstalled at the same time. If you're developing new applications,\nyou should use BTreeFolder2.\n\n\nUsage\n=====\n\nThe BTreeFolder2 user interface shows a list of items rather than a\nseries of checkboxes. To visit an item, select it in the list and\nclick the \"edit\" button.\n\nBTreeFolder2 objects provide Python dictionary-like methods to make them\neasier to use in Python code than standard folders::\n\n has_key(key)\n keys()\n values()\n items()\n get(key, default=None)\n __len__()\n\nkeys(), values(), and items() return sequences, but not necessarily\ntuples or lists. Use len(folder) to call the __len__() method. The\nobjects returned by values() and items() have acquisition wrappers.\n\nBTreeFolder2 also provides a method for generating unique,\nnon-overlapping IDs::\n\n generateId(prefix='item', suffix='', rand_ceiling=999999999)\n\nThe ID returned by this method is guaranteed to not clash with any\nother ID in the folder. Use the returned value as the ID for new\nobjects. The generated IDs tend to be sequential so that objects that\nare likely related in some way get loaded together.\n\nBTreeFolder2 implements the full Folder interface, with the exception\nthat the superValues() method does not return any items. To implement\nthe method in the way the Zope codebase expects would undermine the\nperformance benefits gained by using BTreeFolder2.\n\nChangelog\n=========\n\n4.2 (2019-03-08)\n----------------\n\n- Specify supported Python versions using ``python_requires`` in setup.py\n (`Zope#481 `_)\n\n- Drop support for Python 3.4 since Zope itself does not support it.\n\n- Add support for Python 3.8\n\n\n4.1 (2018-10-05)\n----------------\n\n- More PEP8 compliance.\n\n- Add icon for Bootstrap ZMI.\n\n- Avoid deprecation warnings by using current API.\n\n- Add support for Python 3.7.\n\n\n4.0.0 (2017-05-23)\n------------------\n\n- added tox configuration\n\n- Python 3 compatibility\n\n- Update to require and be compatible with Zope 4.\n\n3.0 (2016-07-18)\n----------------\n\n- Update Dependencies (no ZODB, but BTrees)\n\n2.14.0 (2015-06-18)\n-------------------\n\n- Require ExtensionClass >= 4.1a1 (Compatible w/ Zope 4).\n\n2.13.5 (2015-06-18)\n-------------------\n\n- Added case for clean-up routine where the meta type index contains\n keys that are not in the tree.\n\n2.13.4 (2011-12-12)\n-------------------\n\n- Provide security declaration for `BTreeFolder2Base.hasObject` method.\n\n- Add some tests for correct `getattr` behavior.\n\n- Minor `__getattr__` and `_getOb` optimizations.\n\n2.13.3 (2011-03-15)\n-------------------\n\n- `keys`, `values` and `items` methods are now exactly the same as\n `objectIds`, `objectValues` and `objectItems`. They did the same before\n already but duplicated the code.\n\n2.13.2 (2011-03-08)\n-------------------\n\n- `objectValues` and `objectItems` no longer do a special handling when no\n special `spec` is requested as `objectIds` already does the correct\n handling.\n\n2.13.1 (2010-08-04)\n-------------------\n\n- Make sure that methods returning objects return them Acquisition wrapped.\n\n- Be more careful in calling our own keys, values and items methods, as\n sub-classes might have overridden some of them.\n\n2.13.0 (2010-07-11)\n-------------------\n\n- Changed the `objectIds`, `objectItems` and `objectValues` methods to use the\n internal OOBTree methods directly if no `spec` argument is passed.\n\n- Change implementation of `keys`, `items` and `values` method to access the\n `self._tree` OOBTree methods directly. This avoids lookups in the meta_types\n structures.\n\n- Implement the full dictionary protocol including `__getitem__`,\n `__delitem__`, `__setitem__`, `__nonzero__`, `__iter__` and `__contains__`.\n\n- Released as separate package.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/zopefoundation/Products.BTreeFolder2", "keywords": "", "license": "ZPL 2.1", "maintainer": "", "maintainer_email": "", "name": "Products.BTreeFolder2", "package_url": "https://pypi.org/project/Products.BTreeFolder2/", "platform": "", "project_url": "https://pypi.org/project/Products.BTreeFolder2/", "project_urls": { "Homepage": "https://github.com/zopefoundation/Products.BTreeFolder2" }, "release_url": "https://pypi.org/project/Products.BTreeFolder2/4.2/", "requires_dist": [ "AccessControl", "Acquisition", "BTrees", "ExtensionClass (>=4.1a1)", "Persistence", "Zope2 (>=4.0a5)", "future", "setuptools", "six", "zope.container", "zope.event", "zope.lifecycleevent" ], "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*", "summary": "A BTree based implementation for Zope 2's OFS.", "version": "4.2" }, "last_serial": 4915349, "releases": { "2.13.0": [ { "comment_text": "", "digests": { "md5": "8b4f9155b99ea4e210c9f3f67b66a428", "sha256": "90a8db31d7e1a46deeb60aa52665e1bbb36165dbcde89101322bbfcf237f7aaa" }, "downloads": -1, "filename": "Products.BTreeFolder2-2.13.0.zip", "has_sig": false, "md5_digest": "8b4f9155b99ea4e210c9f3f67b66a428", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24739, "upload_time": "2010-07-11T15:12:41", "url": "https://files.pythonhosted.org/packages/2b/32/b067e0223bfdd917d76e4dea9fc98dcc80c2649a4638dc373b71cb9e9d08/Products.BTreeFolder2-2.13.0.zip" } ], "2.13.1": [ { "comment_text": "", "digests": { "md5": "f4622f6300fa5c85640429ed82096369", "sha256": "e961cc308289dda892a126dab09234cb607c7b699aa7c0b6e78a967c9b3c3ea3" }, "downloads": -1, "filename": "Products.BTreeFolder2-2.13.1.zip", "has_sig": false, "md5_digest": "f4622f6300fa5c85640429ed82096369", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25055, "upload_time": "2010-08-04T22:30:10", "url": "https://files.pythonhosted.org/packages/e4/87/29a5fc5be28617da4082ad4d3121c87804df4cdd9e8d868074ff4cabe12d/Products.BTreeFolder2-2.13.1.zip" } ], "2.13.2": [ { "comment_text": "", "digests": { "md5": "1d9672e14298e403cd8dc8ea6b93e35d", "sha256": "e547beca0318d5256cf427143d6f31ec82e5a13c405252d52384cc2f41c11cac" }, "downloads": -1, "filename": "Products.BTreeFolder2-2.13.2.zip", "has_sig": false, "md5_digest": "1d9672e14298e403cd8dc8ea6b93e35d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25258, "upload_time": "2011-03-08T13:31:02", "url": "https://files.pythonhosted.org/packages/f5/98/d8de182e051e9a7fa09f546c56ea6a76af5888279f5e8a49fcb2eef3eb10/Products.BTreeFolder2-2.13.2.zip" } ], "2.13.3": [ { "comment_text": "", "digests": { "md5": "f57c85673036af7ccd34c3fa251f6bb2", "sha256": "acdc5b63419d127822863d90337a92d27e6b497a268ff2126110ab40a87abf70" }, "downloads": -1, "filename": "Products.BTreeFolder2-2.13.3.tar.gz", "has_sig": false, "md5_digest": "f57c85673036af7ccd34c3fa251f6bb2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14884, "upload_time": "2011-03-15T09:29:12", "url": "https://files.pythonhosted.org/packages/7b/59/21628e28c468fd8bfc746b29ef710c762ca8992b40eec971ccf00bf4280d/Products.BTreeFolder2-2.13.3.tar.gz" } ], "2.13.4": [ { "comment_text": "", "digests": { "md5": "455a169eaf688e10b16fa749b3f91c07", "sha256": "775d276cdbed40e58fcc5ad78e708975d683756c633bb520c5b8af0583bbe8d9" }, "downloads": -1, "filename": "Products.BTreeFolder2-2.13.4.zip", "has_sig": false, "md5_digest": "455a169eaf688e10b16fa749b3f91c07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26030, "upload_time": "2011-12-12T13:59:05", "url": "https://files.pythonhosted.org/packages/32/55/4e9753e1d5926f3c2582dc11cae81aaaeb25484e2bb7124af0c1e27aa000/Products.BTreeFolder2-2.13.4.zip" } ], "2.13.5": [ { "comment_text": "", "digests": { "md5": "a4c36527f74c7029f7c1f4878c2be82a", "sha256": "991eabfeb9d5dce6f9331d4db63085d775ec4ffa22a2ea55fa0f219905a8f3b4" }, "downloads": -1, "filename": "Products.BTreeFolder2-2.13.5.tar.gz", "has_sig": true, "md5_digest": "a4c36527f74c7029f7c1f4878c2be82a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19173, "upload_time": "2015-06-19T01:54:50", "url": "https://files.pythonhosted.org/packages/4d/12/1de16313dcb659402709420e55bf3c823e657376906ad84ab99336f200e3/Products.BTreeFolder2-2.13.5.tar.gz" } ], "2.14.0": [ { "comment_text": "", "digests": { "md5": "e43f0d576ab9361a638a6794e7d0f4a6", "sha256": "d234839b43d4c9869c19daef0b9882a97b77e789c0557f7a0b7998607f037b5d" }, "downloads": -1, "filename": "Products.BTreeFolder2-2.14.0.tar.gz", "has_sig": true, "md5_digest": "e43f0d576ab9361a638a6794e7d0f4a6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18739, "upload_time": "2015-06-19T02:23:50", "url": "https://files.pythonhosted.org/packages/c4/dd/5da8431249f2e72bd31b500ec73b91aeca4b342afd44cba9094026d98e1b/Products.BTreeFolder2-2.14.0.tar.gz" } ], "3.0": [ { "comment_text": "", "digests": { "md5": "51f493642721736ad3cf50fd4ac199fc", "sha256": "fc9db0062dd6e568833e3805b00b31adbb2ec4a7cb96177ce0b1567976201269" }, "downloads": -1, "filename": "Products.BTreeFolder2-3.0.zip", "has_sig": false, "md5_digest": "51f493642721736ad3cf50fd4ac199fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24985, "upload_time": "2016-07-18T16:38:21", "url": "https://files.pythonhosted.org/packages/f2/d0/eb6134eeb2c6025a9a9ff739375e16a22810b8ad26e47c6dad6e139dad31/Products.BTreeFolder2-3.0.zip" } ], "4.0.0": [ { "comment_text": "", "digests": { "md5": "4d3d1b2b97408c3175c49f16d8ab872a", "sha256": "0f96c29c8c69c88aac9bf713bc18a29368194a2373013833a60fed3366554a65" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4d3d1b2b97408c3175c49f16d8ab872a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20070, "upload_time": "2017-05-28T20:21:28", "url": "https://files.pythonhosted.org/packages/17/67/0b7307fa665a70eb0014b251918f23168ed86eda365a1d3e329256813bf9/Products.BTreeFolder2-4.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f03fa027bb15706c1e0b69417c193bdd", "sha256": "055635eed6f5a3310b0f646b5cfeaf1bd7426ddbd4bc66927830ecf9cf08e327" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.0.0.tar.gz", "has_sig": false, "md5_digest": "f03fa027bb15706c1e0b69417c193bdd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17291, "upload_time": "2017-05-23T06:36:10", "url": "https://files.pythonhosted.org/packages/ff/4a/14bb5a185e9330d022d06496480a62d9157d919e747ae51d1e01e5d31372/Products.BTreeFolder2-4.0.0.tar.gz" } ], "4.1": [ { "comment_text": "", "digests": { "md5": "9ee370051bc1e1f27627cc8c61089abb", "sha256": "e2da5f037bcbe6842cf1c64d09cabf26deea0aa8ff4fa90678eb2e5ae431f14b" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9ee370051bc1e1f27627cc8c61089abb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19716, "upload_time": "2018-10-05T11:16:32", "url": "https://files.pythonhosted.org/packages/2f/a4/20aea976db06e15adb2c68254a554bd55bf2baa5c507306f18b70490e261/Products.BTreeFolder2-4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe8b8eeb09d0ebb23b07fab0642ab8f5", "sha256": "d53b514998b7d91957836023a7de14610a8b1f0124e2b80b0287aa5d1bc01ade" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.1.tar.gz", "has_sig": false, "md5_digest": "fe8b8eeb09d0ebb23b07fab0642ab8f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20004, "upload_time": "2018-10-05T11:16:34", "url": "https://files.pythonhosted.org/packages/59/bb/9fbb7d4dd06f5aee49a5cff8aed83d6797306008e9bcb7002e0d2d36bfc5/Products.BTreeFolder2-4.1.tar.gz" } ], "4.2": [ { "comment_text": "", "digests": { "md5": "943598f38a3f5f16e2897b6d3bb9dcb2", "sha256": "56f7a16253e7e9ee0870848140444a063eecff282841b7a4d822dcba56579040" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "943598f38a3f5f16e2897b6d3bb9dcb2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*", "size": 20024, "upload_time": "2019-03-08T13:03:31", "url": "https://files.pythonhosted.org/packages/06/0a/cdece0637ad4d9e15fe466802ee1729ebc861d75d46b5f2cd7dcf19fc090/Products.BTreeFolder2-4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "832d978630cb1fddd87990a247e2e340", "sha256": "8bd762b76fcc163d4ca0670d85cceaa735291c238706c3a2e6bf402ce1558198" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.2.tar.gz", "has_sig": false, "md5_digest": "832d978630cb1fddd87990a247e2e340", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*", "size": 20318, "upload_time": "2019-03-08T13:03:33", "url": "https://files.pythonhosted.org/packages/00/5b/0de0aa791024d45b1db192a055983aaa073191733e7eea7b1991c5507f3b/Products.BTreeFolder2-4.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "943598f38a3f5f16e2897b6d3bb9dcb2", "sha256": "56f7a16253e7e9ee0870848140444a063eecff282841b7a4d822dcba56579040" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "943598f38a3f5f16e2897b6d3bb9dcb2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*", "size": 20024, "upload_time": "2019-03-08T13:03:31", "url": "https://files.pythonhosted.org/packages/06/0a/cdece0637ad4d9e15fe466802ee1729ebc861d75d46b5f2cd7dcf19fc090/Products.BTreeFolder2-4.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "832d978630cb1fddd87990a247e2e340", "sha256": "8bd762b76fcc163d4ca0670d85cceaa735291c238706c3a2e6bf402ce1558198" }, "downloads": -1, "filename": "Products.BTreeFolder2-4.2.tar.gz", "has_sig": false, "md5_digest": "832d978630cb1fddd87990a247e2e340", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*", "size": 20318, "upload_time": "2019-03-08T13:03:33", "url": "https://files.pythonhosted.org/packages/00/5b/0de0aa791024d45b1db192a055983aaa073191733e7eea7b1991c5507f3b/Products.BTreeFolder2-4.2.tar.gz" } ] }