[](https://badge.fury.io/py/pyscrew)
[](https://pypi.org/project/pyscrew/)
[](https://github.com/nikolaiwest/pyscrew/blob/main/LICENSE)
[](https://pepy.tech/project/pyscrew)
# PyScrew
PyScrew is a Python package designed to simplify access to industrial research data from screw driving experiments. It provides a streamlined interface for downloading, validating, and preparing experimental datasets hosted on Zenodo.
More information on the data is available here: https://zenodo.org/records/14769379
## Features
- Data loading from various scenarios
- Handling duplicates and missing values
- Length normalization through padding and truncation
- Configurable data processing pipeline
- Comprehensive data validation and integrity checks
- Detailed logging and statistics tracking
- Support for multiple measurement types (torque, angle, time, gradient, step)
## Installation
To install PyScrew, use pip:
```bash
pip install pyscrew
```
## Usage
### Basic Usage
You can load data from a specific scenario using the `get_data` function with default settings:
```python
import pyscrew
# Load data from the thread degradation scenario (s01)
data = pyscrew.get_data(scenario="s01")
# Access the measurements and labels
x_values = data["torque_values"]
y_values = data["class_values"]
```
### Advanced Usage
<details>
<summary>Click to expand for detailed configuration options</summary>
```python
import pyscrew
# Load and process data with custom settings
data = pyscrew.get_data(
scenario="assembly-conditions-2", # or "s04" or "s04_assembly-conditions-2"
cache_dir="~/.cache/pyscrew", # Specify custom directory (default: src/pyscrew/downloads)
force_download=True, # Force re-download even if cached
handle_duplicates="first", # How to handle duplicate time points
handle_missings="mean", # How to handle missing values
target_length=2000, # Target length for normalization
)
# Describe the data
print("Available measurements:", data.keys())
print("Number of torque measurements:", len(data["torque_values"]))
# Access the data
x_values = data["torque_values"]
y_values = data["class_values"]
```
### Scenario Specification
The scenario parameter can be specified in three different ways:
1. **Short ID**: Use the scenario identifier (e.g., `"s01"`, `"s02"`, etc.)
2. **Full Name**: Use the descriptive name (e.g., `"thread-degradation"`, `"surface-friction"`)
3. **Full ID**: Use the complete identifier (e.g., `"s01_thread-degradation"`, `"s02_surface-friction"`)
All three formats are equivalent and will load the same dataset. For example, these all refer to the same scenario:
```python
data = pyscrew.get_data(scenario="s02") # Short ID
data = pyscrew.get_data(scenario="surface-friction") # Full name
data = pyscrew.get_data(scenario="s02_surface-friction") # Full ID
```
</details>
---
You can find more info regarding the scenarios on [github](https://github.com/nikolaiwest/pyscrew/tree/main/docs/scenarios) and on [zenodo](https://doi.org/10.5281/zenodo.14729547), or you can simply list available scenarios with their descriptions like this:
```python
scenarios = pyscrew.list_scenarios()
print("Available scenarios:", scenarios)
```
## Available Scenarios
Our datasets examine various aspects of screw driving operations in industrial settings. Each scenario focuses on specific experimental conditions and research questions:
| ID | Name | Description | Samples | Classes | Documentation |
|----|------|-------------|---------|---------|---------------|
| s01 | Thread Degradation | Examines thread degradation in plastic materials through repeated fastening operations | 5,000 | 1 | [Details](docs/scenarios/s01_thread-degradation.md) |
| s02 | Surface Friction | Investigates the impact of different surface conditions (water, lubricant, adhesive, etc.) on screw driving operations | 12,500 | 8 | [Details](docs/scenarios/s02_surface-friction.md) |
| s03 | Assembly Conditions 1 | Examines various screw and component faults including washer modifications, thread deformations, and alignment issues | 1,700 | 26 | [Details](docs/scenarios/s03_assembly-conditions-1.md) |
| s04 | Assembly Conditions 2 | Investigates thread modifications, surface conditions, component modifications, and process parameter changes | 5,000 | 25 | [Details](docs/scenarios/s04_assembly-conditions-2.md) |
| s05 | Upper Workpiece Fabrication | Analyzes variations in injection molding parameters for upper workpieces | 2,400 | 42 | [Details](docs/scenarios/s05_upper-workpiece.md) |
| s06 | Lower Workpiece Fabrication | Studies variations in injection molding parameters for lower workpieces | 7,482 | 44 | [Details](docs/scenarios/s06_lower-workpiece.md) |
## Package Structure
```bash
PyScrew/
├── docs/
│ └── scenarios/
│ ├── s01_thread-degradation.md
│ ├── s02_surface-friction.md
│ ├── s03_assembly-conditions-1.md
│ ├── s04_assembly-conditions-2.md
│ ├── s05_upper-workpiece.md
│ └── s06_lower-workpiece.md
├── src/
│ └── pyscrew/
│ ├── __init__.py # Package initialization and version
│ ├── main.py # Main interface and high-level functions
│ ├── core/ # Core data model and structures
│ │ ├── __init__.py
│ │ ├── dataset.py # ScrewDataset class
│ │ ├── run.py # ScrewRun class
│ │ ├── step.py # ScrewStep class
│ │ └── fields.py # Field definitions
│ ├── config/ # Configuration management
│ │ ├── __init__.py
│ │ ├── pipeline.py # Pipeline configuration
│ │ └── scenarios.py # Scenario configuration
│ ├── pipeline/ # Data processing pipeline components
│ │ ├── __init__.py
│ │ ├── loading.py # Data loading from Zenodo
│ │ ├── processing.py # Data processing functionality
│ │ ├── validating.py # Data validation after loading
│ │ └── transformers/ # Data transformation modules
│ ├── scenarios/ # Scenario-specific configurations
│ │ ├── __init__.py
│ │ ├── s01.yml # Thread degradation scenario
│ │ ├── s02.yml # Surface friction scenario
│ │ ├── s03.yml # Assembly conditions 1
│ │ ├── s04.yml # Assembly conditions 2
│ │ ├── s05.yml # Upper workpiece
│ │ └── s06.yml # Lower workpiece
│ ├── downloads/ # Default location for downloaded data
│ │ ├── archives/ # Compressed dataset archives
│ │ └── extracted/ # Extracted dataset files
│ ├── tools/ # Utility scripts and tools
│ │ ├── create_label_csv.py # Label file generation
│ │ └── get_dataset_metrics.py # Documentation metrics calculation
│ └── utils/ # Utility functions and helpers
│ ├── data_model.py
│ └── logger.py
└── tests/ # Test suite
```
## API Reference
### Main Functions
`get_data(scenario_name: str, cache_dir: Optional[Path] = None, force: bool = False) -> Path`
Downloads and extracts a specific dataset.
* `scenario_name`: Name of the dataset to download
* `cache_dir`: Optional custom cache directory (default: ~/.cache/pyscrew)
* `force`: Force re-download even if cached
* **Returns:** Path to extracted dataset
`list_scenarios() -> Dict[str, str]`
Lists all available datasets and their descriptions.
* Returns: Dictionary mapping scenario names to descriptions
## Cache Structure
Downloaded data is stored in:
```bash
~/.cache/pyscrew/
├── archives/ # Compressed dataset archives
└── extracted/ # Extracted dataset files
├── s01_thread-degradation/
├── s02_surface-friction/
├── s03_assembly-conditions-1/
├── s04_assembly-conditions-2/
├── s05_upper-workpiece/
├── s06_lower-workpiece/
└── ...
```
## Code Style
This project uses:
- [Black](https://black.readthedocs.io/en/stable/) for code formatting
- [Ruff](https://docs.astral.sh/ruff/) for fast linting and import sorting
- [MyPy](https://mypy.readthedocs.io/en/stable/) for static type checking
- [Pytest](https://docs.pytest.org/en/stable/) for testing
Configuration for these tools can be found in `pyproject.toml`.
## Development
The package is under active development. Further implementation will add data processing utilities and data validation tools.
## 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.
## Citation
If you use this package in your research, please cite our arXiv publication:
* West, N., & Deuse, J. (2025). PyScrew: A Comprehensive Dataset Collection from Industrial Screw Driving Experiments. arXiv (Computer Science > Machine Learning), 1-18. https://doi.org/10.48550/arXiv.2505.11925
The PyScrew data was used in other papers that might be interesting to you as well:
* West, N., & Deuse, J. (2024). A Comparative Study of Machine Learning Approaches for Anomaly Detection in Industrial Screw Driving Data. Proceedings of the 57th Hawaii International Conference on System Sciences (HICSS), 1050-1059. https://hdl.handle.net/10125/106504
* West, N., Trianni, A. & Deuse, J. (2024). Data-driven analysis of bolted joints in plastic housings with surface-based anomalies using supervised and unsupervised machine learning. CIE51 Proceedings. _(DOI will follow after publication of the proceedings)_
* West, N. & Deuse, J. (2025). Multi-class Error Detection in Industrial Screw Driving 2 Operations Using Machine Learning. Proceedings of the 11th International conference on Time Series and Forecasting (ITISE). _(DOI will follow after publication of the proceedings)_
Raw data
{
"_id": null,
"home_page": null,
"name": "pyscrew",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.11",
"maintainer_email": null,
"keywords": "manufacturing, screw driving, industrial data, open data, research data",
"author": null,
"author_email": "Nikolai West <nikolai.west@tu-dortmund.de>",
"download_url": "https://files.pythonhosted.org/packages/d5/4e/b86d9900c2028ac529b412380e5f29139dfa0af20d838ab0d2f836e29aca/pyscrew-1.2.2.tar.gz",
"platform": null,
"description": "[](https://badge.fury.io/py/pyscrew)\r\n[](https://pypi.org/project/pyscrew/)\r\n[](https://github.com/nikolaiwest/pyscrew/blob/main/LICENSE)\r\n[](https://pepy.tech/project/pyscrew)\r\n\r\n# PyScrew\r\n\r\nPyScrew is a Python package designed to simplify access to industrial research data from screw driving experiments. It provides a streamlined interface for downloading, validating, and preparing experimental datasets hosted on Zenodo.\r\n\r\nMore information on the data is available here: https://zenodo.org/records/14769379\r\n\r\n## Features\r\n\r\n- Data loading from various scenarios\r\n- Handling duplicates and missing values\r\n- Length normalization through padding and truncation\r\n- Configurable data processing pipeline\r\n- Comprehensive data validation and integrity checks\r\n- Detailed logging and statistics tracking\r\n- Support for multiple measurement types (torque, angle, time, gradient, step)\r\n\r\n## Installation\r\n\r\nTo install PyScrew, use pip:\r\n\r\n```bash\r\npip install pyscrew\r\n```\r\n\r\n## Usage\r\n\r\n### Basic Usage\r\nYou can load data from a specific scenario using the `get_data` function with default settings:\r\n\r\n```python \r\nimport pyscrew\r\n\r\n# Load data from the thread degradation scenario (s01)\r\ndata = pyscrew.get_data(scenario=\"s01\")\r\n\r\n# Access the measurements and labels\r\nx_values = data[\"torque_values\"]\r\ny_values = data[\"class_values\"]\r\n```\r\n\r\n### Advanced Usage\r\n<details>\r\n<summary>Click to expand for detailed configuration options</summary>\r\n\r\n```python \r\nimport pyscrew\r\n\r\n# Load and process data with custom settings\r\ndata = pyscrew.get_data(\r\n scenario=\"assembly-conditions-2\", # or \"s04\" or \"s04_assembly-conditions-2\"\r\n cache_dir=\"~/.cache/pyscrew\", # Specify custom directory (default: src/pyscrew/downloads)\r\n force_download=True, # Force re-download even if cached\r\n handle_duplicates=\"first\", # How to handle duplicate time points\r\n handle_missings=\"mean\", # How to handle missing values\r\n target_length=2000, # Target length for normalization\r\n)\r\n\r\n# Describe the data\r\nprint(\"Available measurements:\", data.keys())\r\nprint(\"Number of torque measurements:\", len(data[\"torque_values\"]))\r\n\r\n# Access the data\r\nx_values = data[\"torque_values\"]\r\ny_values = data[\"class_values\"]\r\n\r\n```\r\n### Scenario Specification\r\nThe scenario parameter can be specified in three different ways:\r\n\r\n1. **Short ID**: Use the scenario identifier (e.g., `\"s01\"`, `\"s02\"`, etc.)\r\n2. **Full Name**: Use the descriptive name (e.g., `\"thread-degradation\"`, `\"surface-friction\"`)\r\n3. **Full ID**: Use the complete identifier (e.g., `\"s01_thread-degradation\"`, `\"s02_surface-friction\"`)\r\n\r\nAll three formats are equivalent and will load the same dataset. For example, these all refer to the same scenario:\r\n```python\r\ndata = pyscrew.get_data(scenario=\"s02\") # Short ID\r\ndata = pyscrew.get_data(scenario=\"surface-friction\") # Full name\r\ndata = pyscrew.get_data(scenario=\"s02_surface-friction\") # Full ID\r\n```\r\n</details>\r\n\r\n--- \r\n\r\nYou can find more info regarding the scenarios on [github](https://github.com/nikolaiwest/pyscrew/tree/main/docs/scenarios) and on [zenodo](https://doi.org/10.5281/zenodo.14729547), or you can simply list available scenarios with their descriptions like this: \r\n\r\n```python\r\nscenarios = pyscrew.list_scenarios()\r\nprint(\"Available scenarios:\", scenarios)\r\n```\r\n\r\n## Available Scenarios\r\n\r\nOur datasets examine various aspects of screw driving operations in industrial settings. Each scenario focuses on specific experimental conditions and research questions:\r\n\r\n| ID | Name | Description | Samples | Classes | Documentation |\r\n|----|------|-------------|---------|---------|---------------|\r\n| s01 | Thread Degradation | Examines thread degradation in plastic materials through repeated fastening operations | 5,000 | 1 | [Details](docs/scenarios/s01_thread-degradation.md) |\r\n| s02 | Surface Friction | Investigates the impact of different surface conditions (water, lubricant, adhesive, etc.) on screw driving operations | 12,500 | 8 | [Details](docs/scenarios/s02_surface-friction.md) |\r\n| s03 | Assembly Conditions 1 | Examines various screw and component faults including washer modifications, thread deformations, and alignment issues | 1,700 | 26 | [Details](docs/scenarios/s03_assembly-conditions-1.md) |\r\n| s04 | Assembly Conditions 2 | Investigates thread modifications, surface conditions, component modifications, and process parameter changes | 5,000 | 25 | [Details](docs/scenarios/s04_assembly-conditions-2.md) |\r\n| s05 | Upper Workpiece Fabrication | Analyzes variations in injection molding parameters for upper workpieces | 2,400 | 42 | [Details](docs/scenarios/s05_upper-workpiece.md) |\r\n| s06 | Lower Workpiece Fabrication | Studies variations in injection molding parameters for lower workpieces | 7,482 | 44 | [Details](docs/scenarios/s06_lower-workpiece.md) |\r\n\r\n## Package Structure\r\n\r\n```bash\r\nPyScrew/\r\n\u251c\u2500\u2500 docs/\r\n\u2502 \u2514\u2500\u2500 scenarios/ \r\n\u2502 \u251c\u2500\u2500 s01_thread-degradation.md\r\n\u2502 \u251c\u2500\u2500 s02_surface-friction.md\r\n\u2502 \u251c\u2500\u2500 s03_assembly-conditions-1.md\r\n\u2502 \u251c\u2500\u2500 s04_assembly-conditions-2.md\r\n\u2502 \u251c\u2500\u2500 s05_upper-workpiece.md\r\n\u2502 \u2514\u2500\u2500 s06_lower-workpiece.md\r\n\u251c\u2500\u2500 src/\r\n\u2502 \u2514\u2500\u2500 pyscrew/\r\n\u2502 \u251c\u2500\u2500 __init__.py # Package initialization and version\r\n\u2502 \u251c\u2500\u2500 main.py # Main interface and high-level functions\r\n\u2502 \u251c\u2500\u2500 core/ # Core data model and structures\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 dataset.py # ScrewDataset class\r\n\u2502 \u2502 \u251c\u2500\u2500 run.py # ScrewRun class\r\n\u2502 \u2502 \u251c\u2500\u2500 step.py # ScrewStep class\r\n\u2502 \u2502 \u2514\u2500\u2500 fields.py # Field definitions\r\n\u2502 \u251c\u2500\u2500 config/ # Configuration management\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 pipeline.py # Pipeline configuration\r\n\u2502 \u2502 \u2514\u2500\u2500 scenarios.py # Scenario configuration\r\n\u2502 \u251c\u2500\u2500 pipeline/ # Data processing pipeline components\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 loading.py # Data loading from Zenodo\r\n\u2502 \u2502 \u251c\u2500\u2500 processing.py # Data processing functionality\r\n\u2502 \u2502 \u251c\u2500\u2500 validating.py # Data validation after loading\r\n\u2502 \u2502 \u2514\u2500\u2500 transformers/ # Data transformation modules\r\n\u2502 \u251c\u2500\u2500 scenarios/ # Scenario-specific configurations\r\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\r\n\u2502 \u2502 \u251c\u2500\u2500 s01.yml # Thread degradation scenario\r\n\u2502 \u2502 \u251c\u2500\u2500 s02.yml # Surface friction scenario\r\n\u2502 \u2502 \u251c\u2500\u2500 s03.yml # Assembly conditions 1\r\n\u2502 \u2502 \u251c\u2500\u2500 s04.yml # Assembly conditions 2\r\n\u2502 \u2502 \u251c\u2500\u2500 s05.yml # Upper workpiece\r\n\u2502 \u2502 \u2514\u2500\u2500 s06.yml # Lower workpiece\r\n\u2502 \u251c\u2500\u2500 downloads/ # Default location for downloaded data\r\n\u2502 \u2502 \u251c\u2500\u2500 archives/ # Compressed dataset archives\r\n\u2502 \u2502 \u2514\u2500\u2500 extracted/ # Extracted dataset files \r\n\u2502 \u251c\u2500\u2500 tools/ # Utility scripts and tools\r\n\u2502 \u2502 \u251c\u2500\u2500 create_label_csv.py # Label file generation\r\n\u2502 \u2502 \u2514\u2500\u2500 get_dataset_metrics.py # Documentation metrics calculation\r\n\u2502 \u2514\u2500\u2500 utils/ # Utility functions and helpers\r\n\u2502 \u251c\u2500\u2500 data_model.py\r\n\u2502 \u2514\u2500\u2500 logger.py\r\n\u2514\u2500\u2500 tests/ # Test suite\r\n```\r\n\r\n## API Reference\r\n\r\n### Main Functions\r\n\r\n`get_data(scenario_name: str, cache_dir: Optional[Path] = None, force: bool = False) -> Path`\r\n\r\nDownloads and extracts a specific dataset.\r\n\r\n* `scenario_name`: Name of the dataset to download\r\n* `cache_dir`: Optional custom cache directory (default: ~/.cache/pyscrew)\r\n* `force`: Force re-download even if cached\r\n* **Returns:** Path to extracted dataset\r\n\r\n`list_scenarios() -> Dict[str, str]`\r\n\r\nLists all available datasets and their descriptions.\r\n\r\n* Returns: Dictionary mapping scenario names to descriptions\r\n\r\n## Cache Structure\r\n\r\nDownloaded data is stored in:\r\n\r\n```bash \r\n~/.cache/pyscrew/\r\n\u251c\u2500\u2500 archives/ # Compressed dataset archives\r\n\u2514\u2500\u2500 extracted/ # Extracted dataset files\r\n \u251c\u2500\u2500 s01_thread-degradation/\r\n \u251c\u2500\u2500 s02_surface-friction/\r\n \u251c\u2500\u2500 s03_assembly-conditions-1/\r\n \u251c\u2500\u2500 s04_assembly-conditions-2/\r\n \u251c\u2500\u2500 s05_upper-workpiece/\r\n \u251c\u2500\u2500 s06_lower-workpiece/\r\n \u2514\u2500\u2500 ...\r\n```\r\n\r\n## Code Style\r\n\r\nThis project uses:\r\n- [Black](https://black.readthedocs.io/en/stable/) for code formatting\r\n- [Ruff](https://docs.astral.sh/ruff/) for fast linting and import sorting\r\n- [MyPy](https://mypy.readthedocs.io/en/stable/) for static type checking\r\n- [Pytest](https://docs.pytest.org/en/stable/) for testing\r\n\r\nConfiguration for these tools can be found in `pyproject.toml`.\r\n\r\n## Development\r\nThe package is under active development. Further implementation will add data processing utilities and data validation tools. \r\n\r\n## Contributing\r\nContributions are welcome! Please feel free to submit a Pull Request.\r\n\r\n## License\r\nThis project is licensed under the MIT License - see the LICENSE file for details.\r\n\r\n## Citation\r\nIf you use this package in your research, please cite our arXiv publication:\r\n* West, N., & Deuse, J. (2025). PyScrew: A Comprehensive Dataset Collection from Industrial Screw Driving Experiments. arXiv (Computer Science > Machine Learning), 1-18. https://doi.org/10.48550/arXiv.2505.11925 \r\n\r\nThe PyScrew data was used in other papers that might be interesting to you as well: \r\n* West, N., & Deuse, J. (2024). A Comparative Study of Machine Learning Approaches for Anomaly Detection in Industrial Screw Driving Data. Proceedings of the 57th Hawaii International Conference on System Sciences (HICSS), 1050-1059. https://hdl.handle.net/10125/106504\r\n* West, N., Trianni, A. & Deuse, J. (2024). Data-driven analysis of bolted joints in plastic housings with surface-based anomalies using supervised and unsupervised machine learning. CIE51 Proceedings. _(DOI will follow after publication of the proceedings)_\r\n* West, N. & Deuse, J. (2025). Multi-class Error Detection in Industrial Screw Driving 2 Operations Using Machine Learning. Proceedings of the 11th International conference on Time Series and Forecasting (ITISE). _(DOI will follow after publication of the proceedings)_\r\n",
"bugtrack_url": null,
"license": null,
"summary": "A Python package for accessing industrial research data from a screw driving system",
"version": "1.2.2",
"project_urls": {
"Bug Tracker": "https://github.com/nikolaiwest/pyscrew/issues",
"Changelog": "https://github.com/nikolaiwest/pyscrew/blob/main/CHANGELOG.md",
"Documentation": "https://github.com/nikolaiwest/pyscrew#readme",
"Homepage": "https://github.com/nikolaiwest/pyscrew"
},
"split_keywords": [
"manufacturing",
" screw driving",
" industrial data",
" open data",
" research data"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "0a3054178a139f8c67ad332e47a2f469c755165993f95079fd2f7425d2fac41d",
"md5": "bdfc7684a34e363a0701bb233ea87182",
"sha256": "707bf7f61fd91bc11bf5da77b8a19cf5a5e76ee8a49e2694904f5eab31239f27"
},
"downloads": -1,
"filename": "pyscrew-1.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bdfc7684a34e363a0701bb233ea87182",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 96069,
"upload_time": "2025-07-21T08:23:48",
"upload_time_iso_8601": "2025-07-21T08:23:48.268625Z",
"url": "https://files.pythonhosted.org/packages/0a/30/54178a139f8c67ad332e47a2f469c755165993f95079fd2f7425d2fac41d/pyscrew-1.2.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d54eb86d9900c2028ac529b412380e5f29139dfa0af20d838ab0d2f836e29aca",
"md5": "e44b5d464482af13ca7134d41a7f514d",
"sha256": "111451da208c78a0c050e187e95d345e5517bdf35cae2992ee291e4ce182b35e"
},
"downloads": -1,
"filename": "pyscrew-1.2.2.tar.gz",
"has_sig": false,
"md5_digest": "e44b5d464482af13ca7134d41a7f514d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 81657,
"upload_time": "2025-07-21T08:23:49",
"upload_time_iso_8601": "2025-07-21T08:23:49.298821Z",
"url": "https://files.pythonhosted.org/packages/d5/4e/b86d9900c2028ac529b412380e5f29139dfa0af20d838ab0d2f836e29aca/pyscrew-1.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-21 08:23:49",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "nikolaiwest",
"github_project": "pyscrew",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "pyscrew"
}