{ "info": { "author": "Matt Chisholm", "author_email": "matt-fragments@theory.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: Implementation", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "Fragments\n=========\n\n[![Build Status](https://secure.travis-ci.org/glyphobet/fragments.png)](http://travis-ci.org/glyphobet/fragments)\n\nFragments uses concepts from version control to replace many uses of templating languages.\nInstead of a templating language, it provides diff-based templating;\ninstead of revision control, it provides \"fragmentation control\".\n\nFragments is a [DRY (Don't Repeat Yourself)](http://en.wikipedia.org/wiki/Don't_repeat_yourself) violation manager;\nit is a [Multiple Source of Truth](http://en.wikipedia.org/wiki/Single_Source_of_Truth) engine.\n\nWhat is diff-based templating?\n------------------------------\n\nGenerating HTML with templating languages is difficult because templating languages often have two semi-incompatible purposes.\nThe first purpose is managing common HTML elements & structure: headers, sidebars, and footers; across multiple templates.\nThis is sometimes called page \"inheritance\".\nThe second purpose is to perform idiosyncratic display logic on data coming from another source.\nWhen these two purposes can be separated, templates can be much simpler.\n\nFragments manages this first purpose, common HTML elements and structure, with diff and merge algorithms.\nThe actual display logic is left to your application, or to a templating language whose templates are themselves managed by Fragments.\n\nWhat is fragmentation control?\n------------------------------\n\nThe machinery to manage common and different code fragments across multiple versions of _a single file_ already exists in modern version control systems.\nFragments adapts these tools to manage common and different versions of _several different files_.\n\nEach file is in effect its own \"branch\", and whenever you modify a file (\"branch\") you can apply (\"merge\") that change into whichever other files (\"branches\") you choose.\nIn this sense Fragments is a different kind of \"source control\"--rather than controlling versions/revisions over time, it controls fragments across many files that all exist simultaneously.\nHence the term \"fragmentation control\".\n\nAs I am a linguist, I have to point out that the distinction between [Synchronic](http://en.wikipedia.org/wiki/Synchronic_analysis) and [Diachronic](http://en.wikipedia.org/wiki/Diachronics) Linguistics gave me this idea in the first place.\n\nHow does it work?\n-----------------\n\nThe merge algorithm is a version of [Precise Codeville Merge](http://revctrl.org/PreciseCodevilleMerge) modified to support cherry-picking.\nPrecise Codeville Merge was chosen because it supports [accidental clean merges](http://revctrl.org/AccidentalCleanMerge) and [convergence](http://revctrl.org/Convergence).\nThat is, if two files are independently modified in the same way, they merge together cleanly.\nThis makes adding new files easy; use Fragment's `fork` command to create a new file based on other files (or just `cp` one of your files), change it as desired, and commit it.\nSubsequent changes to any un-modified, common sections, in that file or in its siblings, will be applicable across the rest of the repository.\n\nLike version control, you run Fragments on the command line each time you make a change to your HTML, not before each page render.\n\nWhat is it good for?\n--------------------\n\nFragments was designed with the task of simplifying large collections of HTML or HTML templates.\nIt could replace simpler CMS-managed websites with pure static HTML.\nIt could also handle several different translations of an HTML website, ensuring that the same HTML structure was wrapped around each translation of the content.\n\nBut Fragments is also not HTML specific.\nIf it's got newlines, Fragments can manage it.\nThat means XML, CSS, JSON, YAML, or source code from any programming language where newlines are common (sorry, Perl).\ncFragments is even smart enough to know not to merge totally different files together.\nYou could use it to manage a large set of configuration files for different servers and deployment configurations, for example.\nOr you could use it to manage bug fixes to that mess of duplicated source files on that legacy project you wish you didn't have to maintain.\n\nIn short, Fragments can be used anyplace where you have thought to yourself \"this group of files really is violating DRY\".\n\nIntegration with version control\n--------------------------------\n\nFragments has no history; It only stores the previous committed state of a file.\nStoring history is up to your version control system.\nBut Fragments stores its repository configuration in such a way to allow your version control system to manage it painlessly and obviously.\nConfiguration is stored in a `_fragments` directory.\nThis directory name is not preceded by a `.`, and all the files in it are stored as plain text.\nYou want to make sure to run `fragments init` from your repository root, which is usually at least one directory level above your actual content.\nOtherwise your `_fragments` directory may get accidentally deployed to production or interfere with template loaders.\n\nThe `rename` and `forget` commands in Fragments are written to not interfere with a version control's rename and remove commands, as these commands sometimes need to be used in tandem.\n\nInvisibility\n------------\n\nFragments is invisible to people who don't know it's being used.\nIf you (or someone else) make more than one change to a file, Fragments' `apply` command allows you to perform chunk-based interactive application of changes, similar to `git commit --patch` or `hg record`.\nSo, you can give a single HTML file to your web designer or junior programmer, let him or her modify it as desired.\nLater, you can selectively apply some of those changes across all other HTML files, while leaving other changes only in the modified file.\n\nInstallation\n------------\n\nFragments is [on PyPI](http://pypi.python.org/pypi/fragments).\nYou can install it with `pip install fragments`.\n\nUsage\n-----\n\nFragments installs a `fragments` command line script.\nLike version control, the first argument to Fragments is the command.\nAnd like version control, you must first `$ fragments init` a repository, then `$ fragments follow` some files, then `$ fragments commit` them.\nDeliberately different command names are used in some cases, to remind you that Fragments is not version control.\n\nIf you are red-green color-blind (protanopic or deutanopic), set the `COLORBLIND` environment variable to `protan` or `deutan` and fragments will use blue instead of green for displaying added lines.\n\n export COLORBLIND=protan\n\nCommands\n--------\n\n* `help [COMMAND]`\n\n Display global help, or help for _COMMAND_ if specified.\n\n* `init [FRAGMENTS_ROOT]`\n\n Initialize a new fragments repository.\n Repository is in a directory named `_fragments/`, created in either the current working directory, or _FRAGMENTS\\_ROOT_ if specified.\n\n* `status [[ -l | --limit] STATUS ] [FILENAME [FILENAME ...]]`\n\n Get the current status of the fragments repository, limited to _FILENAME_(s) if specified.\n Limit output to files with status _STATUS_, if present.\n\n* `follow FILENAME [FILENAME ...]`\n\n Start following changes to one or more _FILENAME_(s).\n\n* `forget FILENAME [FILENAME ...]`\n\n Stop following changes to one or more _FILENAME_(s).\n\n* `rename OLD_FILENAME NEW_FILENAME`\n\n Rename _OLD\\_FILENAME_ to _NEW\\_FILENAME_, moving the actual file on disk if it has not already been moved.\n\n* `diff [[-U | --unified] NUM] [FILENAME [FILENAME ...]]`\n\n Show differences between committed and uncommitted versions, limited to _FILENAME_(s) if specified.\n\n `-U NUM`, `--unified NUM` number of lines of context to show\n\n* `commit [FILENAME [FILENAME ...]]`\n\n Commit changes to the fragments repository, limited to _FILENAME_(s) if specified.\n\n* `revert [FILENAME [FILENAME ...]]`\n\n Revert changes to the fragments repository, limited to _FILENAME_(s) if specified.\n\n* `fork [[-U | --unified] NUM] SOURCE_FILENAME [SOURCE_FILENAME ...] TARGET_FILENAME`\n\n Create a new file in _TARGET\\_FILENAME_ based on one or more _SOURCE\\_FILENAME_(s).\n Large common sections are preserved;\n differing sections, and common sections shorter than _NUM_ lines between differing sections, are replaced with one newline for each line or conflict.\n\n* `apply [-i | -a] [[-U | --unified] NUM] SOURCE_FILENAME [TARGET_FILENAME [TARGET_FILENAME ...]]`\n\n Apply changes in _SOURCE\\_FILENAME_ that were made since last commit, where possible.\n Limit application to _TARGET\\_FILENAME_(s) if specified.\n Files that conflict in their entirety will be skipped.\n Smaller conflicts will be written to the file as conflict sections.\n\n `-i, --interactive` interactively select changes to apply\n\n `-a, --automatic` automatically apply all changes\n\n `-U NUM`, `--unified NUM` number of lines of context to show\n\n In interactive mode, you can use the following commands:\n\n * `y` include this change\n * `n` do not include this change\n * `a` include this change and all remaining changes\n * `d` done, do not include this change nor any remaining changes\n * `j` leave this change undecided, see next undecided change\n * `k` leave this change undecided, see previous undecided change\n * `?` interactive apply mode help\n\nFuture improvements\n-------------------\n\n### Preprocessors\n\nSince Fragments is diff-based, it will not do well with minified or otherwise compressed content.\nDo not expect it to handle changes to your 10,000 character, single line, \u00fcber-compressed CSS or JavaScript file, or to the inline JavaScript function in an `onclick` attribute in your HTML.\nThe more newlines there are in your files, the more robust Fragments' merging will be.\n\nAdding preprocessors to enforce consistent newline placement and indentation across all followed files would potentially make Fragments' merging even more robust.\nThe preprocessors would run before `commit`, `fork`, and `apply`, and there would be different preprocessors for different file formats.\n\n### Miscellaneous improvements\n\n* Better command-line completion mode for bash\n* Command-line completion mode for zsh\n* Command aliasing and default configuration\n* Pluggable diff & merge algorithms, if they prove useful\n\nCredits\n-------\n\nFragments is Copyright 2012 by Matt Chisholm, and is released under the BSD License.\nIt is available [on GitHub](https://github.com/glyphobet/fragments) and [on PyPI](http://pypi.python.org/pypi/fragments).\nMany thanks to Ross Cohen for his thoughts on the idea, and for preparing Precise Codeville Merge for use in Fragments.", "description_content_type": null, "docs_url": "https://pythonhosted.org/fragments/", "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/glyphobet/fragments", "keywords": null, "license": "BSD License", "maintainer": null, "maintainer_email": null, "name": "fragments", "package_url": "https://pypi.org/project/fragments/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/fragments/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/glyphobet/fragments" }, "release_url": "https://pypi.org/project/fragments/1.2.4/", "requires_dist": null, "requires_python": null, "summary": "tool for diff-based templating / fragmentation control", "version": "1.2.4" }, "last_serial": 774936, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "32e9fd0a9342c7fa7f42cf7ecccb33f4", "sha256": "70422dd30052af35010c35e85a10bf90d148c785778f68877ea70e345eec041a" }, "downloads": -1, "filename": "fragments-1.0.0-py2.7.egg", "has_sig": false, "md5_digest": "32e9fd0a9342c7fa7f42cf7ecccb33f4", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 40089, "upload_time": "2012-06-03T15:08:03", "url": "https://files.pythonhosted.org/packages/ad/ed/9b69d06de005d62c0acc264956959f16815bdc3bba1f0701fea2632e6521/fragments-1.0.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "7f27fb2b5db988e1932dd163e9d8f611", "sha256": "0218603561765af43d9769b785addb7ab01a70bea28e2dd068596cd1f4b40f17" }, "downloads": -1, "filename": "fragments-1.0.0.tar.gz", "has_sig": false, "md5_digest": "7f27fb2b5db988e1932dd163e9d8f611", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14930, "upload_time": "2012-06-03T15:08:21", "url": "https://files.pythonhosted.org/packages/55/36/37d2b2b502d6941931fb64eef40401e8efbf0b62b027585747eb87046972/fragments-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "e9bfed7da549d837f2875b97cd994561", "sha256": "e5074e65fa1b19ec776df0a99ee3720d2f8cd425a8c4ca26447c27bdf924fb36" }, "downloads": -1, "filename": "fragments-1.0.1-py2.7.egg", "has_sig": false, "md5_digest": "e9bfed7da549d837f2875b97cd994561", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 40124, "upload_time": "2012-06-03T15:29:15", "url": "https://files.pythonhosted.org/packages/e3/83/ae8cbec7a03a7458a971d14617fa1f719ea5f8e52f4b178aeb661a744ca8/fragments-1.0.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "0e5216866fe578c8ec2a89898e6322c5", "sha256": "8a0b769748795d1f95977b1876d5d73a624370660630612e3b2fc6a15e006be4" }, "downloads": -1, "filename": "fragments-1.0.1.tar.gz", "has_sig": false, "md5_digest": "0e5216866fe578c8ec2a89898e6322c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16767, "upload_time": "2012-06-03T15:29:29", "url": "https://files.pythonhosted.org/packages/de/6c/b40d7b5dcd2b474bda290722188d6af5fd0b7911ec1e2392cfbf5061488e/fragments-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "68bf99517c095df4852978f7c1e9c9e5", "sha256": "d88f596d9636bc563a1071c6ba4111e08d5b970aeb3b7df444083c42fbcb68be" }, "downloads": -1, "filename": "fragments-1.1.0-py2.7.egg", "has_sig": false, "md5_digest": "68bf99517c095df4852978f7c1e9c9e5", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 40955, "upload_time": "2012-06-15T00:31:35", "url": "https://files.pythonhosted.org/packages/f7/40/b69e213045110b2b7516b0d89c662e88177ec8ed85783279dca701177c57/fragments-1.1.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "95fd021456cdabd4c29bedad47f9d17d", "sha256": "5d6b2bacae4cb7d271cd4f560ee1889108ed8312759f8b13b107c1c36089e4dd" }, "downloads": -1, "filename": "fragments-1.1.0.tar.gz", "has_sig": false, "md5_digest": "95fd021456cdabd4c29bedad47f9d17d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17398, "upload_time": "2012-06-15T00:31:43", "url": "https://files.pythonhosted.org/packages/d5/1a/f921c935345a01b51b5a96468aae7d685328efce3840988c2ff4a0bdebba/fragments-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "af7bbe515291abcb50a7e882d960ff8f", "sha256": "48d4acd162e033ee8c286e789f4cc8ceef28ec958d6da4f62d0bfff3be432a93" }, "downloads": -1, "filename": "fragments-1.1.1-py2.7.egg", "has_sig": false, "md5_digest": "af7bbe515291abcb50a7e882d960ff8f", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 42240, "upload_time": "2012-06-23T23:52:54", "url": "https://files.pythonhosted.org/packages/b2/db/9cb9af8709f92bfd5c56c82cf8d29007adfe95686f8cfbc1bc9cf3958619/fragments-1.1.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "bfba93cf6922d3e913ae0476235354b2", "sha256": "fbd96439a1975533f46e21e6e3fee0759391fc8cf803a566cf3a8cd210e59c54" }, "downloads": -1, "filename": "fragments-1.1.1.tar.gz", "has_sig": false, "md5_digest": "bfba93cf6922d3e913ae0476235354b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17826, "upload_time": "2012-06-23T23:53:01", "url": "https://files.pythonhosted.org/packages/ec/24/1c49e82bacf237fa8d9b88971109afccc5f68a8d4ab1a1c1eed01b355a28/fragments-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "b028b3a77e0e3844fbb73d0e9adecd08", "sha256": "0c2f4d47a01aee498271d628d7fa9452da381346cb5f0bf16dbc19bf2929f997" }, "downloads": -1, "filename": "fragments-1.2.0-py2.7.egg", "has_sig": false, "md5_digest": "b028b3a77e0e3844fbb73d0e9adecd08", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 42515, "upload_time": "2012-07-09T23:33:51", "url": "https://files.pythonhosted.org/packages/a4/3d/15967ea20f72303b2942df3e80f3ae0c4bcb08ac513bff58690c0d3247fa/fragments-1.2.0-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "a2e1d27a4816e69ba80bbd7e97e5cae6", "sha256": "df76c563a65789534423d31a6a43825a02e7177d45b00ed8ca4a9ea91c6f3fe3" }, "downloads": -1, "filename": "fragments-1.2.0.tar.gz", "has_sig": false, "md5_digest": "a2e1d27a4816e69ba80bbd7e97e5cae6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17905, "upload_time": "2012-07-09T23:34:00", "url": "https://files.pythonhosted.org/packages/31/6b/c259f0b3355b2c6339363b59406a904ad5ee79b35eb8bbeb07be19495569/fragments-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "162bcafd1a58978f2581c33d2d2bd789", "sha256": "7dff67d63fb1378cedafa5050e6174171618eb8fe79e9fa8502da30e4c0bdc41" }, "downloads": -1, "filename": "fragments-1.2.1-py2.7.egg", "has_sig": false, "md5_digest": "162bcafd1a58978f2581c33d2d2bd789", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 42612, "upload_time": "2012-10-09T21:47:03", "url": "https://files.pythonhosted.org/packages/9c/81/74ddd7506586e6bd94b6818c44538872651aeee45c2c695ac434af9f1fa6/fragments-1.2.1-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "abd8316a67f5f0cfe26a775ca556855b", "sha256": "982bdea64b82e9e5e9b24a74c70e380b61a8e3fc9dff40e047e83cc657032dd5" }, "downloads": -1, "filename": "fragments-1.2.1.tar.gz", "has_sig": false, "md5_digest": "abd8316a67f5f0cfe26a775ca556855b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18027, "upload_time": "2012-10-09T21:47:23", "url": "https://files.pythonhosted.org/packages/f6/71/9858884c79e6a36d640a2996c2a77dae850182042d5aa624ae31cdc68f97/fragments-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "8e0c8335b084058d056c9f97013fb8db", "sha256": "bb0c35da3434fd79124e30b83946652fa922031fccd4b391b4955faa228d171a" }, "downloads": -1, "filename": "fragments-1.2.2-py2.7.egg", "has_sig": false, "md5_digest": "8e0c8335b084058d056c9f97013fb8db", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 42850, "upload_time": "2012-10-12T15:42:26", "url": "https://files.pythonhosted.org/packages/e9/e8/2beff73bc4682f37e615f07bf5c3257b62ccbc613447b1033ea75297f17f/fragments-1.2.2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "cb9fd74ab0d08560ac09be8ab7afdeee", "sha256": "ab4170da462dfa793e1359137ce2c529548ea441f19b05a54d18384604e88df9" }, "downloads": -1, "filename": "fragments-1.2.2.tar.gz", "has_sig": false, "md5_digest": "cb9fd74ab0d08560ac09be8ab7afdeee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18172, "upload_time": "2012-10-12T15:43:01", "url": "https://files.pythonhosted.org/packages/63/15/c20b9a99007c97f510ac7519c3e791e1e194b8194df06f3d3258fde27faa/fragments-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "858d99f64130b88cd57f7e601c5a9fe4", "sha256": "42b9b2c1a2f5f47966ebe1409cbfe12d0fd0dfe83e95edc9c5114cc47033ca30" }, "downloads": -1, "filename": "fragments-1.2.3-py2.7.egg", "has_sig": false, "md5_digest": "858d99f64130b88cd57f7e601c5a9fe4", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 43544, "upload_time": "2012-11-06T20:14:42", "url": "https://files.pythonhosted.org/packages/5d/0e/25c5fd7e23b961ac212a37c46e51c8491f8a5db0d0d23ea7c223eaf6ff5c/fragments-1.2.3-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "5a3e08a3bdee18b2967873ce1c826c38", "sha256": "40c4a3cd0e23e737d3aed47c72b3b6adff7617f5403e87aae299913aa6032daf" }, "downloads": -1, "filename": "fragments-1.2.3.tar.gz", "has_sig": false, "md5_digest": "5a3e08a3bdee18b2967873ce1c826c38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18455, "upload_time": "2012-11-06T20:15:02", "url": "https://files.pythonhosted.org/packages/db/9a/d1cc8ab86b4877a67c3206d4a140b901e1f925a0981508e00dc0139ead39/fragments-1.2.3.tar.gz" } ], "1.2.4": [ { "comment_text": "", "digests": { "md5": "64d8162cc700d2f4a559a28cd1e733d8", "sha256": "86972d9a2a4fe0ddf2c8fc4742dba1e1e201e8b3a0545f9b538f0f0084eb8ca3" }, "downloads": -1, "filename": "fragments-1.2.4-py2.7.egg", "has_sig": false, "md5_digest": "64d8162cc700d2f4a559a28cd1e733d8", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 43665, "upload_time": "2013-02-28T15:44:12", "url": "https://files.pythonhosted.org/packages/7d/c8/740b4c99b442b67188f6106a2eb8f775f35d11bd5a4cb7a5b0a8755e5a42/fragments-1.2.4-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "b80b8782e7bb8336d07258bca985a1fc", "sha256": "2fbb5b986d75b5cc7907912aef544906f5121e9d85c5145ed53848892d3fccd0" }, "downloads": -1, "filename": "fragments-1.2.4.tar.gz", "has_sig": false, "md5_digest": "b80b8782e7bb8336d07258bca985a1fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18514, "upload_time": "2013-02-28T15:44:19", "url": "https://files.pythonhosted.org/packages/58/7a/272f188c9b2cae42fdbcf7e563a2042d25458dd1d6e568b3f6ec9d4ba58e/fragments-1.2.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "64d8162cc700d2f4a559a28cd1e733d8", "sha256": "86972d9a2a4fe0ddf2c8fc4742dba1e1e201e8b3a0545f9b538f0f0084eb8ca3" }, "downloads": -1, "filename": "fragments-1.2.4-py2.7.egg", "has_sig": false, "md5_digest": "64d8162cc700d2f4a559a28cd1e733d8", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 43665, "upload_time": "2013-02-28T15:44:12", "url": "https://files.pythonhosted.org/packages/7d/c8/740b4c99b442b67188f6106a2eb8f775f35d11bd5a4cb7a5b0a8755e5a42/fragments-1.2.4-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "b80b8782e7bb8336d07258bca985a1fc", "sha256": "2fbb5b986d75b5cc7907912aef544906f5121e9d85c5145ed53848892d3fccd0" }, "downloads": -1, "filename": "fragments-1.2.4.tar.gz", "has_sig": false, "md5_digest": "b80b8782e7bb8336d07258bca985a1fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18514, "upload_time": "2013-02-28T15:44:19", "url": "https://files.pythonhosted.org/packages/58/7a/272f188c9b2cae42fdbcf7e563a2042d25458dd1d6e568b3f6ec9d4ba58e/fragments-1.2.4.tar.gz" } ] }