pyscrew


Namepyscrew JSON
Version 1.2.2 PyPI version JSON
download
home_pageNone
SummaryA Python package for accessing industrial research data from a screw driving system
upload_time2025-07-21 08:23:49
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseNone
keywords manufacturing screw driving industrial data open data research data
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![PyPI version](https://badge.fury.io/py/pyscrew.svg)](https://badge.fury.io/py/pyscrew)
[![Python](https://img.shields.io/pypi/pyversions/pyscrew.svg)](https://pypi.org/project/pyscrew/)
[![License](https://img.shields.io/github/license/nikolaiwest/pyscrew.svg)](https://github.com/nikolaiwest/pyscrew/blob/main/LICENSE)
[![Downloads](https://pepy.tech/badge/pyscrew)](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": "[![PyPI version](https://badge.fury.io/py/pyscrew.svg)](https://badge.fury.io/py/pyscrew)\r\n[![Python](https://img.shields.io/pypi/pyversions/pyscrew.svg)](https://pypi.org/project/pyscrew/)\r\n[![License](https://img.shields.io/github/license/nikolaiwest/pyscrew.svg)](https://github.com/nikolaiwest/pyscrew/blob/main/LICENSE)\r\n[![Downloads](https://pepy.tech/badge/pyscrew)](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"
}
        
Elapsed time: 1.31932s