{ "info": { "author": "Mitch Garnaat", "author_email": "mitch@cloudnative.io", "bugtrack_url": null, "classifiers": [], "description": "# cruddy\n\n[![Circle CI](https://circleci.com/gh/cloudnative/cruddy.svg?style=svg)](https://circleci.com/gh/cloudnative/cruddy)\n\nA simple CRUD wrapper around Amazon DynamoDB.\n\n## Installation\n\n```\n$ pip install cruddy\n```\n\n## Getting Started\n\nThe first thing to do is to create a CRUD handler for your DynamoDB table. The\nconstructor for the CRUD class takes a number of parameters to help configure\nthe handler for your application. The full list of parameters are:\n\n* **table_name** - name of the backing DynamoDB table (required)\n* **profile_name** - name of the AWS credential profile to use when creating the\n boto3 Session\n* **region_name** - name of the AWS region to use when creating the boto3 Session\n* **prototype** - a dictionary that describes the prototypical object stored in\n your table (see below)\n* **supported_ops** - a list of operations supported by the CRUD handler\n (choices are list, get, create, update, delete, search, increment_counter)\n* **encrypted_attributes** - a list of lists or tuples where the first item is\n the name of the attribute that should be encrypted and the second item is the\n KMS master key ID to use for encrypting/decrypting the value.\n* **debug** - if not False this will cause the raw_response to be left\n in the response dictionary\n\n### Prototypes\n\nA prototype is a description of the prototypical item in your table. It's\nkind of like a template for the item. A prototype can be used to describe what\nattributes are in the item, which are required or optional, and the type of\nvalue that is associated with the attribute. In addition, there are special\nvalues you can use that allow a small range of calculated values in your item.\n\nIf you don't specify a prototype, cruddy will store whatever values are in the\nitem with no validation or insertion of calculated values.\n\nLet's look at a few examples using prototypes.\n\n```\n{\n 'id': '',\n 'created_at': 1,\n 'foo': 1\n}\n```\n\nThis prototype says that your item must have an ``id`` attribute whose value is\nof type ``str``, a ``created_at`` attribute whose value is of type ``int``, and\na ``foo`` attribute whose value is also an ``int``. Your item may contain\nother items as well (this is not a schema) but it must contain these attribute\nname/value pairs. If the item you pass into the ``create`` method does not\ncontain these attributes cruddy will create the necessary attributes and will\ninitialize the value to what ever value you have specified.\n\n\n#### Calculated Values\n\nThe above example assumes that you are going to generate the ``id`` and\n``created_at`` values in your application code. You may, however, prefer to\nhave cruddy handle that for you. In that case, you can make use of cruddy's\ncalcuated value tokens.\n\n```\n{\n 'id': 'on-create:',\n 'created_at': 'on-create:'\n}\n```\n\nNow, when you create a new item you could supply one without an ``id`` or\n``created_at`` value and cruddy will calculate these values for you. If those\nattributes already exist in the item, cruddy will not overwrite them. Note\nthat the calulated values are specified as ``on-create``. This is called a\n``trigger`` and indicates when the calculation will be performed.\n\nIf you wanted to also have a timestamp to indicate when an item has been\nmodified (i.e. created or updated) you could do this.\n\n```\n{\n 'id': 'on-create:',\n 'created_at': 'on-create:',\n 'modified_at': 'on-update:'\n}\n```\n\nThe currently supported calculated value types are:\n\n* **````** to generate a string representation of a Type4 UUID\n* **````** to generate an integer timestamp generated by\n ``int(time.time()*1000)``\n\nThe currently supported triggers for calculated values are:\n\n* **on-create** will be applied when the item is created\n* **on-update** will be applied when the item is created or updated\n\n### Configuring your CRUD handler\n\nAn easy way to configure your CRUD handler is to gather all of the parameters\ntogether in a dictionary and then pass that dictionary to the class\nconstructor.\n\n```\nimport cruddy\n\nparams = {\n 'profile_name': 'foobar',\n 'region_name': 'us-west-2',\n 'table_name': 'fiebaz',\n 'prototype': {'id': '',\n 'created_at': '',\n 'modified_at': ''}\n}\n\ncrud = cruddy.CRUD(**params)\n```\n\nOnce you have your handler, you can start to use it.\n\n```\nitem = {'name': 'the dude', 'email': 'the@dude.com', 'twitter': 'thedude'}\nresponse = crud.create(item)\n```\n\nThe response returned from all CRUD operations is a Python object with the\nfollowing attributes.\n\n* **data** is the actual data returned from the CRUD operation (if successful)\n* **status** is the status of the response and is either ``success`` or\n``error``\n* **metadata** is metadata from the underlying DynamoDB API call\n* **error_type** will be the type of error, if ``status != 'success'``\n* **error_code** will be the code of error, if ``status != 'success'``\n* **error_type** will be the full error message, if ``status != 'success'``\n* **raw_response** will contain the full response from DynamoDB if the CRUD\nhandler is in ``debug`` mode.\n* **is_successful** a simple short-cut, equivalent to ``status == 'success'``\n\nYou can convert the CRUDResponse object into a standard Python dictionary using\nthe ``flatten`` method\n\n```\n>>> response = crud.create(...)\n>>> response.flatten()\n{'data': {'created_at': 1452109758363,\n 'name': 'the dude',\n 'email': 'the@dude.com',\n 'twitter': 'thedude',\n 'id': 'a6ac0fd7-cdde-4170-a1a9-30e139c44897',\n 'modified_at': 1452109758363},\n 'error_code': None,\n 'error_message': None,\n 'error_type': None,\n 'metadata': {'HTTPStatusCode': 200,\n 'RequestId': 'LBBFLMIAVOKR8LOTK7SRGFO4Q3VV4KQNSO5AEMVJF66Q9ASUAAJG'},\n 'raw_response': None,\n 'status': 'success'}\n >>>\n ```\n\n## CRUD operations\n\nThe CRUD object supports the following operations. Note that depending on the\nvalue of the ``supported_operations`` parameter passed to the constructor, some\nof these methods may return an ``UnsupportedOperation`` error type.\n\n### list()\n\nReturns a list of items in the database. Encrypted attributes are not\ndecrypted when listing items.\n\n### get(*id*, *decrypt=False*)\n\nReturns the item corresponding to ``id``. If the ``decrypt`` param is not\nFalse (the default) any encrypted attributes in the item will be decrypted\nbefore the item is returned. If not, the encrypted attributes will contain the\nencrypted value.\n\n### create(*item*)\n\nCreates a new item. You pass in an item containing initial values. Any\nattribute names defined in ``prototype`` that are missing from the item will be\nadded using the default value defined in ``prototype``.\n\n### update(*item*, *encrypt=True*)\n\nUpdates the item based on the current values of the dictionary passed in. If\nthe ``encrypt`` param is True (the default), encrypted attributes in ``item``\nare encrypted. To prevent double-encrypting when using ``list`` or ``get``\nwithout ``decrypt=True``, you can specify ``encrypt=False`` and the item will\nbe stored verbatim.\n\n### delete(*id*)\n\nDeletes the item corresponding to ``id``.\n\n## Beyond CRUD\n\nThe following operations extend beyond the basic CRUD functions but are\nincluded because of they are quite useful.\n\n### search(*query*)\n\nCruddy provides a limited but useful interface to search GSI indexes in DynamoDB\nwith the following limitations (hopefully some of these will be expanded or\neliminated in the future.\n\n* The GSI must be configured with a only HASH and not a RANGE.\n* The only operation supported in the query is equality\n\nTo use the ``search`` operation you must pass in a query string of this form:\n\n =\n\nAs stated above, the only operation currently supported is equality (=) but\nother operations will be added over time. Also, the ``attribute_name`` must be\nan attribute which is configured as the ``HASH`` of a GSI in the DynamoDB\ntable. If all of the above conditions are met, the ``query`` operation will\nreturn a list (possibly empty) of all items matching the query and the\n``status`` of the response will be ``success``. Otherwise, the ``status`` will\nbe ``error`` and the ``error_type`` and ``error_message`` will provide further\ninformation about the error.\n\n### increment_counter(*id*, *counter_name*, [*increment*])\n\nAtomically increments a counter attribute in the item identified by ``id``. You must specify the\nname of the attribute as ``counter_name`` and, optionally, the ``increment``\nwhich defaults to ``1``.\n\n## Using the handler interface\n\nIn addition to the methods described above, cruddy also provides a generic\nhandler interface. This is mainly useful when you want to wrap a cruddy\nhandler in a Lambda function and then call that Lambda function to access the\nCRUD capabilities.\n\nTo call the handler, you simply put all necessary parameters into a Python\ndictionary and then call the handler with that dict.\n\n```\nparams = {\n 'operation': 'create',\n 'item': {'foo': 'bar', 'fie': 'baz'}\n}\nresponse = crud.handler(**params)\n```\n\nSo, you could define a Lambda function like this:\n\n```\nimport logging\nimport json\n\nimport cruddy\n\nLOG = logging.getLogger()\nLOG.setLevel(logging.INFO)\n\nconfig = json.load(open('config.json'))\ncrud = cruddy.CRUD(**config)\n\n\ndef handler(event, context):\n LOG.info(event)\n response = crud.handler(**event)\n return response.flatten()\n```\n\nWhere ``config.json`` looks like this:\n\n```\n{\n \"region_name\": \"us-west-2\",\n \"table_name\": \"foobar\",\n \"prototype\": {\"id\": \"\",\n \"created_at\": \"\",\n \"modified_at\": \"\",\n \"foo\": 1,\n \"bar\": \"\"},\n}\n```\n\nIf you uploaded this function (and config file) to AWS Lambda you could then\ninvoke the handler like this.\n\n```\nimport json\n\nimport boto3\n\nsession = boto3.Session()\nlambda_client = session.client('lambda')\n\nparams = {'operation': 'create', 'item': {'fie': 'baz'}}\nresponse = lambda_client.invoke(\n FunctionName='myfunction',\n InvocationType='RequestResponse',\n Payload=json.dumps(params))\ncruddy_response = json.load(response['Payload'])\n```\n\nThe variable ``cruddy_response`` would now contain the response structure\nreturned by cruddy, flattened into a Python dictionary.\n\n## The cruddy CLI\n\ncruddy also offers a CLI that allows you to access your DynamoDB table or\nLambda-based handler via a simple command line interface. It supports all\noperations supported by cruddy.\n\n### Using the cruddy CLI with a DynamoDB table\n\nTo use cruddy to directly interact with a DynamoDB table, you need to place the\nconfiguration information for your cruddy handler in a JSON file. So, from our\nprevious example if we created a file called ``fiebaz.json`` like this:\n\n```\n{\n \"profile_name\": \"foobar\",\n \"region_name\": \"us-west-2\",\n \"table_name\": \"fiebaz\",\n \"prototype\": {\"id\": \"\",\n \"created_at\": \"\",\n \"modified_at\": \"\"}\n}\n```\n\nWe could then reference this when using the cruddy CLI:\n\n```\n$ cruddy --config-file fiebaz.json list\n[\n {}\n ...\n]\n```\n\nUse the ``--help`` for more information on how to use the cruddy CLI.\n\n### Using the cruddy CLI with a Lambda handler\n\nAll of the operations of the CLI work exactly the same whether you are using it\nwith a DynamoDB table directly or through a Lambda controller. The only\ndifference is that rather than referencing a config file containing info about\nthe table and other parameters needed to create the cruddy CRUD handler, you\nsimply tell the CLI about the Lambda function.\n\n```\n$ cruddy --lambda-fn fiebaz list\n[\n {}\n ...\n]\n```\n\nwhere ``fiebaz`` is the name of your Lambda handler.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/cloudnative/cruddy", "keywords": null, "license": "Apache License 2.0", "maintainer": null, "maintainer_email": null, "name": "cruddy", "package_url": "https://pypi.org/project/cruddy/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/cruddy/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/cloudnative/cruddy" }, "release_url": "https://pypi.org/project/cruddy/0.14.0/", "requires_dist": null, "requires_python": null, "summary": "A CRUD wrapper class for Amazon DynamoDB", "version": "0.14.0" }, "last_serial": 1943236, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "218d3d27efdf518f88fd87f2a28f1def", "sha256": "01dbab29bf719519d4d5b2345be9c6c5e26debb721642676be63b62927f688f2" }, "downloads": -1, "filename": "cruddy-0.1.0.tar.gz", "has_sig": false, "md5_digest": "218d3d27efdf518f88fd87f2a28f1def", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6285, "upload_time": "2016-01-05T22:33:33", "url": "https://files.pythonhosted.org/packages/70/9d/737b041fc54a337f8856ceb6938de00ff719bd9ac6236af266935e27e44a/cruddy-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "eb975ec692dc5465d1f91d49a7c5040e", "sha256": "f0d77863437e884a4b8da710c11b13d37475485a115a70ae6706bd82bc7bb84f" }, "downloads": -1, "filename": "cruddy-0.1.1.tar.gz", "has_sig": false, "md5_digest": "eb975ec692dc5465d1f91d49a7c5040e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6282, "upload_time": "2016-01-05T22:50:29", "url": "https://files.pythonhosted.org/packages/12/fd/36c6ed9552372f6b56d1477ad3323e9e6f8f443e2389b958ac4fcea5f13a/cruddy-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "31d667d50fbf0c2a23521c7516c47323", "sha256": "923778bad01042468ff7b454e8a629bcbbda701883bf2197d55eabb3a831467c" }, "downloads": -1, "filename": "cruddy-0.1.2.tar.gz", "has_sig": false, "md5_digest": "31d667d50fbf0c2a23521c7516c47323", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6284, "upload_time": "2016-01-05T23:11:32", "url": "https://files.pythonhosted.org/packages/b7/a8/432417db31020ebe8f423dd335d3c89ac848cdfac5bed14b47963319da1d/cruddy-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "0c7b18ad8707fd516a62790a0a6f1620", "sha256": "56887cf9b895aaf734e83b38016861a5e9cd0ed18943ff9fcd6803e63cd029fc" }, "downloads": -1, "filename": "cruddy-0.1.3.tar.gz", "has_sig": false, "md5_digest": "0c7b18ad8707fd516a62790a0a6f1620", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6287, "upload_time": "2016-01-06T00:03:25", "url": "https://files.pythonhosted.org/packages/86/ff/df6c044f736c3874c6ec42da324fe6997891b3309583b67e73fb04df4902/cruddy-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "819accdc5caee4b7c9993c4a677c965d", "sha256": "ea2bd9eeb653b88ef52d29c59d17769cac1858d49cae4d66b955b302409ca1d5" }, "downloads": -1, "filename": "cruddy-0.1.4.tar.gz", "has_sig": false, "md5_digest": "819accdc5caee4b7c9993c4a677c965d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6559, "upload_time": "2016-01-06T04:08:50", "url": "https://files.pythonhosted.org/packages/c9/0a/a8ba13e8cfee85b86ca27b989a439e123b1adfd26fc79d9daa9c03549e97/cruddy-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "28be7f219ff74f372122432ac19b3e4f", "sha256": "a61d5189dd3ce9f2f56c09caa603d9ef0bf32996e89341df15934b50fbe80138" }, "downloads": -1, "filename": "cruddy-0.1.5.tar.gz", "has_sig": false, "md5_digest": "28be7f219ff74f372122432ac19b3e4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6564, "upload_time": "2016-01-06T04:15:23", "url": "https://files.pythonhosted.org/packages/ab/ee/1263704e010560cec225e3fe539eaec1a4dc295aa0124da18168615494eb/cruddy-0.1.5.tar.gz" } ], "0.10.0": [ { "comment_text": "", "digests": { "md5": "19f117fb267a58e6497bcd04d2c3c59f", "sha256": "fc2de3c2904bacd13ff371bb12c933703b70ed7486074205c2a5330ecaac1d28" }, "downloads": -1, "filename": "cruddy-0.10.0.tar.gz", "has_sig": false, "md5_digest": "19f117fb267a58e6497bcd04d2c3c59f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23567, "upload_time": "2016-01-19T21:52:28", "url": "https://files.pythonhosted.org/packages/15/5f/7c0b60adf438eeffc0773445575391fcbbdb95d56eb7db39c0cade72c298/cruddy-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "0d5c9e590ece80560449fe80b34a71b9", "sha256": "0947196e9067782182e0c91ce981f66711ac73a0f67ea040fef80cfb99d1625b" }, "downloads": -1, "filename": "cruddy-0.11.0.tar.gz", "has_sig": false, "md5_digest": "0d5c9e590ece80560449fe80b34a71b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29920, "upload_time": "2016-01-21T00:56:16", "url": "https://files.pythonhosted.org/packages/34/16/8532f0c1176058bfedba88a121359806a82166698e4d1ca610a5a9a621a1/cruddy-0.11.0.tar.gz" } ], "0.11.1": [ { "comment_text": "", "digests": { "md5": "32be6001a45f6e3e3653bfd982e61751", "sha256": "6338b1fd950189b0c76d16bb173b07740396d4417861128c9e6656a29af234cb" }, "downloads": -1, "filename": "cruddy-0.11.1.tar.gz", "has_sig": false, "md5_digest": "32be6001a45f6e3e3653bfd982e61751", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29948, "upload_time": "2016-01-21T18:58:06", "url": "https://files.pythonhosted.org/packages/29/d5/d140942fd9c17c52a918872606dd94d3bdce9740f04858fcd24066252aec/cruddy-0.11.1.tar.gz" } ], "0.11.2": [ { "comment_text": "", "digests": { "md5": "57d545dc204f0371845fff739057d727", "sha256": "eb274ca95b4f1705622ad5cafbcb4fe58bbeab32231ce1d6f7449962f3bfecae" }, "downloads": -1, "filename": "cruddy-0.11.2.tar.gz", "has_sig": false, "md5_digest": "57d545dc204f0371845fff739057d727", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23529, "upload_time": "2016-01-23T05:31:38", "url": "https://files.pythonhosted.org/packages/15/48/2af0ea91d82fa1097fcedaa1522ce35b0cb7e389fb074d148f06916307a3/cruddy-0.11.2.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "294eb2922382249701e18e5dcc9781d2", "sha256": "337e7e2fe3f2e47e9bcd4181b6a01e6636f7da7e5fe4fe6a28ad6be6ceecb6c4" }, "downloads": -1, "filename": "cruddy-0.12.0.tar.gz", "has_sig": false, "md5_digest": "294eb2922382249701e18e5dcc9781d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25368, "upload_time": "2016-01-25T16:20:08", "url": "https://files.pythonhosted.org/packages/6c/18/6e6d7478c0c6e1b2c7f626eb097bf7d8146fce24a1d7c0934bfe6555b4d1/cruddy-0.12.0.tar.gz" } ], "0.12.1": [ { "comment_text": "", "digests": { "md5": "d59d95c3573e38b057b5e952dcae9ee9", "sha256": "6472902334df2892030124020dc9a4b1139f42f6cbc5bf1f374e566b68ef5ed0" }, "downloads": -1, "filename": "cruddy-0.12.1.tar.gz", "has_sig": false, "md5_digest": "d59d95c3573e38b057b5e952dcae9ee9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25513, "upload_time": "2016-01-25T17:01:35", "url": "https://files.pythonhosted.org/packages/9e/71/c20f4e1a903101fe82f7f8a9d1a54d02afffd9a557f415f7211820d7ca5d/cruddy-0.12.1.tar.gz" } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "ba7351f5a32e056e2462dd833c81e1b2", "sha256": "1272154796b697b1369893ab19e9d316e01600fd720d9ae81d951e450e259d27" }, "downloads": -1, "filename": "cruddy-0.13.0.tar.gz", "has_sig": false, "md5_digest": "ba7351f5a32e056e2462dd833c81e1b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25732, "upload_time": "2016-01-28T19:00:06", "url": "https://files.pythonhosted.org/packages/45/53/b0f71d3cd37570f4db458ded65c2dfd5b7634429935601b86f6a788209ea/cruddy-0.13.0.tar.gz" } ], "0.14.0": [ { "comment_text": "", "digests": { "md5": "af74a30629e0535e783a25bb6c76e8cb", "sha256": "cad38f82e9d33510d0784e9683bef1958a78440ebe3874f44522fbe93e9ab9f9" }, "downloads": -1, "filename": "cruddy-0.14.0.tar.gz", "has_sig": false, "md5_digest": "af74a30629e0535e783a25bb6c76e8cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26102, "upload_time": "2016-02-06T17:14:49", "url": "https://files.pythonhosted.org/packages/cf/13/33566cb56d4614c83813ff941147bd5eb71f4ab2de59afd5b7b624eb05bf/cruddy-0.14.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "2c980d47159eaed8c6055aaf6db3dfdf", "sha256": "11f98bc6a9040b42f40835b24198a8f54b7dd6105284380d45353f10f6dfcd3a" }, "downloads": -1, "filename": "cruddy-0.2.0.tar.gz", "has_sig": false, "md5_digest": "2c980d47159eaed8c6055aaf6db3dfdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9378, "upload_time": "2016-01-06T20:08:54", "url": "https://files.pythonhosted.org/packages/a8/f5/867fda546dcda96f934ae75b02207641682e2a9e7bf443047b7a09134808/cruddy-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "03bf526fff3045c61e0ba4f7659a1436", "sha256": "ca17a0b7e3a396eca0683d291563f094a9ffe6fbbd208490728caa134087f09f" }, "downloads": -1, "filename": "cruddy-0.2.1.tar.gz", "has_sig": false, "md5_digest": "03bf526fff3045c61e0ba4f7659a1436", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9413, "upload_time": "2016-01-06T20:21:43", "url": "https://files.pythonhosted.org/packages/0b/90/86f27956d9b92474f604b70a1f0456b13bb0deca06f35a300da8a94edc9b/cruddy-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "d5139725c9f7dfdd2e2802c4f86b6a55", "sha256": "8c25e0e8dcd5da60d0ea8d0a5efc7bb12749470b23f98293abc7be412f00ed83" }, "downloads": -1, "filename": "cruddy-0.3.0.tar.gz", "has_sig": false, "md5_digest": "d5139725c9f7dfdd2e2802c4f86b6a55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10485, "upload_time": "2016-01-07T17:53:27", "url": "https://files.pythonhosted.org/packages/22/ab/7588293406e21b1cb8b45ea29d5e39937ffd9f83df2af605840019e71fd7/cruddy-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "6d019f64ca6bb5ab887be455352ca0b7", "sha256": "62171d12589721c7070649a5a85f1edaa2d2c4b2daa1124626f6240ba1e87422" }, "downloads": -1, "filename": "cruddy-0.3.1.tar.gz", "has_sig": false, "md5_digest": "6d019f64ca6bb5ab887be455352ca0b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10508, "upload_time": "2016-01-08T14:57:07", "url": "https://files.pythonhosted.org/packages/c8/6c/dd685a7eeea4ffd839aefefec5b9dfaabda34f1156890a5492fe03ddd04b/cruddy-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "526c21ddf022cb9f9935826ea82d889d", "sha256": "fb4a0609f5544b29f46084cf3f84c7c4c8f9c45fb179ef9426aab80a3ffba6b5" }, "downloads": -1, "filename": "cruddy-0.3.2.tar.gz", "has_sig": false, "md5_digest": "526c21ddf022cb9f9935826ea82d889d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10511, "upload_time": "2016-01-08T15:06:51", "url": "https://files.pythonhosted.org/packages/24/e6/649a3b3c63f513d52621eb718c8b0d830858830de844ced1256ab4efe0c1/cruddy-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "21dd20fd8da6af9d9c57abc92fb4f09a", "sha256": "132c31cb1eaf29aa51a3704147e92a41761d690b1fdb0f85d9c12feb9f32ed49" }, "downloads": -1, "filename": "cruddy-0.3.3.tar.gz", "has_sig": false, "md5_digest": "21dd20fd8da6af9d9c57abc92fb4f09a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10553, "upload_time": "2016-01-08T16:18:18", "url": "https://files.pythonhosted.org/packages/9c/d5/c3e2feee5cf7b975da15c29a9e4bf35326ce4b75aceb27d5435b19a4ab32/cruddy-0.3.3.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "b9d87139156496548f491e348827d0be", "sha256": "ef6acee8ed2726480cd21bd9efb02e849febf3daced34d3d6d894f0ae90d3483" }, "downloads": -1, "filename": "cruddy-0.4.0.tar.gz", "has_sig": false, "md5_digest": "b9d87139156496548f491e348827d0be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13354, "upload_time": "2016-01-11T04:10:50", "url": "https://files.pythonhosted.org/packages/21/35/cbf51799d6c14ac9a5559293c353fab991d3325e2e50839dce98a0507405/cruddy-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "3f5f9d766023f06c4bd30eb9904c5e16", "sha256": "49deb91340f7a388f5140223b2b7da2e2ae9047844c3f6b395076a8606547051" }, "downloads": -1, "filename": "cruddy-0.4.1.tar.gz", "has_sig": false, "md5_digest": "3f5f9d766023f06c4bd30eb9904c5e16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13366, "upload_time": "2016-01-11T05:35:50", "url": "https://files.pythonhosted.org/packages/48/a1/8ebe4a77598dafed2b3c5e2943f2d186caec3361593a03cc1e5810b888b1/cruddy-0.4.1.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "1f578ce36d98d73652805c753e6af5f5", "sha256": "935045accd8f42ecec9c3e1cf1877ee25abf2633f72d14c1a2e9ad42ae4ece3d" }, "downloads": -1, "filename": "cruddy-0.5.0.tar.gz", "has_sig": false, "md5_digest": "1f578ce36d98d73652805c753e6af5f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12589, "upload_time": "2016-01-11T14:25:51", "url": "https://files.pythonhosted.org/packages/30/83/6b3cf3085eec8906ba2912622fb8b009f48fd35b9790ff3c7dbe8f953e2c/cruddy-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "9431261b209ad5260bfa6b09388296d0", "sha256": "364948ec24e82171b83355c7dac68fa6660412c191fb45491d9f60bcb35497e5" }, "downloads": -1, "filename": "cruddy-0.6.0.tar.gz", "has_sig": false, "md5_digest": "9431261b209ad5260bfa6b09388296d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13661, "upload_time": "2016-01-11T16:41:27", "url": "https://files.pythonhosted.org/packages/4f/22/97afd10da5fba6f55a8f025ee6b84c137f116ba97caaf3c2256b7e16b031/cruddy-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "030fefa215090fd88df6085d02fe1114", "sha256": "573f136980521e8d336023ee65c78bec7954ad4db62457009f0a45577d9860da" }, "downloads": -1, "filename": "cruddy-0.6.1.tar.gz", "has_sig": false, "md5_digest": "030fefa215090fd88df6085d02fe1114", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13667, "upload_time": "2016-01-11T16:57:48", "url": "https://files.pythonhosted.org/packages/b9/67/346ad817c5392320dbc6324d95b746241677d0bb01caf82fb8318da0bb65/cruddy-0.6.1.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "a5dff06955d89d9233aeaca52f07242c", "sha256": "dc0aca1e667973fd321a1e5eb87e74be90f4c26069a730c6f95549c2bcb54ad0" }, "downloads": -1, "filename": "cruddy-0.7.0.tar.gz", "has_sig": false, "md5_digest": "a5dff06955d89d9233aeaca52f07242c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15248, "upload_time": "2016-01-13T02:27:39", "url": "https://files.pythonhosted.org/packages/84/a8/741b9d6f5075c326b198c5074f00c20be9636ec86b7cfb2408b3d09612b1/cruddy-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "46092976a9ffeb3de83c691063178a24", "sha256": "864d8a2496238e2deb93e8a80550ab391fbf7b25557f0ae4383265cdee67ed7e" }, "downloads": -1, "filename": "cruddy-0.7.1.tar.gz", "has_sig": false, "md5_digest": "46092976a9ffeb3de83c691063178a24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17639, "upload_time": "2016-01-13T04:34:29", "url": "https://files.pythonhosted.org/packages/a2/e6/97dd151308f9583dbb2d029017bf05b470e4bc1ed24839889b2fc14a1a68/cruddy-0.7.1.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "79540c2d464752cf99ae9ec7e61619a4", "sha256": "60f1ff30e8a769515a2389451729f9324f8ec253ee37aaa85846dcfd2f8d971a" }, "downloads": -1, "filename": "cruddy-0.8.0.tar.gz", "has_sig": false, "md5_digest": "79540c2d464752cf99ae9ec7e61619a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16036, "upload_time": "2016-01-14T15:23:35", "url": "https://files.pythonhosted.org/packages/b1/df/323093fca1a886d3e9458d90cb0e64115ac861a5287ed2e50fff0f4f3bb7/cruddy-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "15ae3dd8038a3d2f0f0bc9ea3450c8ce", "sha256": "65ace618ef136cb1b264a1ea4f0f0de8d9b43c1b8a2a29b8525211a6df818466" }, "downloads": -1, "filename": "cruddy-0.8.1.tar.gz", "has_sig": false, "md5_digest": "15ae3dd8038a3d2f0f0bc9ea3450c8ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16064, "upload_time": "2016-01-14T19:01:22", "url": "https://files.pythonhosted.org/packages/f7/9f/00618735c9edf3024fb21f85ae27bb682efdd6df40308732ba361c84ba97/cruddy-0.8.1.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "761c2dd50570c4d76cb4b4856cbfe9f9", "sha256": "06fda3dd2c66228c9e5bc1bb8249ab8c3bb0fe6df8bf2593bbaf3d932a9509af" }, "downloads": -1, "filename": "cruddy-0.9.0.tar.gz", "has_sig": false, "md5_digest": "761c2dd50570c4d76cb4b4856cbfe9f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16098, "upload_time": "2016-01-16T01:08:18", "url": "https://files.pythonhosted.org/packages/c2/c7/079d9f2212265624526981f501c1c5ca9aee674537e1d612b04e23f3dace/cruddy-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "af74a30629e0535e783a25bb6c76e8cb", "sha256": "cad38f82e9d33510d0784e9683bef1958a78440ebe3874f44522fbe93e9ab9f9" }, "downloads": -1, "filename": "cruddy-0.14.0.tar.gz", "has_sig": false, "md5_digest": "af74a30629e0535e783a25bb6c76e8cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26102, "upload_time": "2016-02-06T17:14:49", "url": "https://files.pythonhosted.org/packages/cf/13/33566cb56d4614c83813ff941147bd5eb71f4ab2de59afd5b7b624eb05bf/cruddy-0.14.0.tar.gz" } ] }