{ "info": { "author": "Josh Whelchel", "author_email": "josh+asanahub@loudr.fm", "bugtrack_url": null, "classifiers": [], "description": "# asana-hub\n\n[ ![PyPi version](https://img.shields.io/pypi/v/asana-hub.svg) ](https://pypi.python.org/pypi/asana-hub)\n[ ![PyPi downloads](https://img.shields.io/pypi/dm/asana-hub.svg) ](https://pypi.python.org/pypi/asana-hub)\n\nasana-hub is a python tool for creating issues and tasks simultaneously on github and asana,\nand keeping them in sync.\n\nOne-two-three Create an Asana *task* and matching Github *issue* in a repository,\nand _eventually_ keep them in sync.\n\n## Setup\n\nEither with `sudo` or in a `virtualenv`:\n\n```bash\n$ pip install asana-hub\n$ asana-hub connect\n```\n\n## Usage\n\n### Connecting OAuth API keys - `connect`\n\n```bash\n$ asana-hub connect\n```\n\nYou will be prompted by asana api key and github token (for `repo`, `user`, `gist`).\nThese may also be passed via command line arguments as `-gh-api` and `-as-api`.\nThese settings will be stored in `~/.asana-hub `.\n\n\n### Syncing Task Issue Status -> Asana Tasks - `sync`\n\nThe main appeal of asana-hub is to **keep issue statuses propogated to asana.**\n\n`asana-hub sync` is responsible for iterating over all issues in a repository,\nand ensuring that tasks mentioned inside of issue descriptions are connected and\nkept in sync.\n\n```bash\n$ git checkout master # keep master in sync, or potential merge conflicts loom\n$ asana-hub sync\n\ncollecting github.com issues\n 20) better usage docs - no task\n 1) Create successful task/issue in correct repo. - no task\n updating #27 (open->closed) - 36700026060600\n updating #27 (open->closed) - 36700026060602\n updating #27 (open->closed) - 36700026060604\n updating #27 (open->closed) - 36700026060606\n```\n\nThis will iterate over all issues that have closed since the last update, and\ncomplete any corresponding asana tasks.\n\nIssues that have no asana tasks are always reported as `- no task`.\n\n#### Creating new tasks for issues on github\n\nTo create tasks automatically for issues that lack tasks, use `--create-missing-tasks`.\nThis will create asana tasks for issues that do not have `#ASANAID`s annotated.\nThe tasks are created in the connected project. You can change this project with\nthe `--project [project]` argument.\n\n#### Limiting sync to newer issues with `--first-issue`\n\nIf you don't wish to create tasks for older issues, which is very likely,\nyou can use the `--first-issue [issue]` argument to limit syncing to issues\nincluding and after an issue of your choice.\n\nFor example, if you wanted to start using asana-hub for issues #12 and above,\nyou would perform:\n\n```bash\n$ git checkout master # keep master in sync, or potential merge conflicts loom\n$ asana-hub sync --first-issue 12 --create-missing-tasks\n\n```\n\nAfter using `first-issue`, its value is stored for subsequent calls to\n`asana-hub sync`, and other commands.\n\n### Creating a new issue & task - `issue`\n\nCreate a new asana task and github.com issue simultaneously. A connection is kept\nbetween the two by a repo-backed JSON database of issues.\n\n```bash\n$ asana-hub issue --title \"better usage docs\" --body \"improve the docs\"\n$ asana-hub issue # for prompts\n\ngithub issue #19 created:\nhttps://github.com/Loudr/asana-hub/issues/19\n\nasana task #36089434604514 created:\nhttps://app.asana.com/0/36084070893405/36089434604514\n```\n\n(see how this changed in the history of [77d58c0777045fc82b85e6f94a39db4ea3116b62](https://github.com/Loudr/asana-hub/commit/77d58c0777045fc82b85e6f94a39db4ea3116b62))\n\n`asana-hub sync` updates the asana task status when the issue changes status (open->closed).\n\n\n#### What about issues I create on github.com?\n\nCreating an issue on github without using `asana-hub` is expected behavior.\nAny `#ASANATASKS` named in the body of the issue in the format of `#2394233842334`\nare automatically connected.\n\nConnecting your issues and asana tasks is as simple as including all asana task IDs\non the issue body.\n\n\n### Creating a new pull request & task\n\nCreate a pull request and sub-task connected to an original issue.\n\n```bash\n$ git checkout -b better-usage-docs # while on a feature branch\n$ git touch changes # made changes to docs here\n$ git commit -am \"commit as normal\"\n$ git push --set-upstream origin better-usage-docs # sync with github\n\n$ asana-hub pr --issue 19 --branch better-usage-docs\n$ asana-hub pr # for prompts\n\ngithub pull_request #20 created:\nhttps://github.com/Loudr/asana-hub/pull/20\n```\n\n(These are the actual pull requests and issues matching this project - see #19 and #20)\n\nA pull request on github is represented by a sub-task on asana.\nThe pull request will belong to the task that matched original issue.\n\nPull requests are managed by linking pull requests directly to issues,\nand creating a matching asana task. This sub-task will live under the\nissue's task, providing a visable heirachy of `issue` to `pull-request`\non asana.\n\nWhen `asana-hub sync` is performed, all pull requests that have been merged\nwill have their tasks updated on asana.\n\nLikewise, if those pull requests include \"fixes #19\" in the description,\nas these pull requests do by default, the issue will be closed and the\nissue's task on asana will be completed.\n\n\n## .asana-hub and .asana-hub.proj\n\nasana-hub creates a settings file in your home folder called `.asana-hub` to store your asana & github api tokens.\n\na `.asana-hub.proj` exists to maintain sync data in your repository, including:\n * selected github repository id\n * selected asana project id\n * created issues and tasks (for sync)\n\nAn obvious future optimization will be to allow multiple projects,\nselected by `alias`, to be managed in one repository. (#21)\n\nSee an example of the [.asana-hub.proj](https://github.com/Loudr/asana-hub/blob/master/.asana-hub.proj).\n", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/Loudr/asana-hub/archive/%220.2.12%22.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/loudr/asana-hub", "keywords": "github,asana,connect", "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "asana-hub", "package_url": "https://pypi.org/project/asana-hub/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/asana-hub/", "project_urls": { "Download": "https://github.com/Loudr/asana-hub/archive/%220.2.12%22.tar.gz", "Homepage": "https://github.com/loudr/asana-hub" }, "release_url": "https://pypi.org/project/asana-hub/0.2.12/", "requires_dist": null, "requires_python": null, "summary": "A python lib & tool for creating issues and tasks simultaneously on github and asana, and keeping them in sync.", "version": "0.2.12" }, "last_serial": 1688033, "releases": { "0.1.5": [], "0.1.6": [ { "comment_text": "", "digests": { "md5": "6c035b1533c637acbf0dec84ab1d387e", "sha256": "4a45f6981c96b694a6428f0831fd745fc792b8cc93f2de8f643986a340f05fb6" }, "downloads": -1, "filename": "asana-hub-0.1.6.tar.gz", "has_sig": false, "md5_digest": "6c035b1533c637acbf0dec84ab1d387e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5991, "upload_time": "2015-05-30T12:24:07", "url": "https://files.pythonhosted.org/packages/0d/72/b3923540894546147b09bdc0339f0b6daa1828a601e9fb8863de8ed673a9/asana-hub-0.1.6.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "a7f9b7c2ed9c3250986afde74a2ae288", "sha256": "13f2b2cc797807be991c908ef54704ad0499e50d53d46976139a8f1580e70c67" }, "downloads": -1, "filename": "asana-hub-0.2.0.tar.gz", "has_sig": false, "md5_digest": "a7f9b7c2ed9c3250986afde74a2ae288", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6336, "upload_time": "2015-05-30T13:42:18", "url": "https://files.pythonhosted.org/packages/f8/3b/35f995641c53d1bb75807ba107de392afceeddb718be41f6e285ec044e56/asana-hub-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "b90ea553a3381f7c519a33f5ef7d4ba1", "sha256": "bb1618bb8680b3cf5827deaad3ba646f14c86c2390a2368c0c3fce7caaa6192c" }, "downloads": -1, "filename": "asana-hub-0.2.1.tar.gz", "has_sig": false, "md5_digest": "b90ea553a3381f7c519a33f5ef7d4ba1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7319, "upload_time": "2015-05-30T14:41:23", "url": "https://files.pythonhosted.org/packages/16/f9/cd5334f14920a63f4c34d73c55d290d191d1ff6bf09065b1b42df90e0e10/asana-hub-0.2.1.tar.gz" } ], "0.2.10": [ { "comment_text": "", "digests": { "md5": "6f2d7358db4eb31b1e2892f46ca95f9c", "sha256": "93e3fb4fa659dc43022d4e5e49b91513f467b1266f406963ae050612af633110" }, "downloads": -1, "filename": "asana-hub-0.2.10.tar.gz", "has_sig": false, "md5_digest": "6f2d7358db4eb31b1e2892f46ca95f9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14488, "upload_time": "2015-08-21T19:49:49", "url": "https://files.pythonhosted.org/packages/a0/02/5bd9f66f70373ecfec5844b850adddca7a802cee7af3d5bf45e6da75a766/asana-hub-0.2.10.tar.gz" } ], "0.2.11": [ { "comment_text": "", "digests": { "md5": "73e166cda44cfe6edcfdad3a09a7928c", "sha256": "feefcb0b78651f9d748fa3725972fe54478b4502ac13d1a2b89f01024a43b6b6" }, "downloads": -1, "filename": "asana-hub-0.2.11.tar.gz", "has_sig": false, "md5_digest": "73e166cda44cfe6edcfdad3a09a7928c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14547, "upload_time": "2015-08-21T20:05:15", "url": "https://files.pythonhosted.org/packages/85/ae/1f03807606b7c9185c5783962a77364da18ebdcb9fb71be3749e7dcf5f37/asana-hub-0.2.11.tar.gz" } ], "0.2.12": [ { "comment_text": "", "digests": { "md5": "5d32a6ecf8eb429a34928fe4bfd56391", "sha256": "ce33d2b454484c382c6d3bb5635bd0fd168e4a61c20c255c55faf4fcaeeeb5f8" }, "downloads": -1, "filename": "asana-hub-0.2.12.tar.gz", "has_sig": false, "md5_digest": "5d32a6ecf8eb429a34928fe4bfd56391", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14549, "upload_time": "2015-08-21T21:10:02", "url": "https://files.pythonhosted.org/packages/77/19/a4bdff7c6ab325c0a2c9eb11f131d61395c63c8a6d83ee293ddc5afec921/asana-hub-0.2.12.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "674aec1d7d4df91d4925ab51e3fa0fcc", "sha256": "fc1a9480efc57a8f035e2a1256ad68a171fa1ad5cd202caef63caa839a01b9a4" }, "downloads": -1, "filename": "asana-hub-0.2.2.tar.gz", "has_sig": false, "md5_digest": "674aec1d7d4df91d4925ab51e3fa0fcc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7488, "upload_time": "2015-05-30T15:20:32", "url": "https://files.pythonhosted.org/packages/a5/f3/1fc17f91bb905cc2a3ff8c2fe7222c1f74d0ac9da2edab9c9084f8be7dd0/asana-hub-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "cfef7412904696308747208f5a82074c", "sha256": "2e59cedc4a58df5d7579d1542657cb80f93dbce362b67594d0ebefc90b4e5fe8" }, "downloads": -1, "filename": "asana-hub-0.2.3.tar.gz", "has_sig": false, "md5_digest": "cfef7412904696308747208f5a82074c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7839, "upload_time": "2015-06-04T22:55:17", "url": "https://files.pythonhosted.org/packages/cc/56/1ae9d98f4d9a87499f2fd49cf1467dfd335dc7c43a65e80e4d7d1662f476/asana-hub-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "0d67bd09352ed1407c5e7a3a655a12db", "sha256": "95f37518da60cf2dca776a0854eba6b3bb2316ef5c73010639a0654c14bad611" }, "downloads": -1, "filename": "asana-hub-0.2.4.tar.gz", "has_sig": false, "md5_digest": "0d67bd09352ed1407c5e7a3a655a12db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7829, "upload_time": "2015-06-04T23:00:25", "url": "https://files.pythonhosted.org/packages/9f/5d/1103806b0190c4ab51025858f4d555b51874ffe403e938c063d0d0647c57/asana-hub-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "2358a224e53cdfb2d13aef673c0ff33f", "sha256": "03b92495f66d5cbfe376da61062dc9c0d7da3e8af431a35c6eabe5e5cf2f1b9c" }, "downloads": -1, "filename": "asana-hub-0.2.5.tar.gz", "has_sig": false, "md5_digest": "2358a224e53cdfb2d13aef673c0ff33f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10884, "upload_time": "2015-06-05T20:54:48", "url": "https://files.pythonhosted.org/packages/eb/7a/18b51759432e242b26d56766f062eb4e484574bb11d199502c3249e664e1/asana-hub-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "09de1a06da6bbaf27c3a59defd88b4e9", "sha256": "bc7726f1b479aef67be9e3f68ee9cbd5964d0d9b0ee196a4c9fbcd41aacb25df" }, "downloads": -1, "filename": "asana-hub-0.2.6.tar.gz", "has_sig": false, "md5_digest": "09de1a06da6bbaf27c3a59defd88b4e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12516, "upload_time": "2015-06-25T07:32:48", "url": "https://files.pythonhosted.org/packages/8d/81/3c6df7e4018b112fae3edbcd7862acb8e634f3e0ebeb078cbdf9a8743216/asana-hub-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "c21b2db59b5fdfc72d092dd8c95d9b4f", "sha256": "cc97241a68782b7fb8eb408da0593eaa22581cb3e6605abb53ea4059ca2e4801" }, "downloads": -1, "filename": "asana-hub-0.2.7.tar.gz", "has_sig": false, "md5_digest": "c21b2db59b5fdfc72d092dd8c95d9b4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12526, "upload_time": "2015-07-24T19:30:40", "url": "https://files.pythonhosted.org/packages/5f/a0/8759f76abf07aa157461d4ec61702b4e043d4b99f3c1fc57e1941625fbd3/asana-hub-0.2.7.tar.gz" } ], "0.2.8": [ { "comment_text": "", "digests": { "md5": "f5adc51ef2892f05d5d52b49e305ddf7", "sha256": "bc902d4933037a59d31c5952a870eb29b503196d0462c13547a3dfa1e10470c4" }, "downloads": -1, "filename": "asana-hub-0.2.8.tar.gz", "has_sig": false, "md5_digest": "f5adc51ef2892f05d5d52b49e305ddf7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14569, "upload_time": "2015-08-08T05:30:19", "url": "https://files.pythonhosted.org/packages/5f/9d/d9da1469a1a8fc9c99da3ce58f4d574e64a9e1490f8de432fdc835f85ed7/asana-hub-0.2.8.tar.gz" } ], "0.2.9": [ { "comment_text": "", "digests": { "md5": "d718e34beccbc92a8f3dc796d2e51337", "sha256": "59feaf6e7fc379cacc6b04cdc018d76cb63bb5efe374009540fad70f439815aa" }, "downloads": -1, "filename": "asana-hub-0.2.9.tar.gz", "has_sig": false, "md5_digest": "d718e34beccbc92a8f3dc796d2e51337", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14323, "upload_time": "2015-08-08T06:12:03", "url": "https://files.pythonhosted.org/packages/33/0d/4207c3a3ad08c2ba066fe2f95c59969a1210ae57dd530cc7974b72af49d9/asana-hub-0.2.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5d32a6ecf8eb429a34928fe4bfd56391", "sha256": "ce33d2b454484c382c6d3bb5635bd0fd168e4a61c20c255c55faf4fcaeeeb5f8" }, "downloads": -1, "filename": "asana-hub-0.2.12.tar.gz", "has_sig": false, "md5_digest": "5d32a6ecf8eb429a34928fe4bfd56391", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14549, "upload_time": "2015-08-21T21:10:02", "url": "https://files.pythonhosted.org/packages/77/19/a4bdff7c6ab325c0a2c9eb11f131d61395c63c8a6d83ee293ddc5afec921/asana-hub-0.2.12.tar.gz" } ] }