Name | papi-projects JSON |
Version |
0.2.0
JSON |
| download |
home_page | None |
Summary | PAPI is an API for managing projects |
upload_time | 2024-11-15 18:29:59 |
maintainer | None |
docs_url | None |
author | sandyjmacdonald |
requires_python | <4.0,>=3.11 |
license | MIT |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
PAPI is an API for managing projects.
<img src="https://imgur.com/lprJ3mP.jpg" alt="HAHA BUSINESS meme" height="250">
It has functionality for creating User and Project instances, storing users in a TinyDB database, and generating project IDs in the format we use in the Data Science group (at the Bioscience Technology Facility at the University of York). It also has wrappers for Asana and Notion, and Toggl Track, tools we use for project management and time tracking, respectively.
Much of the functionality is tailor-made to the way we manage projects in our group, but make of it what you will!
## Installation
The simplest way to install this is to do as follows:
```
pip install papi-projects
```
You can also install the Poetry packaging and dependency tool and then clone this repository and install with poetry, as follows:
```
pipx install poetry
git clone https://github.com/sandyjmacdonald/papi
cd papi
poetry install
```
## Environment variables
The Asana and Toggl Track wrappers expect several environment variables for API keys, etc. and the best way to do this is with a .env file that can be loaded via the Python dotenv library straight into your script. The CLI scripts provided also expect these variables to be in a .env file.
The .env file should look as follows:
```
# Asana config:
ASANA_API_KEY="YOURAPIKEY"
ASANA_PASSWORD=""
ASANA_WORKSPACE="myworkspace"
ASANA_TEAM="My Team Name"
# toggl track config:
TOGGL_TRACK_API_KEY="YOURAPIKEY"
TOGGL_TRACK_PASSWORD="api_token"
TOGGL_TRACK_WORKSPACE="My Workspace Name"
# Notion config
NOTION_API_SECRET = "YOURAPISECRET"
NOTION_CLIENTS_DB = "notionclientsdbid"
NOTION_PROJECTS_DB = "notionprojectsdbid"
```
The `ASANA_PASSWORD` and `TOGGL_TRACK_PASSWORD` values can be left as above, the remaining ones should be replaced with the correct values from your Notion, Asana, and Toggl Track accounts.
This .env file can either be put in your working directory or in the top-level papi module folder wherever it is installed.
Alternatively, these values can be hard-coded in your scripts, but this is not advised and will not work with the CLI scripts provided.
## CLI scripts
Convenience CLI scripts are provided for some common tasks. They are:
### create-toggl-project
This script creates a project ID if necessary, and adds the project to your Toggl Track:
```
usage: create-toggl-project [-h] [-u USER_ID] [-g GRANT_CODE] [-n NAME] [-p PROJECT_ID] [--enable-logging] [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
[--log-file LOG_FILE]
options:
-h, --help show this help message and exit
-u USER_ID, --user_id USER_ID
three-letter user ID, e.g. JAS
-g GRANT_CODE, --grant_code GRANT_CODE
grant code, e.g. R12345
-n NAME, --name NAME short project name, e.g. 'RNA-seq analysis'
-p PROJECT_ID, --project_id PROJECT_ID
full project ID, e.g. P2024-JAS-ABCD, if already generated
--enable-logging enable logging output for the papi library
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
set the logging level (default: INFO)
--log-file LOG_FILE path to a file where logs should be written
```
Ideally, a three-character user ID, grant code, and short project name will be provided, and PAPI will generate the project ID, e.g.
```
create-toggl-project -u JAS -g R12345 -n 'Such project. Wow.'
```
If a project ID has already been created, then it can be provided via the `-p` argument and the user ID is not necessary, e.g.
```
create-toggl-project -p P2024-JAS-ABCD -g R12345 -n 'Such project. Wow.'
```
The grant code (`-g`) and name (`-n`) are not required, but either a project ID (`-p`) or user ID (`-u`) _is_ necessary.
Logging can also be enabled at various levels of detail, and logs can be saved to a file.
### collate-toggl-hours
This script collates and returns your Toggl Track hours tracked over a specified time period:
```
usage: collate-toggl-hours [-h] -s START [-e END] [-o OUTPUT]
options:
-h, --help show this help message and exit
-s START, --start START
start date in YYYY-MM-DD format
-e END, --end END end date in YYYY-MM-DD format, if none supplied then end date is now
-o OUTPUT, --output OUTPUT
output TSV filename, omit to write to stdout
```
This script collates your tracked hours for any projects worked during a given time period and return the project name and decimal number of hours in tab-separated format.
If an output filename is provided, then the resulting hours are saved to that file, otherwise they are printed to stdout.
If no end date (`-e`) is provided, then the end date is the current time/date.
To collate your hours worked in August 2024:
```
collate-toggl-hours -s 2024-08-01 -e 2024-08-31 -o august-2024-hours.tsv
```
### create-notion-project
This script creates a project ID if necessary, and adds the project to the Notion projects database:
```
usage: create-notion-project [-h] [-u USER_ID] [-v USER_NAME] [-n NAME] [-p PROJECT_ID] [--enable-logging] [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
[--log-file LOG_FILE]
options:
-h, --help show this help message and exit
-u USER_ID, --user_id USER_ID
three-letter user (client) ID, e.g. JAS
-v USER_NAME, --user_name USER_NAME
user (client) name, e.g. John Andrew Smith
-n NAME, --name NAME short project name, e.g. 'RNA-seq analysis', project ID will be auto-generated
-p PROJECT_ID, --project_id PROJECT_ID
full project ID, e.g. P2024-JAS-ABCD, if already generated
--enable-logging enable logging output for the papi library
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
set the logging level (default: INFO)
--log-file LOG_FILE path to a file where logs should be written
```
Similar to the `create-toggl-project` script, you can simply provide a three-character user ID and a short project name, and PAPI will generate the project ID, e.g.
```
create-notion-project -u JAS -n 'Such project. Wow.'
```
If a project ID has already been created, then it can be provided via the `-p` argument and the user ID is not necessary, e.g.
```
create-notion-project -p P2024-JAS-ABCD -n 'Such project. Wow.'
```
Logging can also be enabled at various levels of detail, and logs can be saved to a file.
### create-project
This script can create a project on Toggl Track or Notion, or both:
```
usage: create-project [-h] [-u USER_ID] [-v USER_NAME] [-n NAME] [-p PROJECT_ID] [--enable-toggl] [--enable-notion] [--enable-logging]
[--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [--log-file LOG_FILE]
options:
-h, --help show this help message and exit
-u USER_ID, --user_id USER_ID
three-letter user (client) ID, e.g. JAS
-v USER_NAME, --user_name USER_NAME
user (client) name, e.g. John Andrew Smith
-n NAME, --name NAME short project name, e.g. 'RNA-seq analysis', project ID will be auto-generated
-p PROJECT_ID, --project_id PROJECT_ID
full project ID, e.g. P2024-JAS-DEFG, if already generated
--enable-toggl create Toggl Track project
--enable-notion create Notion project
--enable-logging enable logging output for the papi library
--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
set the logging level (default: INFO)
--log-file LOG_FILE path to a file where logs should be written
```
If no arguments are given to the script, i.e. just running `create-project`, then interactive prompts are shown to enter the necessary arguments.
## API reference
### project module
### Project class
The `Project` class is central to the whole library. A `Project` instance can be created in a few different ways.
At the most basic level, a valid `user_id` (either three letter initials or two letter initials and an integer number from 1 to 9) can be provided when instantiating the class, and the prefix and suffix will be generated.
```
from papi.project import Project
proj = Project(user_id="JAS")
```
This will generate the project ID, `id` attribute using the current year, and a random four-letter suffix.
```
print(proj.id)
print(proj.year)
print(proj.suffix)
```
```
P2024-JAS-ABCD
2024
ABCD
```
If a valid project ID has already been created, then a `Project` instance can be instantiated with the `id` attribute, and the `year`, `user_id`, and `suffix` attributes will be pulled out and set on the instance.
```
proj = Project(id="P2024-JAS-ABCD")
print(proj.year)
print(proj.user_id)
print(proj.suffix)
```
```
2024
JAS
ABCD
```
If a grant code and/or project name are available, then these can be passed in when instantiating the class.
```
proj = Project(user_id="JAS", grant_code="R12345", name="RNA-seq analysis")
```
A version 4 UUID is also generated for the project when instantiated.
```
proj = Project(user_id="JAS")
print(proj.p_uuid)
```
```
6697e457-9785-4668-b78b-72616b27aede
```
Or if a version 4 UUID has been generated separately then it can be provided when instantiating.
```
proj = Project(user_id="JAS", p_uuid="6697e457-9785-4668-b78b-72616b27aede")
```
### project functions
A couple of functions are provided to check the validity of a project ID, to check the validity of a suffix, and to check for a valid version 4 UUID.
You can check the validity of a project ID as follows:
```
from papi.project import check_project_id
print(check_project_id("P2024-JAS-ABCD"))
print(check_project_id("P2024-JAS-1234"))
```
```
True
False
```
You can check the validity of a project suffix as follows:
```
from papi.project import check_suffix
print(check_suffix("ABCD"))
print(check_suffix("1234"))
```
```
True
False
```
### user module
### User class
The `User` class stores attributes of a user: their name, a three-letter initial (or two-letter initial and integer number from 1 to 9), and an optional email address.
The most basic way of instantiating a `User` instance is as follows:
```
from papi.user import User
usr = User("John Andrew Smith")
print(usr.user_id)
print(usr.user_name)
```
```
JAS
John Andrew Smith
```
The first initials are converted into the `user_id` attribute.
If an email address is available, then this can be provided when instantiating:
```
from papi.user import User
usr = User("John Andrew Smith", email="jasmith@email.com")
print(usr.email)
```
```
jasmith@email.com
```
Because our user ID naming scheme enforces that a user ID must be unique, the `user_id` attribute should not really be set directly, although it can in theory:
```
usr = User("John Smith")
usr.user_id = "JS1"
```
Setting the `user_id` attribute creates the possibility of a clash in user IDs, therefore the `user` module provides a means to create a basic user database with the TinyDB library. This avoids the possibility of a clash and appends and increments integer numbers to the end of the user ID if a matching one is already in the database.
Raw data
{
"_id": null,
"home_page": null,
"name": "papi-projects",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.11",
"maintainer_email": null,
"keywords": null,
"author": "sandyjmacdonald",
"author_email": "sandyjmacdonald@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/1f/01/484db122929c80db8ed19a840409dadc14d6b88cf87a51aff76e29e47a38/papi_projects-0.2.0.tar.gz",
"platform": null,
"description": "PAPI is an API for managing projects.\n\n<img src=\"https://imgur.com/lprJ3mP.jpg\" alt=\"HAHA BUSINESS meme\" height=\"250\">\n\nIt has functionality for creating User and Project instances, storing users in a TinyDB database, and generating project IDs in the format we use in the Data Science group (at the Bioscience Technology Facility at the University of York). It also has wrappers for Asana and Notion, and Toggl Track, tools we use for project management and time tracking, respectively.\n\nMuch of the functionality is tailor-made to the way we manage projects in our group, but make of it what you will!\n\n## Installation\n\nThe simplest way to install this is to do as follows:\n\n```\npip install papi-projects\n```\n\nYou can also install the Poetry packaging and dependency tool and then clone this repository and install with poetry, as follows:\n\n```\npipx install poetry\ngit clone https://github.com/sandyjmacdonald/papi\ncd papi\npoetry install\n```\n\n## Environment variables\n\nThe Asana and Toggl Track wrappers expect several environment variables for API keys, etc. and the best way to do this is with a .env file that can be loaded via the Python dotenv library straight into your script. The CLI scripts provided also expect these variables to be in a .env file.\n\nThe .env file should look as follows:\n\n```\n# Asana config:\nASANA_API_KEY=\"YOURAPIKEY\"\nASANA_PASSWORD=\"\"\nASANA_WORKSPACE=\"myworkspace\"\nASANA_TEAM=\"My Team Name\"\n\n# toggl track config:\nTOGGL_TRACK_API_KEY=\"YOURAPIKEY\"\nTOGGL_TRACK_PASSWORD=\"api_token\"\nTOGGL_TRACK_WORKSPACE=\"My Workspace Name\"\n\n# Notion config\nNOTION_API_SECRET = \"YOURAPISECRET\"\nNOTION_CLIENTS_DB = \"notionclientsdbid\"\nNOTION_PROJECTS_DB = \"notionprojectsdbid\"\n```\n\nThe `ASANA_PASSWORD` and `TOGGL_TRACK_PASSWORD` values can be left as above, the remaining ones should be replaced with the correct values from your Notion, Asana, and Toggl Track accounts.\n\nThis .env file can either be put in your working directory or in the top-level papi module folder wherever it is installed.\n\nAlternatively, these values can be hard-coded in your scripts, but this is not advised and will not work with the CLI scripts provided.\n\n## CLI scripts\n\nConvenience CLI scripts are provided for some common tasks. They are:\n\n### create-toggl-project\n\nThis script creates a project ID if necessary, and adds the project to your Toggl Track:\n\n```\nusage: create-toggl-project [-h] [-u USER_ID] [-g GRANT_CODE] [-n NAME] [-p PROJECT_ID] [--enable-logging] [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]\n [--log-file LOG_FILE]\n\noptions:\n -h, --help show this help message and exit\n -u USER_ID, --user_id USER_ID\n three-letter user ID, e.g. JAS\n -g GRANT_CODE, --grant_code GRANT_CODE\n grant code, e.g. R12345\n -n NAME, --name NAME short project name, e.g. 'RNA-seq analysis'\n -p PROJECT_ID, --project_id PROJECT_ID\n full project ID, e.g. P2024-JAS-ABCD, if already generated\n --enable-logging enable logging output for the papi library\n --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}\n set the logging level (default: INFO)\n --log-file LOG_FILE path to a file where logs should be written\n```\n\nIdeally, a three-character user ID, grant code, and short project name will be provided, and PAPI will generate the project ID, e.g.\n\n```\ncreate-toggl-project -u JAS -g R12345 -n 'Such project. Wow.'\n```\n\nIf a project ID has already been created, then it can be provided via the `-p` argument and the user ID is not necessary, e.g.\n\n```\ncreate-toggl-project -p P2024-JAS-ABCD -g R12345 -n 'Such project. Wow.'\n```\n\nThe grant code (`-g`) and name (`-n`) are not required, but either a project ID (`-p`) or user ID (`-u`) _is_ necessary.\n\nLogging can also be enabled at various levels of detail, and logs can be saved to a file.\n\n### collate-toggl-hours\n\nThis script collates and returns your Toggl Track hours tracked over a specified time period:\n\n```\nusage: collate-toggl-hours [-h] -s START [-e END] [-o OUTPUT]\n\noptions:\n -h, --help show this help message and exit\n -s START, --start START\n start date in YYYY-MM-DD format\n -e END, --end END end date in YYYY-MM-DD format, if none supplied then end date is now\n -o OUTPUT, --output OUTPUT\n output TSV filename, omit to write to stdout\n```\n\nThis script collates your tracked hours for any projects worked during a given time period and return the project name and decimal number of hours in tab-separated format.\n\nIf an output filename is provided, then the resulting hours are saved to that file, otherwise they are printed to stdout.\n\nIf no end date (`-e`) is provided, then the end date is the current time/date.\n\nTo collate your hours worked in August 2024:\n\n```\ncollate-toggl-hours -s 2024-08-01 -e 2024-08-31 -o august-2024-hours.tsv\n```\n\n### create-notion-project\n\nThis script creates a project ID if necessary, and adds the project to the Notion projects database:\n\n```\nusage: create-notion-project [-h] [-u USER_ID] [-v USER_NAME] [-n NAME] [-p PROJECT_ID] [--enable-logging] [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]\n [--log-file LOG_FILE]\n\noptions:\n -h, --help show this help message and exit\n -u USER_ID, --user_id USER_ID\n three-letter user (client) ID, e.g. JAS\n -v USER_NAME, --user_name USER_NAME\n user (client) name, e.g. John Andrew Smith\n -n NAME, --name NAME short project name, e.g. 'RNA-seq analysis', project ID will be auto-generated\n -p PROJECT_ID, --project_id PROJECT_ID\n full project ID, e.g. P2024-JAS-ABCD, if already generated\n --enable-logging enable logging output for the papi library\n --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}\n set the logging level (default: INFO)\n --log-file LOG_FILE path to a file where logs should be written\n```\n\nSimilar to the `create-toggl-project` script, you can simply provide a three-character user ID and a short project name, and PAPI will generate the project ID, e.g.\n\n```\ncreate-notion-project -u JAS -n 'Such project. Wow.'\n```\n\nIf a project ID has already been created, then it can be provided via the `-p` argument and the user ID is not necessary, e.g.\n\n```\ncreate-notion-project -p P2024-JAS-ABCD -n 'Such project. Wow.'\n```\n\nLogging can also be enabled at various levels of detail, and logs can be saved to a file.\n\n### create-project\n\nThis script can create a project on Toggl Track or Notion, or both:\n\n```\nusage: create-project [-h] [-u USER_ID] [-v USER_NAME] [-n NAME] [-p PROJECT_ID] [--enable-toggl] [--enable-notion] [--enable-logging]\n [--log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}] [--log-file LOG_FILE]\n\noptions:\n -h, --help show this help message and exit\n -u USER_ID, --user_id USER_ID\n three-letter user (client) ID, e.g. JAS\n -v USER_NAME, --user_name USER_NAME\n user (client) name, e.g. John Andrew Smith\n -n NAME, --name NAME short project name, e.g. 'RNA-seq analysis', project ID will be auto-generated\n -p PROJECT_ID, --project_id PROJECT_ID\n full project ID, e.g. P2024-JAS-DEFG, if already generated\n --enable-toggl create Toggl Track project\n --enable-notion create Notion project\n --enable-logging enable logging output for the papi library\n --log-level {DEBUG,INFO,WARNING,ERROR,CRITICAL}\n set the logging level (default: INFO)\n --log-file LOG_FILE path to a file where logs should be written\n```\n\nIf no arguments are given to the script, i.e. just running `create-project`, then interactive prompts are shown to enter the necessary arguments.\n\n## API reference\n\n### project module\n\n### Project class\n\nThe `Project` class is central to the whole library. A `Project` instance can be created in a few different ways.\n\nAt the most basic level, a valid `user_id` (either three letter initials or two letter initials and an integer number from 1 to 9) can be provided when instantiating the class, and the prefix and suffix will be generated.\n\n```\nfrom papi.project import Project\n\nproj = Project(user_id=\"JAS\")\n```\n\nThis will generate the project ID, `id` attribute using the current year, and a random four-letter suffix.\n\n```\nprint(proj.id)\nprint(proj.year)\nprint(proj.suffix)\n```\n\n```\nP2024-JAS-ABCD\n2024\nABCD\n```\n\nIf a valid project ID has already been created, then a `Project` instance can be instantiated with the `id` attribute, and the `year`, `user_id`, and `suffix` attributes will be pulled out and set on the instance.\n\n```\nproj = Project(id=\"P2024-JAS-ABCD\")\n\nprint(proj.year)\nprint(proj.user_id)\nprint(proj.suffix)\n```\n\n```\n2024\nJAS\nABCD\n```\n\nIf a grant code and/or project name are available, then these can be passed in when instantiating the class.\n\n```\nproj = Project(user_id=\"JAS\", grant_code=\"R12345\", name=\"RNA-seq analysis\")\n```\n\nA version 4 UUID is also generated for the project when instantiated.\n\n```\nproj = Project(user_id=\"JAS\")\n\nprint(proj.p_uuid)\n```\n\n```\n6697e457-9785-4668-b78b-72616b27aede\n```\n\n Or if a version 4 UUID has been generated separately then it can be provided when instantiating.\n\n ```\n proj = Project(user_id=\"JAS\", p_uuid=\"6697e457-9785-4668-b78b-72616b27aede\")\n ```\n\n### project functions\n\nA couple of functions are provided to check the validity of a project ID, to check the validity of a suffix, and to check for a valid version 4 UUID.\n\nYou can check the validity of a project ID as follows:\n\n```\nfrom papi.project import check_project_id\n\nprint(check_project_id(\"P2024-JAS-ABCD\"))\nprint(check_project_id(\"P2024-JAS-1234\"))\n```\n\n```\nTrue\nFalse\n```\n\nYou can check the validity of a project suffix as follows:\n\n```\nfrom papi.project import check_suffix\n\nprint(check_suffix(\"ABCD\"))\nprint(check_suffix(\"1234\"))\n```\n\n```\nTrue\nFalse\n```\n\n### user module\n\n### User class\n\nThe `User` class stores attributes of a user: their name, a three-letter initial (or two-letter initial and integer number from 1 to 9), and an optional email address.\n\nThe most basic way of instantiating a `User` instance is as follows:\n\n```\nfrom papi.user import User\n\nusr = User(\"John Andrew Smith\")\n\nprint(usr.user_id)\nprint(usr.user_name)\n```\n\n```\nJAS\nJohn Andrew Smith\n```\n\nThe first initials are converted into the `user_id` attribute.\n\nIf an email address is available, then this can be provided when instantiating:\n\n```\nfrom papi.user import User\n\nusr = User(\"John Andrew Smith\", email=\"jasmith@email.com\")\n\nprint(usr.email)\n```\n\n```\njasmith@email.com\n```\n\nBecause our user ID naming scheme enforces that a user ID must be unique, the `user_id` attribute should not really be set directly, although it can in theory:\n\n```\nusr = User(\"John Smith\")\nusr.user_id = \"JS1\"\n```\n\nSetting the `user_id` attribute creates the possibility of a clash in user IDs, therefore the `user` module provides a means to create a basic user database with the TinyDB library. This avoids the possibility of a clash and appends and increments integer numbers to the end of the user ID if a matching one is already in the database.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "PAPI is an API for managing projects",
"version": "0.2.0",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "a01d7fb1ecbe145f9f659a30b685484ced612dd2df3d52ac384aaad948f54a14",
"md5": "f7b910cc3cff5391686e6d897e5fe12b",
"sha256": "d6ad2547549f6eef10a3168ee0cdc2a6c36c862da792c00346625d74931a4382"
},
"downloads": -1,
"filename": "papi_projects-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f7b910cc3cff5391686e6d897e5fe12b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.11",
"size": 26806,
"upload_time": "2024-11-15T18:29:57",
"upload_time_iso_8601": "2024-11-15T18:29:57.826423Z",
"url": "https://files.pythonhosted.org/packages/a0/1d/7fb1ecbe145f9f659a30b685484ced612dd2df3d52ac384aaad948f54a14/papi_projects-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1f01484db122929c80db8ed19a840409dadc14d6b88cf87a51aff76e29e47a38",
"md5": "48efd7d5dc9d83c0c4375b2470f34f23",
"sha256": "f50ecf2df219c730065596cc1b5ef0ab7dedb235addcbeadb6945939c88e36e4"
},
"downloads": -1,
"filename": "papi_projects-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "48efd7d5dc9d83c0c4375b2470f34f23",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.11",
"size": 23091,
"upload_time": "2024-11-15T18:29:59",
"upload_time_iso_8601": "2024-11-15T18:29:59.579382Z",
"url": "https://files.pythonhosted.org/packages/1f/01/484db122929c80db8ed19a840409dadc14d6b88cf87a51aff76e29e47a38/papi_projects-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-15 18:29:59",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "papi-projects"
}