# cheche_pm - Project Scheduling Toolkit
A Python package for project scheduling, designed to simplify project management tasks.
## Table of Contents
- [Installation](#installation)
- [Usage](##usage)
- [Create project](###Create_project)
- [from_csv](###from_csv)
- [CPM](###cpm)
- [Priority List](###priority_list)
- [Scheduling methods](###Scheduling_methods)
- [Genetic Algorithm](###Genetic_Algorithm)
- [Risk Analysis](###Risk_Analysis)
- [Contributor](##contributor)
- [License](##license)
## Installation
To install `cheche_pm`, you can use pip:
```bash
pip install cheche_pm
```
## Usage
To use cheche_pm, import the Project class and start utilizing its methods. Here are some of the key methods provided by the package:
### Create project
creates an empty project. Activities can be added manually.
```python
from cheche_pm import Project
p = p.Project()
p.add_activity(activity_name='A',activity_duration=2,activity_precedence = [None], activity_resources= [2,4,5])
p.add_activity(activity_name='B',activity_duration=3,activity_precedence =['A'],activity_resources= [3,7,8])
p.add_activity(activity_name='C',activity_duration=4,activity_precedence =['B'],activity_resources=[3,2,2])
p.add_activity(activity_name='D',activity_duration=3,activity_precedence =['A'],activity_resources=[4,5,6])
```
Activities can be also deleted.
```python
p.delete_activity('D')
```
Once the activities are created the user, can add the terminal dummy nodes. "Start" and "End" by using the following methods.
```python
p.add_dummies_create_project_network()
```
### from_csv or from_excel
A project can be created from a .csv file or .xlsx file. Imagine that we have an MS EXCEL file with the data below
| Activity | Description | Duration | Precedence | Cost | Bulbasaur | Charizard | Squirtle |
|----------|--------------|----------|------------|-------|-----------|-----------|----------|
| A | F.House | 5 | | 1000 | 1 | 0 | 0 |
| B | F.Pool | 2 | | 2000 | 1 | 0 | 0 |
| C | Walls | 5 | A | 3500 | 0 | 1 | 0 |
| D | Pool | 6 | B | 4500 | 0 | 0 | 1 |
| E | Roof | 5 | C | 2600 | 0 | 1 | 0 |
| F | Windows | 2 | C | 7000 | 0 | 1 | 0 |
| G | Electricity | 3 | C | 8000 | 0 | 0 | 1 |
| H | S.Panels | 2 | E | 1000 | 0 | 0 | 1 |
| I | Plumbing | 4 | F | 5600 | 0 | 0 | 1 |
| J | Finishings | 3 | H, I | 12000 | 0 | 0 | 1 |
A project can be created using the following methods:
#### .csv file
```python
p = Project.from_csv(filename='data_project.csv',rcpsp_format=True,n_resources= 3,max_resources=[1,1,1])
```
#### .xlsx file
``` python
p = Project.from_excel(filename='data_project.xlsx',rcpsp_format=True,n_resources= 3,max_resources=[1,1,1])
```
### CPM
This method allows the generation of project schedule using the critical path method
```python
p.CPM()
```
the user can ask for the critical path
```python
p.get_critical_path()
```
### priority_list
This method allows the user to generate a priority list from a given priority rule:
- **LPT:** Longest processing time
- **SPT:** Shortest processing time
- **LIS:** Least immediate successors
- **MIS:** Most immediate successor
- **LTS:** Least total successors
- **MTS:** Most total successors
- **sEST:** Smallest Earliest Start Time
- **gEST:** Greatest Earliest Start Time
- **sEFT:** Smallest Earliest Finish Time
- **gEFT:** Greatest Earliest Finish Time
- **sLST:** Smallest Latest Start Time
- **gLST:** Greatest Latest Start Time
- **sLFT:** Smallest Latest Finish Time
- **gLFT:** Greatest Latest Finish Time
- **MINF:** Minimum float
- **MAXF:** Maximum float
- **GRPW:** Greatest GRPW
- **LRPW:** Lowest GRPW
- **FCFS:** First comes first served
- **LCFS:** Last comes first served
- **GRD:** Greatest resource demand
- **LRD:** Lowest resource demand
- **GCRD:** Greatest cumulative resource demand
- **LCRD:** Lowest cumulative resource demand
The user can ask for an individual priority list.
```python
PL = p.get_priority_list(priority_rule= 'FCFS',verbose=True,save=True)
```
### Scheduling_methods
Once the user has a priority list it can decide to produce an schedule from it. The user can generate a serial schedule (SSG) or a parallel one (PSG)
#### Serial (SSG)
```python
ssg = p.SSG(PL,max_resources=[1,1,1],verbose=False)
```
#### Parallel (PSG)
```python
psg = p.PSG(PL,max_resources=[1,1,1],verbose=False)
```
The user can also decide to run all priority list heuristics, and schedule each one via the two methods. This method will return the best schedule obtained.
```python
p.run_all_pl_heuristics()
```
#### Visualizations of schedules
Once an schedule is produced, the user can ask for a datetime schedule by providing the date for the project start.
```python
w_sche = p.generate_datetime_schedule(solution = ssg,start_date="2023-09-03",weekends_work=False,max_resources=[1,1,1],verbose=True)
```
The user can then ask for a gantt chart of this datetime schedule
```python
p.plot_date_gantt(w_sche)
```
The user can ask for the critical chain of this schedule
```python
p.get_critical_chain(ssg,max_resources=[1,1,1])
```
The user can perform resource vistualizations
```python
p.plot_resource_levels(ssg)
```
```python
p.RCPSP_plot(ssg,resource_id=0)
```
### Genetic_Algorithm
The user can use the genetic algorithm optimization method to find the optimal schedule.
```python
p.genetic_algorithm_optimization(popSize = 40, elite_percentage = 0.2, crossover_rate = 0.5, mutationRate = 0.5, generations = 100,show = True)
```
### Risk analysis
These methods offers a collection of monte carlo simulation methods, that can be used to evaluate project makespan uncertainty as well as the effectivenes of activity buffers.
#### Simple Monte Carlo simulation
```python
p.monte_carlo_cpm_simple(optimistic=0.25,pessimistic=1)
```
#### Detailed Monte Carlo simulation
```python
pessimistic = {'A':7.5,'B':3.5,'C':7.5,'D':9,'E':7.5,'F':3,'G':4.5,'H':3,'I':6,'J':4.5}
optimistic = {'A':2.5,'B':1,'C':2.5,'D':3,'E':2.5,'F':1,'G':1.5,'H':1,'I':2,'J':1.5}
p.monte_carlo_cpm_detailed(optimistic=optimistic,pessimistic=pessimistic, NumberIterations=1000)
```
#### Buffer analysis
```python
pessimistic = {'A':7.5,'B':3.5,'C':7.5,'D':9,'E':7.5,'F':3,'G':4.5,'H':3,'I':6,'J':4.5}
optimistic = {'A':2.5,'B':1,'C':2.5,'D':3,'E':2.5,'F':1,'G':1.5,'H':1,'I':2,'J':1.5}
buffer = {'A':2,'C':2,'E':3,'H':2,'F':2,'I':1,'J':2}
p.monte_carlo_detail_buffer_analysis(optimistic=optimistic,pessimistic=pessimistic,buffer=buffer, NumberIterations=2000)
```
## Contributors
Author: **Luis Fernando Perez Armas**
Email: luisfernandopa1212@gmail.com
LinkedIn: [LinkedIn Profile](https://www.linkedin.com/in/luis-fernando-perez-project-manager/)
## License
This project is licensed under the MIT License - see the LICENSE file for details.
**MIT License**
Copyright (c) 2023, Luis Fernando Pérez Armas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
=======
History
=======
0.1.0 (2023-09-03)
* First release on PyPI.
+++++++++++++++++++
0.1.4 (2023-09-04)
+++++++++++++++++++
0.1.5 (2023-09-04)
+++++++++++++++++++
0.1.6 (2023-09-29)
+++++++++++++++++++
0.1.7 (2023-09-29)
**Bugfixes**
- Error with MTS,LTS, MIS and LIS priority rules fixed.
- Bug related to incorrect choosing of activities under the condition of a priority rule tie, was fixed.
+++++++++++++++++++
0.1.8 (2023-10-03)
- Weak forbidden set function added
- Minimum forbidden set function added
- Simple monte carlo buffer analysis added
- Possibility to create a project from a .rcp file and from instances of the CV dataset
+++++++++++++++++++
0.1.9 (2023-10-03)
- Extra information added to the monte carlo buffer analysis methods
- Critical Path Method returns a dataframe with the basic outputs ES,EF,LS,LF,F
+++++++++++++++++++
0.1.10 (2023-10-03)
- Bug fix with the monte carlo buffer analysis methods
+++++++++++++++++++
0.1.11 (2023-10-03)
+++++++++++++++++++
0.1.12 (2023-10-08)
- Feasible subset function added
- Function that calculate naive bounds for each activity, based on a time horizon
+++++++++++++++++++
0.1.13 (2023-10-08)
- Bug fix with the outputs of forbidden sets and feasible set.
------------------
Raw data
{
"_id": null,
"home_page": "https://github.com/ceche1212/cheche_pm",
"name": "cheche-pm",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "",
"keywords": "cheche_pm",
"author": "Luis Fernando P\u00e9rez Armas",
"author_email": "luisfernandopa1212@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/91/76/c776094b36d81f5f3e91c13971116516d231b82209ea6c8dc1faa4020058/cheche_pm-0.1.13.tar.gz",
"platform": null,
"description": "# cheche_pm - Project Scheduling Toolkit\r\n\r\nA Python package for project scheduling, designed to simplify project management tasks.\r\n\r\n## Table of Contents\r\n\r\n- [Installation](#installation)\r\n- [Usage](##usage)\r\n - [Create project](###Create_project)\r\n - [from_csv](###from_csv)\r\n - [CPM](###cpm)\r\n - [Priority List](###priority_list)\r\n - [Scheduling methods](###Scheduling_methods)\r\n - [Genetic Algorithm](###Genetic_Algorithm)\r\n - [Risk Analysis](###Risk_Analysis)\r\n- [Contributor](##contributor)\r\n- [License](##license)\r\n\r\n## Installation\r\n\r\nTo install `cheche_pm`, you can use pip:\r\n\r\n```bash\r\npip install cheche_pm\r\n```\r\n\r\n## Usage\r\nTo use cheche_pm, import the Project class and start utilizing its methods. Here are some of the key methods provided by the package:\r\n\r\n\r\n### Create project\r\n\r\ncreates an empty project. Activities can be added manually.\r\n\r\n```python\r\nfrom cheche_pm import Project\r\n\r\np = p.Project()\r\n\r\np.add_activity(activity_name='A',activity_duration=2,activity_precedence = [None], activity_resources= [2,4,5])\r\np.add_activity(activity_name='B',activity_duration=3,activity_precedence =['A'],activity_resources= [3,7,8])\r\np.add_activity(activity_name='C',activity_duration=4,activity_precedence =['B'],activity_resources=[3,2,2])\r\np.add_activity(activity_name='D',activity_duration=3,activity_precedence =['A'],activity_resources=[4,5,6])\r\n```\r\n\r\nActivities can be also deleted.\r\n\r\n```python\r\np.delete_activity('D')\r\n```\r\n\r\nOnce the activities are created the user, can add the terminal dummy nodes. \"Start\" and \"End\" by using the following methods.\r\n\r\n```python\r\np.add_dummies_create_project_network()\r\n```\r\n\r\n### from_csv or from_excel\r\n\r\nA project can be created from a .csv file or .xlsx file. Imagine that we have an MS EXCEL file with the data below\r\n\r\n| Activity | Description | Duration | Precedence | Cost | Bulbasaur | Charizard | Squirtle |\r\n|----------|--------------|----------|------------|-------|-----------|-----------|----------|\r\n| A | F.House | 5 | | 1000 | 1 | 0 | 0 |\r\n| B | F.Pool | 2 | | 2000 | 1 | 0 | 0 |\r\n| C | Walls | 5 | A | 3500 | 0 | 1 | 0 |\r\n| D | Pool | 6 | B | 4500 | 0 | 0 | 1 |\r\n| E | Roof | 5 | C | 2600 | 0 | 1 | 0 |\r\n| F | Windows | 2 | C | 7000 | 0 | 1 | 0 |\r\n| G | Electricity | 3 | C | 8000 | 0 | 0 | 1 |\r\n| H | S.Panels | 2 | E | 1000 | 0 | 0 | 1 |\r\n| I | Plumbing | 4 | F | 5600 | 0 | 0 | 1 |\r\n| J | Finishings | 3 | H, I | 12000 | 0 | 0 | 1 |\r\n\r\nA project can be created using the following methods:\r\n\r\n#### .csv file\r\n\r\n\r\n```python\r\np = Project.from_csv(filename='data_project.csv',rcpsp_format=True,n_resources= 3,max_resources=[1,1,1])\r\n\r\n```\r\n\r\n#### .xlsx file\r\n\r\n``` python\r\np = Project.from_excel(filename='data_project.xlsx',rcpsp_format=True,n_resources= 3,max_resources=[1,1,1])\r\n```\r\n### CPM\r\n\r\nThis method allows the generation of project schedule using the critical path method\r\n\r\n```python\r\np.CPM()\r\n\r\n```\r\n\r\nthe user can ask for the critical path\r\n\r\n```python\r\np.get_critical_path()\r\n```\r\n\r\n### priority_list\r\n\r\nThis method allows the user to generate a priority list from a given priority rule:\r\n\r\n- **LPT:** Longest processing time\r\n- **SPT:** Shortest processing time\r\n- **LIS:** Least immediate successors\r\n- **MIS:** Most immediate successor\r\n- **LTS:** Least total successors\r\n- **MTS:** Most total successors\r\n- **sEST:** Smallest Earliest Start Time\r\n- **gEST:** Greatest Earliest Start Time\r\n- **sEFT:** Smallest Earliest Finish Time\r\n- **gEFT:** Greatest Earliest Finish Time\r\n- **sLST:** Smallest Latest Start Time\r\n- **gLST:** Greatest Latest Start Time\r\n- **sLFT:** Smallest Latest Finish Time\r\n- **gLFT:** Greatest Latest Finish Time\r\n- **MINF:** Minimum float\r\n- **MAXF:** Maximum float\r\n- **GRPW:** Greatest GRPW\r\n- **LRPW:** Lowest GRPW\r\n- **FCFS:** First comes first served\r\n- **LCFS:** Last comes first served\r\n- **GRD:** Greatest resource demand\r\n- **LRD:** Lowest resource demand\r\n- **GCRD:** Greatest cumulative resource demand\r\n- **LCRD:** Lowest cumulative resource demand\r\n\r\nThe user can ask for an individual priority list.\r\n\r\n```python\r\nPL = p.get_priority_list(priority_rule= 'FCFS',verbose=True,save=True)\r\n```\r\n\r\n### Scheduling_methods\r\n\r\nOnce the user has a priority list it can decide to produce an schedule from it. The user can generate a serial schedule (SSG) or a parallel one (PSG)\r\n\r\n#### Serial (SSG)\r\n```python\r\nssg = p.SSG(PL,max_resources=[1,1,1],verbose=False)\r\n```\r\n\r\n#### Parallel (PSG)\r\n```python\r\npsg = p.PSG(PL,max_resources=[1,1,1],verbose=False)\r\n```\r\nThe user can also decide to run all priority list heuristics, and schedule each one via the two methods. This method will return the best schedule obtained.\r\n\r\n```python\r\np.run_all_pl_heuristics()\r\n```\r\n#### Visualizations of schedules\r\n\r\nOnce an schedule is produced, the user can ask for a datetime schedule by providing the date for the project start.\r\n\r\n```python\r\nw_sche = p.generate_datetime_schedule(solution = ssg,start_date=\"2023-09-03\",weekends_work=False,max_resources=[1,1,1],verbose=True)\r\n```\r\n\r\nThe user can then ask for a gantt chart of this datetime schedule\r\n\r\n```python\r\np.plot_date_gantt(w_sche)\r\n```\r\n\r\nThe user can ask for the critical chain of this schedule\r\n\r\n```python\r\np.get_critical_chain(ssg,max_resources=[1,1,1])\r\n```\r\n\r\nThe user can perform resource vistualizations\r\n\r\n```python\r\np.plot_resource_levels(ssg)\r\n```\r\n\r\n```python\r\np.RCPSP_plot(ssg,resource_id=0)\r\n```\r\n\r\n\r\n### Genetic_Algorithm\r\n\r\nThe user can use the genetic algorithm optimization method to find the optimal schedule.\r\n\r\n```python\r\np.genetic_algorithm_optimization(popSize = 40, elite_percentage = 0.2, crossover_rate = 0.5, mutationRate = 0.5, generations = 100,show = True)\r\n```\r\n\r\n### Risk analysis\r\nThese methods offers a collection of monte carlo simulation methods, that can be used to evaluate project makespan uncertainty as well as the effectivenes of activity buffers.\r\n\r\n#### Simple Monte Carlo simulation\r\n```python\r\np.monte_carlo_cpm_simple(optimistic=0.25,pessimistic=1)\r\n```\r\n\r\n#### Detailed Monte Carlo simulation\r\n\r\n```python\r\npessimistic = {'A':7.5,'B':3.5,'C':7.5,'D':9,'E':7.5,'F':3,'G':4.5,'H':3,'I':6,'J':4.5}\r\noptimistic = {'A':2.5,'B':1,'C':2.5,'D':3,'E':2.5,'F':1,'G':1.5,'H':1,'I':2,'J':1.5}\r\n\r\np.monte_carlo_cpm_detailed(optimistic=optimistic,pessimistic=pessimistic, NumberIterations=1000)\r\n```\r\n\r\n#### Buffer analysis\r\n\r\n\r\n```python\r\npessimistic = {'A':7.5,'B':3.5,'C':7.5,'D':9,'E':7.5,'F':3,'G':4.5,'H':3,'I':6,'J':4.5}\r\noptimistic = {'A':2.5,'B':1,'C':2.5,'D':3,'E':2.5,'F':1,'G':1.5,'H':1,'I':2,'J':1.5}\r\nbuffer = {'A':2,'C':2,'E':3,'H':2,'F':2,'I':1,'J':2}\r\n\r\np.monte_carlo_detail_buffer_analysis(optimistic=optimistic,pessimistic=pessimistic,buffer=buffer, NumberIterations=2000)\r\n```\r\n\r\n## Contributors\r\nAuthor: **Luis Fernando Perez Armas**\r\n\r\nEmail: luisfernandopa1212@gmail.com\r\n\r\nLinkedIn: [LinkedIn Profile](https://www.linkedin.com/in/luis-fernando-perez-project-manager/)\r\n\r\n## License\r\nThis project is licensed under the MIT License - see the LICENSE file for details.\r\n\r\n**MIT License**\r\n\r\nCopyright (c) 2023, Luis Fernando P\u00c3\u00a9rez Armas\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n\r\n=======\r\n\r\nHistory\r\n\r\n=======\r\n\r\n0.1.0 (2023-09-03)\r\n\r\n* First release on PyPI.\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.4 (2023-09-04)\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.5 (2023-09-04)\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.6 (2023-09-29)\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.7 (2023-09-29)\r\n\r\n**Bugfixes**\r\n\r\n- Error with MTS,LTS, MIS and LIS priority rules fixed.\r\n- Bug related to incorrect choosing of activities under the condition of a priority rule tie, was fixed.\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.8 (2023-10-03)\r\n\r\n- Weak forbidden set function added\r\n- Minimum forbidden set function added\r\n- Simple monte carlo buffer analysis added\r\n- Possibility to create a project from a .rcp file and from instances of the CV dataset\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.9 (2023-10-03)\r\n\r\n- Extra information added to the monte carlo buffer analysis methods\r\n- Critical Path Method returns a dataframe with the basic outputs ES,EF,LS,LF,F\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.10 (2023-10-03)\r\n\r\n- Bug fix with the monte carlo buffer analysis methods\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.11 (2023-10-03)\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.12 (2023-10-08)\r\n\r\n- Feasible subset function added\r\n- Function that calculate naive bounds for each activity, based on a time horizon\r\n\r\n+++++++++++++++++++\r\n\r\n0.1.13 (2023-10-08)\r\n\r\n- Bug fix with the outputs of forbidden sets and feasible set.\r\n\r\n------------------\r\n\r\n\r\n",
"bugtrack_url": null,
"license": "MIT license",
"summary": "A python package dedicated to project scheduling",
"version": "0.1.13",
"project_urls": {
"Homepage": "https://github.com/ceche1212/cheche_pm"
},
"split_keywords": [
"cheche_pm"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3e8d99b28d8b5ef5a97ae348819b327c85af3bbc9fed12a4cb7f8524b7883d50",
"md5": "f637b2852926e437e72b7111f8beb10d",
"sha256": "842d5d7b99f337d0e6d0ada924b9ab5983c228ea7ff0e63338af6102cf45be82"
},
"downloads": -1,
"filename": "cheche_pm-0.1.13-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "f637b2852926e437e72b7111f8beb10d",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.9",
"size": 39392,
"upload_time": "2023-10-08T10:42:38",
"upload_time_iso_8601": "2023-10-08T10:42:38.304630Z",
"url": "https://files.pythonhosted.org/packages/3e/8d/99b28d8b5ef5a97ae348819b327c85af3bbc9fed12a4cb7f8524b7883d50/cheche_pm-0.1.13-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9176c776094b36d81f5f3e91c13971116516d231b82209ea6c8dc1faa4020058",
"md5": "6cdc56714498ab8f3db510e04b60220b",
"sha256": "bc13b94ddf810fe15b6e3c5be0debf7e27bf6b3e965d6785e9ed26a6af384bb6"
},
"downloads": -1,
"filename": "cheche_pm-0.1.13.tar.gz",
"has_sig": false,
"md5_digest": "6cdc56714498ab8f3db510e04b60220b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 48177,
"upload_time": "2023-10-08T10:42:40",
"upload_time_iso_8601": "2023-10-08T10:42:40.219277Z",
"url": "https://files.pythonhosted.org/packages/91/76/c776094b36d81f5f3e91c13971116516d231b82209ea6c8dc1faa4020058/cheche_pm-0.1.13.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-10-08 10:42:40",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ceche1212",
"github_project": "cheche_pm",
"github_not_found": true,
"lcname": "cheche-pm"
}