{ "info": { "author": "", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": ".. note:: For the latest source, please visit the\n `Bitbucket repository `_\n\n\nStuffer - simplified, container-friendly provisioning\n=====================================================\n\nStuffer is a provisioning tool designed to be simple, and to be used in simple scenarios, primarily\nfor provisioning container images.\n\nDocumentation is hosted on ``_. The source code lives at\n``_.\n\n\nProject status\n--------------\n\nAlpha. Raw but usable.\n\nWhile stuffer is in alpha stage, i.e. version 0.0.x, the interface may change with any release.\n\nUse cases\n---------\n\nStuffer is primarily intended to be used for provisioing container images, Docker in particular. As\na secondary use case, it can be used to provision non-production machines, e.g. developer machines.\n\nMore complex provisioning tools, such as Puppet, Chef, and Ansible, are intended for bringing a\nmachine in an arbitrary state to a desired state. This turns out not to be possible in practice, and\nproduction machines manages with such tools tend to suffer from deviations from intended state,\ne.g. outdated dependency packages. At the other end of the complexity scale, good old bash has\nlittle support for reuse and for encoding decided best practices. Stuffer provides a middle road,\naiming to keep the simplicity of shell commands, augmented with support for sharing constructs\nbetween projects.\n\nStuffer is primarily intended for building a machine from scratch to the desired state. Since the\ninitial state is known, much of the complexity of existing provisioning tools is unnecessary. For\nexample, during an image build, running services need not be considered nor restarted.\n\nOverview\n--------\n\nStuffer is installed through pip3. It is based on Python 3, so plain pip will not work unless Python\n3 is default on your platform.\n::\n\n sudo apt-get update && apt-get install -y python3-pip\n sudo pip3 install stuffer\n\n\n\nStuffer uses a Python embedded DSL for specifying provisioning directives. It is typically invoked\nwith one or more command arguments on the command line, e.g.:\n::\n\n stuffer 'apt.Install(\"mercurial\")'\n\nMultiple arguments are concatenated into a multiple line Python recipe:\n::\n\n stuffer \\\n 'for pkg in \"mercurial\", \"gradle\", \"python-nose\":' \\\n ' print(\"Installing\", pkg)' \\\n ' apt.Install(pkg)'\n\nWhen provisioning Docker containers, stuffer should typically be invoked multiple times, since it\nallows Docker to use the local cache efficiently:\n::\n\nRUN stuffer 'apt.Install(\"mercurial\")'\nRUN stuffer 'apt.Install(\"gradle\")'\nRUN stuffer 'apt.Install(\"python-nose\")'\n\n\nReused recipes can be factored out into Python modules for easier reuse:\n::\n\n stuffer 'development.Tools()'\n\nIn development.py:\n::\n\n from stuffer.core import Group\n\n class Tools(Group):\n def children(self):\n return [apt.Install(p) for p in \"mercurial\", \"gradle\", \"python-nose\"]\n\n\nIt is also possible to create composite actions by explicitly executing other actions. Example from stuffer.contrib.docker:\n::\n\nclass Prologue(Action):\n \"\"\"Check that the Docker base image is sound and prepare the image.\"\"\"\n\n def run(self):\n # Check that the image is ok\n ...\n # Always needed, or apt install complains.\n apt.Install(['apt-utils']).execute()\n\n\nStuffer comes with builtin knowledge of Docker practices, and helps you steer away from common\nmistakes, and towards best practices. There is not consensus on a single set of Docker best\npractices, but stuffer provides a means to express your organisation's decided practices in code, instead\nof educating all developers on the right incantations and rituals.\n\n::\n\n Dockerfile:\n FROM phusion/baseimage:0.9.18\n\n RUN stuffer 'docker.Prologue()' # Verifies e.g. that base image is sound.\n\n RUN stuffer 'apt.Install(\"some-package\")' \n\n RUN stuffer 'apt.SourceList(\"deb http://some.external.repository.com stable non-free\")'\n RUN stuffer 'apt.Install(\"other-package\")' # Automatically runs 'apt-get update' before 'apt-get install'\n\n RUN stuffer 'docker.Epilogue()' # Cleans temporary files.\n\n\n\nDesign goals\n------------\n\nStuffer design gives priority to:\n\n- Simplicity of use. No knowledge about the tool should be required in order to use it for simple scenarios by copying\n examples. Some simplicity in the implementation is sacrificed in order to make the usage interface simple. Actions\n are named similarly to the corresponding shell commands.\n\n- Transparency. Whenever reasonable, actions are translated to shell commands. All actions are logged.\n\n- Ease of reuse. It should be simple to extract commands from snippets and convert them to reusable modules without a\n rewrite. Therefore, both the DSL and modules are written in Python.\n\n- Docker cache friendliness. Images built with similar commands should be able to share a prefix of commands in order\n to benefit from Docker image caching.\n\n- No dislike factors. Provisioning tools tend to be loved and/or hated by users, for various\n reasons. There might be no reason to be passionately enamoured with stuffer, but there should be\n no reason to have a strong dislike for it, given that you approve of Python and Docker.\n\n- Ease of debugging. Debugging stuffer recipes should be as easy as debugging standard Python programs.\n\n- Avoid reinventing wheels. Use existing Python modules or external tools for tasks that have\n already been solved. Give priority to reusing existing code over minimising dependencies. In\n particular, use Python 3 and `click `_ to save boilerplate.\n\n\nMoreover, the project model is design to facilitate sharing and reuse of code between users, see below.\n\n\nDSL\n---\n\nThe DSL is designed to be comprehensible by readers that are not familiar with stuffer. For example,\nthe command apt.Install(\"mypack\") runs \"apt-get install mypack\". There is a balance between\nconvenience and comprehensibility. Stuffer in most cases shuns magic that would create\nconvenience in preference for more understandable code.\n\nThe DSL is also designed to make it easy to do things that are correct and work well with\ncontainers, and difficult to do things that do not harmonise with containers.\n\nThe DSL is designed to be tool friendly (with IntelliJ/PyCharm and pylint in particular), both for\nwriting stuff files and for working on stuffer itself. For example, all imports are explicitly\ndeclared in order to make package structure comprehensible for tools.\n\nPython conventions are used for naming, i.e. CamelCase classes and snake_case functions.\n\n\nActions\n```````\n\nEach desired mutation of a container is represented by an Action. There are Actions for installing\npackages, changing file contents, setting configuration variables, etc. The different types of\nactions are represented by different subclasses of Action. Implementations of Action should be\nidempotent; stuffer will not perform any checks whether the Action is redundant, and each Action\nspecified will be run. Many system administration commands are naturally idempotent, e.g. ``apt-get\ninstall``. For Actions that are not, the Action implementation needs to include appropriate checks.\n\nImplementations of Action specify what commands to execute by overrinding either ``Action.command``\nor ``Action.run``.\n\n\nPrerequisites\n`````````````\n\nActions may specify that another Action needs to have been executed before ``Action.run`` by\noverriding ``Action.prerequisites``. For example, ``pip.Install`` specifies that the ``pip`` command\nmust be installed before using it to install other packages. Although the same effect can be\nachieved by explicitly running the required preparatory steps inside ``Action.run``, it is more\nnatural to separate the prerequisites from the command specified by the user. It also allows a\npotential future version of stuffer to keep track of executed prerequisites and avoid redundant\nexecutions.\n\n\nPassing state\n`````````````\n\nA container provisioning recipe typically consists of multiple stuffer invocations. The invocations\ndo not share state, except for the container file system. Hence, if you need to pass state between\ninvocations, you will need to save state in the file system.\n\nStuffer provides a simple key/value store mechanism to pass state between invocations via files in\nthe container file system. Use `store.set_value `_ to store values, and\n`store.get `_ to retrieve them. The naming convention for keys is\nlower snake case, separated by dots for hierarchical organisation,\ne.g. ``my_corp.databases.mysql.preferred_driver``. The prefix `stuffer.`` is reserved for stuffer\ncomponents, which should use key names corresponding to the stuffer package name,\ne.g. ``stuffer.apt.update_needed``.\n\nThe values in the store are plain strings.\n\n\nDeveloping stuffer\n------------------\n\nCollaboration model\n```````````````````\n\nUsers are allowed to put recipes under sites/ for others to get inspired. This model may not scale,\nbut as long as the number of users is small, there is value in sharing and showing each other code\nsnippets, in order to extract pieces of common value.\n\nSnippets worth reuse can be put under stuffer/contrib/. Files under stuffer/contrib are expected to\nbe maintained by the contributor.\n\nRoutines for installing third-party software should also go under stuffer/contrib.\n\n\nContributing\n````````````\n\nNew code should be covered with integration tests. Avoid unit tests - since the purpose of stuffer is integration,\nthere is little value testing scenarios that are not authentic. Strive to figure out a way to test functionality with\nDocker containers.\n\nIn order to run the test suite, run ``tox`` in the project root directory. The continuous\nintegration build also bulds the documentation and performs a distribution build. See `shippable.yml\n`_\nfor the exact commands.\n\nWhen tests pass, fork ``_, push your code to the fork, and\ncreate a pull request.\n\n\nBuild and release\n`````````````````\n\nContinuous integration builds are run with `Shippable\n`_. Shippable builds a release package for\nevery merge or push to master branch. If the version number is higher than the current version on\n``_, the CI build uploads a new release. Hence, in order to make a new\nrelease, update the version number in main.py and setup.py before merging to master.\n\n\nDeployment\n``````````\n\nInstall the latest version with ``pip3 install stuffer``, depending on the default python version in\nyour environment.\n\nIn order to create an installable distribution package from the source directory, run ``./setup.py\nsdist`` from the project root directory. Install with ``pip3 install dist/stuffer-*.tar.gz``.\n\n\nQ & A\n-----\n\nQ: Stuffer sounds similar to `Packer `_. What is the relation?\n\nA: Packer is a tool for creating a container, given that you provide stuff to put in the\ncontainer. Stuffer is a way to express what stuff to put in a container, given that you provide a\nway to pack the container. They can be used together, if desired. Packer is made by `Hashicorp\n`_, who have no relation to Stuffer.\n\nQ: I think that Docker containers should be built according to the following principle: . Why doesn't stuffer do that?\n\nA: There is no single best way to build Docker images. There are tradeoffs involved. Stuffer gives\nyou a way to express your preferences, and package it as code, reusable by your colleagues. Feel\nfree to submit a PR that implements your preferences as an optional strategy.\n\nQ: Does it scale to more complex scenarios? Can I see some examples?\n\nA: You can find some non-trivial examples at\n``_.\n\n\nKnown issues\n------------\n\nThere is a name clash between the `click command line parser library `_ and\na Ubuntu python package for handling the click packaging format. Hence, you might run into trouble\nif you have the former installed on your machine, or in the Docker images that you wish to build. At\nthis point, you can either solve it by removing the conflicting package, or by installing stuffer in\na virtual environment (virtualenv).\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://bitbucket.org/mapflat/stuffer", "keywords": "", "license": "", "maintainer": "Lars Albertsson", "maintainer_email": "lalle@mapflat.com", "name": "stuffer", "package_url": "https://pypi.org/project/stuffer/", "platform": "", "project_url": "https://pypi.org/project/stuffer/", "project_urls": { "Homepage": "http://bitbucket.org/mapflat/stuffer" }, "release_url": "https://pypi.org/project/stuffer/0.0.10/", "requires_dist": [ "click" ], "requires_python": "", "summary": "Simplified, container-friendly provisioning", "version": "0.0.10" }, "last_serial": 4922534, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "9d04bd49c7813c2ce51a2246035ec27a", "sha256": "cf461d9944c09834507c4e65ebea1655db035ff3ebbdff1acd90b40fa8ef1dad" }, "downloads": -1, "filename": "stuffer-0.0.1.tar.gz", "has_sig": false, "md5_digest": "9d04bd49c7813c2ce51a2246035ec27a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 71856, "upload_time": "2017-06-11T09:38:56", "url": "https://files.pythonhosted.org/packages/f8/8f/34c7c01ec5d3ea642fc4d6c65233abffd2e0ce51b6fed4e5cc0f22302541/stuffer-0.0.1.tar.gz" } ], "0.0.10": [ { "comment_text": "", "digests": { "md5": "a21c3f8603f2c7f641fb07636c5e246e", "sha256": "99de505054c9647e8294c2de2b1becc66b36965fa6ab9ac5621d41b509d36a2c" }, "downloads": -1, "filename": "stuffer-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "a21c3f8603f2c7f641fb07636c5e246e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29723, "upload_time": "2019-03-10T20:08:38", "url": "https://files.pythonhosted.org/packages/78/c8/a79046605879b2e88d64941a64acefb69c9a9f8b63fe151cbbd797c659a1/stuffer-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b0b6f7c6926e3e7856b0972a11503080", "sha256": "8e870f7e2c21dd5dd061f72314657309cd6bc3ad1118b9f4625488fa061f89a6" }, "downloads": -1, "filename": "stuffer-0.0.10.tar.gz", "has_sig": false, "md5_digest": "b0b6f7c6926e3e7856b0972a11503080", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22411, "upload_time": "2019-03-10T20:08:40", "url": "https://files.pythonhosted.org/packages/84/d9/c9c6eef0972e60dcbba69efa913ad58866cd42821d17eb4a342c1ca9158f/stuffer-0.0.10.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "b4603d75af9d741bec81319d48041bb5", "sha256": "a869dc28fa4cfe73baf589bdcb0ecdf5a4b6ad1324f91efc7787012caca57e6d" }, "downloads": -1, "filename": "stuffer-0.0.2.tar.gz", "has_sig": false, "md5_digest": "b4603d75af9d741bec81319d48041bb5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 72049, "upload_time": "2017-06-11T11:43:47", "url": "https://files.pythonhosted.org/packages/36/23/bd87e0297f1b4004b86c0440234edcf482691251fea0517a1e3b1c54b445/stuffer-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "6f7be01dab485a334ea79fdb59711e5b", "sha256": "e21fbf90fc1aa29f806f2c46793bde01e9b5d4741c8b8eb8888f4acf04fe6795" }, "downloads": -1, "filename": "stuffer-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "6f7be01dab485a334ea79fdb59711e5b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15139, "upload_time": "2017-07-10T12:04:34", "url": "https://files.pythonhosted.org/packages/9e/a0/cd37e97f78bc69891f91d91c01b704fb5a8f820a33049217b052d4a83f61/stuffer-0.0.3-py3-none-any.whl" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "dd56f4c82847e3c681e7541958473615", "sha256": "c9981621f873b22167b0ca09cfc05e4c1fae74dd23b20833e7f0905531f9372c" }, "downloads": -1, "filename": "stuffer-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "dd56f4c82847e3c681e7541958473615", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15143, "upload_time": "2017-07-10T12:15:57", "url": "https://files.pythonhosted.org/packages/62/a0/3badba04e38e576413edb5e27e30911e1c062d666fcad35950fd1471ae80/stuffer-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c6f5c69407c6043967dfc8159f33599", "sha256": "0c3390ec14e30e97830e139c4480429b2889a114a8c87cc70b2117314162714d" }, "downloads": -1, "filename": "stuffer-0.0.4.tar.gz", "has_sig": false, "md5_digest": "5c6f5c69407c6043967dfc8159f33599", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10763, "upload_time": "2017-07-10T12:16:00", "url": "https://files.pythonhosted.org/packages/ad/83/2c0b769d09d5fe325e74b4e36d74f6db59d26e9aa35bfb38c02032a374ee/stuffer-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "850d55d48c4826422a5f514ea31fbad2", "sha256": "9c6cf627e641cbaf09eeaee8ffacae51efa9b787f2e119879fa24726e2cb60ed" }, "downloads": -1, "filename": "stuffer-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "850d55d48c4826422a5f514ea31fbad2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21223, "upload_time": "2017-07-11T19:38:25", "url": "https://files.pythonhosted.org/packages/76/24/caa893d15a7e0ddfdfc80f0ea7ef614932f5a9945eb6c0f2fbbb534a5c88/stuffer-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ad9ba61ee4b977897b55c6e7d36af2e", "sha256": "84ca04c153d5a30174bf43ec267c4429d1f320534e664b93c11a8eb5e57700bd" }, "downloads": -1, "filename": "stuffer-0.0.5.tar.gz", "has_sig": false, "md5_digest": "0ad9ba61ee4b977897b55c6e7d36af2e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13999, "upload_time": "2017-07-11T19:38:26", "url": "https://files.pythonhosted.org/packages/21/46/85860f2b2114b18d3f996b0d1c16a8c24a5c3cc4f4f1bfd6f8d636af2c5d/stuffer-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "62f34c9c6404f05fd10ad25e2e726d58", "sha256": "521a8337b1299912597123b4f2aac323743b172d6731d79725f0b96e33075ac2" }, "downloads": -1, "filename": "stuffer-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "62f34c9c6404f05fd10ad25e2e726d58", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28708, "upload_time": "2017-09-08T20:16:11", "url": "https://files.pythonhosted.org/packages/3a/17/3473a2fed6a541a86154bd1708470379a872319f3e8a18cb52e31a783576/stuffer-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "35fc2c377cc35d049bcf4e71ff0da5c2", "sha256": "93f1de49728ddbbd69f404368365c1c61ef3596b92d2bcefd53747bbbf8bc0fd" }, "downloads": -1, "filename": "stuffer-0.0.6.tar.gz", "has_sig": false, "md5_digest": "35fc2c377cc35d049bcf4e71ff0da5c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20340, "upload_time": "2017-09-08T20:16:14", "url": "https://files.pythonhosted.org/packages/fa/70/6c1a0ba1ad6a961395ac953913d982917ac3fac75afce8ef61bbd712bebf/stuffer-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "29769fe80a21863262c5136bf51c12f3", "sha256": "167ac24049e6608fc14d68329aa0d8c09a84d44094601af94a4ce51a30bd726b" }, "downloads": -1, "filename": "stuffer-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "29769fe80a21863262c5136bf51c12f3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29295, "upload_time": "2017-10-07T17:46:34", "url": "https://files.pythonhosted.org/packages/c3/8f/b24ef39b5167a0583be3230008b669b2cec788a39978a3825417896175eb/stuffer-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "923a8f81a327166a96b0ef5d1afa917a", "sha256": "8a5845eca8471b1bd106041d1372e069045ab30b17f5ceae7dd2c87a8ca1cdb2" }, "downloads": -1, "filename": "stuffer-0.0.7.tar.gz", "has_sig": false, "md5_digest": "923a8f81a327166a96b0ef5d1afa917a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20903, "upload_time": "2017-10-07T17:46:37", "url": "https://files.pythonhosted.org/packages/dc/d3/7fff24a3a6d74a45c40b67c1950cfd4a60e0f05e9e19926e5c14df3a365c/stuffer-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "fa715fcc0ee15178cfb714bbe96f0d50", "sha256": "233bd9eafdcf2a21e467f56e8ec736565ca665fc59c5351634fdd2379b529275" }, "downloads": -1, "filename": "stuffer-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "fa715fcc0ee15178cfb714bbe96f0d50", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29310, "upload_time": "2017-11-14T21:05:20", "url": "https://files.pythonhosted.org/packages/65/14/43cb92934a6686849dff8be86591de9cacd50f8b28e4e47f4e97875f94f6/stuffer-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2534c59139320313eee21516e9acd74e", "sha256": "f011c1822dae5c50d6829bbe9bc8bc895bc48724dc726957a117554ad9b9a509" }, "downloads": -1, "filename": "stuffer-0.0.8.tar.gz", "has_sig": false, "md5_digest": "2534c59139320313eee21516e9acd74e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20921, "upload_time": "2017-11-14T21:05:22", "url": "https://files.pythonhosted.org/packages/18/30/9ec71a10606dc89d2e24fea0a0868ca57288a7488b03f974c486ddb0b4fc/stuffer-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "7109d9d5346bfaff59709d13ab044760", "sha256": "80d76b40c49868d8ca0f84f635d73d4e1bcc9585561243cdb8fa50d820b693b4" }, "downloads": -1, "filename": "stuffer-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "7109d9d5346bfaff59709d13ab044760", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29357, "upload_time": "2017-12-01T09:51:19", "url": "https://files.pythonhosted.org/packages/31/04/2c59f1f861c2f155605d2c54afde073e8fb310ed60013c6d85f57ccdbee0/stuffer-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "422c4d72b92d5026b0bde6531e8bfd78", "sha256": "a24187b7d4d51d887635815e23c1b0f725ac134bd7b9a49db9fdd9ab647d19c7" }, "downloads": -1, "filename": "stuffer-0.0.9.tar.gz", "has_sig": false, "md5_digest": "422c4d72b92d5026b0bde6531e8bfd78", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20976, "upload_time": "2017-12-01T09:51:20", "url": "https://files.pythonhosted.org/packages/29/fc/3d61ea743e887316d9cf1cefce373ea4612c7c180a751db9ef7a869b9bd1/stuffer-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a21c3f8603f2c7f641fb07636c5e246e", "sha256": "99de505054c9647e8294c2de2b1becc66b36965fa6ab9ac5621d41b509d36a2c" }, "downloads": -1, "filename": "stuffer-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "a21c3f8603f2c7f641fb07636c5e246e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29723, "upload_time": "2019-03-10T20:08:38", "url": "https://files.pythonhosted.org/packages/78/c8/a79046605879b2e88d64941a64acefb69c9a9f8b63fe151cbbd797c659a1/stuffer-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b0b6f7c6926e3e7856b0972a11503080", "sha256": "8e870f7e2c21dd5dd061f72314657309cd6bc3ad1118b9f4625488fa061f89a6" }, "downloads": -1, "filename": "stuffer-0.0.10.tar.gz", "has_sig": false, "md5_digest": "b0b6f7c6926e3e7856b0972a11503080", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22411, "upload_time": "2019-03-10T20:08:40", "url": "https://files.pythonhosted.org/packages/84/d9/c9c6eef0972e60dcbba69efa913ad58866cd42821d17eb4a342c1ca9158f/stuffer-0.0.10.tar.gz" } ] }