secretstuff


Namesecretstuff JSON
Version 0.0.1 PyPI version JSON
download
home_pagehttps://github.com/adw777/secretStuff
SummaryA comprehensive PII redaction and reverse mapping library
upload_time2025-09-01 08:40:29
maintainerNone
docs_urlNone
authoraxondendrite
requires_python>=3.8
licenseMIT
keywords pii redaction privacy nlp gliner data-protection anonymization secretstuff
VCS
bugtrack_url
requirements gliner torch transformers numpy
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # SecretStuff

A comprehensive, production-ready Python library for identifying, redacting, and reversing personally identifiable information (PII) in text documents using advanced NLP models.

## Features

- **PII Identification**: Uses GLiNER model to identify 150+ types of PII including names, addresses, phone numbers, government IDs, and more
- **Flexible Redaction**: Replace identified PII with configurable dummy values while preserving document structure
- **Reverse Mapping**: Restore original PII from redacted text using secure mapping files
- **Modular Architecture**: Use components independently or through unified pipeline
- **Extensive Coverage**: Comprehensive support for Indian and international PII types
- **Production Ready**: Type hints, comprehensive tests, and robust error handling

## Installation

```bash
pip install secretstuff
```

## Quick Start

### Simple Pipeline Usage

```python
from secretstuff import SecretStuffPipeline

# Initialize pipeline
pipeline = SecretStuffPipeline()

# Your sensitive text
text = """
Mr. John Doe lives at 123 Main Street, New York.
His phone number is +1-555-123-4567 and email is john.doe@email.com.
His Aadhaar number is 1234 5678 9012 and PAN is ABCDE1234F.
"""

# Identify and redact PII in one step
redacted_text, entities, mapping = pipeline.identify_and_redact(text)

print("Redacted:", redacted_text)
print("Found entities:", entities)
```

### Step-by-Step Process

```python
from secretstuff import SecretStuffPipeline

pipeline = SecretStuffPipeline()

# Step 1: Identify PII
entities = pipeline.identify_pii(text)
print("Identified PII:", entities)

# Step 2: Redact PII
redacted_text = pipeline.redact_pii(text)
print("Redacted text:", redacted_text)

# Step 3: After cloud LLM processing, reverse the redaction
restored_text, count, details = pipeline.reverse_redaction(processed_text)
print("Restored text:", restored_text)
```

### File Processing

```python
# Process files
result = pipeline.process_text_file(
    input_file="document.txt",
    output_redacted="redacted_document.txt",
    output_identified="identified_entities.json",
    output_mapping="replacement_mapping.json"
)

# Later, reverse the redaction
reverse_result = pipeline.reverse_from_files(
    redacted_file="processed_document.txt",  # After LLM processing
    mapping_file="replacement_mapping.json",
    output_file="final_document.txt"
)
```

## Component Usage

### Individual Components

```python
from secretstuff import PIIIdentifier, PIIRedactor, ReverseMapper

# Use components individually
identifier = PIIIdentifier()
redactor = PIIRedactor()
reverse_mapper = ReverseMapper()

# Identify PII
entities = identifier.identify_entities(text)

# Redact PII
redacted = redactor.redact_from_identified_entities(text, entities)

# Reverse redaction
reverse_mapper.set_replacement_mapping(redactor.get_replacement_mapping())
restored, count, details = reverse_mapper.reverse_redaction(redacted)
```

### Custom Configuration

```python
from secretstuff import SecretStuffPipeline

# Custom labels and dummy values
custom_labels = ["person", "email", "phone number", "custom_entity"]
custom_dummy_values = {
    "person": ["[PERSON_A]", "[PERSON_B]", "[PERSON_C]"],
    "email": "[EMAIL_REDACTED]",
    "custom_entity": "[CUSTOM_REDACTED]"
}

pipeline = SecretStuffPipeline(
    labels=custom_labels,
    dummy_values=custom_dummy_values
)

# Or configure after initialization
pipeline.configure_labels(custom_labels)
pipeline.configure_dummy_values(custom_dummy_values)
```

## Supported PII Types

SecretStuff identifies 150+ types of PII including:

### Personal Information
- Names, addresses, phone numbers, email addresses
- Dates of birth, ages, places of birth
- Family relationships (father's name, mother's name, etc.)

