{ "info": { "author": "David Eyk", "author_email": "deyk@crossway.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: Office/Business :: Scheduling", "Topic :: Software Development :: Build Tools" ], "description": "##########\nScriptter!\n##########\n\n.. image:: https://travis-ci.org/eykd/scriptter.svg?branch=master\n :target: https://travis-ci.org/eykd/scriptter\n\n\n.. image:: https://coveralls.io/repos/eykd/scriptter/badge.svg\n :target: https://coveralls.io/r/eykd/scriptter\n\n\nScriptter is a brain for your cron job. You write a script (using a special\nYAML_ format), specifying a sequence of commands to run and a human-readable\ndelay between each group of commands. Then, run Scriptter against your script\nevery minute (or as often as you can). Scriptter will make sure that your\ncommands are run in the sequence and timing you specified.\n\n.. _YAML: http://www.yaml.org/\n\n\nUses:\n=====\n\nI conceived of Scriptter as a way to author Twitter bots, especially Twitter\nbots that converse with each other. But there's no limitation to Twitter:\nanything you can do in the shell, you can do in Scriptter.\n\n\nExample:\n========\n\nHere's a simple script to run a daily conversation between two Twitter\naccounts, using the `t Twitter CLI`_::\n\n defaults:\n delay: 1min\n activate: t set active\n update: t update\n cmd:\n - '{activate} {as}'\n - '{update} \"{say}\"'\n timezone: US/Eastern\n ---\n as: Costello\n say: \"@Abbott I'm not... stay out of the infield! I want to know what's the guy's name in left field?\"\n ---\n as: Abbott\n say: \"@Costello No, What is on second.\"\n ---\n as: Costello\n say: \"@Abbott I'm not asking you who's on second.\"\n ---\n as: Abbott\n say: \"@Costello Who's on first!\"\n ---\n as: Costello\n say: \"@Abbott I don't know.\"\n ---\n cmd:\n - '{activate} Abbott'\n - '{update} \"@Costello Third base!\"'\n - '{activate} Costello'\n - '{update} \"@Abbott Third base!\"'\n ---\n delay: 10min\n as: Costello\n say: '@Abbott Look, you gotta outfield?'\n\n.. _t Twitter CLI: https://github.com/sferik/t\n\nClassic, I know. Here's what's going on: every time Scriptter runs, it\nremembers where it left off at, and at what time the next item should run. When\nthat time comes, it looks at the ``cmd`` member. If a member isn't present on\nthe item, it looks in the defaults. ``cmd`` can be a single string, or a list\nof strings. Command strings can be templates containing `formatting instructions`_.\n\n.. _formatting instructions: https://docs.python.org/2/library/string.html#formatstrings\n\n\nTemplating\n==========\n\nThe context for a command template comes from the item itself, filled in with\nany global defaults from the document. That's how we can just define\n``activate`` and ``update`` at the top and use them willy-nilly in command\nstrings later. The Twitter account to use (``as``) and the content of the tweet\n(``say``) are defined in each item.\n\n\nTime Delay\n==========\n\nThey say that comedy is all about... TIMING! So how do we control the timing of\nour comedic commands? The ``delay`` attribute is a human-readable time span or\ndelay, like \"5 minutes\" or \"5mins\" or \"tomorrow at 8am\", relative to the\nprevious item. We set a default ``delay`` at the top (or if we don't set a\ndefault, the default is, by default, ``5mins``).\n\nThe ``delay`` of the first item is special: that determines how long after the\nfirst invocation the script will begin. This might be useful for a script that\nis keyed to time of day--you could say ``tomorrow at 8am`` and the script would\nbegin in the morning, next day after you start your cron job.\n\n\nRepeating a Script\n==================\n\nSome scripts should only run once, some should repeat forever. By default, your\nscript will repeat (go back to the beginning) after it completes. To change\nthis behavior, include this at the top of your script::\n\n defaults:\n repeat: false\n\n\nCommand Line\n============\n\nYou'll usually be interacting with Scriptter via the command line::\n\n $ scriptter --help\n\n\nNormal Run\n==========\n\nTo actually run the schedule, perform commands, and change state::\n\n $ scriptter run schedule.yaml\n\n\nTrial Run\n=========\n\nTo do a trial run and find out what Scriptter will do in a given state::\n\n $ scriptter trial schedule.yaml\n\nThis will do a dry run of the schedule, with the current state, but stop short\nof actually performing any actions or changing the state.\n\n\nChecking Delays\n===============\n\nIf you need to get a feel for how an item list will play out in time, use the\n``check`` command::\n\n $ scriptter check schedule.yaml\n\nThis will first verify that the complete schedule is valid, well-formed, and\nrenderable. It will go through and simulate each item in sequence, reporting\nwhen that item would run and what commands would be performed.", "description_content_type": null, "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/eykd/scriptter", "keywords": "social media twitter scheduling cron", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "scriptter", "package_url": "https://pypi.org/project/scriptter/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/scriptter/", "project_urls": { "Homepage": "https://github.com/eykd/scriptter" }, "release_url": "https://pypi.org/project/scriptter/0.3/", "requires_dist": [ "tox; extra == 'test'", "six (==1.9.0)", "docopt (==0.6.2)", "parsedatetime (==1.4)", "path.py (==7.3)", "pytz (==2015.2)", "PyYAML (==3.11)", "check-manifest; extra == 'dev'", "coverage; extra == 'test'", "coveralls; extra == 'test'", "ensure; extra == 'test'", "green; extra == 'test'", "mock; extra == 'test'", "pep8; extra == 'test'" ], "requires_python": null, "summary": "cron's missing brain. Stateful, time-based scripting.", "version": "0.3" }, "last_serial": 1539736, "releases": { "0.2": [ { "comment_text": "", "digests": { "md5": "0422df2691796b37d3f767e89b1aeae9", "sha256": "a2fefa27fe88b209b2ebd752c038c6e0ec159999036b3951971c9862a7089a4b" }, "downloads": -1, "filename": "scriptter-0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "0422df2691796b37d3f767e89b1aeae9", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9932, "upload_time": "2015-05-08T13:17:40", "url": "https://files.pythonhosted.org/packages/a3/8f/57932a317a4f3df07b0d51a8aedff16efb2742753188d2cf6561b3e81c5a/scriptter-0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8f54474c92b9ede1112da202cb847e96", "sha256": "1ae0f9c5d30d60e2ebfbefab834fe66908a7ac203fc24fb2b5bd9a3d42bdb25d" }, "downloads": -1, "filename": "scriptter-0.2.tar.gz", "has_sig": false, "md5_digest": "8f54474c92b9ede1112da202cb847e96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7805, "upload_time": "2015-05-08T13:17:43", "url": "https://files.pythonhosted.org/packages/04/b0/74d0081b69958c892fc42b8470fd2cb5608b44c6699985d09e94c08ffe9f/scriptter-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "0639ed5134da67eae7772dc275731803", "sha256": "6512c77f3188e96053ba9ab2f7daf8a5a2345da9d0cc13c5a6a5e8844b3eebe4" }, "downloads": -1, "filename": "scriptter-0.2.1-py2-none-any.whl", "has_sig": false, "md5_digest": "0639ed5134da67eae7772dc275731803", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9975, "upload_time": "2015-05-08T14:04:12", "url": "https://files.pythonhosted.org/packages/a2/0c/9bdd870d0021bf3a48ccbef627af66837f882a42dd3761ed924361b93b7c/scriptter-0.2.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f88b679b218b2dd3c1e4649d83ee2231", "sha256": "d1aa4fa5c05c4721789b0067da90d8c6ec3d11fc312a74a9162edbc5ce5b3fdc" }, "downloads": -1, "filename": "scriptter-0.2.1.tar.gz", "has_sig": false, "md5_digest": "f88b679b218b2dd3c1e4649d83ee2231", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7831, "upload_time": "2015-05-08T14:04:15", "url": "https://files.pythonhosted.org/packages/5c/95/a33d2ba6416b6878f5078f68b7cc5fb83250a3dc721cc0a7d778481f8864/scriptter-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "a51399290734c0f121f7a098a1995ffa", "sha256": "332bab5d39d82e4e8c84afc74c29a6e4100b6bb38de0802254dc25d843328fca" }, "downloads": -1, "filename": "scriptter-0.2.2-py2-none-any.whl", "has_sig": false, "md5_digest": "a51399290734c0f121f7a098a1995ffa", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9974, "upload_time": "2015-05-08T14:10:12", "url": "https://files.pythonhosted.org/packages/34/a2/cad76115df25df1757802795e85bf610d62733efe9a0a3adc08ae7a83470/scriptter-0.2.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1aaeaffb1fd438e6e6b479e3d926926", "sha256": "02a98e8cedbbf81a84b3f46d7615afabe6069cbe0e75af83b107c2b1d1c773d0" }, "downloads": -1, "filename": "scriptter-0.2.2.tar.gz", "has_sig": false, "md5_digest": "a1aaeaffb1fd438e6e6b479e3d926926", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7830, "upload_time": "2015-05-08T14:10:15", "url": "https://files.pythonhosted.org/packages/87/95/f56ee21e69986ae7fb7fa8b1ae00f2a0d757e2eaf2830548b04b086cb93d/scriptter-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "94e37e1d1bea89b3d16f14dd28fd0e47", "sha256": "9546882f18d016d2cb6208b4f316a5d2d62bb6b2c85a3aa85b8192b7ecc14917" }, "downloads": -1, "filename": "scriptter-0.2.3-py2-none-any.whl", "has_sig": false, "md5_digest": "94e37e1d1bea89b3d16f14dd28fd0e47", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 10013, "upload_time": "2015-05-08T14:24:41", "url": "https://files.pythonhosted.org/packages/bd/9c/ebc11fa6e156b1bd61dcac459450c9c9d5f66c2b9f5b0756ea9c056fa40c/scriptter-0.2.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b10db9f5a815dbe3f0f11e47fb4cc60d", "sha256": "b7f9080a9b89b190cf03f42c292746b52f8149678fc3bc82245b1510794c67bf" }, "downloads": -1, "filename": "scriptter-0.2.3.tar.gz", "has_sig": false, "md5_digest": "b10db9f5a815dbe3f0f11e47fb4cc60d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7878, "upload_time": "2015-05-08T14:24:44", "url": "https://files.pythonhosted.org/packages/91/bc/863b42ca2748f48a5391caee6d0c03766d06f9dc8fa15641a8f8cec48877/scriptter-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "8df3ad820f401031dba1dfa696e14697", "sha256": "1011aac2fe1cc000adffc3dd6ad249e28a6392952c54f636a98ccb4a55ad8436" }, "downloads": -1, "filename": "scriptter-0.2.4-py2-none-any.whl", "has_sig": false, "md5_digest": "8df3ad820f401031dba1dfa696e14697", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 10014, "upload_time": "2015-05-08T14:29:44", "url": "https://files.pythonhosted.org/packages/09/a7/27b2e70bef357d945efe014e8f816b69ccb50293d48ea1b58c36f5cb9dd7/scriptter-0.2.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6a3b872e97e37dce5c015a99d13e664a", "sha256": "b306b9ebf002de14f7b19df05d98563551f06ef4894edd21f5c0e206a361f5d1" }, "downloads": -1, "filename": "scriptter-0.2.4.tar.gz", "has_sig": false, "md5_digest": "6a3b872e97e37dce5c015a99d13e664a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7948, "upload_time": "2015-05-08T14:29:47", "url": "https://files.pythonhosted.org/packages/db/83/ea52c5235d7748268f73f8a0383bb420432a8195c3a71fde42afd5115eff/scriptter-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "0c055090b9ff53f133e15deef0e4339e", "sha256": "6283a2c86256710e17accd9efc065496ceeb60f71465ab6ca1ffdd0dcada1c07" }, "downloads": -1, "filename": "scriptter-0.2.5-py2-none-any.whl", "has_sig": false, "md5_digest": "0c055090b9ff53f133e15deef0e4339e", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9977, "upload_time": "2015-05-08T14:39:34", "url": "https://files.pythonhosted.org/packages/29/1e/807c2946e1c610f418785f6532c1375a4a71f8f4fe493a1fe2bbd67ab0a7/scriptter-0.2.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a41ea889aba42eaca90ac01b47149702", "sha256": "a7f867e90880bb0959f8c0fb6be34936e47c7ff7f34b2410791da57e4f98c88c" }, "downloads": -1, "filename": "scriptter-0.2.5.tar.gz", "has_sig": false, "md5_digest": "a41ea889aba42eaca90ac01b47149702", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7941, "upload_time": "2015-05-08T14:39:37", "url": "https://files.pythonhosted.org/packages/fb/29/d1de0ebb253c65b053c0947e54659ec577bc14df1e2e853c048fac862d55/scriptter-0.2.5.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "7ca7f0eb2a0b44420db371b261e2b548", "sha256": "d02a365eee2b0b75b5273890d1815a4c08f8cdab08bd938dc64ccc864c9e0e8e" }, "downloads": -1, "filename": "scriptter-0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "7ca7f0eb2a0b44420db371b261e2b548", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9969, "upload_time": "2015-05-09T00:36:29", "url": "https://files.pythonhosted.org/packages/3c/f2/8ea8a8e209707eb97009e4a975d0ea40ecd2ffbbda6ca4f1b2f7b9605086/scriptter-0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9aaf9ff27e8dedea7fd3b0e2e7954563", "sha256": "fb021460d334cdf921c8f78938315a114d2a5b355d5c9e97396184fba2794ef9" }, "downloads": -1, "filename": "scriptter-0.3.tar.gz", "has_sig": false, "md5_digest": "9aaf9ff27e8dedea7fd3b0e2e7954563", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8124, "upload_time": "2015-05-09T00:36:32", "url": "https://files.pythonhosted.org/packages/86/ce/206915a3267f6ec1f1c99bb63d303ab7c81269808d3be45f7c03984325f7/scriptter-0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7ca7f0eb2a0b44420db371b261e2b548", "sha256": "d02a365eee2b0b75b5273890d1815a4c08f8cdab08bd938dc64ccc864c9e0e8e" }, "downloads": -1, "filename": "scriptter-0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "7ca7f0eb2a0b44420db371b261e2b548", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 9969, "upload_time": "2015-05-09T00:36:29", "url": "https://files.pythonhosted.org/packages/3c/f2/8ea8a8e209707eb97009e4a975d0ea40ecd2ffbbda6ca4f1b2f7b9605086/scriptter-0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9aaf9ff27e8dedea7fd3b0e2e7954563", "sha256": "fb021460d334cdf921c8f78938315a114d2a5b355d5c9e97396184fba2794ef9" }, "downloads": -1, "filename": "scriptter-0.3.tar.gz", "has_sig": false, "md5_digest": "9aaf9ff27e8dedea7fd3b0e2e7954563", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8124, "upload_time": "2015-05-09T00:36:32", "url": "https://files.pythonhosted.org/packages/86/ce/206915a3267f6ec1f1c99bb63d303ab7c81269808d3be45f7c03984325f7/scriptter-0.3.tar.gz" } ] }