A script to fetch and save course activities from myrpl.ar
Project description
myrpl-cli
myrpl-cli is a command-line interface tool for fetching and saving course activities from myrpl.ar.
What does it do?
-
๐ชจ Tired of copying and pasting your code between your IDE and RPL like a caveman?
Well I've got the answer for you! Fetch your activities with
myrpl fetch, solve them and upload them once withmyrpl submitwhen you're done -
โ Exhausted of waiting whole seconds for running tests that should take milliseconds?
Well I've got the answer for you! Run your tests locally with
myrpl test -
๐ฆ Got a thing for slick CLI tools?
While
myrplcan't help you with your fantasies, it can certainly make your workflow smoother and more enjoyable. ๐
๐ ๏ธ Installation
Install the package globally using pipx:
pipx install myrpl-cli
Now you can use the myrpl command! ๐
๐ Usage
To use myrpl-cli, you need a bearer token for authentication. You can provide this token either as an environment variable (even within a .env file) or as a command-line argument.
1. ๐ Logging In
Before fetching course activities, you need to log in and store your credentials securely. Use the login command:
myrpl login
This will prompt you for your username/email and password and store your credentials securely in an encrypted file. You'll also be asked for a passphrase to encrypt said file.๐ NOTE: Each time you use myrpl you'll be prompted for the passphrase.
You can always overwrite the stored credentials by running the login command again
2. ๐ Fetching course activities
First, cd into the directory where you want your courses and activities stored
To fetch activities for a specific course:
myrpl fetch <course_id>
This will create a file structure in the current working directory like follows:
./
โโโ courses/
โโโ {course 1}/
โโโ {category 1}/
โ โโโ description.txt
โ โโโ {activity 1}/
โ โ โโโ description.md
โ โ โโโ unit_test.py
โ โ โโโ main.py
โ โโโ {activity 2}/
โ โ
3. ๐งโ๐ป Getting some actual work done
cdinto any activity- Launch your IDE of choice. eg.:
code .for VS Code - You can see the activity's description, initial code and unit tests
- Write your code and run the tests using
myrpl testor justpytest
๐ก๏ธ (Optional) Setting up the bearer token
Option 1: Set an environment variable
export MYRPL_BEARER_TOKEN=your_bearer_token_here
Option 2: Provide the token as a command-line argument (see examples below)
โ Getting help
For general help:
myrpl --help
For help with the a specific command:
myrpl <command> --help
๐๏ธ Project Structure
myrpl-cli/
โโโ pyproject.toml
โโโ README.md
โโโ myrpl_cli/
โโโ __init__.py
โโโ api.py
โโโ credential_manager.py
โโโ main.py
โโโ myrpl.py
๐ฉโ๐ป๐จโ๐ป Development
To set up the development environment:
- Install all dependencies
poetry install
- And pre-commit hooks:
pre-commit install
- Activate the virtual environment:
poetry shell
- Off you go! ๐
๐งช Tests
Use pytest to run the project's tests
Use act for running the github workflow locally
๐โ Linting & Formatting
I chose ruff for linting + formatting
PD: I use the Ruff VS Code extension, but you do you
๐บ๏ธ Roadmap
- [x] Implement basic authentication functionality
- [x] Fetch course activities
- [x] Store credentials securely for reuse
- [x] Fetch latest submission
- [ ] Implement hidden file .pyc download via submission abuse (branch:
feature/hidden_file_decompilation) - [ ] Implement hidden file decompilation for python version agnostic test execution
- [ ] Implement activity submission (
myrpl submit) - [ ] Implement course/category/activity progress (
myrpl status) - [ ] Remove annoying keyring passphrase
- [ ] Enhance test coverage
- [ ] VS Code extension (?)
- [ ] Add support for additional programming languages (idk if actually necessary)
Please note that this roadmap is subject to change and may be updated based on user feedback and my own time ๐
How does myrpl-cli fetch hidden files and decompiles them? (incoming feature)
I ran into a problem where I couldn't run a unit_test because the "grafo" library was missing.
So, what could I do?
I started trying to get the content of the grafo library, obviously
I ended up with this code snippet, which I ran on myrpl.ar:
import grafo
import base64
def vertex_cover_min(_):
print("#startgrafocontent")
with open(grafo.__file__, "rb") as gf:
content = gf.read()
encoded_content = base64.b64encode(content).decode("utf-8")
print(encoded_content)
print("#endgrafocontent")
return []
In the future this can be easily automated with the submission API
This ends up spitting into the submission's stdout the base64 encoded contents
of the grafo.pyc file.
From there I could easily import the Grafo class into python. But, .pyc files are
python version specific, so I could only run them inside Python 3.10.0. Boooringg
So, time to decompile ๐
I finally found pycdc, which unfortunately has to be make compiled (that'll make things harder when integrating with myrpl-cli later on)
pycdc then spat the following to stdout:
# Source Generated with Decompyle++
# File: grafo.pyc (Python 3.10)
class Grafo:
def __init__(self, es_dirigido, vertices_init=(False, [])):
self.vertices = {}
for v in vertices_init:
self.vertices[v] = {}
self.es_dirigido = es_dirigido
def __contains__(self, v):
return v in self.vertices
# and so on...
So, now comes the time to integrate this into myrpl-cli, which poses a challenge in itself.
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
Where does the name come from?
It's actually 'My RPL' backwards. No, wait...
๐ฅ Authors
- tcorzo ๐ง๐พโ๐ฆฒ
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file myrpl_cli-1.0.0.tar.gz.
File metadata
- Download URL: myrpl_cli-1.0.0.tar.gz
- Upload date:
- Size: 12.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cea2128f9bd70f8ff29080d9274f84485b19a8aebd891eadefdad4a577769ed6
|
|
| MD5 |
0de9690b7d2199771d0f14acfd5fbabe
|
|
| BLAKE2b-256 |
88ab260d746bcdd64663cfe1a914a3e65eb7d12649988e530f0a5fd2fa409052
|
Provenance
The following attestation bundles were made for myrpl_cli-1.0.0.tar.gz:
Publisher:
release.yml on tcorzo/myrpl-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
myrpl_cli-1.0.0.tar.gz -
Subject digest:
cea2128f9bd70f8ff29080d9274f84485b19a8aebd891eadefdad4a577769ed6 - Sigstore transparency entry: 149284533
- Sigstore integration time:
-
Permalink:
tcorzo/myrpl-cli@b10be331de3c56554481556425b90913779d9e01 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/tcorzo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b10be331de3c56554481556425b90913779d9e01 -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file myrpl_cli-1.0.0-py3-none-any.whl.
File metadata
- Download URL: myrpl_cli-1.0.0-py3-none-any.whl
- Upload date:
- Size: 11.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4715d9675ad19a15691461ee99fadb942600d2a37a3a99bfa3714ad1e08bb36e
|
|
| MD5 |
315c25f631087d6c0002ac62b6dfc4d6
|
|
| BLAKE2b-256 |
8c11bac352001fcc8764c232486c1872bc2f576268b32f8646adb448828d5acc
|
Provenance
The following attestation bundles were made for myrpl_cli-1.0.0-py3-none-any.whl:
Publisher:
release.yml on tcorzo/myrpl-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
myrpl_cli-1.0.0-py3-none-any.whl -
Subject digest:
4715d9675ad19a15691461ee99fadb942600d2a37a3a99bfa3714ad1e08bb36e - Sigstore transparency entry: 149284534
- Sigstore integration time:
-
Permalink:
tcorzo/myrpl-cli@b10be331de3c56554481556425b90913779d9e01 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/tcorzo
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b10be331de3c56554481556425b90913779d9e01 -
Trigger Event:
workflow_run
-
Statement type: