{ "info": { "author": "N. Jarus, M. Wisely, & T. Morrow", "author_email": "jarus@mst.edu", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Education", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3 :: Only", "Topic :: Education", "Topic :: Software Development :: Version Control :: Git" ], "description": "Assigner |pypi| |travis|\n========================\n\n.. |pypi| image:: https://badge.fury.io/py/assigner.svg\n :target: https://badge.fury.io/py/assigner\n\n.. |travis| image:: https://travis-ci.org/redkyn/assigner.svg?branch=master\n :target: https://travis-ci.org/redkyn/assigner\n\n*Assigner* automatically creates a number of repositories within a GitLab group (or user).\nThe repositories represent homework assignments being assigned to a list of students.\n\nThe repositories are created as private with the instructor (the one running *Assigner*) as owner and each student as a Developer.\nBy doing this, students do not need group permission (which would allow them to see other students' repos), but instead are given individual permissions on their repositories within the group.\n\nThe student repositories that are created receive some initial content from some base repo, a link to which must be provided to *Assigner* as an argument.\n\nThe list of students is retrieved from either a default YAML file or a specified one. See ``_config.example.yml`` for an example YAML configuration file.\n\nInstallation\n------------\n\nAssigner can be installed with ``pip``: ``pip install assigner``.\n\n(You may need to run ``pip3 install assigner`` if your operating system uses python 2 as the default python.)\n\nCommands\n--------\n\nCheck out the `tutorial `_ for a walkthrough of how to use Assigner's features!\n\n- ``init`` Creates a new configuration file, interactively prompting for required values.\n- ``help`` What it says on the tin.\n- ``new `` Creates a new base repository for an assignment so that you can add the instructions, sample code, etc.\n- ``assign `` Creates homework repositories for an assignment for each student in the roster.\n- ``open `` Adds each student in the roster to their respective homework repositories as Developers so they can pull/commit/push their work.\n- ``get []`` Creates a folder for the assignment in the CWD (or ````, if specified) and clones each students' repository into subfolders or fetches their changes if their repository is already cloned.\n- ``lock `` Sets each student to Reporter status on their homework repository so they cannot push changes, etc.\n- ``unlock `` Sets each student to Developer status on their homework repository.\n- ``archive `` Archives student repositories, disallowing pushes and hiding the repository from the project listing on GitLab.\n- ``unarchive `` Restores archived student repositories to their previous state.\n- ``protect `` Protect a repo branch (prevent force pushes)\n- ``unprotect `` Unprotect a repo branch\n- ``status `` Shows the status of student homework repositories, as well as the last commit author and timestamp for each repository.\n- ``roster`` Manages the course roster.\n- ``canvas`` Lists Canvas courses or imports students from a Canvas course to the roster.\n- ``import
`` Imports students from a CSV file to the roster.\n- ``set `` Sets ```` to ```` in the config.\n\nSSH\n~~~\n\nYour GitLab account must have an SSH key set up in order to push the assignment to the students' repos.\n\nConfiguration File\n~~~~~~~~~~~~~~~~~~\n\n*Assigner* will create a ``_config.yml`` file that will persist your GitLab private token and other settings.\nYou can use a different config file by specifying the ``--config`` option.\n\n*Assigner* needs you to set a few config keys before it will work:\n\n- ``gitlab-host``: Hostname of your gitlab instance\n- ``namespace``: Group or user to create repositories in\n- ``semester``: The semester; recommended formatting: ``2016SP``\n- ``gitlab-token``: Your gitlab API token, retrievable from your gitlab settings page\n- ``canvas-token``: Your Canvas API token, retrievable from your Canvas settings page\n\nYou can set these keys by either manually adding them to the config or through using the ``config`` subcommand.\n\nImporting from Canvas via the Canvas API\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe Canvas API can be used to retrieve the list of students for each course section.\nYou can use the ``canvas list`` command to list your course sections, and make note of the ID of the course you would like to import students from. Then you can use the ``canvas import`` command with the appropriate course ID to import the students from the course section into your configuration file.\n\nImporting from Joe'SS via CSV file\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nJoe'SS offers a button to download a table of all the students in a section.\nFor whatever reason, the developers at Oracle decided that this button should give you an HTML table in a file named ``pg.xls`` (or something like that).\nYou can download this file, open in LibreOffice (or some other piece of software that tramples your freedom), and save as a ``.csv`` file.\nThe ``import`` command can read the resulting ``.csv`` and import your students' data for you.\n\nExtra Help\n~~~~~~~~~~\nIf you are particularly baffled, you can pass the ``-h`` or ``--help`` flag to any *Assigner* command for more details on what it offers.\nFor example, ``get --help`` will get you help with ``get``.\n\nGenerating Access Tokens\n------------------------\n\nGitLab Token\n~~~~~~~~~~~~\n\nTo generate an access token for GitLab, log onto the GitLab website (e.g. https://git-classes.mst.edu/), and go to your *Profile Settings*. Go to the *Access Token* tab, then add a personal access token using the form on the page. Leave the expiry date empty to create a token that never expires, and select the *api* checkbox to allow API access using your token. Make sure you copy the generated token, since you won't be able to retrieve it afterwards.\n\nCanvas Token\n~~~~~~~~~~~~\n\nTo generate an API token for Canvas, log onto your Canvas account (e.g. https://canvas.mst.edu/), and click on *Account* at the top left corner of the page, then go to *Settings*. From there scroll down to *Approved Integrations* and click the *New Access Token* button, then use the form to create a new API token. Make sure you copy the generated token, since you won't be able to retrieve it afterwards.\n\nDeveloping\n----------\n\nSee |CONTRIBUTING.md|_.\n\n.. this is an awful hack; see http://docutils.sourceforge.net/FAQ.html#is-nested-inline-markup-possible\n.. |CONTRIBUTING.md| replace:: ``CONTRIBUTING.md``\n.. _CONTRIBUTING.md: https://github.com/redkyn/assigner/blob/master/CONTRIBUTING.md\n\nCredits\n-------\n\n- Ty Morrow\n- Mike Wisely\n- Nate Jarus\n- Islam Elnabarawy\n- Billy Rhoades\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/redkyn/assigner", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "assigner", "package_url": "https://pypi.org/project/assigner/", "platform": "", "project_url": "https://pypi.org/project/assigner/", "project_urls": { "Homepage": "https://github.com/redkyn/assigner" }, "release_url": "https://pypi.org/project/assigner/1.2.0/", "requires_dist": [ "GitPython (>=1)", "PyYAML (>=3.11)", "colorlog (<3,>=2.6)", "jsonschema (>=2.5)", "requests (==2.9.1)", "PTable (>=0.9)", "tqdm (>=4)" ], "requires_python": ">=3", "summary": "Automatically assign programming homework to students on GitLab", "version": "1.2.0" }, "last_serial": 3568882, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "46c793df9648e4563f4ce663e3713c40", "sha256": "a879c4caa4eb5076566c5366c06b2b964e4604d3adffb9941cc94908c8e3684a" }, "downloads": -1, "filename": "assigner-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "46c793df9648e4563f4ce663e3713c40", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 33971, "upload_time": "2018-01-05T17:58:54", "url": "https://files.pythonhosted.org/packages/05/ee/d7ef52957574a4034cb7d7ebf0ba0b168f39d4fb69b4347f23feb023c432/assigner-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9062472b25ec8aaf063bafa80649aa52", "sha256": "e750a0772f7aa07681d6a03484967e06e30220fb02461b1b41b04d40c9f22ff7" }, "downloads": -1, "filename": "assigner-0.1.0.tar.gz", "has_sig": false, "md5_digest": "9062472b25ec8aaf063bafa80649aa52", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 21348, "upload_time": "2018-01-05T17:58:57", "url": "https://files.pythonhosted.org/packages/73/53/4b5fdc060c777365c4adab069b91b1afafd29f3421080a6025b084877299/assigner-0.1.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "6b1c6ae7ce533bf46077a95302a664b8", "sha256": "1731e4c42b847949230f06cdb02a6c1d64563d6bb041763856daa0df0b10ed82" }, "downloads": -1, "filename": "assigner-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6b1c6ae7ce533bf46077a95302a664b8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 37535, "upload_time": "2018-01-18T20:25:08", "url": "https://files.pythonhosted.org/packages/97/fe/ee23a787a25d1ec7507dcaeccc3fe1b3ea15c5b84fdd3fda91aadcecfeb7/assigner-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c52a64ae4c6d4608976161ed13b41d55", "sha256": "b00cb86440be0d8109b981e779558871eb1ed370a5fc999f8dcb9c29ca79b512" }, "downloads": -1, "filename": "assigner-1.0.0.tar.gz", "has_sig": false, "md5_digest": "c52a64ae4c6d4608976161ed13b41d55", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 24243, "upload_time": "2018-01-18T20:25:09", "url": "https://files.pythonhosted.org/packages/34/74/14180bd55ec907442fd2ca96632d31a3f12db9d51cea783d7a4754dbfc60/assigner-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "1d04c9e6af5865ce59ca9974ddcde8c7", "sha256": "ec9bac0ed103283b0f79b2586eb4ab9caa51caf82a994d8f9925f6b95d0f4bee" }, "downloads": -1, "filename": "assigner-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1d04c9e6af5865ce59ca9974ddcde8c7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 41374, "upload_time": "2018-01-24T15:33:59", "url": "https://files.pythonhosted.org/packages/39/a1/34e918d5f36e48e2552771cf773329f379c9fd6274e0e04337f10173a091/assigner-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02ea3272dd13cf1f1091667b67345799", "sha256": "6cbc8e03b3600b65f0dda777451b3bf2fa3d0dfcdbba9b3643dc72cccd9e581f" }, "downloads": -1, "filename": "assigner-1.1.0.tar.gz", "has_sig": false, "md5_digest": "02ea3272dd13cf1f1091667b67345799", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 26476, "upload_time": "2018-01-24T15:34:01", "url": "https://files.pythonhosted.org/packages/e1/79/2af71107c9ccccb661fc5e1ae6d19a0397da56a05df57cf421e21e569b3a/assigner-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "c3e510a974e57f230056d4ee6b1d6879", "sha256": "7aaa761c416f6a7ac1b5faf6e0e6a747213f30fb36cbf024538f4d89de014893" }, "downloads": -1, "filename": "assigner-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c3e510a974e57f230056d4ee6b1d6879", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 42652, "upload_time": "2018-02-04T21:09:30", "url": "https://files.pythonhosted.org/packages/23/39/77f65ca7e07ddcf317ae31858a32b81dc455e38df4f2f77ef7f19dda5f3f/assigner-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ac47824b458ca04dbe091de44d426f6d", "sha256": "771c7ce44903243e0ff45fee1535a8ce5664c4de4bc8cb76357931752d8b2206" }, "downloads": -1, "filename": "assigner-1.1.1.tar.gz", "has_sig": false, "md5_digest": "ac47824b458ca04dbe091de44d426f6d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 37636, "upload_time": "2018-02-04T21:09:31", "url": "https://files.pythonhosted.org/packages/24/1f/3f5df58b840291b3efcd4a878ad6e65989fcfc73d840152602b623699bd2/assigner-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "f9c2bb641d5f5c64d363ea89c38dd809", "sha256": "8e632a619363ccf5f589a69d36fae5b529ed2c500f0d58b629b28b016777229e" }, "downloads": -1, "filename": "assigner-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f9c2bb641d5f5c64d363ea89c38dd809", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 44713, "upload_time": "2018-02-09T23:33:45", "url": "https://files.pythonhosted.org/packages/42/86/3a236c22edbcbf5cb21fb1581c842d810528e701cc1bf633898cee3841c5/assigner-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0b1751335828dedcd31af28f20b2ef33", "sha256": "adc27b0013962617adbd126c02575d9626fcb94d0f363d830ea683689f6a8b36" }, "downloads": -1, "filename": "assigner-1.2.0.tar.gz", "has_sig": false, "md5_digest": "0b1751335828dedcd31af28f20b2ef33", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 37785, "upload_time": "2018-02-09T23:33:50", "url": "https://files.pythonhosted.org/packages/7a/e4/c777cb0d4c45656c0d105f03073550446cf362073dfa0bf5ef2e26be8ef9/assigner-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f9c2bb641d5f5c64d363ea89c38dd809", "sha256": "8e632a619363ccf5f589a69d36fae5b529ed2c500f0d58b629b28b016777229e" }, "downloads": -1, "filename": "assigner-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f9c2bb641d5f5c64d363ea89c38dd809", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 44713, "upload_time": "2018-02-09T23:33:45", "url": "https://files.pythonhosted.org/packages/42/86/3a236c22edbcbf5cb21fb1581c842d810528e701cc1bf633898cee3841c5/assigner-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0b1751335828dedcd31af28f20b2ef33", "sha256": "adc27b0013962617adbd126c02575d9626fcb94d0f363d830ea683689f6a8b36" }, "downloads": -1, "filename": "assigner-1.2.0.tar.gz", "has_sig": false, "md5_digest": "0b1751335828dedcd31af28f20b2ef33", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 37785, "upload_time": "2018-02-09T23:33:50", "url": "https://files.pythonhosted.org/packages/7a/e4/c777cb0d4c45656c0d105f03073550446cf362073dfa0bf5ef2e26be8ef9/assigner-1.2.0.tar.gz" } ] }