{"id":13305864,"url":"https://github.com/jlumbroso/pylifttk","last_synced_at":"2025-07-21T20:34:19.588Z","repository":{"id":36329045,"uuid":"215932687","full_name":"jlumbroso/pylifttk","owner":"jlumbroso","description":"Utility library for the Princeton COS' LIFT.","archived":false,"fork":false,"pushed_at":"2022-12-08T10:56:13.000Z","size":192,"stargazers_count":14,"open_issues_count":5,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-04T23:22:50.953Z","etag":null,"topics":["codepost","edstem","educational-technology","gradescope","integration"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jlumbroso.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-10-18T03:18:44.000Z","updated_at":"2024-09-18T00:50:54.000Z","dependencies_parsed_at":"2023-01-17T00:31:41.506Z","dependency_job_id":null,"html_url":"https://github.com/jlumbroso/pylifttk","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlumbroso%2Fpylifttk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlumbroso%2Fpylifttk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlumbroso%2Fpylifttk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jlumbroso%2Fpylifttk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jlumbroso","download_url":"https://codeload.github.com/jlumbroso/pylifttk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227690970,"owners_count":17805016,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["codepost","edstem","educational-technology","gradescope","integration"],"created_at":"2024-07-29T17:54:36.877Z","updated_at":"2024-12-02T07:33:36.128Z","avatar_url":"https://github.com/jlumbroso.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pylifttk\n\n[![Downloads](https://pepy.tech/badge/pylifttk)](https://pepy.tech/project/pylifttk)\n[![Downloads](https://pepy.tech/badge/pylifttk/month)](https://pepy.tech/project/pylifttk/month)\n\nThis is a Python utility library for Princeton COS' LIFT.\n\nThis library tries to conveniently integrate a collection of educational tech tools used at Princeton's Department of Computer Science, to facilitate exchanges of data between those platforms.\n\n\n## Services integrated by this library\n\nThis library integrates:\n- codePost (roster, grades);\n- Ed Discussion (roster);\n- CSStaff Course API (roster, assignments);\n- TigerFile (roster, assignments, submissions);\n- Gradescope (roster, grades).\n\n\n## Configuration file\n\nSince this library integrates the functionality of several platforms, it requires access to credentials for each of those platforms. As such the `config.yaml` file does a lot of the heavy lifting. *Note that each subsection of the file is only loaded if the corresponding submodules are loaded in Python.*\n\n```yaml\ncourse: COS126\nterm: F2019\n\ncsstaff:\n  username: \"cos126api\"\n  password: \"\" # email csstaff@princeton.edu\n\ncodePost:\n  api_key: \"\" #\n\ned:\n  username: \"\" # credentials for https://us.edstem.org\n  password: \"\"\n\ngradescope:\n  username: \"\" # credentials for https://gradescope.com\n  password: \"\"\n\ntigerfile:\n  token: \"\" # token obtained from https://adm.cs.princeton.edu\n```\n\n## Example\n\nThis snippet computes final grades:\n\n```python\nimport pylifttk.integrations.final_grades as pyltkfg\n\ndef get_late_data():\n    # student_id -\u003e float of late days (including alloted)\n    return {\n        \"student1\": 1.0,\n        \"student7\": 2.5,    \n    }\n\n# Miscellaneous late data calculation\nlate_data = get_late_data()\n\nstudent_data = pyltkfg.compute_final_grade_data(\n    course_name=\"COS126\",\n    course_term=\"F2019\",\n    ignore_missing_assessment=False,\n    skipped_assessments=None,\n    override_cutoffs={\n        \"A+\": 100.0,\n        \"A\" : 92.49,\n        \"A-\": 89.50,\n        \"B+\": 87.00,\n        \"B\" : 82.75,\n        \"B-\": 80.00,\n        \"C+\": 77.00,\n        \"C\" : 73.00,\n        \"C-\": 69.00,\n        \"D\" : 55.0\n    },\n    late_data=late_data)\n```\n\nwith the following sample configuration (authentication content blanked out):\n\n```yaml\n# Course information\n\ncourse: COS126\nterm: F2019\n\n\n# Authentication credentials and tokens\n\ncsstaff:\n  username: \"**********\"\n  password: \"**********\"\n\ncodePost:\n  api_key: \"**********\"\n\ned:\n  username: \"**********\"\n  password: \"**********\"\n\ngradescope:\n  username: \"**********\"\n  password: \"**********\"\n\ntigerfile:\n  token: \"**********\"\n\nlabqueue:\n  username: \"**********\"\n  password: \"**********\"\n\ncanvas:\n  token: \"**********\"\n\n\n# Mappings between the names of various services that this library is integrating\n\nnormalizations:\n  - source: runscript\n    destination: tigerfile\n    mapping:\n      hello: Hello\n      loops: Loops\n      nbody: NBody\n      sierpinski: Sierpinski\n      hamming: Hamming\n      lfsr: LFSR\n      guitar: Guitar\n      markov: Markov\n      tsp: TSP\n      atomic: Atomic\n  - source: tigerfile\n    destination: codepost\n    mapping:\n      Hello: Hello\n      Loops: Loops\n      NBody: NBody\n      Sierpinski: Sierpinski\n      Hamming: Hamming\n      LFSR: LFSR\n      Guitar: Guitar\n      Markov: Markov\n      TSP: \"TSPP\"\n      Atomic: Atomic\n\n\n# Course policy constants\n\npolicy:\n  cutoffs:\n    \"A\" : 93\n    \"A-\": 90\n    \"B+\": 87\n    \"B\" : 83\n    \"B-\": 80\n    \"C+\": 77\n    \"C\" : 73\n    \"C-\": 70\n    \"D\" : 60\n    \"F\" : 0\n\n  lateness:\n    allotted: 4\n    penalty: 0.5\n    grace_minutes: 180\n\n  totals:\n    Hello: 4.0\n    Loops: 4.0\n    NBody: 4.0\n    Sierpinski: 4.0\n    Hamming: 4.0\n    Programming Exam 1: 7.5\n    Written Exam 1: 17.5\n    LFSR: 5.0\n    Guitar: 5.0\n    Markov: 5.0\n    TSPP: 5.0\n    Programming Exam 2: 7.5\n    Written Exam 2: 17.5\n    Atomic: 10.0\n\n  weights:\n    - name: \"assignments\"\n      weight: 40.0\n      content:\n        - Hello\n        - Loops\n        - NBody\n        - Sierpinski\n        - Hamming\n        - LFSR\n        - Guitar\n        - Markov\n        - TSPP\n\n    - name: \"final project\"\n      weight: 10.0\n      content:\n        - Atomic\n\n    - name: \"written exams\"\n      weight: 35.0\n      content:\n        - Written Exam 1\n        - Written Exam 2\n\n    - name: \"programming exams\"\n      weight: 15.0\n      content:\n        - Programming Exam 1\n        - Programming Exam 2\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjlumbroso%2Fpylifttk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjlumbroso%2Fpylifttk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjlumbroso%2Fpylifttk/lists"}