{
"info": {
"author": "Nikolay Bondarenko",
"author_email": "misterionkell@gmail.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 3 - Alpha",
"Environment :: Console",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python"
],
"description": "|PyPI version| |Build Status| |Code Health| |GitHub license|\n\nRedis Memory Analyzer\n=====================\n\nRMA is a console tool to scan Redis key space in real time and aggregate\nmemory usage statistic by key patterns. You may use this tools without\nmaintenance on production servers. You can scanning by all or selected\nRedis types such as \"string\", \"hash\", \"list\", \"set\", \"zset\" and use\nmatching pattern as you like. RMA try to discern key names by patterns,\nfor example if you have keys like 'user:100' and 'user:101' application\nwould pick out common pattern 'user:\\*' in output so you can analyze\nmost memory distressed data in your instance.\n\nInstalling rma\n~~~~~~~~~~~~~~\n\nPre-Requisites :\n\n1. python >= 3.4 and pip.\n2. redis-py.\n\nTo install from PyPI (recommended) :\n\n::\n\n pip install rma\n\nTo install from source :\n\n::\n\n git clone https://github.com/gamenet/redis-memory-analyzer\n cd redis-memory-analyzer\n sudo python setup.py install\n\nRunning\n-------\n\nAfter install used it from console:\n\n::\n\n >rma --help\n usage: rma [-h] [-s HOST] [-p PORT] [-a PASSWORD] [-d DB] [-m MATCH] [-l LIMIT]\n [-b BEHAVIOUR] [-t TYPES]\n\n RMA is used to scan Redis key space in and aggregate memory usage statistic by\n key patterns.\n\n optional arguments:\n -h, --help show this help message and exit\n -s, --server HOST Redis Server hostname. Defaults to 127.0.0.1\n -p, --port PORT Redis Server port. Defaults to 6379\n -a, --password PASSWORD Password to use when connecting to the server\n -d, --db DB Database number, defaults to 0\n -m, --match MATCH Keys pattern to match\n -l, --limit LIMIT Get max key matched by pattern\n -b, --behaviour BEHAVIOUR Specify application working mode. Allowed values\n areall, scanner, ram, global\n -t, --type TYPES Data types to include. Possible values are string,\n hash, list, set. Multiple types can be provided. If\n not specified, all data types will be returned.\n Allowed values arestring, hash, list, set, zset\n -f --format TYPE Output type format: json or text (by default)\n\nIf you have large database try running first with ``--limit`` option to\nrun first limited amount of keys. Also run with ``--types`` to limit\nonly specified Redis types in large database. Not this tool has\nperformance issues - call encoding for individual keys instead if batch\nqueue with LUA (like in scanner does). So this option may be very\nuseful. You can choose what kind of data would be aggregated from Redis\nnode using ``-b (--behaviour)`` option as console argument. Supported\nbehaviours are 'global', 'scanner', 'ram' and 'all'.\n\nInternals\n---------\n\nRMA shows statistics separated by types. All works in application\nseparated by few steps:\n\n1. Load type and encoding for each key matched by given pattern with Lua\n scripting in batch mode. ``SCAN`` used to iterate keys from Redis key\n db.\n2. Separate keys by types and match patterns.\n3. Run behaviours and rules for given data set.\n4. Output result with given reported (now only TextReported implemented)\n\nGlobal output ('global' behaviour)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe global data is some Redis server statistics which helps you to\nunderstand other data from this tools:\n\n::\n\n | Stat | Value |\n |:---------------------------------|:---------------|\n | Total keys in db | 28979 |\n | RedisDB key space overhead | 790528 |\n | Used `set-max-intset-entries` | 512 |\n | .... | ... |\n | Info `total_system_memory` | 3190095872 |\n | .... | ... |\n\nThe one of interesting things here is \"RedisDB key space overhead\". The\namount of memory used Redis to store key space data. If you have lots of\nkeys in your Redis instance this actually shows your overhead for this.\nKeep in mind that part of data such as total keys in db or key space overhead\nshows data for selected db. But statistics started with ``Info`` or ``Config``\nkeywords is server based.\n\nKey types ('scanner' behaviour)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis table helps then you do not know actually that kind of keys stored\nin your Redis database. For example then DevOps or system administrator\nwant to understand what kind of keys stored in Redis instance. Which\ndata structure is most used in system. This also helps if you are new to\nsome big project - this kind of ``SHOW ALL TABLES`` request :)\n\n::\n\n | Match | Count | Type | % |\n |:----------------------|--------:|:-------|:-------|\n | job:* | 5254 | hash | 18.13% |\n | game:privacy:* | 2675 | hash | 9.23% |\n | user:* | 1890 | hash | 6.52% |\n | group:* | 1885 | set | 6.50% |\n\nData related output ('ram' behaviour)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAll output separated by keys and values statistics. This division is\nused because: 1. Keys of any type in Redis actually stored in RedisDB\ninternal data structure based on dict (more about this on\n`RedisPlanet `__). 2. This type of data\nspecially important in Redis instances with lots of keys.\n\n::\n\n | Match | Count | Useful | Real | Ratio | Encoding | Min | Max | Avg |\n |:------------------------------|------:|-------:|-------:|------:|:-----------------------------|----:|----:|------:|\n | event:data:* | 1198 | 17970 | 76672 | 4.27 | embstr [50.0%] / raw [50.0%] | 15 | 71 | 41.20 |\n | mm:urllist:* | 524 | 7648 | 33536 | 4.38 | embstr [100.0%] | 12 | 15 | 14.60 |\n | Provider:ParallelForm:*:*:*:* | 459 | 43051 | 66096 | 1.54 | raw [100.0%] | 92 | 94 | 93.79 |\n | user:spamblocked:dialy:post:* | 48 | 2208 | 4608 | 2.09 | raw [100.0%] | 46 | 46 | 46.00 |\n | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n | Total: | 2432 | 80493 | 200528 | 0.00 | | 0 | 0 | 0.00 |\n\nSo you can see count of keys matching given pattern, expected (by\ndeveloper) and real memory with taking into account the Redis data\nstructures and allocator overhead. Ratio and encoding distribution\nmin/max/avg len of key. For example in sample above keys some keys\nencoded as ``raw`` (sds string). Each sds encoded string:\n\n1. Has useful payload\n2. Has sds string header overhead\n3. Has ``redis object`` overhead\n4. The Redis implementation during memory allocation would be\n align(redis object) + align(sds header + useful payload)\n\nIn x64 instance of Redis key ``event:data:f1wFFqgqqwgeg`` (24 byte len)\nactually would use 24 bytes payload bytes, 9 bytes sds header and 32\nbytes in r\\_obj (``redis object``). So we may think this would use 65\nbytes. But after jemalloc allocator align it this 24 byte (65 byte data\nwith Redis internals) would use 80 bytes - in ~3,3 more times as you\nexpect (\\`Ratio\\`\\` value in table).\n\nNot we can look at values. All values output individual by Redis type.\nEach type has they own limitations so here is some common data for each\ntype and some unique. The ``strings`` data type value same as keys\noutput above. The only one difference is ``Free`` field which shows\nunused but allocated memory by SDS strings in ``raw`` encoding.\n\nSo for example look at output for ``HASH`` values:\n\n::\n\n | Match | Count | Avg field count | Key mem | Real | Ratio | Value mem | Real | Ratio | System | Encoding | Total mem | Total aligned |\n |:----------------------|------:|----------------:|--------:|-------:|------:|----------:|-------:|---------:|---------:|:-----------------|----------:|---------------:|\n | job:* | 5254 | 9.00 | 299485 | 619988 | 2.07 | 685451 | 942984 | 1.38 | 1345024 | ziplist [100.0%] | 984936 | 2907996 |\n | LIKE:* | 1890 | 1.02 | 5744 | 30262 | 5.27 | 1932 | 15432 | 7.99 | 91344 | ziplist [100.0%] | 7676 | 137038 |\n | game:*:count:* | 1231 | 1.00 | 7386 | 19696 | 2.67 | 1234 | 9848 | 7.98 | 59088 | ziplist [100.0%] | 8620 | 88632 |\n | LIKE:game:like:* | 1207 | 1.00 | 3621 | 19312 | 5.33 | 1210 | 9656 | 7.98 | 57936 | ziplist [100.0%] | 4831 | 86904 |\n | integration:privacy:* | 530 | 3.00 | 20140 | 33920 | 1.68 | 0 | 25440 | 25440.00 | 42400 | ziplist [100.0%] | 20140 | 101760 |\n\nLook at ``job:*`` hashes. This instance contains 5254 such keys with 9\nfields each. Looks like this data has regular structure like python\ntuple. This means you can change data structure of this data from Redis\n``hash`` to ``list`` and use 2 times less memory then now. Why do this?\nNow you ``job:*`` hash uses ~3,2 times more memory as you developers\nexpect.\n\nWhy doesn't reported memory match actual memory used?\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe memory reported by this tool is approximate. In general, the\nreported memory should be within 10% of what is reported by\n`info `__.\n\nAlso note that the tool does not (and cannot) account for the following:\n- Memory used by allocator metadata (it is actually not possible without ``c``)\n- Memory used for pub/sub (no any commands in Redis for that)\n- Redis process internals (like shared objects)\n\nKnown issues\n~~~~~~~~~~~~\n\n1. ``Skiplist`` (``zset`` actually) encoding actually not realized.\n2. ``Quicklist`` now calculated as ``ziplist``.\n3. SDS strings from redis 3.2 (optimized headers) not implemented. Now\n used fixed 9 bytes header.\n\nWhats next?\n~~~~~~~~~~~\n\nNow we use this tools as awesome helper. We most used data structures in\nour Redis instances is ``hash`` and ``list``. After upgradings our\nservers to Redis 3.2.x planning to fix known issues. Be glad to know\nthat are you think about this tool. In my dreams this tools should used\nas ``redis-lint`` tools which can say you\n``Hey, change this from this to this and save 30% of RAM``,\n``Hey, you are using PHP serializer for strings - change to msgpack and save 15% of RAM``\nand so on.\n\nLicense\n-------\n\nThis application was developed for using in\n`GameNet `__ project as part of Redis memory\noptimizations and analise. RMA is licensed under the MIT License. See\n`LICENSE `__\n\n.. |PyPI version| image:: https://badge.fury.io/py/rma.svg\n :target: https://badge.fury.io/py/rma\n.. |Build Status| image:: https://travis-ci.org/gamenet/redis-memory-analyzer.svg?branch=master\n :target: https://travis-ci.org/gamenet/redis-memory-analyzer\n.. |Code Health| image:: https://landscape.io/github/gamenet/redis-memory-analyzer/master/landscape.svg?style=flat-square\n :target: https://landscape.io/github/gamenet/redis-memory-analyzer/master\n.. |GitHub license| image:: https://img.shields.io/badge/license-MIT-blue.svg\n :target: https://raw.githubusercontent.com/gamenet/redis-memory-analyzer/master/LICENSE\n\nChangeLog for RMA\n--------------------\n- 0.2.0\n * Calculate TTL feature for all key types and display min/max/mean TTL in Key summary tables.\n * Replace invalid UTF-8 characters in redis key names when scanning keyspace.\n\n- 0.1.16\n\n * Added possibility to report output in JSON format. Issue #28\n\n- 0.1.15\n\n * Fix #29 fails with ValueError if a key containing ValueString was removed.\n\n- 0.1.14\n\n * Fix fails with ValueError if a key containing Hash was removed.\n Closes issue #23.\n\n- 0.1.13\n\n * Fix fails with TypeError if a key containing integer was removed.\n Closes issue #22.\n\n- 0.1.12\n\n * Fix fails with ResponseError if a key containing integer was removed.\n Closes issue #22.\n * Add more info to global rule description.\n\n- 0.1.11\n\n * Fix unknown command 'DEBUG' issue with AWS's ElastiCache.\n Closes issue #21.\n\n- 0.1.10\n\n * Each rule submit they progress with tqdm.\n Closes issue #5.\n\n * Fix CROSSSLOT error in Scanner Lua script by switching to pipelined mode to retrieve type\n and encoding data from Redis cluster server.\n Part of fixing issue #17.\n\n- 0.1.9\n\n * Fix issue with types and behavior filters.\n Closes issue #14.\n\n * Add columns min and max to the list statistic.\n Closes issue #15.\n\n * ValueError: min() arg is an empty sequence.\n Closes issue #13.\n\n * Make setup.py use requires from requirements.txt and info from readme.rst.\n Closes issue #8.\n\n- 0.1.8\n\n * More one try with deps in setup.py.\n Closes issue #16.\n\n- 0.1.7\n\n * More one try with deps in setup.py.\n Closes issue #16.\n\n- 0.1.6\n\n * Fix display percent of keys issue.\n Closes issue #13.\n\n * Fix invalid syntax on python 3.4 in setup.py.\n Closes issue #16.\n\n- 0.1.5\n\n * Fix logging issue in ValueString\n\n- 0.1.4\n\n * Fix pip deps\n\n- 0.1.3\n\n * Move pattern aggregation to separate pass\n\n * Retrieve key encoding in Scanner LUA script and boost performance ~1,75 times.\n Closes issue #4.\n\n * Lots of pylint warning and code style from landscape\n\n- 0.1.2\n\n * Fix issue with ``no such key`` ResponseError during debug sdslen in Value String.\n Closes issue #1.\n\n * Fix wrong behaviour if used non 0 db.\n Closes issue #2.\n\n * Fix crash with ElastiCache because of ``CONFIG`` command is disallowed to use.\n Closes issue #3.\n\n- 0.1.1\n\n * Prepare to pip distribution\n\n- 0.1.0\n\n * Initial version\n * Strings, Hash, Set, List are supported\n\n\n",
"description_content_type": "",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/gamenet/redis-memory-analyzer",
"keywords": "Redis,Memory Profiler",
"license": "MIT",
"maintainer": "Nikolay Bondarenko",
"maintainer_email": "misterionkell@gmail.com",
"name": "rma",
"package_url": "https://pypi.org/project/rma/",
"platform": "",
"project_url": "https://pypi.org/project/rma/",
"project_urls": {
"Homepage": "https://github.com/gamenet/redis-memory-analyzer"
},
"release_url": "https://pypi.org/project/rma/0.2.0/",
"requires_dist": [
"redis",
"tabulate",
"tqdm",
"msgpack-python"
],
"requires_python": "",
"summary": "Utilities to profile Redis RAM usage",
"version": "0.2.0"
},
"last_serial": 4816718,
"releases": {
"0.1.1": [
{
"comment_text": "",
"digests": {
"md5": "0cb78293e05ffe63f4ad472c1ab6e6e6",
"sha256": "a417399884fc649ae337c3732c9d2d0e8e9cca0214957ff2af9b6bea365bd678"
},
"downloads": -1,
"filename": "rma-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "0cb78293e05ffe63f4ad472c1ab6e6e6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 16357,
"upload_time": "2016-02-09T16:05:10",
"url": "https://files.pythonhosted.org/packages/f4/3f/7ade831fbd72ac0b3190cde6d028022a3b4dbe87b5f390547ef4ef80a787/rma-0.1.1.tar.gz"
}
],
"0.1.10": [
{
"comment_text": "",
"digests": {
"md5": "1755f94164a7eff99ce1a95f700bdd3f",
"sha256": "125b8d30aa225e5b1302918164eb45361c33e23bdcc6630c31fc42fd9de9177d"
},
"downloads": -1,
"filename": "rma-0.1.10.tar.gz",
"has_sig": false,
"md5_digest": "1755f94164a7eff99ce1a95f700bdd3f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25278,
"upload_time": "2016-02-16T15:38:58",
"url": "https://files.pythonhosted.org/packages/dc/ab/1d139106a5bf555c7f3d525bc2cfb4158463fb6153d3978433450429b742/rma-0.1.10.tar.gz"
}
],
"0.1.11": [
{
"comment_text": "",
"digests": {
"md5": "6798f53fb1cfb24c7fa7b3b34e567ca1",
"sha256": "00ff41ae4b70b6ff573dca218e3273b860bf2575292275a430a8548aba74f5ea"
},
"downloads": -1,
"filename": "rma-0.1.11.tar.gz",
"has_sig": false,
"md5_digest": "6798f53fb1cfb24c7fa7b3b34e567ca1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25430,
"upload_time": "2016-02-26T08:31:53",
"url": "https://files.pythonhosted.org/packages/57/11/849abcc007a231983520ecff8e1842adb3250cf5838bf7d8e76243f695d0/rma-0.1.11.tar.gz"
}
],
"0.1.12": [
{
"comment_text": "",
"digests": {
"md5": "f0434b2a901d84635b91f0ba1b52e75c",
"sha256": "ab09abebb981882a1824051ec1548fbd0d33d439e425da16369fce2c4b6738e6"
},
"downloads": -1,
"filename": "rma-0.1.12.tar.gz",
"has_sig": false,
"md5_digest": "f0434b2a901d84635b91f0ba1b52e75c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25806,
"upload_time": "2016-02-29T08:28:15",
"url": "https://files.pythonhosted.org/packages/ff/1c/4b9c585d4f96e8fd5aa18c33dc433edcfd5b9001d1dcc0a1414a42e017f4/rma-0.1.12.tar.gz"
}
],
"0.1.13": [
{
"comment_text": "",
"digests": {
"md5": "6cf01c99c83f4310964479509df450a8",
"sha256": "7cf3e368d23be90907a78b774c32d459a1be7204412ec1ab47d124cb70465b7f"
},
"downloads": -1,
"filename": "rma-0.1.13.tar.gz",
"has_sig": false,
"md5_digest": "6cf01c99c83f4310964479509df450a8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25842,
"upload_time": "2016-03-03T08:48:50",
"url": "https://files.pythonhosted.org/packages/48/17/e22202b05cf087e5f63ce5cd9254d618bbb755c194abcae846a9795fffc9/rma-0.1.13.tar.gz"
}
],
"0.1.14": [
{
"comment_text": "",
"digests": {
"md5": "7564d1de95876ee4df78345bc2d12175",
"sha256": "e47745a96d8b9ad8a05bff03ded1b967ddb9c9946673ef944f535e4ee28efaba"
},
"downloads": -1,
"filename": "rma-0.1.14.tar.gz",
"has_sig": false,
"md5_digest": "7564d1de95876ee4df78345bc2d12175",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25924,
"upload_time": "2016-03-04T07:06:18",
"url": "https://files.pythonhosted.org/packages/78/ea/33d8b50418bcf79f44dc53b0760a6ca8fe06bc658a6710a389909a71a20a/rma-0.1.14.tar.gz"
}
],
"0.1.15": [
{
"comment_text": "",
"digests": {
"md5": "b5d165daeb9c05d31530c119432a93b6",
"sha256": "492a1a000824e6d9bdfcf8a5721547abd3a8d09e20d08ad55f5e6065376514ce"
},
"downloads": -1,
"filename": "rma-0.1.15.tar.gz",
"has_sig": false,
"md5_digest": "b5d165daeb9c05d31530c119432a93b6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25980,
"upload_time": "2016-09-12T09:08:33",
"url": "https://files.pythonhosted.org/packages/64/47/0d46ab827fa0f86a764921d950e0857b03e2a29edf0e48eec5f1be97ae70/rma-0.1.15.tar.gz"
}
],
"0.1.16": [
{
"comment_text": "",
"digests": {
"md5": "5c8ac7b40fef4bbfd33fc11227f0d239",
"sha256": "c9383875210871d0d2837e9250194449ccfefaf9d0516b79b2f36052f64ad215"
},
"downloads": -1,
"filename": "rma-0.1.16.zip",
"has_sig": false,
"md5_digest": "5c8ac7b40fef4bbfd33fc11227f0d239",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 41420,
"upload_time": "2017-01-31T04:44:12",
"url": "https://files.pythonhosted.org/packages/80/1e/aff684c56a10c5b31ae66d9f629aec9943d0a1120a75a57736657cff5051/rma-0.1.16.zip"
}
],
"0.1.2": [
{
"comment_text": "",
"digests": {
"md5": "fd2c295cb6abb611ac3893fda4e2c403",
"sha256": "54d8cbd8a3a0b25bb7cccd6e64605f31a9ef28865c4a75419662f56192987439"
},
"downloads": -1,
"filename": "rma-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "fd2c295cb6abb611ac3893fda4e2c403",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 16963,
"upload_time": "2016-02-11T10:00:02",
"url": "https://files.pythonhosted.org/packages/83/ba/8fa33e124dada8d7f31377c0bc4a71e0ab49c3f2ad3f93a66513f4e5c173/rma-0.1.2.tar.gz"
}
],
"0.1.3": [],
"0.1.4": [
{
"comment_text": "",
"digests": {
"md5": "c799338464f39f8329569f35b20e6f00",
"sha256": "6cb1c904ace75c739ec4b26b8e4cd91f0857d2ab52c67a64abd76fa6d1431086"
},
"downloads": -1,
"filename": "rma-0.1.4.tar.gz",
"has_sig": false,
"md5_digest": "c799338464f39f8329569f35b20e6f00",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18539,
"upload_time": "2016-02-12T14:21:00",
"url": "https://files.pythonhosted.org/packages/c4/42/1baa806eda5ce55ecd6774569fd3f098fe33c6de349179a80f3f9d035c79/rma-0.1.4.tar.gz"
}
],
"0.1.5": [
{
"comment_text": "",
"digests": {
"md5": "e0f71257bbbf820b19108fbc490895be",
"sha256": "99a007dc2303c501c772ae4a50b3727db42669c267fc0d5b343f60066ae40a85"
},
"downloads": -1,
"filename": "rma-0.1.5.tar.gz",
"has_sig": false,
"md5_digest": "e0f71257bbbf820b19108fbc490895be",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18557,
"upload_time": "2016-02-12T14:25:27",
"url": "https://files.pythonhosted.org/packages/d0/c6/a4401981b4590a85e447a7c46d3d7de89f8d371acb3157d2d49766c185fa/rma-0.1.5.tar.gz"
}
],
"0.1.6": [
{
"comment_text": "",
"digests": {
"md5": "9e085be8c1f71a0129533d6b5dced0af",
"sha256": "d50b5d6b8c18d172accb4bdd3982f527eecc5f8050e8e3b58d4f33f0ae13ff5c"
},
"downloads": -1,
"filename": "rma-0.1.6.tar.gz",
"has_sig": false,
"md5_digest": "9e085be8c1f71a0129533d6b5dced0af",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18596,
"upload_time": "2016-02-15T08:32:20",
"url": "https://files.pythonhosted.org/packages/be/f8/752877ddfae03fbe6fa51355dbef5a261a78d54c0f6fc7c8b67cfe1a78f1/rma-0.1.6.tar.gz"
}
],
"0.1.7": [
{
"comment_text": "",
"digests": {
"md5": "817c27a90abe53842728338f7cb727ea",
"sha256": "01c7c03936228ccfbf7d34e2bc2344b8eef66c02cc6eb5d31ffb2a60a3d61a6b"
},
"downloads": -1,
"filename": "rma-0.1.7.tar.gz",
"has_sig": false,
"md5_digest": "817c27a90abe53842728338f7cb727ea",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18610,
"upload_time": "2016-02-15T08:47:59",
"url": "https://files.pythonhosted.org/packages/25/5f/2971365a11cc61b887265eae2e1fb87e17494a415f6fd97ef91bc84d3d93/rma-0.1.7.tar.gz"
}
],
"0.1.8": [
{
"comment_text": "",
"digests": {
"md5": "8fc56e5917a442ce28ba63dbc7fa11fe",
"sha256": "4a6a2ecd31e7c9ed10eccaed96b5a657b765b6f3cae84586a26b144c7bf42cbf"
},
"downloads": -1,
"filename": "rma-0.1.8.tar.gz",
"has_sig": false,
"md5_digest": "8fc56e5917a442ce28ba63dbc7fa11fe",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18630,
"upload_time": "2016-02-15T09:20:40",
"url": "https://files.pythonhosted.org/packages/ba/24/d7d8ffd672526f77d7c3858ef8b91b9fb27e63bc006db714c49efb2db70d/rma-0.1.8.tar.gz"
}
],
"0.1.9": [
{
"comment_text": "",
"digests": {
"md5": "a0da14964fcab9d0230361f9c0f4c16f",
"sha256": "32e4482ffa225beeca5fad079c01acd3b031130bf74fcaa5673b7c42ccb7a4c9"
},
"downloads": -1,
"filename": "rma-0.1.9.tar.gz",
"has_sig": false,
"md5_digest": "a0da14964fcab9d0230361f9c0f4c16f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 24584,
"upload_time": "2016-02-15T13:59:33",
"url": "https://files.pythonhosted.org/packages/b2/ee/8dcf5bd8fb435f360583e1c28dcf04b42bb77cea7bbd1eb31a11b0367342/rma-0.1.9.tar.gz"
}
],
"0.2.0": [
{
"comment_text": "",
"digests": {
"md5": "0985147aa9fcaa55955098b153787b9d",
"sha256": "aa55306f5e8bf9b09aa75cf7116dbc75ac8c23314d3b1b7b28f8f0845748ca4b"
},
"downloads": -1,
"filename": "rma-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0985147aa9fcaa55955098b153787b9d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 28476,
"upload_time": "2019-02-13T17:21:56",
"url": "https://files.pythonhosted.org/packages/33/16/f6b94eff544a5cd9bda6682c049779a9cc71893d595c4eed32c0e1cbddea/rma-0.2.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "bdd830080d31ba3fc080a0f60901f9a2",
"sha256": "ed5eb7b6ab88b15689d3d837e7d10d9d99ee8490bfcf44ffcb0101f005761367"
},
"downloads": -1,
"filename": "rma-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "bdd830080d31ba3fc080a0f60901f9a2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27420,
"upload_time": "2019-02-13T17:21:58",
"url": "https://files.pythonhosted.org/packages/76/ee/78200b78bcdb4ddd060c928e06f8f1003f8c66f54f6c455691fa96f75127/rma-0.2.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "0985147aa9fcaa55955098b153787b9d",
"sha256": "aa55306f5e8bf9b09aa75cf7116dbc75ac8c23314d3b1b7b28f8f0845748ca4b"
},
"downloads": -1,
"filename": "rma-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0985147aa9fcaa55955098b153787b9d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 28476,
"upload_time": "2019-02-13T17:21:56",
"url": "https://files.pythonhosted.org/packages/33/16/f6b94eff544a5cd9bda6682c049779a9cc71893d595c4eed32c0e1cbddea/rma-0.2.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "bdd830080d31ba3fc080a0f60901f9a2",
"sha256": "ed5eb7b6ab88b15689d3d837e7d10d9d99ee8490bfcf44ffcb0101f005761367"
},
"downloads": -1,
"filename": "rma-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "bdd830080d31ba3fc080a0f60901f9a2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 27420,
"upload_time": "2019-02-13T17:21:58",
"url": "https://files.pythonhosted.org/packages/76/ee/78200b78bcdb4ddd060c928e06f8f1003f8c66f54f6c455691fa96f75127/rma-0.2.0.tar.gz"
}
]
}