{ "info": { "author": "Mark Lalor", "author_email": "markwlalor@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Education", "License :: OSI Approved :: MIT License", "Topic :: Education", "Topic :: System :: Shells" ], "description": "[![Clanvas on PyPI](https://img.shields.io/pypi/v/clanvas.svg)](https://pypi.python.org/pypi/clanvas)\n[![Build Status](https://travis-ci.org/marklalor/clanvas.svg?branch=master)](https://travis-ci.org/marklalor/clanvas)\n\n# Clanvas\nCommand-line shell client for the [Canvas Learning Management System](https://github.com/instructure/canvas-lms)\n\n![Clanvas Screenshot](clanvas.png)\n\n### Available Commands\n\nIn the Clanvas shell, all commands already on your system `PATH` are available.\nYou can `ls` and `grep` as you please.\n\nIn addition, the shell provides the following commands:\n\n| Command | Meaning |\n|-----------|---------------------------------|\n| lc | list classes |\n| cc | change current class |\n| la | list assignments |\n| lg | list grades |\n| lann | list announcements |\n| catann | print announcements |\n| pullf | pull course files |\n| ua | upload submission to assignment |\n| wopen | open in web interface |\n| whoami | show login info |\n| quit | quit the shell |\n\nType `help` to see all commands, and use the `-h` flag to show usage details for any particular command.\n\n### Installation\n\nClanvas is hosted on [PyPi](https://pypi.python.org/pypi/clanvas) and can be installed with `pip`.\n\nClanvas requires Python 3.6+\n\n```\npip install clanvas\n```\n\nThe `clanvas` command should now be on your path!\n\nUsage will also require [generating a Canvas API token](#generating-an-api-token) which will be used to log in.\n\n##### Note: in order to have 100% proper line editing and tab completion support, further configuration may be required.\n\nClanvas relies on the capabilities provided by `GNU readline` or an equivalent library. The situation varies by system.\n\n| | |\n|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Linux | `GNU readline` is most likely already installed, no further configuration required. |\n| macOS | Apple ships it's operating system with the BSD-licensed `editline` since `GNU readline` is released under a GPL (copyleft) license. By default, Clanvas will try to use `editline` if this is what is available. However, certain features like navigating previous commands and tab completion may not work correctly in all cases. The best/recommended solution is to ensure you are using Python with `GNU readline`. See [GNU readline on macOS](#gnu-readline-on-macos) for more details. |\n| Windows | Currently Windows is untested, but the we recommend installing the `pyreadline` Python module. |\n\n### Login\nStart the Clanvas shell by providing a config entry or URL.\n\nFor example, with the following config file at `~/.clanvas/config`...\n```\nHost school\n\tUrl https://canvas.school.edu\n\tToken bOYc5cOIldA3eB9NTr7X0Um9Z8TPMACb0HtdgHTMtp10T5UKH0b4HOqTmOCvWZlYRpJ9dN\n```\n\n...login can be done with the hostname `school`\n```\n$ clanvas school \nbmr23@canvas.school.edu:~:~ $\n```\n\nOtherwise, if a URL can is provided then you are prompted for an access token:\n```\n$ clanvas https://canvas.school.edu\nEnter access token: \n```\n\nSee [Generating an API Token](#generating-an-api-token) for more info on the access token.\n\n### Example Usage\n\nRun commands\n```\nbmr23@canvas.school.edu:~:~ $ lc -l\nEECS 325 7832 Spring 2018 Computer Networks (100/5013)\nEECS 338 6939 Spring 2018 Operating Systems (100/4593)\nEECS 391 7136 Spring 2018 Artificial Intelligence (100/4163)\nEECS 345 6937 Spring 2018 Programming Language Concepts (100/4699)\nbmr23@canvas.school.edu:~:~ $ cc 325\nbmr23@canvas.school.edu:EECS 325:~ $ lg -g\nComputer Networks (100/5013)\n\u251c\u2500\u2500 Quizzes\n\u2502 \u251c\u2500\u2500 Quiz 1 100/100 100%\n\u2502 \u251c\u2500\u2500 Quiz 2 85/100 85%\n\u2502 \u2514\u2500\u2500 Quiz 3 95/100 95%\n\u251c\u2500\u2500 Exams\n\u2502 \u2514\u2500\u2500 Exam 1 86/100 86%\n\u2514\u2500\u2500 Homework\n \u251c\u2500\u2500 HW 1 20/20 100%\n \u251c\u2500\u2500 HW 2 18/20 90%\n \u2514\u2500\u2500 HW 3 17/20 85%\nbmr23@canvas.school.edu:EECS 325:~ $ pullf\nbmr23@canvas.school.edu:EECS 325:~ $ tree ~/canvas/courses/EECS325-7832/files\n/home/bob/canvas/courses/EECS325-7832/files\n\u251c\u2500\u2500 HW1_2018S.pdf\n\u251c\u2500\u2500 HW2_2018S.pdf\n\u251c\u2500\u2500 HW3-2018S.pdf\n\u251c\u2500\u2500 HW Solutions\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 HW1_2018S_Solutions\n\u251c\u2500\u2500 Lecture Notes\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Lecture1.ppt\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Lecture2.ppt\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Lecture3_Layering_AppLayerOverview.ppt\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Lecture4_5_Web.ppt\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Lecture6_DNS_CDN.ppt\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Lecture7_SMTP_P2P_SPAM.ppt\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Lecture8-Sockets_TransportIntro.ppt\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 Lecture9-UDP_RelXmit.ppt\n\u251c\u2500\u2500 Project1Files.zip\n\u251c\u2500\u2500 Project1Instructions.pdf\n\u2514\u2500\u2500 Syllabus.pdf\n```\n\n### Generating an API Token\n1. Navigate to /profile/settings\n2. Under the \"Approved Integrations\" section, click the button to generate a new access token.\n3. Once the token is generated, you cannot view it again, so you'll have to generate a new token if it is lost.\n\n### GNU readline on macOS\n\nTo check which line editor library your current python is using, check the output of\n\n```\necho \"import readline\\nprint(readline.__doc__)\" | python\n```\n\nYou should see one of the following messages.\n```\nImporting this module enables command line editing using GNU readline.\nImporting this module enables command line editing using libedit readline.\n```\n\nIf you see the first message, you are good to go!\n\nIf you see the latter, the easiest fix is to install and configure `Anaconda`, a package manager that provides a Python distribution that comes with `GNU readline` set up as the command line editor.\n\nInstall `Anaconda`\n```\n$ brew cask install anaconda\n```\n\nAdd Anaconda binaries to your path by amending your `~/.bash_profile` or `~/.zshrc` file\n```\n# At some point after your PATH is defined...\nexport PATH=/usr/local/anaconda3/bin:\"$PATH\"\n```\n\nSave and then source your edited rc file with `source ~/.zshrc` or equivalent (or restart your terminal).\n\n**Now `Anaconda`'s commands are available to use!**\n\nCreate a new virtual environment\n```\n$ conda create --name py36 python=3.6\n```\n\nNow, somewhere after the `export PATH=/usr/local/anaconda3/bin:\"$PATH\"` line in your rc file, add the following line:\n```\nsource activate py36\n```\nSave your rc file, and once again `source ~/.zshrc` or equivalent.\n\nCheck your Python version, you should see `Anaconda, Inc.` in the name.\n```\n$ python --version\nPython 3.6.4 :: Anaconda, Inc.\n```\n\nNow check if `GNU readline` is being used\n```\n$ echo \"import readline\\nprint(readline.__doc__)\" | python\nImporting this module enables command line editing using GNU readline.\n```\n\nCongratulations, you have installed and set up a Python distribution with `GNU readline`!\n\nRun `pip install clanvas` to celebrate.\n\n## Contributing\n\nPull requests are welcome! Check out the [contributing](CONTRIBUTING.md) page for details\non how to help.\n\n## Built With\nThese projects are used very directly, and both welcome pull requests. If you want to add an uncovered\ncanvas endpoint, or change the behavior of the shell itself, check out these projects: \n* [cmd2 (shell functionality)](https://github.com/python-cmd2/cmd2)\n* [canvasapi (canvas lms api wrapper)](https://github.com/ucfopen/canvasapi)\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\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/marklalor/clanvas", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "clanvas", "package_url": "https://pypi.org/project/clanvas/", "platform": "", "project_url": "https://pypi.org/project/clanvas/", "project_urls": { "Homepage": "https://github.com/marklalor/clanvas" }, "release_url": "https://pypi.org/project/clanvas/0.3.0/", "requires_dist": [ "canvasapi (==0.12.0)", "cmd2 (==0.9.12)", "tabulate (>=0.8.3)", "tree-format (>=0.1.2)", "html2text", "colorama", "pytz", "tzlocal", "requests-mock ; extra == 'dev'" ], "requires_python": "", "summary": "Command-line client for Canvas by Instructure", "version": "0.3.0" }, "last_serial": 5211690, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "d0b56fa944cb0143ca1dd423b6bf480f", "sha256": "f8bb07f66b3e66c1f183522a43e98392fb051d85479e5686b4522dd1fb916e93" }, "downloads": -1, "filename": "clanvas-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d0b56fa944cb0143ca1dd423b6bf480f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11507, "upload_time": "2018-03-11T22:18:59", "url": "https://files.pythonhosted.org/packages/1c/cd/72d40c7594421c8e797c6a9c243e4726234b159b89b52b3da13dd47cda26/clanvas-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "59cac15c2b2aca52bfcc4bb2d3a977d4", "sha256": "eb2b6886e087e8c028486dc55c88c588e0d0460d388d88f27773ed196a7d8349" }, "downloads": -1, "filename": "clanvas-0.1.0.tar.gz", "has_sig": false, "md5_digest": "59cac15c2b2aca52bfcc4bb2d3a977d4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10272, "upload_time": "2018-03-11T22:19:01", "url": "https://files.pythonhosted.org/packages/00/40/a2fd9efcd3b3700fc3ab0bdaa1ba430a68ea8125112ea57dfeb27d6b54d1/clanvas-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "686195cec9871bb39c4772bb19327e30", "sha256": "a4b6ff5a5df7b3f2e90a76a8d8f95b44497af6dd9c20fd0e52dcf5220b4b1d0a" }, "downloads": -1, "filename": "clanvas-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "686195cec9871bb39c4772bb19327e30", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13818, "upload_time": "2018-03-15T08:19:13", "url": "https://files.pythonhosted.org/packages/d6/f7/fe2e35f5e4082c37752b907739685b8376cf8085fac9801e8db914b9fd4e/clanvas-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "40c2914ccb16a06460d428c99dbf8727", "sha256": "0f9fdf906389d1a28bef4e00268c7d514103f4525f9be1c7bdcb87bcaddd79fe" }, "downloads": -1, "filename": "clanvas-0.1.1.tar.gz", "has_sig": false, "md5_digest": "40c2914ccb16a06460d428c99dbf8727", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12979, "upload_time": "2018-03-15T08:19:15", "url": "https://files.pythonhosted.org/packages/3d/5f/4be498694321ebac4005de8183e3978aed16d0d7db0cdb28494f88cc45e4/clanvas-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f4e49896acd9b9f6b783ed80c4857f17", "sha256": "8330624c7dc7733685effd3dfd9dd71634d3f467c0637b23c8742fc32ebad11f" }, "downloads": -1, "filename": "clanvas-0.2.0.tar.gz", "has_sig": false, "md5_digest": "f4e49896acd9b9f6b783ed80c4857f17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13836, "upload_time": "2018-10-02T05:30:45", "url": "https://files.pythonhosted.org/packages/01/52/8776efbd5915b0d4498dcd8943aa451c694fecd17d002a398805a4fc42cf/clanvas-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "cdb9c2040919052be4a0f9bea632e2a9", "sha256": "d9123922c7329d520a22c80b7e31ce310f9f64fd1c8f805a44a8768715e8d1b0" }, "downloads": -1, "filename": "clanvas-0.2.1.tar.gz", "has_sig": false, "md5_digest": "cdb9c2040919052be4a0f9bea632e2a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14460, "upload_time": "2018-10-03T04:11:38", "url": "https://files.pythonhosted.org/packages/5b/19/120f91b5937fd7ad44d5ef98c0866997d2a1be950b11d5426ec929bb6d0c/clanvas-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "a932ffe16755ae984b26d24a72d4894a", "sha256": "8b899752d796fb647a0901b9b329ef0c5260df6ee9975889d1f5aedd088be31d" }, "downloads": -1, "filename": "clanvas-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a932ffe16755ae984b26d24a72d4894a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14693, "upload_time": "2018-10-13T21:46:34", "url": "https://files.pythonhosted.org/packages/89/52/95ead149967e4cc760e07a260d52000407410eb012eaeae621f27bc05337/clanvas-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a387f442b364f06606704218d1170a25", "sha256": "5cf3bb438e4462f0a86e9e0a47a0643c0f9c5877735e4dd2bcdccb1348174f6d" }, "downloads": -1, "filename": "clanvas-0.2.2.tar.gz", "has_sig": false, "md5_digest": "a387f442b364f06606704218d1170a25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14327, "upload_time": "2018-10-13T21:46:36", "url": "https://files.pythonhosted.org/packages/48/e8/d5f39ea0a03a4a8cb2822fc59fc3c4b5afc6559d8edf3ff7aad770eecc9a/clanvas-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "b3016b343df73713089037a8b2552862", "sha256": "2c2682705e77cc727cb08ee00aca1e8ace0aa786790806a66315c9ef6c912a7c" }, "downloads": -1, "filename": "clanvas-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "b3016b343df73713089037a8b2552862", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13922, "upload_time": "2018-10-18T07:45:51", "url": "https://files.pythonhosted.org/packages/20/00/4221e094a8a8888a97c7f2badc805d11be313c602ee8799f4a0681d47c85/clanvas-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "31a9087e89ab53a8c979b97ea890abaf", "sha256": "96022e5043a176eff7bf3fc6a69eec04d5c760fadb06a4e3d194c562030214be" }, "downloads": -1, "filename": "clanvas-0.2.3.tar.gz", "has_sig": false, "md5_digest": "31a9087e89ab53a8c979b97ea890abaf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14290, "upload_time": "2018-10-18T07:45:52", "url": "https://files.pythonhosted.org/packages/f0/38/5c42a590a25ccf4dc4cf4454de1aa07d53f0880ae804ca2aa99d22fa7fcc/clanvas-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "f93b96c472fb677ecf14f6fd915f0f93", "sha256": "a019b854539059fb64e9ee4115d0f9ed25d15a4104852505ec8e58c9840ababf" }, "downloads": -1, "filename": "clanvas-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "f93b96c472fb677ecf14f6fd915f0f93", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14588, "upload_time": "2018-11-21T16:27:45", "url": "https://files.pythonhosted.org/packages/e6/2f/a8d195e2918e46736c52c591cd884a14344357b63061f4f756478f64905f/clanvas-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "61907824ce21a643078a23093ff4fca2", "sha256": "faefbd194e73a92fcea0f6f1213bb9a10cc07ea3354f1b198b6510d4b079bc26" }, "downloads": -1, "filename": "clanvas-0.2.4.tar.gz", "has_sig": false, "md5_digest": "61907824ce21a643078a23093ff4fca2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14706, "upload_time": "2018-11-21T16:27:47", "url": "https://files.pythonhosted.org/packages/f0/7d/c8f4e886574004d3e0ee55e76c15b68ced5d6a1eaef3c650f8781fffd07e/clanvas-0.2.4.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "519126122020a82094aec38e4a612255", "sha256": "59e721a4023ef2cb4d0dfd43155e79e78018eca31c38020ad1592cdd045b2279" }, "downloads": -1, "filename": "clanvas-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "519126122020a82094aec38e4a612255", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19330, "upload_time": "2019-05-01T07:11:28", "url": "https://files.pythonhosted.org/packages/ae/13/79d74a9135f0507f647365b4eab33f6373b4f517f97d7d3a1849b7e6596b/clanvas-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87f57e5c6bfa1bafe9d010063ea09e5e", "sha256": "e7b9b6d4f3935a39b1a3bc50f0003df9def9d313cdcc8acf11c5abdf888334f7" }, "downloads": -1, "filename": "clanvas-0.3.0.tar.gz", "has_sig": false, "md5_digest": "87f57e5c6bfa1bafe9d010063ea09e5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19144, "upload_time": "2019-05-01T07:11:30", "url": "https://files.pythonhosted.org/packages/41/86/52682be4ed45c404aac222ec710c0e101bb161d6ffc77acefe1e03475f65/clanvas-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "519126122020a82094aec38e4a612255", "sha256": "59e721a4023ef2cb4d0dfd43155e79e78018eca31c38020ad1592cdd045b2279" }, "downloads": -1, "filename": "clanvas-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "519126122020a82094aec38e4a612255", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 19330, "upload_time": "2019-05-01T07:11:28", "url": "https://files.pythonhosted.org/packages/ae/13/79d74a9135f0507f647365b4eab33f6373b4f517f97d7d3a1849b7e6596b/clanvas-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "87f57e5c6bfa1bafe9d010063ea09e5e", "sha256": "e7b9b6d4f3935a39b1a3bc50f0003df9def9d313cdcc8acf11c5abdf888334f7" }, "downloads": -1, "filename": "clanvas-0.3.0.tar.gz", "has_sig": false, "md5_digest": "87f57e5c6bfa1bafe9d010063ea09e5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19144, "upload_time": "2019-05-01T07:11:30", "url": "https://files.pythonhosted.org/packages/41/86/52682be4ed45c404aac222ec710c0e101bb161d6ffc77acefe1e03475f65/clanvas-0.3.0.tar.gz" } ] }