{ "info": { "author": "Zope Corporation and Contributors", "author_email": "zope-dev@zope.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "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" ], "description": "===============================\nZope 3 Controlled Package Index\n===============================\n\nThis package has been developed to support the maintenance of a stable set of\nZope project distributions. It manages the controlled packages configuration\nfile and supports the generation of buildout configuration files that can be\nused by developers.\n\nAnother use of this package is to use it for testing new distributions against\nthe index. Here is the workflow for testing a new package against stable set:\n\n1. Install the correct version of this package.\n\n (a) Download the version of this package that manages the stable set that\n you are interested in. Currently only the trunk exists, which manages\n the Zope 3.4 release::\n\n $ svn co svn://svn.zope.org/repos/main/zope.release/trunk zope3.4\n $ cd zope3.4\n\n (b) Bootstrap the checkout::\n\n $ python ./bootstrap.py\n\n (c) Run buildout to create the scripts::\n\n $ ./bin/buildout\n\n (d) Run the ``buildout.cfg`` generation script to build a configuration\n file that can be used for testing:\n\n $ ./bin/generate-buildout\n\n2. From the generated configuration file, you can now build a testing\n environment.\n\n (a) Enter the test directory and create a buildout:\n\n $ cd test\n $ python ../bootstrap.py\n $ ./bin/buildout\n\n (b) Run all the tests to verify that all tests are initially passing:\n\n $ ./bin/test -vpc1\n\n3. Modify the ``buildout.cfg`` to look for your the new distribution to be\n tested:\n\n (a) Comment out the \"index\" option. This needs to be done, so that the new\n package is going to be picked up.\n\n (b) Change the version number of the package of interest in the \"versions\"\n section.\n\n Alternative:\n\n (a) Check out the new distribution from SVN.\n\n (b) Add a \"develop path/to/my/package\" line in the \"buildout\" section of\n ``buildout.cfg``.\n\n4. Run the tests, making sure that they all pass.\n\n5. Modify ``controlled-packages.cfg`` by adding the new version of the package\n to the package's version list.\n\n6. Generate all files again and upload them:\n\n $ cd ..\n $ ./bin/generate-buildout\n $ ./bin/generate-versions\n $ ./bin/upload\n\n Once the files are uploaded, a crontab-job, running every minute, will\n detect the changes in ``controlled-pages.cfg`` and will generate the new\n controlled package pages.\n\nNote: I think the process is still a tiny bit too long. I probably write a\nscript that makes testing a new version of a package easier, but let's see\nwhether this process is workable first.\n\n\n===============\nKnown Good Sets\n===============\n\nThis package provides a set of scripts and tools to manage Good-Known-Sets, or\nshort KGSs. A KGS is a set of package distributions that are known to work\nwell together. You can verify this, for example, by running all the tests of\nall the packages at once.\n\nLet me show you how a typical controlled packages configuration file looks\nlike:\n\n >>> import tempfile\n >>> cfgFile = tempfile.mktemp('-cp.cfg')\n >>> open(cfgFile, 'w').write('''\\\n ... [DEFAULT]\n ... tested = true\n ...\n ... [KGS]\n ... name = zope-dev\n ... version = 1.2.0\n ... date = 2009-01-01\n ... changelog = CHANGES.txt\n ... announcement = ANNOUNCEMENT.txt\n ... files =\n ... zope-dev-1.2.0.tgz\n ... zope-dev-1.2.0.zip\n ... zope-dev-1.2.0.exe\n ...\n ... [packageA]\n ... versions = 1.0.0\n ... 1.0.1\n ...\n ... [packageB]\n ... versions = 1.2.3\n ... test-extras = test\n ...\n ... [packageC]\n ... # Do not test this package.\n ... tested = false\n ... versions = 4.3.1\n ... ''')\n\nAs you can see, this file uses an INI-style format. The \"DEFAULT\" section is\nspecial, as it will insert the specified options into all other sections as\ndefault. The \"KGS\" section specifies some global information about the KGS,\nsuch as the name of the KGS. Since this section references several external\nfiles, we should quickly create those.\n\n >>> import os\n >>> dir = os.path.dirname(cfgFile)\n\n >>> open(os.path.join(dir, 'CHANGES.txt'), 'w').write('''\\\n ... =======\n ... Changes\n ... =======\n ...\n ... packageA\n ... ========\n ...\n ... Version 1.0.0\n ... -------------\n ...\n ... * Initial Release\n ... ''')\n\n >>> open(os.path.join(dir, 'ANNOUNCEMENT.txt'), 'w').write('''\\\n ... =======================\n ... zope-dev 1.2.0 Released\n ... =======================\n ...\n ... The announcement text!\n ... ''')\n\n >>> open(os.path.join(dir, 'zope-dev-1.2.0.tgz'), 'w').write('tgz')\n >>> open(os.path.join(dir, 'zope-dev-1.2.0.exe'), 'w').write('exe')\n\nAll other sections refer to package names. Currently each package section\nsupports two options. The \"versions\" option lists all versions that are known\nto work in the KGS. Those versions should *always* only be bug fixes to the\nfirst listed version. The second option, \"tested\", specifies whether the\npackage should be part of the KGS test suite. By default, we want all packages\nto be tested, but some packages require very specific test setups that cannot\nbe easily reproduced _[1], so we turn off those tests.\n\nYou can also stack controlled package configurations on top of each\nother. Base configurations can be specified using the `extends` option:\n\n >>> import tempfile\n >>> cfgFile2 = tempfile.mktemp('-cp.cfg')\n >>> open(cfgFile2, 'w').write('''\\\n ... [DEFAULT]\n ... tested = true\n ...\n ... [KGS]\n ... name = grok-dev\n ... version = 0.1.0\n ... extends = %s\n ...\n ... [packageA]\n ... versions = 1.0.2\n ...\n ... [packageD]\n ... versions = 2.2.3\n ... 2.2.4\n ... ''' %cfgFile)\n\nAs you can see, you can completely override another package's version\nspecification as well.\n\nGenerating the configuration file and managing it is actually the hard\npart. Let's now see what we can do with it.\n\n.. [1]: This is usually due to bugs in setuptools or buildout, such as PYC\nfiles not containing the correct reference to their PY file.\n\n\nGenerate Versions\n-----------------\n\nOne of the easiest scripts, is the version generation. This script will\ngenerate a \"versions\" section that is compatible with buildout.\n\n >>> versionsFile = tempfile.mktemp('-versions.cfg')\n\n >>> from zope.kgs import version\n >>> version.main((cfgFile, versionsFile))\n\n >>> print open(versionsFile, 'r').read()\n [versions]\n packageA = 1.0.1\n packageB = 1.2.3\n packageC = 4.3.1\n\nLet's now ensure that the versions also work for the extended configuration:\n\n >>> versionsFile2 = tempfile.mktemp('-versions.cfg')\n\n >>> version.main((cfgFile2, versionsFile2))\n\n >>> print open(versionsFile2, 'r').read()\n [versions]\n packageA = 1.0.2\n packageB = 1.2.3\n packageC = 4.3.1\n packageD = 2.2.4\n\n\nGenerate Buildout\n-----------------\n\nIn order to be able to test the KGS, you can also generate a full buildout\nfile that will create and install a testrunner over all packages for you:\n\n >>> buildoutFile = tempfile.mktemp('-buildout.cfg')\n\n >>> from zope.kgs import buildout\n >>> buildout.main((cfgFile, buildoutFile))\n\n >>> print open(buildoutFile, 'r').read()\n [buildout]\n parts = test\n versions = versions\n \n [test]\n recipe = zc.recipe.testrunner\n eggs = packageA\n packageB [test]\n \n [versions]\n packageA = 1.0.1\n packageB = 1.2.3\n packageC = 4.3.1\n \n\nLet's make sure that the buildout generation also honors the extensions:\n\n >>> buildoutFile2 = tempfile.mktemp('-buildout.cfg')\n\n >>> buildout.main((cfgFile2, buildoutFile2))\n\n >>> print open(buildoutFile2, 'r').read()\n [buildout]\n parts = test\n versions = versions\n \n [test]\n recipe = zc.recipe.testrunner\n eggs = packageA\n packageB [test]\n packageD\n \n [versions]\n packageA = 1.0.2\n packageB = 1.2.3\n packageC = 4.3.1\n packageD = 2.2.4\n \n\n\nFlat Links Pages\n----------------\n\nWe can also create a flat links page that can be used in the\n`dependency_links` argument in your `setup.py` file. Since this module\naccesses the original PyPI to ask for the download locations and filenames, we\nhave to create a controlled packages configuration file that contains real\npackages with real version numbers:\n\n >>> cfgFileReal = tempfile.mktemp('-cp.cfg')\n >>> open(cfgFileReal, 'w').write('''\\\n ... [DEFAULT]\n ... tested = true\n ...\n ... [KGS]\n ... name = zope-dev\n ... version = 3.4.0b2\n ...\n ... [PIL]\n ... versions = 1.1.6\n ...\n ... [zope.component]\n ... versions = 3.4.0\n ...\n ... [zope.interface]\n ... versions = 3.4.0\n ... 3.4.1\n ...\n ... [z3c.formdemo]\n ... versions = 1.1.0\n ... ''')\n\nLet's now create the links page:\n\n >>> linksFile = tempfile.mktemp('-links.html')\n\n >>> from zope.kgs import link\n >>> link.main((cfgFileReal, linksFile))\n\n >>> print open(linksFile, 'r').read()\n \n \n Links for the \"zope-dev\" KGS (version 3.4.0b2)\n \n \n

Links for the \"zope-dev\" KGS (version 3.4.0b2)

\n z3c.formdemo-1.1.0-py2.4.egg
\n z3c.formdemo-1.1.0.tar.gz
\n zope.component-3.4.0-py2.4.egg
\n zope.component-3.4.0.tar.gz
\n zope.interface-3.4.0.tar.gz
\n zope.interface-3.4.0-py2.4-win32.egg
\n zope.interface-3.4.1.tar.gz
\n \n \n\n\nPPIX Support\n------------\n\nYou can also use the KGS to limit the available packages in a package index\ngenerated ``zc.mirrorcheeseshopslashsimple``. This script also uses PyPI to\nlook up distribution file, so wave to use the real configuration file again.\n\nLet's create the pages:\n\n >>> indexDir = tempfile.mkdtemp('-ppix')\n\n >>> from zope.kgs import ppix\n >>> ppix.main((cfgFileReal, indexDir))\n\nThe index contains one directory per package. So let's have a look:\n\n >>> import os\n >>> sorted(os.listdir(indexDir))\n ['PIL', 'z3c.formdemo', 'zope.component', 'zope.interface']\n\nEach directory contains a single \"index.html\" file with the download links:\n\n >>> pkgDir = os.path.join(indexDir, 'zope.component')\n >>> sorted(os.listdir(pkgDir))\n ['index.html']\n\n >>> pkgIndex = os.path.join(pkgDir, 'index.html')\n >>> print open(pkgIndex, 'r').read()\n \n \n Links for \"zope.component\"\n \n \n

Links for \"zope.component\"

\n zope.component-3.4.0-py2.4.egg
\n zope.component-3.4.0.tar.gz
\n \n \n\nPIL is an interesting case, because it does not upload its distribution files\nyet, at least not for version 1.1.6:\n\n >>> pkgIndex = os.path.join(indexDir, 'PIL', 'index.html')\n >>> print open(pkgIndex, 'r').read()\n Links for PIL

Links for PIL

1.1.5 home_page
\n 1.1.5 download_url
\n 1.1.5a2 home_page
\n 1.1.5a2 download_url
\n 1.1.5a1 home_page
\n 1.1.5a1 download_url
\n 1.1.4 home_page
\n 1.1.3 home_page
\n 1.1.3 download_url
\n 1.1.6 home_page
\n 1.1.6 download_url
\n \n\nOptionally, you can also specify the `-i` option to generate an overview:\n\n >>> ppix.main(('-i', cfgFileReal, indexDir))\n\n >>> sorted(os.listdir(indexDir))\n ['PIL', 'index.html', 'z3c.formdemo', 'zope.component', 'zope.interface']\n\nLet's now look at the file:\n\n >>> indexPage = os.path.join(indexDir, 'index.html')\n >>> print open(indexPage, 'r').read()\n \n \n Simple Index for the \"zope-dev\" KGS (version 3.4.0b2)\n \n \n

Simple Index for the \"zope-dev\" KGS (version 3.4.0b2)

\n PIL
\n z3c.formdemo
\n zope.component
\n zope.interface
\n \n \n\nAllowing exisitng package pages to be overwritten and making the main index\npage an optional feature makes it possible to use this script for two use\ncases: (1) Merge the constraints into a PPIX index created by\n``zc.mirrorcheeseshopslashsimple``, and (2) create a standalone index which\nonly provides the packages of the KGS.\n\n\nGetting the Latest Versions\n---------------------------\n\nWhen updating the KGS, it is often useful to know for which packages have new\nreleases.\n\n >>> from zope.kgs import latest\n >>> latest.main((cfgFileReal,))\n z3c.formdemo: 1.1.1, 1.1.2, 1.2.0, 1.3.0, 1.3.0b1, 1.4.0, ...\n\nHowever, it is often desired only to show new minor versions; in this case, we\ncan pass an option to exclude all versions that have a different major\nversion:\n\n >>> latest.main(('-m', cfgFileReal))\n z3c.formdemo: 1.1.1, 1.1.2\n\nSometimes you're only interested in changes that apply to a single package,\nand you won't want to wait for the script to query all of the others\n\n >>> latest.main(('-m', cfgFileReal, 'zope.app.server'))\n\n >>> latest.main(('-m', cfgFileReal, 'z3c.formdemo'))\n z3c.formdemo: 1.1.1, 1.1.2\n\n\nExtracting Change Information\n-----------------------------\n\nWhen releasing a version of the KGS, it is desirable to produce a list of\nchanges since the last release. Changes are commonly compared to an older\nversion.\n\n >>> cfgFileRealOrig = tempfile.mktemp('-cp.cfg')\n >>> open(cfgFileRealOrig, 'w').write('''\\\n ... [DEFAULT]\n ... tested = true\n ...\n ... [KGS]\n ... name = zope-dev\n ... version = 3.4.0b1\n ...\n ... [PIL]\n ... versions = 1.1.6\n ...\n ... [zope.component]\n ... versions = 3.4.0\n ...\n ... [zope.interface]\n ... versions = 3.4.0\n ... ''')\n\nLet's now produce the changes:\n\n >>> from zope.kgs import change\n >>> change.main((cfgFileReal, cfgFileRealOrig))\n Processing ('PIL', '1.1.6')\n Processing ('z3c.formdemo', '1.1.0')\n Processing ('zope.component', '3.4.0')\n Processing ('zope.interface', '3.4.1')\n ===\n PIL\n ===\n \n No changes or information not found.\n \n ============\n z3c.formdemo\n ============\n \n 1.1.0 (unknown)\n ---------------\n \n - Feature: New \"SQL Message\" demo shows how ``z3c.form`` can be used with\n non-object data. Specificically, this small application demonstrates using a\n Gadfly database using pure SQL calls without any ORM.\n \n - Feature: New \"Address Book\" demo that demonstrates more complex use cases,\n such as subforms, composite widgets, and mappings/lists\n \n \n ==============\n zope.component\n ==============\n \n 3.4.0 (2007-09-29)\n ------------------\n \n No further changes since 3.4.0a1.\n \n \n ==============\n zope.interface\n ==============\n \n 3.4.1 (unknown)\n ---------------\n \n Fixed a setup bug that prevented installation from source on systems\n without setuptools.\n \n 3.4.0 (unknown)\n ---------------\n \n Final release for 3.4.0.\n \n \n\n\nYou can also create the changes without an original file, in which case only\nthe versions listed in the current KGS are considered.\n\n >>> change.main((cfgFileReal,))\n Processing ('PIL', '1.1.6')\n Processing ('z3c.formdemo', '1.1.0')\n Processing ('zope.component', '3.4.0')\n Processing ('zope.interface', '3.4.1')\n ===\n PIL\n ===\n \n No changes or information not found.\n \n ============\n z3c.formdemo\n ============\n \n 1.1.0 (unknown)\n ---------------\n \n - Feature: New \"SQL Message\" demo shows how ``z3c.form`` can be used with\n non-object data. Specificically, this small application demonstrates using a\n Gadfly database using pure SQL calls without any ORM.\n \n - Feature: New \"Address Book\" demo that demonstrates more complex use cases,\n such as subforms, composite widgets, and mappings/lists\n \n \n ==============\n zope.component\n ==============\n \n 3.4.0 (2007-09-29)\n ------------------\n \n No further changes since 3.4.0a1.\n \n \n ==============\n zope.interface\n ==============\n \n 3.4.1 (unknown)\n ---------------\n \n Fixed a setup bug that prevented installation from source on systems\n without setuptools.\n \n 3.4.0 (unknown)\n ---------------\n \n Final release for 3.4.0.\n \n \n\n\nThe Site Generator\n------------------\n\nThe easiest way to publish the KGS is via a directory published by a Web\nserver. Whenever a new `controlled-packages.cfg` file is uploaded, a script is\nrun that generates all the files. I usually set up a crontab job to do\nthis. The site generator script acts upon a directory, in which it assumes a\n`controlled-packages.cfg` file was placed:\n\n >>> siteDir = tempfile.mkdtemp()\n >>> cfgFileSite = os.path.join(siteDir, 'controlled-packages.cfg')\n\n >>> import shutil\n >>> shutil.copy(cfgFileReal, cfgFileSite)\n\n >>> from zope.kgs import site\n >>> site.main(['-s', siteDir])\n\nLet's have a look at the generated files:\n\n >>> from pprint import pprint\n >>> pprint(sorted(os.listdir(siteDir)))\n ['3.4.0b2', 'index.html', 'intro.html', 'resources']\n\n >>> sorted(os.listdir(os.path.join(siteDir, '3.4.0b2')))\n ['ANNOUNCEMENT.html', 'CHANGES.html',\n 'buildout.cfg', 'controlled-packages.cfg', 'index', 'index.html',\n 'links.html', 'minimal', 'versions.cfg']\n\n >>> sorted(os.listdir(os.path.join(siteDir, '3.4.0b2', 'minimal')))\n ['PIL', 'index.html', 'z3c.formdemo', 'zope.component', 'zope.interface']\n\nIf you try to generate the site again without adding the controlled packages\nconfig file to the site directory again, it will simply return:\n\n >>> site.main(['-s', siteDir])\n\n\nBasic Parser API\n----------------\n\nThe ``kgs.py`` module provides a simple class that parses the KGS\nconfiguration file and provides all data in an object-oriented manner.\n\n >>> from zope.kgs import kgs\n\nThe class is simply instnatiated using the path to the config file:\n\n >>> myKGS = kgs.KGS(cfgFile)\n >>> myKGS\n \n\nThe name, version and date of the KGS is available via:\n\n >>> myKGS.name\n 'zope-dev'\n >>> myKGS.version\n '1.2.0'\n >>> myKGS.date\n datetime.date(2009, 1, 1)\n\nWhen the changelog and/or announcement files are available, the KGS references\nthe absolute path:\n\n >>> myKGS.changelog\n '.../CHANGES.txt'\n >>> myKGS.announcement\n '.../ANNOUNCEMENT.txt'\n\nThe same is true for other release-related files:\n\n >>> myKGS.files\n ('.../zope-dev-1.2.0.tgz',\n '.../zope-dev-1.2.0.exe')\n\nThe packages are available under `packages`:\n\n >>> myKGS.packages\n [, , ]\n\nEach package is also an object:\n\n >>> pkgA = myKGS.packages[0]\n >>> pkgA\n \n\n >>> pkgA.name\n 'packageA'\n >>> pkgA.versions\n ['1.0.0', '1.0.1']\n >>> pkgA.tested\n True\n\nAs we have seen in the scripts above, the KGS class also supports the\n`entends` option. Thus, let's load the KGS for the config file 2:\n\n >>> myKGS2 = kgs.KGS(cfgFile2)\n >>> myKGS2\n \n\n >>> myKGS2.name\n 'grok-dev'\n\n >>> myKGS2.packages\n [,\n ,\n ,\n ]\n\n\n=======\nCHANGES\n=======\n\n1.2.0 (2009-07-24)\n------------------\n\n- Add ability to specify the extra-includes for running tests.\n\n1.1.0 (2009-02-01)\n------------------\n\n- Added '--no-links', '--no-index', and '--no-minimal-index' options to the\n site generation sctipt to make it faster.\n\n- Generating list of latest versions does not fail anymore, if downloading and\n parsing of the index page fails.\n\n- Update links to PyPI web sites.\n\n1.0.1 (2009-01-29)\n------------------\n\n- Fix documentation in all scripts, fixing missing imports and incorrect\n wording.\n\n- The package should depend on `python-dateutl` and not `datetutil`, since the\n latter is not available in PyPI anymore.\n\n1.0.0 (2009-01-29)\n------------------\n\n- Initial version as ``zope.kgs``.\n\n * A script that extracts the relevant part of the changelog of each package\n in the KGS.\n\n * A script that lists all versions of a package released after the latest\n version listed in the KGS.\n\n * A script that manages the generation of the entire KGS site.\n\n + Generates generic and version-specific pages.\n\n + Page generation is template-based for easy customization.\n\n * Generate `links.html` file which lists all controlled packages files.\n\n * Features copied from ``zope.release``:\n\n + Parser for KGS configuration files.\n\n + Generate `versions.cfg` and `buildout.cfg` script.\n\n * Features copied from ``zc.mirrorcheeseshopslashsimple``:\n\n + Generate new index pages for the controlled packages.", "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/zope.kgs", "keywords": "zope3 setuptools egg kgs", "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "zope.kgs", "package_url": "https://pypi.org/project/zope.kgs/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/zope.kgs/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/zope.kgs" }, "release_url": "https://pypi.org/project/zope.kgs/1.2.0/", "requires_dist": null, "requires_python": null, "summary": "Known-Good-Set (KGS) Support", "version": "1.2.0" }, "last_serial": 805511, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "2d5171d389dac405e36deddb8bb26361", "sha256": "12ce0a3d5a003e70ccec74ec9367b1f9d6779819516a21016c74e00bd56906a8" }, "downloads": -1, "filename": "zope.kgs-1.0.0.tar.gz", "has_sig": false, "md5_digest": "2d5171d389dac405e36deddb8bb26361", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62518, "upload_time": "2009-01-29T07:53:22", "url": "https://files.pythonhosted.org/packages/73/88/62356e5f7d8a2a58519ec763028946052d5640a11a672d18e5e28cd9eb27/zope.kgs-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "eb286625c64bc3f1a9501bc5458bc79b", "sha256": "1ebb3c5f11ed3375a8ff67e356b722bda367bdd0cd0922eb119c1f45ede2bec2" }, "downloads": -1, "filename": "zope.kgs-1.0.1.tar.gz", "has_sig": false, "md5_digest": "eb286625c64bc3f1a9501bc5458bc79b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62676, "upload_time": "2009-01-30T02:10:06", "url": "https://files.pythonhosted.org/packages/bf/91/06906c5533ae7e6609da0f0cf8d43109da97111fb763aa5046ef4283eb44/zope.kgs-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "3edac14166603c42501a4bdaa82d09bc", "sha256": "e1227b0a3a16736195a3c6cc3bda3dde28b17632e2eaddf12b5da9b68283f4bf" }, "downloads": -1, "filename": "zope.kgs-1.1.0.tar.gz", "has_sig": false, "md5_digest": "3edac14166603c42501a4bdaa82d09bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63114, "upload_time": "2009-02-02T05:39:56", "url": "https://files.pythonhosted.org/packages/3c/90/d9e2f950c60ef1d90afb40934e35877eba219958c2d8b2d44ea96a2740b4/zope.kgs-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "15ed01a270bddcf253b1c08479549692", "sha256": "5499bb2bb7305f663276d62cd92a21a1980b092225915ed9a15cc7dfa464b988" }, "downloads": -1, "filename": "zope.kgs-1.2.0.tar.gz", "has_sig": false, "md5_digest": "15ed01a270bddcf253b1c08479549692", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63850, "upload_time": "2009-07-24T17:48:47", "url": "https://files.pythonhosted.org/packages/f9/b4/5aff45eb5ea0d08db57187860481d7cf98c6819f3b41b4e7f3f6666c6d2c/zope.kgs-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "15ed01a270bddcf253b1c08479549692", "sha256": "5499bb2bb7305f663276d62cd92a21a1980b092225915ed9a15cc7dfa464b988" }, "downloads": -1, "filename": "zope.kgs-1.2.0.tar.gz", "has_sig": false, "md5_digest": "15ed01a270bddcf253b1c08479549692", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63850, "upload_time": "2009-07-24T17:48:47", "url": "https://files.pythonhosted.org/packages/f9/b4/5aff45eb5ea0d08db57187860481d7cf98c6819f3b41b4e7f3f6666c6d2c/zope.kgs-1.2.0.tar.gz" } ] }