### Government IDs (India)
- Aadhaar numbers, PAN numbers, Voter IDs
- Passport numbers, driving licenses
- Various state and central government IDs

### Financial Information
- Bank account numbers, IFSC codes, UPI IDs
- Credit/debit card numbers, cheque numbers
- GST numbers, tax identification numbers

### Legal & Court Documents
- Case numbers, FIR numbers, court order numbers
- CNR numbers, filing numbers, petition numbers

### Corporate Information
- CIN numbers, trade license numbers
- Professional registration numbers

### Technical Identifiers
- IP addresses, MAC addresses, device serial numbers
- IMEI numbers, device identifiers

[and more....]

## API Reference

### SecretStuffPipeline

The main interface for all operations:

```python
class SecretStuffPipeline:
    def identify_pii(text: str, chunk_size: int = 384) -> Dict[str, List[str]]
    def redact_pii(text: str, entities: Optional[Dict] = None) -> str
    def identify_and_redact(text: str) -> Tuple[str, Dict, Dict]
    def reverse_redaction(redacted_text: str, mapping: Optional[Dict] = None) -> Tuple[str, int, Dict]
    def process_text_file(input_file: str, **kwargs) -> Dict
    def reverse_from_files(redacted_file: str, mapping_file: str, output_file: str) -> Dict
```

### PIIIdentifier

```python
class PIIIdentifier:
    def identify_entities(text: str, chunk_size: int = 384) -> List[Dict]
    def create_entity_mapping(entities: List[Dict]) -> Dict[str, List[str]]
    def add_custom_labels(labels: List[str]) -> None
    def set_labels(labels: List[str]) -> None
```

### PIIRedactor

```python
class PIIRedactor:
    def create_replacement_mapping(entities: Dict[str, List[str]]) -> Dict[str, str]
    def redact_text(text: str, mapping: Dict[str, str]) -> str
    def redact_from_identified_entities(text: str, entities: Dict) -> str
    def set_dummy_values(dummy_values: Dict) -> None
```

### ReverseMapper

```python
class ReverseMapper:
    def reverse_redaction(redacted_text: str) -> Tuple[str, int, Dict]
    def load_replacement_mapping(mapping_file: str) -> None
    def validate_mapping() -> bool
    def get_mapping_statistics() -> Dict
```

## Advanced Usage

### Custom Model

```python
pipeline = SecretStuffPipeline(
    model_name="your-custom-gliner-model"
)
```

### Batch Processing

```python
# Process multiple files
files = ["doc1.txt", "doc2.txt", "doc3.txt"]
results = []

for file in files:
    result = pipeline.process_text_file(file)
    results.append(result)
```

## Use Cases

### 1. Cloud LLM Data Protection

```python
# Before sending to cloud LLM
original_text = "Patient John Doe (DOB: 1985-03-15) visited on..."
redacted_text, entities, mapping = pipeline.identify_and_redact(original_text)

# Send redacted_text to cloud LLM
llm_response = call_cloud_llm(redacted_text)

# Restore original PII in response
final_response, _, _ = pipeline.reverse_redaction(llm_response, mapping)
```

### 2. Document Anonymization

```python
# Remove PII from documents permanently
entities = pipeline.identify_pii(document_text)
anonymized = pipeline.redact_pii(document_text, entities)
# Don't save the mapping for permanent anonymization
```

### 3. Data Processing Pipeline

```python
# Part of larger data processing workflow
def process_sensitive_documents(input_dir, output_dir):
    for filename in os.listdir(input_dir):
        input_path = os.path.join(input_dir, filename)
        output_path = os.path.join(output_dir, f"redacted_{filename}")
        
        pipeline.process_text_file(
            input_file=input_path,
            output_redacted=output_path
        )
```

## Configuration

### Environment Variables

```bash
export SECRETSTUFF_MODEL_NAME="urchade/gliner_multi_pii-v1"
export SECRETSTUFF_CHUNK_SIZE="384"
export SECRETSTUFF_CACHE_DIR="/path/to/cache"
```

### Custom Configuration File

