{ "info": { "author": "Naphat Sanguansin", "author_email": "naphat.krit@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "EasyCI\n======\n**Note**: EasyCI only works with git repositories.\n\nNever worry about checking in broken code again. No need to maintain a CI server. No need to shell out ridiculous amount of money for your personal project. EasyCI puts your mind at ease, like a good CI service, but without all the extra costs.\n\nEasyCI operates via git :code:`pre-commit` and :code:`pre-push` hooks to ensure that your code passes tests before letting you commit/push.\n\n.. code-block:: bash\n\n $ git commit\n Running test: flake8\n Passed\n [master b2e6fa1] test commit\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\nEasyCI also makes sure not to run tests redundantly. If you ran tests before using :code:`eci test`, and no files have changed, then it does not try to run tests again.\n\n.. code-block:: bash\n\n $ eci test\n Running test: flake8\n Passed\n $ git commit\n OK Files not changed\n [master b2e6fa1] test commit\n 1 file changed, 2 insertions(+), 2 deletions(-)\n\nThis means that if you run tests regularly as part of your workflow, there is effectively no efficiency cost in using EasyCI, yet you can rest easy knowing that if you forgot to run tests, you will not be allowed to commit/push.\n\nEasyCI is designed to shift the burden of test running away from you. To that end, it is possible to have EasyCI monitor your project for changes and automatically run tests, so that by the time you want to commit your changes, your tests would have already been run. Do this in a separate shell session:\n\n.. code-block:: bash\n\n $ # from anywhere in your project\n $ eci watch\n Watching directory `/path/to/project`. Use ctrl-c to stop.\n\nInstallation/Setup\n------------------\nFirst, install EasyCI using :code:`pip`.\n\n.. code-block:: bash\n\n pip install easyci\n\nNext, setup EasyCI for your project.\n\n.. code-block:: bash\n\n cd /path/to/project\n eci init\n\nThis will install the necessary git hooks and put a trivial config file :code:`eci.yaml`. You should modify the config file to actually run your tests.\n\nRunning Tests\n-------------\nTests are run automatically by git's :code:`pre-commit` and :code:`pre-push` hooks. To trigger tests manually:\n\n.. code-block:: bash\n\n # from anywhere in your project\n eci test\n\nCollecting Test Results\n-----------------------\nEasyCI preserves the state of your project by making a copy of your project using :code:`rsync` to a temporary directory. In some cases, you do want the files generated by your tests. For example, if your tests generate code coverage data, or other tests data, you will want the options to copy those files from the temporary directory back to your project directory. This can be done by the config :code:`collect_results`.\n\nAs an example, the following config will copy everything under the subdirectory :code:`htmlcov`, which in this case contains the code coverage report.\n\n.. code-block:: yaml\n\n tests:\n - coverage run -m py.test && coverage html\n collect_results:\n - htmlcov/***\n\nFor more information on the pattern format for :code:`collect_results`, see the man page for :code:`rsync`, which is used internally to copy the test results.\n\n\nConfig\n------\nThe config lives in a file at the root of the repository, :code:`eci.yaml`.\n\n========================= ==================== ===========\nkey type Description\n========================= ==================== ===========\n:code:`tests` :code:`List[string]` This is a list of commands to run tests.\n:code:`history_limit` :code:`int` The number of passing test runs to remember.\n:code:`collect_results` :code:`List[string]` Copy files matching these patterns back to the project. The patterns must be in an :code:`rsync`-compatible format.\n========================= ==================== ===========\n\nCommands\n--------\nAll commands should be run inside the target repository.\n\neci init\n+++++++++++++\nInitialize the project for use with EasyCI. This installs the necessary git hooks (pre-commit + pre-push) and add a config file if one does not already exists.\n\n\neci test\n++++++++\nRun tests. If a passing test run is found in the tests run history, then this does not run any tests.\n\n\neci watch\n+++++++++\nWatch the current repository for changes and automatically run tests.\n\n\neci gc\n++++++\nRuns housekeeping tasks to free up space. For now, this only removes saved but unused (unreachable) test results.\n\n\neci clear-history\n+++++++++++++++++\nClear tests run history. History is normally used to keep track of whether a test has been run for a specific state of the project, to avoid running tests redundantly. This command clears the history, causing the next `eci test` command to always run tests.\n", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/naphatkrit/easyci/tarball/2.0.1", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/naphatkrit/easyci", "keywords": "continuous,integration,easy,ci,gating,tests,testing,test,git", "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "easyci", "package_url": "https://pypi.org/project/easyci/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/easyci/", "project_urls": { "Download": "https://github.com/naphatkrit/easyci/tarball/2.0.1", "Homepage": "https://github.com/naphatkrit/easyci" }, "release_url": "https://pypi.org/project/easyci/2.0.1/", "requires_dist": null, "requires_python": null, "summary": "Local CI, for mortals.", "version": "2.0.1" }, "last_serial": 1714295, "releases": { "0.2.2": [ { "comment_text": "", "digests": { "md5": "d4d037c9846a29de3cbb464fe1408b82", "sha256": "79aa06839e35f1239316fda4325627ea67d61911eb13539d2de177e5d12241e7" }, "downloads": -1, "filename": "easyci-0.2.2.tar.gz", "has_sig": false, "md5_digest": "d4d037c9846a29de3cbb464fe1408b82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5098, "upload_time": "2015-08-27T13:38:03", "url": "https://files.pythonhosted.org/packages/df/fd/85be901739889627aba795430d13e651a9a9c5fb0d5ffbbc4b38a90a7ab9/easyci-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "10f300156267ec7fb9ca07af80f2dee7", "sha256": "f5e638b90b89a902969248a4086fa7888e1776a58b2f400b2dd36fe24c76485f" }, "downloads": -1, "filename": "easyci-0.3.0.tar.gz", "has_sig": false, "md5_digest": "10f300156267ec7fb9ca07af80f2dee7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5269, "upload_time": "2015-08-27T22:44:02", "url": "https://files.pythonhosted.org/packages/99/12/f09f72d4c00f9abe37dc00904374b94c530320427e3fa1d069942e4de2c2/easyci-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "c4e28cdeab88f3adfb457832def218c6", "sha256": "76686846d77d19081085ebbc03b8d4cd0eb184e83583f36a89e5f55e01b1fe02" }, "downloads": -1, "filename": "easyci-0.3.1.tar.gz", "has_sig": false, "md5_digest": "c4e28cdeab88f3adfb457832def218c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5262, "upload_time": "2015-08-27T22:50:42", "url": "https://files.pythonhosted.org/packages/06/6d/1dda4982d8154ba650e9131f436a097e4f049b77e0874ee3302ab138742a/easyci-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "f0310bad9019b0f49bf2186ea7233bb4", "sha256": "98d24b44e3e2c22230189e323708b0c808a6c9e271be6f7d1bacb20a739ea3e9" }, "downloads": -1, "filename": "easyci-0.3.2.tar.gz", "has_sig": false, "md5_digest": "f0310bad9019b0f49bf2186ea7233bb4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5474, "upload_time": "2015-08-28T07:32:36", "url": "https://files.pythonhosted.org/packages/97/f1/73ff1cfc82510bb7c911ae7d3a687014d5b1d6cd91e2013cdf6624c89592/easyci-0.3.2.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "9a35b66e0f2d638cced2b4d70aca958e", "sha256": "b06c1c1e819500012e614a45c46aa5f2329ad6529cc02a70b1e3b3b5b7043c4c" }, "downloads": -1, "filename": "easyci-0.4.0.tar.gz", "has_sig": false, "md5_digest": "9a35b66e0f2d638cced2b4d70aca958e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5638, "upload_time": "2015-08-28T09:14:56", "url": "https://files.pythonhosted.org/packages/cd/6f/d9639c0aeb07e8a565672c2549d41701ee8e9ddf4676933a0d080754699d/easyci-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "d90f96ee94346af0b0c8b0af74f46f2b", "sha256": "322c8fc8102031632b7f6a9f416b608a4b3825b9e2083bc407ba7a8a529a14a4" }, "downloads": -1, "filename": "easyci-0.4.1.tar.gz", "has_sig": false, "md5_digest": "d90f96ee94346af0b0c8b0af74f46f2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5460, "upload_time": "2015-08-28T09:18:44", "url": "https://files.pythonhosted.org/packages/0c/cd/8f30ae30884ede61d84593b187b732554bb5b823df51c9e439c009700bc2/easyci-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "0116cb74f5e5819555886b23f2f255c2", "sha256": "14a8fb9870cdeec859f3a3f2d0c834dda8d380f3be7d077de19b1a9414d62ef0" }, "downloads": -1, "filename": "easyci-0.4.2.tar.gz", "has_sig": false, "md5_digest": "0116cb74f5e5819555886b23f2f255c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11024, "upload_time": "2015-08-28T09:31:06", "url": "https://files.pythonhosted.org/packages/26/87/e830a0c703ec857e3d3d811e7d9e487ea7ac02045ae083a527303e2fd6a7/easyci-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "3e206fc1d7d8f514159798e4c6ab8e4a", "sha256": "c0097d4fa6791490503d1febcf0649e04612c7a34c8e9a95d17574f525856ee6" }, "downloads": -1, "filename": "easyci-0.4.3.tar.gz", "has_sig": false, "md5_digest": "3e206fc1d7d8f514159798e4c6ab8e4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11024, "upload_time": "2015-08-28T09:35:31", "url": "https://files.pythonhosted.org/packages/61/bf/9f24010832f4624c812d8c2b23a5129d2435583471b2f09e404e855a59eb/easyci-0.4.3.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "645d2364afd7f463704e28d5545fd358", "sha256": "1fef1901c9e2cd3fa4b9a1e780cada279c04512230bf609a2076a905417af259" }, "downloads": -1, "filename": "easyci-0.5.0.tar.gz", "has_sig": false, "md5_digest": "645d2364afd7f463704e28d5545fd358", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11412, "upload_time": "2015-08-28T14:52:13", "url": "https://files.pythonhosted.org/packages/d0/87/6abcb8d8fe05fbebd67fc440d5720af1863ccf46491ddd76b02c87cf4f8e/easyci-0.5.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "3b6271692981aa87607b9c1fd8e97514", "sha256": "f83c0624bdd60adaf6e997d65df3d465db87de150d5ac8c12712977ce02b5813" }, "downloads": -1, "filename": "easyci-1.0.0.tar.gz", "has_sig": false, "md5_digest": "3b6271692981aa87607b9c1fd8e97514", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11786, "upload_time": "2015-08-28T15:19:10", "url": "https://files.pythonhosted.org/packages/5a/d2/6f7172cdd55ea4784cfd07266a834f9d1cec635c6b7b4bc28487f6f0f1e1/easyci-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "432213433784105fc58057b4df21481f", "sha256": "1f09f9d784b9681ae2a5019a0c2e0e02ef55548881bc965a6ac9a73ae419cb17" }, "downloads": -1, "filename": "easyci-1.0.1.tar.gz", "has_sig": false, "md5_digest": "432213433784105fc58057b4df21481f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11792, "upload_time": "2015-08-28T15:21:17", "url": "https://files.pythonhosted.org/packages/78/3a/deadcb32fc0b78f12cc2e734f89f7fdb72982400bb3619ed58e00307c9e9/easyci-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "7e96b1318b311c4264feef9db578d394", "sha256": "770eba54ce5395437bb9dbcb8aff3693388b00bfea142df3d695c5c93b2594d9" }, "downloads": -1, "filename": "easyci-1.1.0.tar.gz", "has_sig": false, "md5_digest": "7e96b1318b311c4264feef9db578d394", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12101, "upload_time": "2015-08-29T04:25:31", "url": "https://files.pythonhosted.org/packages/ba/15/c7faf83193d04b8f86a41449b4c02aa6afea2daa8ca541050fb68c98d028/easyci-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "09713e0eb012ef22be25fde97aa219ba", "sha256": "4251f3201a1089b61a95fdd53826eabb3499d661892e9d82ef346176d26272e1" }, "downloads": -1, "filename": "easyci-1.2.0.tar.gz", "has_sig": false, "md5_digest": "09713e0eb012ef22be25fde97aa219ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12198, "upload_time": "2015-08-29T10:25:11", "url": "https://files.pythonhosted.org/packages/7e/1b/c0b8160903f1e049893c1bb51bbc298ca0a0685a1c992c84aa73f52d5b45/easyci-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "3fe5e1855b54071b21fb258c0660dfce", "sha256": "54935e8041008d1e213cfdbb11b4631a06f732c86ae304582185e64b8ddcc67f" }, "downloads": -1, "filename": "easyci-1.2.1.tar.gz", "has_sig": false, "md5_digest": "3fe5e1855b54071b21fb258c0660dfce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12279, "upload_time": "2015-08-29T13:00:01", "url": "https://files.pythonhosted.org/packages/72/f4/343d13b4f5fc9311990ff9243fc4c085bf18bd83f200864107a4d52b001c/easyci-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "cd0b38f6a2e097c8220a014bc5599ba5", "sha256": "80d02d076a973c0f971b09b0ef339e6bd8dc0a3723825fdb925b0c8cd9d50881" }, "downloads": -1, "filename": "easyci-1.3.0.tar.gz", "has_sig": false, "md5_digest": "cd0b38f6a2e097c8220a014bc5599ba5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12974, "upload_time": "2015-08-30T00:22:24", "url": "https://files.pythonhosted.org/packages/a0/cf/d5be6f5e36ce3f4260b8a52d8a22f2d28aa6e78df4f909ff3822405a78d5/easyci-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "cf25fe1605ae2b23410e17a0b2ce621b", "sha256": "da777d05ab6d1bc48addf54a58f5e08ae349a5cf993d7e39a4215ecc037a0a1e" }, "downloads": -1, "filename": "easyci-1.4.0.tar.gz", "has_sig": false, "md5_digest": "cf25fe1605ae2b23410e17a0b2ce621b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13251, "upload_time": "2015-08-30T08:36:23", "url": "https://files.pythonhosted.org/packages/ed/b0/d4754de282e1eaaada8a8ba121afee473bbcd374e51d04bbb7c082921767/easyci-1.4.0.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "5fad17d64ace82ea461a4c77f466aa8f", "sha256": "59b99f13301c2d02877e8d219feede49edada7c3b390fc215549d9cb1fe2cc1f" }, "downloads": -1, "filename": "easyci-1.5.0.tar.gz", "has_sig": false, "md5_digest": "5fad17d64ace82ea461a4c77f466aa8f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13844, "upload_time": "2015-08-31T04:30:13", "url": "https://files.pythonhosted.org/packages/42/0e/8448af4aae6392fdb1451bae12ca99dcabebb2b8a034bf65e29f088d789b/easyci-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "fb53a8da94a2375ef2ed4f5fea77b113", "sha256": "dda1d707368ff67bc0ac43d49c436ee8a82ae31726dcb45b7c749ce048e9ec67" }, "downloads": -1, "filename": "easyci-1.6.0.tar.gz", "has_sig": false, "md5_digest": "fb53a8da94a2375ef2ed4f5fea77b113", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14827, "upload_time": "2015-08-31T14:29:36", "url": "https://files.pythonhosted.org/packages/62/fb/2b52e1d591d68d9cea292f8d17290ae1337586c3224ae34d9e22113ab1db/easyci-1.6.0.tar.gz" } ], "1.6.2": [ { "comment_text": "", "digests": { "md5": "82f133027f9959314af4d600fd371840", "sha256": "5d2351a7800cd2211cc359069ec8c01d8922e7019d5bdea562da1e81f5617f1f" }, "downloads": -1, "filename": "easyci-1.6.2.tar.gz", "has_sig": false, "md5_digest": "82f133027f9959314af4d600fd371840", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14856, "upload_time": "2015-09-03T02:10:11", "url": "https://files.pythonhosted.org/packages/5f/c1/695374913a2fcbad6517b1e0370a9bddfcf0516041c5f8cf5a129468ce99/easyci-1.6.2.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "6f68796ab1fa90fec5f2491475e58836", "sha256": "59fda954c33e544d1b644b9d63c643b39da72b98c7aab3299fb7cfe7abee9b64" }, "downloads": -1, "filename": "easyci-2.0.0.tar.gz", "has_sig": false, "md5_digest": "6f68796ab1fa90fec5f2491475e58836", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19318, "upload_time": "2015-09-07T22:05:16", "url": "https://files.pythonhosted.org/packages/00/9e/e8defeb70dd69a9df5419d4ed6921a1ee7eb41b36a9924647ed60fd36af3/easyci-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "a8b49453ae41534a7443a2fa58b529a4", "sha256": "7d929b1429680d583ad3eb7e05f0e77124293af8623fedad4f5a70c1063aa5cf" }, "downloads": -1, "filename": "easyci-2.0.1.tar.gz", "has_sig": false, "md5_digest": "a8b49453ae41534a7443a2fa58b529a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19739, "upload_time": "2015-09-09T00:27:12", "url": "https://files.pythonhosted.org/packages/83/d2/dff24bb49e44020a189f43e3e8abe9fa686b32056bb87419b4e6268d3a47/easyci-2.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a8b49453ae41534a7443a2fa58b529a4", "sha256": "7d929b1429680d583ad3eb7e05f0e77124293af8623fedad4f5a70c1063aa5cf" }, "downloads": -1, "filename": "easyci-2.0.1.tar.gz", "has_sig": false, "md5_digest": "a8b49453ae41534a7443a2fa58b529a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19739, "upload_time": "2015-09-09T00:27:12", "url": "https://files.pythonhosted.org/packages/83/d2/dff24bb49e44020a189f43e3e8abe9fa686b32056bb87419b4e6268d3a47/easyci-2.0.1.tar.gz" } ] }