{ "info": { "author": "Andrew Chronister", "author_email": "chr@cybre.space", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Topic :: Communications" ], "description": "# Ananas\n\n## What is Ananas?\n\nAnanas allows you to write simple (or complicated!) mastodon bots without having\nto rewrite config file loading, interval-based posting, scheduled posting,\nauto-replying, and so on.\n\nSome bots are as simple as a configuration file:\n\n [bepis]\n class = tracery.TraceryBot\n access_token = ....\n grammar_file = \"bepis.json\"\n\nBut it's easy to write one with customized behavior:\n\n class MyBot(ananas.PineappleBot):\n def start(self):\n with open('trivia.txt', 'r') as trivia_file:\n self.trivia = trivia_file.lines()\n\n @hourly(minute=17)\n def post_trivia(self):\n self.mastodon.toot(random.choice(self.trivia))\n\n @reply\n def respond_trivia(self, status, user):\n self.mastodon.toot(\"@{}: {}\".format(user[\"acct\"], random.choice(self.trivia)))\n\nRun multiple bots on multiple instances out of a single config file:\n\n [jorts]\n class = custom.JortsBot\n domain = botsin.space\n access_token = ....\n line = 632\n\n [roll]\n class = roll.DiceBot\n domain = cybre.space\n access_token = ....\n\nAnd use the DEFAULT section to share common configuration options between them:\n\n [DEFAULT]\n domain = cybre.space\n client_id = ....\n client_secret = ....\n\n## Getting started\n\n pip install ananas\n\nThe `ananas` pip package comes with a script to help you manage your bots.\n\nSimply give it a config file and it'll load your bots and close them safely\nwhen it receives a keyboard interrupt, SIGINT, SIGTERM, or SIGKILL.\n\n ananas config.cfg\n\nIf you haven't specified a client id/secret or access token, the script will\nexit unless you run it with the `--interactive` flag, which allows it to\nprompt you for the instance login information. (The only part of the input\nyou enter here that's stored in the config file is the instance name -- the\nemail and password are only used to generate the access token).\n\n## Configuration\n\nThe following fields are interpreted by the PineappleBot base classs and will\nwork for every bot:\n\n**class**: the fully-specified python class that the runner script should\ninstantiate to start your bot. e.g. \"ananas.default.TraceryBot\"\n\n**domain**\\ \u00b9: the domain of the instance to run the bot on. Must support https\nconnections. Only include the domain, no protocol or slashes. e.g. \"mastodon.social\"\n\n**client\\_id**\\ \u00b9, **client\\_secret**\\ \u00b9: the tokens that the instance uses to identify\nwhat client this bot is posting from/as. Will be used to determine what's\ndisplayed underneath all the posts made by this bot.\n\n**access\\_token**\\ \u00b9: the access token used to authenticate API requests with the\ninstance. Make sure this is secret, don't distribute config files with this\nfield filled out or people will be able to post under the account this token was\ncreated with.\n\n**admin**: the full username (without leading @) of the user to DM error reports to.\nCan be left unspecified, but is useful for keeping an eye on the health of the\nbot without constantly monitoring the script logs. e.g. `admin@example.town`\n\n\u00b9: Filled out automatically if the bot is run in interactive mode.\n\nAdditional fields are specific to the type of bot, refer to the documentation\nfor the bot's class for more information about the fields it expects.\n\n# Writing Bots\n\nCustom bot classes should be subclasses of `ananas.PineappleBot`. If you\noverride `__init__`, be sure to call the base class's `__init__`.\n\n## Decorators\n\nIn order for the bot to do anything, you should add a method decorated with at\nleast one of the following decorators:\n\n**@ananas.reply**: Calls the decorated function when the bot is mentioned by any\nother user. Decorator takes no parameters, but should only be called on\nfunctions matching this signature: `def reply_fn(self, mention, user)`.\n`mention` will be the dictionary corresponding to the status containing the\nmention (as returned by the [mastodon API](https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md),\n`user` will be the dictionary corresponding to the user that mentioned the bot.\n\n**@ananas.interval(secs)**: Calls the decorated function every `secs` seconds,\nstarting when the bot is initialized. For intervals longer than ~an hour, you\nmay want to use `@schedule` instead. e.g. `@ananas.interval(60)`\n\n**@ananas.schedule(\\*\\*kwargs)**: Allows you to schedule, cron-style, the\ndecorated function. Accepted keywords are \"second\", \"minute\", \"hour\",\n\"day\\_of\\_week\" or \"day\\_of\\_month\" (but not both), \"month\", and \"year\". If any of\nthese keywords are not specified, they will be treated like cron treats an \\*,\nthat is, as long as the time matches the other values, any value will be\naccepted. Speaking of which, the cron-like syntax \"\\*\" as well as \"\\*/3\" are\nboth accepted, and will expand to the expected thing: for example,\n`schedule(hour=\"*/2\", minute=\"*/10\")` will post every 10 minutes during hours\nwhich are multiples of 2.\n\n**@ananas.hourly(minute=0)**, **@ananas.daily(hour=0, minute=0)**: Shortcuts for\n`@ananas.schedule()` that call the decorated function once an hour at the\nspecified minute or once a day at the specified hour and minute. If parameters\nare omitted they'll post at the top of the hour or midnight (UTC).\n\n**@ananas.error\\_reporter**: specifies custom behavior for reporting errors. The\ndecorated function should match this signature: `def err(self, error)` where\n`error` is a string representation of the error.\n\n## Overrideable Functions\n\nYou can also define the following functions and they will be called at the\nrelevant points in the bot's lifecycle:\n\n**init(self)**: called before the configuration file has been loaded, so\nthat you can set default values for config fields in case the config file\ndoesn't specify them.\n\n**start(self)**: called after all of the internal PineappleBot initialization is\ncomplete and the mastodon API is ready to use. A good place to load files\nspecified in the config, post a startup notice, or otherwise do bot-specific\nsetup.\n\n**stop(self)**: called when the bot has received a shutdown signal and needs to\nstop. The config file will be saved after this, so if you need to make any last\nminute changes to the config, do that here.\n\n## Configuration Fields\n\nAll of the configuration fields for the current bot are available through the\n`self.config` object, which exposes them with both field-accessor syntax and\ndictionary-accessor syntax, for example:\n\n foo = self.config.foo\n bar = self.config[\"bar\"]\n\nThese can be read (to get the user's configuration data) or written to (to\naffect the config file on next save) or deleted (to remove that field from the\nconfig file).\n\nYou can call `self.config.load()` to get the latest values from the config\nfile. `load` takes an optional parameter `name`, which is the name of the\nsection to load in the config file in case you want to load a different one than\nthe bot was started with.\n\nYou can also call `self.config.save()` to write any changes made since the last\nload back to the config file.\n\nNote that if you call `self.config.load()` during bot operation, without first\ncalling `self.config.save()`, you will discard any changes made to the\nconfiguration since the last load.\n\n## Distributing Bots\n\nYou can distribute bots however you want; as long as the class is available in\nsome module in python's `sys.path` or a module accessible from the current\ndirectory, the runner script will be able to load it.\n\nIf you think your bot might be generally useful to other people, feel free to\ncreate a pull request on this repository to get it added to the collection of\ndefault bots.\n\n\nQuestions? Ping me on Mastodon at `@chr@cybre.space` or shoot me an email at\n`chr@cybre.space` and I'll answer as best I can!\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/chronister/ananas", "keywords": "mastodon microblogging bot", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "ananas", "package_url": "https://pypi.org/project/ananas/", "platform": "", "project_url": "https://pypi.org/project/ananas/", "project_urls": { "Homepage": "https://github.com/chronister/ananas" }, "release_url": "https://pypi.org/project/ananas/1.0.0b18/", "requires_dist": [ "requests", "more-itertools", "Mastodon.py (>=1.3.1)", "configobj" ], "requires_python": "~=3.3", "summary": "Mastodon bot framework built on Mastodon.py", "version": "1.0.0b18" }, "last_serial": 4429863, "releases": { "1.0.0b1": [ { "comment_text": "", "digests": { "md5": "94a5c450cfa2f1f34d25cff3798c8243", "sha256": "b1decf978fdbbf2bdc408d9d92002d0fe95b6d3191931b0760f2d78dbb7889e9" }, "downloads": -1, "filename": "ananas-1.0.0b1-py3-none-any.whl", "has_sig": false, "md5_digest": "94a5c450cfa2f1f34d25cff3798c8243", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13615, "upload_time": "2017-08-31T02:30:51", "url": "https://files.pythonhosted.org/packages/8d/50/6e9610fd1f77a41b3252902918b492ffe97ac92dfcd244b360daa13aac2b/ananas-1.0.0b1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15d2e3dc7beeee8d3fa526c22ddb975d", "sha256": "fe81bba5ef1d0064a8a65c1ba296b8bcf840cbd65cbc37fff80dbcf13fe46afc" }, "downloads": -1, "filename": "ananas-1.0.0b1.zip", "has_sig": false, "md5_digest": "15d2e3dc7beeee8d3fa526c22ddb975d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25580, "upload_time": "2017-08-31T02:30:54", "url": "https://files.pythonhosted.org/packages/08/43/119037f2332e254c7b3c537e759412370bc3e162333f35db6fe68993b4e4/ananas-1.0.0b1.zip" } ], "1.0.0b10": [ { "comment_text": "", "digests": { "md5": "24d4bdae8e59c68bee15a650670c2232", "sha256": "dd4a353323ce3d7a755de572f415cff76459d88eb41078bf8bda5c9ff7494f2f" }, "downloads": -1, "filename": "ananas-1.0.0b10.tar.gz", "has_sig": false, "md5_digest": "24d4bdae8e59c68bee15a650670c2232", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17900, "upload_time": "2018-04-13T03:37:37", "url": "https://files.pythonhosted.org/packages/ac/25/47fcc6b37ba628bf9f18fc0eab83c9ca010de637ac5a61a92d264ac4bcac/ananas-1.0.0b10.tar.gz" } ], "1.0.0b11": [ { "comment_text": "", "digests": { "md5": "b175c057b1e316d9630b48b226f546f5", "sha256": "08505bdd4e29dd67e96bbe33bb83cf1369d99359f1587a4271bbc19b2a198d27" }, "downloads": -1, "filename": "ananas-1.0.0b11.tar.gz", "has_sig": false, "md5_digest": "b175c057b1e316d9630b48b226f546f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17910, "upload_time": "2018-04-13T03:44:12", "url": "https://files.pythonhosted.org/packages/b7/a6/16b42d95adcf54d54af94f6901a60d12550a54f80782c20fe4e28b822351/ananas-1.0.0b11.tar.gz" } ], "1.0.0b12": [ { "comment_text": "", "digests": { "md5": "d3a7709cd39ee5b807f95714f4cc92b8", "sha256": "c6a3029da46dde5014beeff29b17ae0c2799be77088604df718d8246773c099f" }, "downloads": -1, "filename": "ananas-1.0.0b12.tar.gz", "has_sig": false, "md5_digest": "d3a7709cd39ee5b807f95714f4cc92b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17917, "upload_time": "2018-04-13T03:52:04", "url": "https://files.pythonhosted.org/packages/57/ff/2a29f480ab54ff4776d113eebb2075d96f2e4fe9233d38ae9569a46b6e48/ananas-1.0.0b12.tar.gz" } ], "1.0.0b13": [ { "comment_text": "", "digests": { "md5": "283c7de8c9f658899242b8af2aca4059", "sha256": "af54e85d969dc7bad55b5029560e65ddc3dfd7587c5b908c55f049f1ceb30222" }, "downloads": -1, "filename": "ananas-1.0.0b13-py3-none-any.whl", "has_sig": false, "md5_digest": "283c7de8c9f658899242b8af2aca4059", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28255, "upload_time": "2018-07-15T19:12:54", "url": "https://files.pythonhosted.org/packages/ba/a0/833edda51300f15ef5acd765d21fd7efef5ef952313e2b3e53012ddc6b54/ananas-1.0.0b13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15203959930baf9d92974a5b1ee1c5ab", "sha256": "62aa9a811c828ad08d8774c975cd82473e58f71f16ae1970b8c42de44380d163" }, "downloads": -1, "filename": "ananas-1.0.0b13.tar.gz", "has_sig": false, "md5_digest": "15203959930baf9d92974a5b1ee1c5ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17926, "upload_time": "2018-07-15T19:10:02", "url": "https://files.pythonhosted.org/packages/8e/65/581dd530f89774b509f9293c438148e131da9e83bc873cdba066aa7cc25c/ananas-1.0.0b13.tar.gz" } ], "1.0.0b14": [ { "comment_text": "", "digests": { "md5": "1db0aa59713936f9998eb4b4a28e66b3", "sha256": "91b0fa3ccbcdd985f01f4dc79a90d570f8031de4c2adea10059cf8d3380b9499" }, "downloads": -1, "filename": "ananas-1.0.0b14.tar.gz", "has_sig": false, "md5_digest": "1db0aa59713936f9998eb4b4a28e66b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18104, "upload_time": "2018-07-15T20:22:12", "url": "https://files.pythonhosted.org/packages/11/18/4b9e2b348189e2ef71ce807225898bd96946bf3b7c280669173ccc90666d/ananas-1.0.0b14.tar.gz" } ], "1.0.0b15": [ { "comment_text": "", "digests": { "md5": "87fe34267f2a04686b1dcfda270674e1", "sha256": "a475db9f6c552bbf7314b696655ebc5fdc43d23047a043c9d1a69961770d0298" }, "downloads": -1, "filename": "ananas-1.0.0b15-py3-none-any.whl", "has_sig": false, "md5_digest": "87fe34267f2a04686b1dcfda270674e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28976, "upload_time": "2018-07-31T06:31:23", "url": "https://files.pythonhosted.org/packages/80/9e/b7ba269c34efa7c2827f3fa8bd36ef8613ad68d1fba324f03f127c478b3c/ananas-1.0.0b15-py3-none-any.whl" } ], "1.0.0b16": [ { "comment_text": "", "digests": { "md5": "cec40d3a08bde2cf46425fde3aefd0ee", "sha256": "c4ef91cda59ae16a99ae4aff50cb741acd28de12904d9bcc804207c0d05f57bd" }, "downloads": -1, "filename": "ananas-1.0.0b16-py3-none-any.whl", "has_sig": false, "md5_digest": "cec40d3a08bde2cf46425fde3aefd0ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28977, "upload_time": "2018-07-31T06:34:15", "url": "https://files.pythonhosted.org/packages/e9/62/5804c82903ce10f20807da8e68aeec00a828d1091263180958ab8e9580e5/ananas-1.0.0b16-py3-none-any.whl" } ], "1.0.0b17": [ { "comment_text": "", "digests": { "md5": "e504bd9f6c6cf8d3d419f39c18267219", "sha256": "cc52dc666f458d84b8f5f4843122d6152180fcfbf2028b2ea1374629594d4921" }, "downloads": -1, "filename": "ananas-1.0.0b17-py3-none-any.whl", "has_sig": false, "md5_digest": "e504bd9f6c6cf8d3d419f39c18267219", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28993, "upload_time": "2018-07-31T06:39:49", "url": "https://files.pythonhosted.org/packages/20/eb/0b13312c17663848db0f013f7918d454e497c42df6632dd2bb2486ef2a82/ananas-1.0.0b17-py3-none-any.whl" } ], "1.0.0b18": [ { "comment_text": "", "digests": { "md5": "6834072352562cef6ad8e04685952531", "sha256": "0eb8fb83ced0706bf450252f330886e0ab8e58ae9c023ef5ddcfa73bb6e8cbbd" }, "downloads": -1, "filename": "ananas-1.0.0b18-py3-none-any.whl", "has_sig": false, "md5_digest": "6834072352562cef6ad8e04685952531", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.3", "size": 20716, "upload_time": "2018-10-30T03:00:53", "url": "https://files.pythonhosted.org/packages/52/46/23cbff4d8804ad6d7ccc7dcf6147b5545c31f88e8c3817a6d2b05c724915/ananas-1.0.0b18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "890bcc812550af49edf5c56a37a11054", "sha256": "a9da5243d77c41e3eb674b0bb846b3ea5436271426ab0def9e8829778a8425e9" }, "downloads": -1, "filename": "ananas-1.0.0b18.tar.gz", "has_sig": false, "md5_digest": "890bcc812550af49edf5c56a37a11054", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.3", "size": 21189, "upload_time": "2018-10-30T03:00:55", "url": "https://files.pythonhosted.org/packages/f4/a0/6c2f02183bf342db8f70da1dd0e5a3e18e3b1958d2f916cec1c10466f49c/ananas-1.0.0b18.tar.gz" } ], "1.0.0b2": [ { "comment_text": "", "digests": { "md5": "438e5cb8091a546aa0613c90b8caf247", "sha256": "7a34c80af1bd1555122fe1206d3e7fd1a9d589768c6566cbe76466cf821ff588" }, "downloads": -1, "filename": "ananas-1.0.0b2-py3-none-any.whl", "has_sig": false, "md5_digest": "438e5cb8091a546aa0613c90b8caf247", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25249, "upload_time": "2017-08-31T03:12:42", "url": "https://files.pythonhosted.org/packages/15/1b/44ec91c31ea0a839feb96ea869c4b76016dea1653665fe917d18b76da060/ananas-1.0.0b2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c92678ad8c152db4418af220f24a114", "sha256": "352280dd37141156df668ba8cdf5562212dde0f5b7d53a475ba5afdbeb8568ec" }, "downloads": -1, "filename": "ananas-1.0.0b2.zip", "has_sig": false, "md5_digest": "5c92678ad8c152db4418af220f24a114", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25900, "upload_time": "2017-08-31T03:12:44", "url": "https://files.pythonhosted.org/packages/f1/ce/8a24df75fe709d40ad7f69bace86cffd5f1063fa4ff8f083edd0742648e6/ananas-1.0.0b2.zip" } ], "1.0.0b3": [ { "comment_text": "", "digests": { "md5": "7b5e694f1f19d2d5bfc972f56f6bf6f8", "sha256": "1c900a9014e5a9f17727f5b6b0501eb4c6efb9508476e6e14d3313e3237c0f53" }, "downloads": -1, "filename": "ananas-1.0.0b3-py3-none-any.whl", "has_sig": false, "md5_digest": "7b5e694f1f19d2d5bfc972f56f6bf6f8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25560, "upload_time": "2017-08-31T09:45:25", "url": "https://files.pythonhosted.org/packages/6a/27/5d508bb34448b8fa9d2a1b586b024f4853152f9a20548b12e106aa2f72eb/ananas-1.0.0b3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b64eb93b9661b0ac0abb1e5a3383509c", "sha256": "302290630aac0afaca9ea21e37c32c6922d068faad0bb097ad593242eddb105d" }, "downloads": -1, "filename": "ananas-1.0.0b3.zip", "has_sig": false, "md5_digest": "b64eb93b9661b0ac0abb1e5a3383509c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26173, "upload_time": "2017-08-31T09:45:28", "url": "https://files.pythonhosted.org/packages/94/ad/a9256674c0a3c69b8386a451478671cd7144b19ea4f84c957a104c90a191/ananas-1.0.0b3.zip" } ], "1.0.0b4": [ { "comment_text": "", "digests": { "md5": "1c27a5b750d69969ee5f2744444fd287", "sha256": "025e81b22abfb26e462c026df13955687380a1f55f5bba63c372f2f440f869fa" }, "downloads": -1, "filename": "ananas-1.0.0b4-py3-none-any.whl", "has_sig": false, "md5_digest": "1c27a5b750d69969ee5f2744444fd287", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.3", "size": 25396, "upload_time": "2017-09-05T08:37:45", "url": "https://files.pythonhosted.org/packages/f6/50/70a84bd1c88b3f984ace2fa982e64bed36681e3eacb3c06c70b7b2d37093/ananas-1.0.0b4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b527ca7204b8affeb2086ecb6b55d8c", "sha256": "4a7cebd8f96ed02faf9bdca2566b11c3300666a9dac7dc9d65d29344500cf7a0" }, "downloads": -1, "filename": "ananas-1.0.0b4.tar.gz", "has_sig": false, "md5_digest": "4b527ca7204b8affeb2086ecb6b55d8c", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.3", "size": 19398, "upload_time": "2017-09-05T08:37:47", "url": "https://files.pythonhosted.org/packages/e8/5d/a2afc64b4ff94f3f731d7f1b13655eff0d9924c1775d0c529fe41231bebd/ananas-1.0.0b4.tar.gz" } ], "1.0.0b5": [ { "comment_text": "", "digests": { "md5": "c09a6f4151a8eddc1189a745eb9cbf36", "sha256": "04c06486d4cc8effc98cdc2b2ca1f4e0d82d024f827ccd495f41a4b3e2c973f2" }, "downloads": -1, "filename": "ananas-1.0.0b5-py3-none-any.whl", "has_sig": false, "md5_digest": "c09a6f4151a8eddc1189a745eb9cbf36", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 26483, "upload_time": "2018-02-21T04:54:44", "url": "https://files.pythonhosted.org/packages/0b/34/158303021a46c4a854d1ff6e9a47c5dc036ccda45966b21ff1ca4594d73a/ananas-1.0.0b5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ee25a7997242c2e76e74a6455354a0de", "sha256": "45131c5ecb268a73d83e934c5dfea44f33571ce4b28c6d6df7ea32c407d210df" }, "downloads": -1, "filename": "ananas-1.0.0b5.tar.gz", "has_sig": false, "md5_digest": "ee25a7997242c2e76e74a6455354a0de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15711, "upload_time": "2018-02-21T04:54:41", "url": "https://files.pythonhosted.org/packages/35/3d/6055c6a2becd00b77bc2fe4d10fc6ae529e8a032b9eddc65fca65d0440fb/ananas-1.0.0b5.tar.gz" } ], "1.0.0b6": [ { "comment_text": "", "digests": { "md5": "e6104b0cb245f8fc9811971a4d890392", "sha256": "a0166250464b178c2d708ac44433b38a72f3315f640065af2ffefa3b4fc88c38" }, "downloads": -1, "filename": "ananas-1.0.0b6-py3-none-any.whl", "has_sig": false, "md5_digest": "e6104b0cb245f8fc9811971a4d890392", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 26488, "upload_time": "2018-03-12T00:08:21", "url": "https://files.pythonhosted.org/packages/19/48/93d326eb6777209ac23afc7dfbc13781fe7c6826d6caa95fac97e706695b/ananas-1.0.0b6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4ce765d723e60acc695ea13d2c32cac", "sha256": "56d2b097258df592aedae3b50a161c5b8d19192c5501247928d863991a152681" }, "downloads": -1, "filename": "ananas-1.0.0b6.tar.gz", "has_sig": false, "md5_digest": "d4ce765d723e60acc695ea13d2c32cac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15718, "upload_time": "2018-03-12T00:08:18", "url": "https://files.pythonhosted.org/packages/a7/4d/a636d46ca1a68189d46686664ff59f65b2d23a97934f98bb34ad857733c0/ananas-1.0.0b6.tar.gz" } ], "1.0.0b7": [ { "comment_text": "", "digests": { "md5": "daf6afdf2c9e5662ce1143dd3f465d3c", "sha256": "d1bb534d81c114e2ff240b41665e0deda5481ee5ee7e015776337708c32d1689" }, "downloads": -1, "filename": "ananas-1.0.0b7-py3-none-any.whl", "has_sig": false, "md5_digest": "daf6afdf2c9e5662ce1143dd3f465d3c", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 26998, "upload_time": "2018-03-12T22:04:37", "url": "https://files.pythonhosted.org/packages/6b/68/60ac6a55dc00c2a25b37cad853161ab8c6a5ce7bcf9c45508ecdc53c8557/ananas-1.0.0b7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8cdddaf7eda675224df7b9a764b8964", "sha256": "8c599cebe6a95efd819599d4539679d0c6c28ff1086d0e64beb8a3a72a1b8075" }, "downloads": -1, "filename": "ananas-1.0.0b7.tar.gz", "has_sig": false, "md5_digest": "f8cdddaf7eda675224df7b9a764b8964", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16194, "upload_time": "2018-03-12T22:04:36", "url": "https://files.pythonhosted.org/packages/c7/ac/1ed7fd22d78ab72999039dcbc750215349fc42f8a8d92938fb9fa74173b2/ananas-1.0.0b7.tar.gz" } ], "1.0.0b8": [ { "comment_text": "", "digests": { "md5": "93e3ff4d6d1a127cfa96047e2341b9df", "sha256": "9432d5325fed34a1b5baa861b9f115a80dd2fb1b7dcecf03d50f2452e35fd6c5" }, "downloads": -1, "filename": "ananas-1.0.0b8-py3-none-any.whl", "has_sig": false, "md5_digest": "93e3ff4d6d1a127cfa96047e2341b9df", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 27010, "upload_time": "2018-03-12T22:36:07", "url": "https://files.pythonhosted.org/packages/48/74/1030b18a18fad0fceac4628b139e1c9be067c878404eb0c88dbd4fc062b8/ananas-1.0.0b8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f4b1fd2edc971a2cd0ac78d2966bab9", "sha256": "95921ff01463cec62d71957b91e4b3822dde764b6e5e36d7f03d2c45c3ff1c41" }, "downloads": -1, "filename": "ananas-1.0.0b8.tar.gz", "has_sig": false, "md5_digest": "7f4b1fd2edc971a2cd0ac78d2966bab9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16208, "upload_time": "2018-03-12T22:36:05", "url": "https://files.pythonhosted.org/packages/5b/63/b7449a8dc10aeb8205798fd234b1243c1380b046a2512d730b153574b438/ananas-1.0.0b8.tar.gz" } ], "1.0.0b9": [ { "comment_text": "", "digests": { "md5": "044e8a9b899921577c1fe3ecef3e2abd", "sha256": "6f16f728cb3e73c100b490e8e7c8aa67b7c6349dac423b5d19df1b40fec3e551" }, "downloads": -1, "filename": "ananas-1.0.0b9-py3-none-any.whl", "has_sig": false, "md5_digest": "044e8a9b899921577c1fe3ecef3e2abd", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 27089, "upload_time": "2018-03-13T05:46:52", "url": "https://files.pythonhosted.org/packages/47/e5/ac0e583131d150a97d5cca9f65123d5cd3bc943e9e6454f6571438ae16df/ananas-1.0.0b9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4369ae50a70413cc4af9bc3876acbf91", "sha256": "430149fcda7ee2cb156de9c3d10977fd6523ffbab6f6d16003f0b73c35b1bb61" }, "downloads": -1, "filename": "ananas-1.0.0b9.tar.gz", "has_sig": false, "md5_digest": "4369ae50a70413cc4af9bc3876acbf91", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16295, "upload_time": "2018-03-13T05:46:51", "url": "https://files.pythonhosted.org/packages/bc/7d/49bd51fbebb57f08353c65733d79165abc6849e91b9aebf4300c58422232/ananas-1.0.0b9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6834072352562cef6ad8e04685952531", "sha256": "0eb8fb83ced0706bf450252f330886e0ab8e58ae9c023ef5ddcfa73bb6e8cbbd" }, "downloads": -1, "filename": "ananas-1.0.0b18-py3-none-any.whl", "has_sig": false, "md5_digest": "6834072352562cef6ad8e04685952531", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.3", "size": 20716, "upload_time": "2018-10-30T03:00:53", "url": "https://files.pythonhosted.org/packages/52/46/23cbff4d8804ad6d7ccc7dcf6147b5545c31f88e8c3817a6d2b05c724915/ananas-1.0.0b18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "890bcc812550af49edf5c56a37a11054", "sha256": "a9da5243d77c41e3eb674b0bb846b3ea5436271426ab0def9e8829778a8425e9" }, "downloads": -1, "filename": "ananas-1.0.0b18.tar.gz", "has_sig": false, "md5_digest": "890bcc812550af49edf5c56a37a11054", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.3", "size": 21189, "upload_time": "2018-10-30T03:00:55", "url": "https://files.pythonhosted.org/packages/f4/a0/6c2f02183bf342db8f70da1dd0e5a3e18e3b1958d2f916cec1c10466f49c/ananas-1.0.0b18.tar.gz" } ] }