```python
# config.py
CUSTOM_LABELS = ["person", "email", "phone", "custom_field"]
CUSTOM_DUMMY_VALUES = {
    "custom_field": "[CUSTOM_REDACTED]"
}

# main.py
from config import CUSTOM_LABELS, CUSTOM_DUMMY_VALUES
pipeline = SecretStuffPipeline(
    labels=CUSTOM_LABELS,
    dummy_values=CUSTOM_DUMMY_VALUES
)
```

## Performance Considerations

- **Model Caching**: GLiNER model is cached after first load
- **Batch Processing**: Process multiple documents in batches for efficiency

## Error Handling

```python
from secretstuff import SecretStuffPipeline
from secretstuff.exceptions import SecretStuffError

try:
    pipeline = SecretStuffPipeline()
    result = pipeline.identify_and_redact(text)
except SecretStuffError as e:
    print(f"SecretStuff error: {e}")
except Exception as e:
    print(f"Unexpected error: {e}")
```

## Testing

Run the test suite:

```bash
# Install dev dependencies
pip install secretstuff[dev]

# Run tests
pytest

# Run with coverage
pytest --cov=secretstuff --cov-report=html
```

## Contributing

1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Ensure all tests pass
5. Submit a pull request

## License

MIT License - see LICENSE file for details.

## Support

- Documentation: https://github.com/adw777/secretStuff/blob/main/README.md
- Issues: https://github.com/adw777/secretStuff/issues
- Email: amandogra2016@gmail.com

## Changelog

### v0.0.1
- Initial release
- PII identification with GLiNER
- Flexible redaction system
- Reverse mapping functionality
- Comprehensive test suite
- Production-ready API

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/adw777/secretStuff",
    "name": "secretstuff",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "pii, redaction, privacy, nlp, gliner, data-protection, anonymization, secretStuff",
    "author": "axondendrite",
    "author_email": "axondendrite <amandogra2016@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/5f/f9/4a03af7fa78159dc91f941cda6c3f5a094f4ebfffb0e1688594b33e3ce64/secretstuff-0.0.1.tar.gz",
    "platform": null,
    "description": "# SecretStuff\r\n\r\nA comprehensive, production-ready Python library for identifying, redacting, and reversing personally identifiable information (PII) in text documents using advanced NLP models.\r\n\r\n## Features\r\n\r\n- **PII Identification**: Uses GLiNER model to identify 150+ types of PII including names, addresses, phone numbers, government IDs, and more\r\n- **Flexible Redaction**: Replace identified PII with configurable dummy values while preserving document structure\r\n- **Reverse Mapping**: Restore original PII from redacted text using secure mapping files\r\n- **Modular Architecture**: Use components independently or through unified pipeline\r\n- **Extensive Coverage**: Comprehensive support for Indian and international PII types\r\n- **Production Ready**: Type hints, comprehensive tests, and robust error handling\r\n\r\n## Installation\r\n\r\n```bash\r\npip install secretstuff\r\n```\r\n\r\n## Quick Start\r\n\r\n### Simple Pipeline Usage\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\n\r\n# Initialize pipeline\r\npipeline = SecretStuffPipeline()\r\n\r\n# Your sensitive text\r\ntext = \"\"\"\r\nMr. John Doe lives at 123 Main Street, New York.\r\nHis phone number is +1-555-123-4567 and email is john.doe@email.com.\r\nHis Aadhaar number is 1234 5678 9012 and PAN is ABCDE1234F.\r\n\"\"\"\r\n\r\n# Identify and redact PII in one step\r\nredacted_text, entities, mapping = pipeline.identify_and_redact(text)\r\n\r\nprint(\"Redacted:\", redacted_text)\r\nprint(\"Found entities:\", entities)\r\n```\r\n\r\n### Step-by-Step Process\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\n\r\npipeline = SecretStuffPipeline()\r\n\r\n# Step 1: Identify PII\r\nentities = pipeline.identify_pii(text)\r\nprint(\"Identified PII:\", entities)\r\n\r\n# Step 2: Redact PII\r\nredacted_text = pipeline.redact_pii(text)\r\nprint(\"Redacted text:\", redacted_text)\r\n\r\n# Step 3: After cloud LLM processing, reverse the redaction\r\nrestored_text, count, details = pipeline.reverse_redaction(processed_text)\r\nprint(\"Restored text:\", restored_text)\r\n```\r\n\r\n### File Processing\r\n\r\n```python\r\n# Process files\r\nresult = pipeline.process_text_file(\r\n    input_file=\"document.txt\",\r\n    output_redacted=\"redacted_document.txt\",\r\n    output_identified=\"identified_entities.json\",\r\n    output_mapping=\"replacement_mapping.json\"\r\n)\r\n\r\n# Later, reverse the redaction\r\nreverse_result = pipeline.reverse_from_files(\r\n    redacted_file=\"processed_document.txt\",  # After LLM processing\r\n    mapping_file=\"replacement_mapping.json\",\r\n    output_file=\"final_document.txt\"\r\n)\r\n```\r\n\r\n## Component Usage\r\n\r\n### Individual Components\r\n\r\n```python\r\nfrom secretstuff import PIIIdentifier, PIIRedactor, ReverseMapper\r\n\r\n# Use components individually\r\nidentifier = PIIIdentifier()\r\nredactor = PIIRedactor()\r\nreverse_mapper = ReverseMapper()\r\n\r\n# Identify PII\r\nentities = identifier.identify_entities(text)\r\n\r\n# Redact PII\r\nredacted = redactor.redact_from_identified_entities(text, entities)\r\n\r\n# Reverse redaction\r\nreverse_mapper.set_replacement_mapping(redactor.get_replacement_mapping())\r\nrestored, count, details = reverse_mapper.reverse_redaction(redacted)\r\n```\r\n\r\n### Custom Configuration\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\n\r\n# Custom labels and dummy values\r\ncustom_labels = [\"person\", \"email\", \"phone number\", \"custom_entity\"]\r\ncustom_dummy_values = {\r\n    \"person\": [\"[PERSON_A]\", \"[PERSON_B]\", \"[PERSON_C]\"],\r\n    \"email\": \"[EMAIL_REDACTED]\",\r\n    \"custom_entity\": \"[CUSTOM_REDACTED]\"\r\n}\r\n\r\npipeline = SecretStuffPipeline(\r\n    labels=custom_labels,\r\n    dummy_values=custom_dummy_values\r\n)\r\n\r\n# Or configure after initialization\r\npipeline.configure_labels(custom_labels)\r\npipeline.configure_dummy_values(custom_dummy_values)\r\n```\r\n\r\n## Supported PII Types\r\n\r\nSecretStuff identifies 150+ types of PII including:\r\n\r\n### Personal Information\r\n- Names, addresses, phone numbers, email addresses\r\n- Dates of birth, ages, places of birth\r\n- Family relationships (father's name, mother's name, etc.)\r\n\r\n### Government IDs (India)\r\n- Aadhaar numbers, PAN numbers, Voter IDs\r\n- Passport numbers, driving licenses\r\n- Various state and central government IDs\r\n\r\n### Financial Information\r\n- Bank account numbers, IFSC codes, UPI IDs\r\n- Credit/debit card numbers, cheque numbers\r\n- GST numbers, tax identification numbers\r\n\r\n### Legal & Court Documents\r\n- Case numbers, FIR numbers, court order numbers\r\n- CNR numbers, filing numbers, petition numbers\r\n\r\n### Corporate Information\r\n- CIN numbers, trade license numbers\r\n- Professional registration numbers\r\n\r\n### Technical Identifiers\r\n- IP addresses, MAC addresses, device serial numbers\r\n- IMEI numbers, device identifiers\r\n\r\n[and more....]\r\n\r\n## API Reference\r\n\r\n### SecretStuffPipeline\r\n\r\nThe main interface for all operations:\r\n\r\n```python\r\nclass SecretStuffPipeline:\r\n    def identify_pii(text: str, chunk_size: int = 384) -> Dict[str, List[str]]\r\n    def redact_pii(text: str, entities: Optional[Dict] = None) -> str\r\n    def identify_and_redact(text: str) -> Tuple[str, Dict, Dict]\r\n    def reverse_redaction(redacted_text: str, mapping: Optional[Dict] = None) -> Tuple[str, int, Dict]\r\n    def process_text_file(input_file: str, **kwargs) -> Dict\r\n    def reverse_from_files(redacted_file: str, mapping_file: str, output_file: str) -> Dict\r\n```\r\n\r\n### PIIIdentifier\r\n\r\n```python\r\nclass PIIIdentifier:\r\n    def identify_entities(text: str, chunk_size: int = 384) -> List[Dict]\r\n    def create_entity_mapping(entities: List[Dict]) -> Dict[str, List[str]]\r\n    def add_custom_labels(labels: List[str]) -> None\r\n    def set_labels(labels: List[str]) -> None\r\n```\r\n\r\n### PIIRedactor\r\n\r\n```python\r\nclass PIIRedactor:\r\n    def create_replacement_mapping(entities: Dict[str, List[str]]) -> Dict[str, str]\r\n    def redact_text(text: str, mapping: Dict[str, str]) -> str\r\n    def redact_from_identified_entities(text: str, entities: Dict) -> str\r\n    def set_dummy_values(dummy_values: Dict) -> None\r\n```\r\n\r\n### ReverseMapper\r\n\r\n```python\r\nclass ReverseMapper:\r\n    def reverse_redaction(redacted_text: str) -> Tuple[str, int, Dict]\r\n    def load_replacement_mapping(mapping_file: str) -> None\r\n    def validate_mapping() -> bool\r\n    def get_mapping_statistics() -> Dict\r\n```\r\n\r\n## Advanced Usage\r\n\r\n### Custom Model\r\n\r\n```python\r\npipeline = SecretStuffPipeline(\r\n    model_name=\"your-custom-gliner-model\"\r\n)\r\n```\r\n\r\n### Batch Processing\r\n\r\n```python\r\n# Process multiple files\r\nfiles = [\"doc1.txt\", \"doc2.txt\", \"doc3.txt\"]\r\nresults = []\r\n\r\nfor file in files:\r\n    result = pipeline.process_text_file(file)\r\n    results.append(result)\r\n```\r\n\r\n## Use Cases\r\n\r\n### 1. Cloud LLM Data Protection\r\n\r\n```python\r\n# Before sending to cloud LLM\r\noriginal_text = \"Patient John Doe (DOB: 1985-03-15) visited on...\"\r\nredacted_text, entities, mapping = pipeline.identify_and_redact(original_text)\r\n\r\n# Send redacted_text to cloud LLM\r\nllm_response = call_cloud_llm(redacted_text)\r\n\r\n# Restore original PII in response\r\nfinal_response, _, _ = pipeline.reverse_redaction(llm_response, mapping)\r\n```\r\n\r\n### 2. Document Anonymization\r\n\r\n```python\r\n# Remove PII from documents permanently\r\nentities = pipeline.identify_pii(document_text)\r\nanonymized = pipeline.redact_pii(document_text, entities)\r\n# Don't save the mapping for permanent anonymization\r\n```\r\n\r\n### 3. Data Processing Pipeline\r\n\r\n```python\r\n# Part of larger data processing workflow\r\ndef process_sensitive_documents(input_dir, output_dir):\r\n    for filename in os.listdir(input_dir):\r\n        input_path = os.path.join(input_dir, filename)\r\n        output_path = os.path.join(output_dir, f\"redacted_{filename}\")\r\n        \r\n        pipeline.process_text_file(\r\n            input_file=input_path,\r\n            output_redacted=output_path\r\n        )\r\n```\r\n\r\n## Configuration\r\n\r\n### Environment Variables\r\n\r\n```bash\r\nexport SECRETSTUFF_MODEL_NAME=\"urchade/gliner_multi_pii-v1\"\r\nexport SECRETSTUFF_CHUNK_SIZE=\"384\"\r\nexport SECRETSTUFF_CACHE_DIR=\"/path/to/cache\"\r\n```\r\n\r\n### Custom Configuration File\r\n\r\n```python\r\n# config.py\r\nCUSTOM_LABELS = [\"person\", \"email\", \"phone\", \"custom_field\"]\r\nCUSTOM_DUMMY_VALUES = {\r\n    \"custom_field\": \"[CUSTOM_REDACTED]\"\r\n}\r\n\r\n# main.py\r\nfrom config import CUSTOM_LABELS, CUSTOM_DUMMY_VALUES\r\npipeline = SecretStuffPipeline(\r\n    labels=CUSTOM_LABELS,\r\n    dummy_values=CUSTOM_DUMMY_VALUES\r\n)\r\n```\r\n\r\n## Performance Considerations\r\n\r\n- **Model Caching**: GLiNER model is cached after first load\r\n- **Batch Processing**: Process multiple documents in batches for efficiency\r\n\r\n## Error Handling\r\n\r\n```python\r\nfrom secretstuff import SecretStuffPipeline\r\nfrom secretstuff.exceptions import SecretStuffError\r\n\r\ntry:\r\n    pipeline = SecretStuffPipeline()\r\n    result = pipeline.identify_and_redact(text)\r\nexcept SecretStuffError as e:\r\n    print(f\"SecretStuff error: {e}\")\r\nexcept Exception as e:\r\n    print(f\"Unexpected error: {e}\")\r\n```\r\n\r\n## Testing\r\n\r\nRun the test suite:\r\n\r\n```bash\r\n# Install dev dependencies\r\npip install secretstuff[dev]\r\n\r\n# Run tests\r\npytest\r\n\r\n# Run with coverage\r\npytest --cov=secretstuff --cov-report=html\r\n```\r\n\r\n## Contributing\r\n\r\n1. Fork the repository\r\n2. Create a feature branch\r\n3. Add tests for new functionality\r\n4. Ensure all tests pass\r\n5. Submit a pull request\r\n\r\n## License\r\n\r\nMIT License - see LICENSE file for details.\r\n\r\n## Support\r\n\r\n- Documentation: https://github.com/adw777/secretStuff/blob/main/README.md\r\n- Issues: https://github.com/adw777/secretStuff/issues\r\n- Email: amandogra2016@gmail.com\r\n\r\n## Changelog\r\n\r\n### v0.0.1\r\n- Initial release\r\n- PII identification with GLiNER\r\n- Flexible redaction system\r\n- Reverse mapping functionality\r\n- Comprehensive test suite\r\n- Production-ready API\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A comprehensive PII redaction and reverse mapping library",
    "version": "0.0.1",
    "project_urls": {
        "Bug Reports": "https://github.com/adw777/secretStuff#/issues",
        "Documentation": "https://github.com/adw777/secretStuff/blob/main/README.md",
        "Homepage": "https://github.com/adw777/secretStuff",
        "Source": "https://github.com/adw777/secretStuff#"
    },
    "split_keywords": [
        "pii",
        " redaction",
        " privacy",
        " nlp",
        " gliner",
        " data-protection",
        " anonymization",
        " secretstuff"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "615d8928e700b50a0fc1d46fda858ecb0c44a5fc22a322ad615cf69e34e4adf9",
                "md5": "9918670824c8e7b4e388b7a7ee8aff43",
                "sha256": "3d2424abeaddafed11197ab7729afcff90015b81e7da961fb746ca01af9a59b5"
            },
            "downloads": -1,
            "filename": "secretstuff-0.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9918670824c8e7b4e388b7a7ee8aff43",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 26266,
            "upload_time": "2025-09-01T08:40:28",
            "upload_time_iso_8601": "2025-09-01T08:40:28.348519Z",
            "url": "https://files.pythonhosted.org/packages/61/5d/8928e700b50a0fc1d46fda858ecb0c44a5fc22a322ad615cf69e34e4adf9/secretstuff-0.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5ff94a03af7fa78159dc91f941cda6c3f5a094f4ebfffb0e1688594b33e3ce64",
                "md5": "cf13b528f7059bceaa9b1c2b47d2f6bb",
                "sha256": "3585713cd353536748a520e8f940cbcf9157de021e10a347548d130223bb8d82"
            },
            "downloads": -1,
            "filename": "secretstuff-0.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "cf13b528f7059bceaa9b1c2b47d2f6bb",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 35230,
            "upload_time": "2025-09-01T08:40:29",
            "upload_time_iso_8601": "2025-09-01T08:40:29.890447Z",
            "url": "https://files.pythonhosted.org/packages/5f/f9/4a03af7fa78159dc91f941cda6c3f5a094f4ebfffb0e1688594b33e3ce64/secretstuff-0.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-01 08:40:29",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "adw777",
    "github_project": "secretStuff",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "gliner",
            "specs": []
        },
        {
            "name": "torch",
            "specs": []
        },
        {
            "name": "transformers",
            "specs": []
        },
        {
            "name": "numpy",
            "specs": []
        }
    ],
    "lcname": "secretstuff"
}
        
Elapsed time: 1.33216s