inconnu 0.1.0__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. inconnu-0.1.1/Makefile +41 -0
  2. {inconnu-0.1.0 → inconnu-0.1.1}/PKG-INFO +85 -81
  3. {inconnu-0.1.0 → inconnu-0.1.1}/README.md +84 -74
  4. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/__init__.py +1 -1
  5. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/model_installer.py +86 -2
  6. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/nlp/entity_redactor.py +6 -0
  7. {inconnu-0.1.0 → inconnu-0.1.1}/pyproject.toml +4 -8
  8. {inconnu-0.1.0 → inconnu-0.1.1}/uv.lock +91 -80
  9. inconnu-0.1.0/Makefile +0 -39
  10. {inconnu-0.1.0 → inconnu-0.1.1}/.bitbucket/scripts/auto_fix.py +0 -0
  11. {inconnu-0.1.0 → inconnu-0.1.1}/.github/workflows/publish.yml +0 -0
  12. {inconnu-0.1.0 → inconnu-0.1.1}/.gitignore +0 -0
  13. {inconnu-0.1.0 → inconnu-0.1.1}/.python-version +0 -0
  14. {inconnu-0.1.0 → inconnu-0.1.1}/LICENSE +0 -0
  15. {inconnu-0.1.0 → inconnu-0.1.1}/MANIFEST.in +0 -0
  16. {inconnu-0.1.0 → inconnu-0.1.1}/bitbucket-pipelines.yml +0 -0
  17. {inconnu-0.1.0 → inconnu-0.1.1}/examples.ipynb +0 -0
  18. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/config.py +0 -0
  19. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/exceptions.py +0 -0
  20. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/nlp/interfaces.py +0 -0
  21. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/nlp/patterns.py +0 -0
  22. {inconnu-0.1.0 → inconnu-0.1.1}/inconnu/nlp/utils.py +0 -0
  23. {inconnu-0.1.0 → inconnu-0.1.1}/issues.json +0 -0
  24. {inconnu-0.1.0 → inconnu-0.1.1}/tests/conftest.py +0 -0
  25. {inconnu-0.1.0 → inconnu-0.1.1}/tests/mocks/de_prompt.txt +0 -0
  26. {inconnu-0.1.0 → inconnu-0.1.1}/tests/mocks/en_prompt.txt +0 -0
  27. {inconnu-0.1.0 → inconnu-0.1.1}/tests/mocks/it_prompt.txt +0 -0
  28. {inconnu-0.1.0 → inconnu-0.1.1}/tests/test_inconnu.py +0 -0
inconnu-0.1.1/Makefile ADDED
@@ -0,0 +1,41 @@
1
+ install:
2
+ uv sync --group dev
3
+
4
+ activate:
5
+ uv venv
6
+
7
+ model-en:
8
+ uv run inconnu-download en
9
+
10
+ model-de:
11
+ uv run inconnu-download de
12
+
13
+ model-it:
14
+ uv run inconnu-download it
15
+
16
+ model-es:
17
+ uv run inconnu-download es
18
+
19
+ model-fr:
20
+ uv run inconnu-download fr
21
+
22
+ update-deps:
23
+ uv update
24
+
25
+ fix:
26
+ uv run ruff check --fix .
27
+
28
+ format:
29
+ uv run ruff format .
30
+
31
+ lint:
32
+ uv run ruff check .
33
+
34
+ clean: fix format lint
35
+ rm -fr .pytest_cache */__pycache__ */*/__pycache__
36
+ uv run ruff clean
37
+
38
+ install-models: model-en model-de model-it # Models required for testing
39
+
40
+ test: install-models
41
+ uv run pytest -vv
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: inconnu
3
- Version: 0.1.0
3
+ Version: 0.1.1
4
4
  Summary: GDPR-compliant data privacy tool for entity redaction and de-anonymization
5
5
  Project-URL: Homepage, https://github.com/0xjgv/inconnu
6
6
  Project-URL: Documentation, https://github.com/0xjgv/inconnu#readme
@@ -26,16 +26,14 @@ Classifier: Topic :: Text Processing :: Linguistic
26
26
  Requires-Python: >=3.10
27
27
  Requires-Dist: phonenumbers>=9.0.8
28
28
  Requires-Dist: spacy>=3.8.7
29
- Provides-Extra: all
30
- Provides-Extra: de
31
- Provides-Extra: en
32
- Provides-Extra: es
33
- Provides-Extra: fr
34
- Provides-Extra: it
35
29
  Description-Content-Type: text/markdown
36
30
 
37
31
  # Inconnu
38
32
 
33
+ [![GitHub](https://img.shields.io/github/stars/0xjgv/inconnu)](https://github.com/0xjgv/inconnu)
34
+ [![inconnu.ai](https://img.shields.io/badge/website-inconnu.ai-blue)](https://inconnu.ai)
35
+ [![PyPI](https://img.shields.io/pypi/v/inconnu)](https://pypi.org/project/inconnu/)
36
+
39
37
  ## What is Inconnu?
40
38
 
41
39
  Inconnu is a GDPR-compliant data privacy tool designed for entity redaction and de-anonymization. It provides cutting-edge NLP-based tools for anonymizing and pseudonymizing text data while maintaining data utility, ensuring your business meets stringent privacy regulations.
@@ -62,40 +60,60 @@ Inconnu is a GDPR-compliant data privacy tool designed for entity redaction and
62
60
  ### Install from PyPI
63
61
 
64
62
  ```bash
65
- # Basic installation (without language models)
63
+ # Using pip
66
64
  pip install inconnu
67
65
 
68
- # Install with English language support
69
- pip install inconnu[en]
66
+ # Using UV (Recommended)
67
+ uv add inconnu
68
+ ```
69
+
70
+ **Note**: Language models are NOT included as optional dependencies. You'll need to download them separately using the `inconnu-download` command after installation (see below).
70
71
 
71
- # Install with specific language support
72
- pip install inconnu[de] # German
73
- pip install inconnu[fr] # French
74
- pip install inconnu[es] # Spanish
75
- pip install inconnu[it] # Italian
72
+ ### Download Language Models
73
+
74
+ After installing Inconnu, use the `inconnu-download` command to download spaCy language models:
75
+
76
+ ```bash
77
+ # Download default (small) models
78
+ inconnu-download en # English
79
+ inconnu-download de # German
80
+ inconnu-download en de fr # Multiple languages
81
+ inconnu-download all # All default models
76
82
 
77
- # Install with multiple languages
78
- pip install inconnu[en,de,fr]
83
+ # Download specific model sizes
84
+ inconnu-download en --size large # Large English model
85
+ inconnu-download en --size transformer # Transformer model (English only)
79
86
 
80
- # Install with all language support
81
- pip install inconnu[all]
87
+ # List available models and check what's installed
88
+ inconnu-download --list
89
+
90
+ # Upgrade existing models
91
+ inconnu-download en --upgrade
92
+
93
+ # Get help for UV environments
94
+ inconnu-download --uv-help
82
95
  ```
83
96
 
84
- ### Download Language Models
97
+ #### How Model Installation Works
98
+
99
+ 1. **No Optional Dependencies**: spaCy models are NOT included as pip/uv optional dependencies to avoid unnecessary downloads during dependency resolution
100
+ 2. **On-Demand Downloads**: The `inconnu-download` command downloads only the models you need
101
+ 3. **Smart Environment Detection**: Automatically detects UV environments and provides appropriate guidance
102
+ 4. **Verification**: Checks if models are already installed before downloading
103
+
104
+ #### Available Model Sizes
105
+
106
+ - **Small (sm)**: Default, fast processing, ~15-50MB, good for high-volume
107
+ - **Medium (md)**: Better accuracy, ~50-200MB, moderate speed
108
+ - **Large (lg)**: High accuracy, ~200-600MB, slower processing
109
+ - **Transformer (trf)**: Highest accuracy, ~400MB+, GPU-optimized (English only)
85
110
 
86
- After installation, download the required spaCy models:
111
+ #### Alternative: Direct spaCy Download
87
112
 
113
+ You can also use spaCy directly if preferred:
88
114
  ```bash
89
- # Using the built-in CLI tool
90
- inconnu-download en # Download default English model
91
- inconnu-download de fr # Download German and French models
92
- inconnu-download en --size large # Download large English model
93
- inconnu-download all # Download all default models
94
- inconnu-download --list # List all available models
95
-
96
- # Or using spaCy directly
97
- python -m spacy download en_core_web_sm
98
- python -m spacy download de_core_news_sm
115
+ python -m spacy download en_core_web_sm # English small
116
+ python -m spacy download de_core_news_lg # German large
99
117
  ```
100
118
 
101
119
  ### Install from Source
@@ -108,9 +126,9 @@ python -m spacy download de_core_news_sm
108
126
 
109
127
  2. **Install with UV (recommended for development)**:
110
128
  ```bash
111
- make install # Install dependencies
112
- make model-de # Download German model
113
- make test # Run tests
129
+ uv sync # Install dependencies
130
+ inconnu-download en de # Download language models
131
+ make test # Run tests
114
132
  ```
115
133
 
116
134
  3. **Or install with pip**:
@@ -119,69 +137,55 @@ python -m spacy download de_core_news_sm
119
137
  python -m spacy download en_core_web_sm
120
138
  ```
121
139
 
122
- ### Installing Additional Models
140
+ ### Development Commands
123
141
 
124
- Inconnu supports multiple spaCy models for enhanced accuracy. The default `en_core_web_sm` model is lightweight and fast, but you can install more accurate models:
142
+ For development, the Makefile provides convenience targets:
125
143
 
126
- #### English Models
127
144
  ```bash
128
- # Small model (default) - 15MB, fast processing
129
- uv run python -m spacy download en_core_web_sm
130
-
131
- # Large model - 560MB, higher accuracy
132
- uv run python -m spacy download en_core_web_lg
133
-
134
- # Transformer model - 438MB, highest accuracy
135
- uv run python -m spacy download en_core_web_trf
145
+ # Download models using make commands
146
+ make model-en # English small
147
+ make model-de # German small
148
+ make model-it # Italian small
149
+ make model-es # Spanish small
150
+ make model-fr # French small
151
+
152
+ # Other development commands
153
+ make test # Run tests
154
+ make lint # Check code with ruff
155
+ make format # Format code
156
+ make clean # Clean cache and format code
136
157
  ```
137
158
 
138
- #### Additional Language Models
139
- ```bash
140
- # German model
141
- make model-de
142
- uv run python -m spacy download de_core_news_sm
143
-
144
- # Italian model
145
- make model-it
146
- uv run python -m spacy download it_core_news_sm
159
+ ### Using Different Models in Code
147
160
 
148
- # Spanish model
149
- make model-es
150
- uv run python -m spacy download es_core_news_sm
161
+ To use a different model size, first download it, then specify it when initializing:
151
162
 
152
- # French model
153
- make model-fr
154
- uv run python -m spacy download fr_core_news_sm
155
-
156
- # For enhanced accuracy (manual installation)
157
- # Medium German model - better accuracy
158
- uv run python -m spacy download de_core_news_md
159
-
160
- # Large German model - highest accuracy
161
- uv run python -m spacy download de_core_news_lg
162
- ```
163
-
164
- #### Using Different Models
163
+ ```python
164
+ from inconnu import Inconnu
165
+ from inconnu.nlp.entity_redactor import SpacyModels
165
166
 
166
- To use a different model, specify it when initializing the EntityRedactor:
167
+ # First, download the model you want
168
+ # $ inconnu-download en --size large
167
169
 
168
- ```python
169
- from inconnu.nlp.entity_redactor import EntityRedactor, SpacyModels
170
+ # Then use it in your code
171
+ inconnu = Inconnu(
172
+ language="en",
173
+ model_name=SpacyModels.EN_CORE_WEB_LG # Use large model
174
+ )
170
175
 
171
- # Use transformer model for highest accuracy
172
- entity_redactor = EntityRedactor(
173
- custom_components=None,
176
+ # For highest accuracy (transformer model)
177
+ inconnu_trf = Inconnu(
174
178
  language="en",
175
- model_name=SpacyModels.EN_CORE_WEB_TRF # High accuracy transformer model
179
+ model_name=SpacyModels.EN_CORE_WEB_TRF
176
180
  )
177
181
  ```
178
182
 
179
183
  **Model Selection Guide:**
180
- - `en_core_web_sm`: Fast processing, good for high-volume processing
181
- - `en_core_web_lg`: Better accuracy, moderate processing time
182
- - `en_core_web_trf`: Highest accuracy, slower processing (recommended for sensitive data)
184
+ - `en_core_web_sm`: Fast processing, good for high-volume
185
+ - `en_core_web_lg`: Better accuracy, moderate speed
186
+ - `en_core_web_trf`: Highest accuracy, GPU-optimized (recommended for sensitive data)
183
187
 
184
- For more models, visit the [spaCy Models Directory](https://spacy.io/models).
188
+ For a complete list of supported models, run `inconnu-download --list`
185
189
 
186
190
  ## Development Setup
187
191
 
@@ -1,5 +1,9 @@
1
1
  # Inconnu
2
2
 
3
+ [![GitHub](https://img.shields.io/github/stars/0xjgv/inconnu)](https://github.com/0xjgv/inconnu)
4
+ [![inconnu.ai](https://img.shields.io/badge/website-inconnu.ai-blue)](https://inconnu.ai)
5
+ [![PyPI](https://img.shields.io/pypi/v/inconnu)](https://pypi.org/project/inconnu/)
6
+
3
7
  ## What is Inconnu?
4
8
 
5
9
  Inconnu is a GDPR-compliant data privacy tool designed for entity redaction and de-anonymization. It provides cutting-edge NLP-based tools for anonymizing and pseudonymizing text data while maintaining data utility, ensuring your business meets stringent privacy regulations.
@@ -26,40 +30,60 @@ Inconnu is a GDPR-compliant data privacy tool designed for entity redaction and
26
30
  ### Install from PyPI
27
31
 
28
32
  ```bash
29
- # Basic installation (without language models)
33
+ # Using pip
30
34
  pip install inconnu
31
35
 
32
- # Install with English language support
33
- pip install inconnu[en]
36
+ # Using UV (Recommended)
37
+ uv add inconnu
38
+ ```
39
+
40
+ **Note**: Language models are NOT included as optional dependencies. You'll need to download them separately using the `inconnu-download` command after installation (see below).
34
41
 
35
- # Install with specific language support
36
- pip install inconnu[de] # German
37
- pip install inconnu[fr] # French
38
- pip install inconnu[es] # Spanish
39
- pip install inconnu[it] # Italian
42
+ ### Download Language Models
43
+
44
+ After installing Inconnu, use the `inconnu-download` command to download spaCy language models:
45
+
46
+ ```bash
47
+ # Download default (small) models
48
+ inconnu-download en # English
49
+ inconnu-download de # German
50
+ inconnu-download en de fr # Multiple languages
51
+ inconnu-download all # All default models
40
52
 
41
- # Install with multiple languages
42
- pip install inconnu[en,de,fr]
53
+ # Download specific model sizes
54
+ inconnu-download en --size large # Large English model
55
+ inconnu-download en --size transformer # Transformer model (English only)
43
56
 
44
- # Install with all language support
45
- pip install inconnu[all]
57
+ # List available models and check what's installed
58
+ inconnu-download --list
59
+
60
+ # Upgrade existing models
61
+ inconnu-download en --upgrade
62
+
63
+ # Get help for UV environments
64
+ inconnu-download --uv-help
46
65
  ```
47
66
 
48
- ### Download Language Models
67
+ #### How Model Installation Works
68
+
69
+ 1. **No Optional Dependencies**: spaCy models are NOT included as pip/uv optional dependencies to avoid unnecessary downloads during dependency resolution
70
+ 2. **On-Demand Downloads**: The `inconnu-download` command downloads only the models you need
71
+ 3. **Smart Environment Detection**: Automatically detects UV environments and provides appropriate guidance
72
+ 4. **Verification**: Checks if models are already installed before downloading
73
+
74
+ #### Available Model Sizes
75
+
76
+ - **Small (sm)**: Default, fast processing, ~15-50MB, good for high-volume
77
+ - **Medium (md)**: Better accuracy, ~50-200MB, moderate speed
78
+ - **Large (lg)**: High accuracy, ~200-600MB, slower processing
79
+ - **Transformer (trf)**: Highest accuracy, ~400MB+, GPU-optimized (English only)
49
80
 
50
- After installation, download the required spaCy models:
81
+ #### Alternative: Direct spaCy Download
51
82
 
83
+ You can also use spaCy directly if preferred:
52
84
  ```bash
53
- # Using the built-in CLI tool
54
- inconnu-download en # Download default English model
55
- inconnu-download de fr # Download German and French models
56
- inconnu-download en --size large # Download large English model
57
- inconnu-download all # Download all default models
58
- inconnu-download --list # List all available models
59
-
60
- # Or using spaCy directly
61
- python -m spacy download en_core_web_sm
62
- python -m spacy download de_core_news_sm
85
+ python -m spacy download en_core_web_sm # English small
86
+ python -m spacy download de_core_news_lg # German large
63
87
  ```
64
88
 
65
89
  ### Install from Source
@@ -72,9 +96,9 @@ python -m spacy download de_core_news_sm
72
96
 
73
97
  2. **Install with UV (recommended for development)**:
74
98
  ```bash
75
- make install # Install dependencies
76
- make model-de # Download German model
77
- make test # Run tests
99
+ uv sync # Install dependencies
100
+ inconnu-download en de # Download language models
101
+ make test # Run tests
78
102
  ```
79
103
 
80
104
  3. **Or install with pip**:
@@ -83,69 +107,55 @@ python -m spacy download de_core_news_sm
83
107
  python -m spacy download en_core_web_sm
84
108
  ```
85
109
 
86
- ### Installing Additional Models
110
+ ### Development Commands
87
111
 
88
- Inconnu supports multiple spaCy models for enhanced accuracy. The default `en_core_web_sm` model is lightweight and fast, but you can install more accurate models:
112
+ For development, the Makefile provides convenience targets:
89
113
 
90
- #### English Models
91
114
  ```bash
92
- # Small model (default) - 15MB, fast processing
93
- uv run python -m spacy download en_core_web_sm
94
-
95
- # Large model - 560MB, higher accuracy
96
- uv run python -m spacy download en_core_web_lg
97
-
98
- # Transformer model - 438MB, highest accuracy
99
- uv run python -m spacy download en_core_web_trf
115
+ # Download models using make commands
116
+ make model-en # English small
117
+ make model-de # German small
118
+ make model-it # Italian small
119
+ make model-es # Spanish small
120
+ make model-fr # French small
121
+
122
+ # Other development commands
123
+ make test # Run tests
124
+ make lint # Check code with ruff
125
+ make format # Format code
126
+ make clean # Clean cache and format code
100
127
  ```
101
128
 
102
- #### Additional Language Models
103
- ```bash
104
- # German model
105
- make model-de
106
- uv run python -m spacy download de_core_news_sm
107
-
108
- # Italian model
109
- make model-it
110
- uv run python -m spacy download it_core_news_sm
129
+ ### Using Different Models in Code
111
130
 
112
- # Spanish model
113
- make model-es
114
- uv run python -m spacy download es_core_news_sm
131
+ To use a different model size, first download it, then specify it when initializing:
115
132
 
116
- # French model
117
- make model-fr
118
- uv run python -m spacy download fr_core_news_sm
119
-
120
- # For enhanced accuracy (manual installation)
121
- # Medium German model - better accuracy
122
- uv run python -m spacy download de_core_news_md
123
-
124
- # Large German model - highest accuracy
125
- uv run python -m spacy download de_core_news_lg
126
- ```
127
-
128
- #### Using Different Models
133
+ ```python
134
+ from inconnu import Inconnu
135
+ from inconnu.nlp.entity_redactor import SpacyModels
129
136
 
130
- To use a different model, specify it when initializing the EntityRedactor:
137
+ # First, download the model you want
138
+ # $ inconnu-download en --size large
131
139
 
132
- ```python
133
- from inconnu.nlp.entity_redactor import EntityRedactor, SpacyModels
140
+ # Then use it in your code
141
+ inconnu = Inconnu(
142
+ language="en",
143
+ model_name=SpacyModels.EN_CORE_WEB_LG # Use large model
144
+ )
134
145
 
135
- # Use transformer model for highest accuracy
136
- entity_redactor = EntityRedactor(
137
- custom_components=None,
146
+ # For highest accuracy (transformer model)
147
+ inconnu_trf = Inconnu(
138
148
  language="en",
139
- model_name=SpacyModels.EN_CORE_WEB_TRF # High accuracy transformer model
149
+ model_name=SpacyModels.EN_CORE_WEB_TRF
140
150
  )
141
151
  ```
142
152
 
143
153
  **Model Selection Guide:**
144
- - `en_core_web_sm`: Fast processing, good for high-volume processing
145
- - `en_core_web_lg`: Better accuracy, moderate processing time
146
- - `en_core_web_trf`: Highest accuracy, slower processing (recommended for sensitive data)
154
+ - `en_core_web_sm`: Fast processing, good for high-volume
155
+ - `en_core_web_lg`: Better accuracy, moderate speed
156
+ - `en_core_web_trf`: Highest accuracy, GPU-optimized (recommended for sensitive data)
147
157
 
148
- For more models, visit the [spaCy Models Directory](https://spacy.io/models).
158
+ For a complete list of supported models, run `inconnu-download --list`
149
159
 
150
160
  ## Development Setup
151
161
 
@@ -15,7 +15,7 @@ from .nlp.entity_redactor import EntityRedactor
15
15
  from .nlp.interfaces import NERComponent, ProcessedData
16
16
 
17
17
  # Package version
18
- __version__ = "0.1.0"
18
+ __version__ = "0.1.1"
19
19
 
20
20
  # Export key classes and exceptions for easy importing
21
21
  __all__ = [
@@ -4,8 +4,10 @@ Model installer for Inconnu - downloads spaCy language models.
4
4
  """
5
5
 
6
6
  import argparse
7
+ import os
7
8
  import sys
8
- from subprocess import run
9
+ from pathlib import Path
10
+ from subprocess import CalledProcessError, run
9
11
  from typing import Optional
10
12
 
11
13
  # Mapping of language codes to spaCy model names
@@ -27,8 +29,60 @@ DEFAULT_MODELS = {
27
29
  }
28
30
 
29
31
 
32
+ def is_uv_environment() -> bool:
33
+ """Check if running in a UV environment."""
34
+ # Check for UV environment markers
35
+ return (
36
+ os.environ.get("UV_PROJECT_ROOT") is not None
37
+ or Path(sys.prefix).name == ".venv"
38
+ and Path(sys.prefix).parent.joinpath("uv.lock").exists()
39
+ )
40
+
41
+
42
+ def ensure_pip_available() -> bool:
43
+ """Ensure pip is available, install it if running in UV environment."""
44
+ try:
45
+ # Try importing pip to check if it's available
46
+ import pip # type: ignore # noqa: F401
47
+
48
+ return True
49
+ except ImportError:
50
+ if is_uv_environment():
51
+ print("📦 UV environment detected. Installing pip...")
52
+ try:
53
+ result = run( # noqa: S603
54
+ ["uv", "pip", "install", "pip", "--upgrade"], # noqa: S607
55
+ capture_output=True,
56
+ text=True,
57
+ )
58
+ if result.returncode == 0:
59
+ print("✓ pip installed successfully")
60
+ return True
61
+ else:
62
+ print(f"✗ Failed to install pip: {result.stderr}")
63
+ return False
64
+ except (CalledProcessError, FileNotFoundError) as e:
65
+ print(f"✗ Error installing pip: {e}")
66
+ return False
67
+ return False
68
+
69
+
30
70
  def download_model(model_name: str, upgrade: bool = False) -> bool:
31
71
  """Download a spaCy model using subprocess."""
72
+ # First, ensure pip is available
73
+ if not ensure_pip_available():
74
+ print("\n⚠️ pip is not available and could not be installed.")
75
+ if is_uv_environment():
76
+ print("\n💡 For UV environments, you can install models directly:")
77
+ print(
78
+ f" uv add 'inconnu[{model_name.split('_')[0]}]' # for default model"
79
+ )
80
+ print(
81
+ f" uv add 'inconnu[{model_name.split('_')[0]}-lg]' # for large model"
82
+ )
83
+ print("\n Or install all languages: uv add 'inconnu[all]'")
84
+ return False
85
+
32
86
  try:
33
87
  cmd = [sys.executable, "-m", "spacy", "download", model_name]
34
88
  if upgrade:
@@ -126,12 +180,26 @@ def download_language_models(
126
180
  def download_all_default_models(upgrade: bool = False) -> bool:
127
181
  """Download all default models."""
128
182
  success = True
129
- for lang, model in DEFAULT_MODELS.items():
183
+ for model in DEFAULT_MODELS.values():
130
184
  if not download_model(model, upgrade):
131
185
  success = False
132
186
  return success
133
187
 
134
188
 
189
+ def print_uv_instructions():
190
+ """Print instructions for UV users."""
191
+ print("\n📘 UV Installation Instructions:")
192
+ print("\nFor UV environments, models can be installed as dependencies:")
193
+ print(" uv add 'inconnu[en]' # English")
194
+ print(" uv add 'inconnu[de]' # German")
195
+ print(" uv add 'inconnu[en,de,fr]' # Multiple languages")
196
+ print(" uv add 'inconnu[all]' # All languages")
197
+ print("\n Larger models:")
198
+ print(" uv add 'inconnu[en-lg]' # English large")
199
+ print(" uv add 'inconnu[en-trf]' # English transformer")
200
+ print("\n Available sizes: sm (default), md, lg, trf (English only)")
201
+
202
+
135
203
  def main():
136
204
  """Main CLI entry point."""
137
205
  parser = argparse.ArgumentParser(
@@ -162,9 +230,17 @@ Examples:
162
230
  "--upgrade", action="store_true", help="Upgrade existing models"
163
231
  )
164
232
  parser.add_argument("--list", action="store_true", help="List all available models")
233
+ parser.add_argument(
234
+ "--uv-help", action="store_true", help="Show UV installation instructions"
235
+ )
165
236
 
166
237
  args = parser.parse_args()
167
238
 
239
+ # Handle UV help
240
+ if args.uv_help:
241
+ print_uv_instructions()
242
+ return
243
+
168
244
  # Handle list command
169
245
  if args.list:
170
246
  list_available_models()
@@ -172,6 +248,14 @@ Examples:
172
248
 
173
249
  # Require at least one language if not listing
174
250
  if not args.languages:
251
+ if is_uv_environment():
252
+ print("⚠️ UV environment detected!")
253
+ print_uv_instructions()
254
+ print("\nOr use 'inconnu-download --list' to see available models")
255
+ print(
256
+ "Or use 'inconnu-download LANG' to download via this tool (requires pip)"
257
+ )
258
+ return
175
259
  parser.error("Please specify language(s) to download or use --list")
176
260
 
177
261
  # Handle 'all' keyword
@@ -19,6 +19,8 @@ class SpacyModels(StrEnum):
19
19
  EN_CORE_WEB_TRF = "en_core_web_trf"
20
20
  DE_CORE_NEWS_SM = "de_core_news_sm"
21
21
  IT_CORE_NEWS_SM = "it_core_news_sm"
22
+ ES_CORE_NEWS_SM = "es_core_news_sm"
23
+ FR_CORE_NEWS_SM = "fr_core_news_sm"
22
24
  EN_CORE_WEB_SM = "en_core_web_sm"
23
25
 
24
26
 
@@ -155,6 +157,10 @@ class EntityRedactor:
155
157
  model_name = SpacyModels.EN_CORE_WEB_SM
156
158
  case "it":
157
159
  model_name = SpacyModels.IT_CORE_NEWS_SM
160
+ case "es":
161
+ model_name = SpacyModels.ES_CORE_NEWS_SM
162
+ case "fr":
163
+ model_name = SpacyModels.FR_CORE_NEWS_SM
158
164
  case _:
159
165
  # Default to English small model for unsupported languages
160
166
  model_name = SpacyModels.EN_CORE_WEB_SM
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "inconnu"
3
- version = "0.1.0"
3
+ version = "0.1.1"
4
4
  description = "GDPR-compliant data privacy tool for entity redaction and de-anonymization"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -35,13 +35,9 @@ Documentation = "https://github.com/0xjgv/inconnu#readme"
35
35
  Repository = "https://github.com/0xjgv/inconnu"
36
36
  Issues = "https://github.com/0xjgv/inconnu/issues"
37
37
 
38
- [project.optional-dependencies]
39
- en = []
40
- de = []
41
- it = []
42
- es = []
43
- fr = []
44
- all = ["inconnu[en,de,it,es,fr]"]
38
+ # Note: spaCy models are not included as optional dependencies to avoid downloading
39
+ # all models when running `uv lock`. Use the `inconnu-download` command or the
40
+ # Makefile targets (make model-de, make model-it, etc.) to install models as needed.
45
41
 
46
42
  [project.scripts]
47
43
  inconnu-download = "inconnu.model_installer:main"
@@ -33,6 +33,15 @@ wheels = [
33
33
  { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" },
34
34
  ]
35
35
 
36
+ [[package]]
37
+ name = "backports-asyncio-runner"
38
+ version = "1.2.0"
39
+ source = { registry = "https://pypi.org/simple" }
40
+ sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" }
41
+ wheels = [
42
+ { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" },
43
+ ]
44
+
36
45
  [[package]]
37
46
  name = "blis"
38
47
  version = "1.3.0"
@@ -92,11 +101,11 @@ wheels = [
92
101
 
93
102
  [[package]]
94
103
  name = "certifi"
95
- version = "2025.6.15"
104
+ version = "2025.7.14"
96
105
  source = { registry = "https://pypi.org/simple" }
97
- sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753, upload-time = "2025-06-15T02:45:51.329Z" }
106
+ sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" }
98
107
  wheels = [
99
- { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650, upload-time = "2025-06-15T02:45:49.977Z" },
108
+ { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" },
100
109
  ]
101
110
 
102
111
  [[package]]
@@ -313,27 +322,27 @@ wheels = [
313
322
 
314
323
  [[package]]
315
324
  name = "debugpy"
316
- version = "1.8.14"
317
- source = { registry = "https://pypi.org/simple" }
318
- sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444, upload-time = "2025-04-10T19:46:10.981Z" }
319
- wheels = [
320
- { url = "https://files.pythonhosted.org/packages/fc/df/156df75a41aaebd97cee9d3870fe68f8001b6c1c4ca023e221cfce69bece/debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339", size = 2076510, upload-time = "2025-04-10T19:46:13.315Z" },
321
- { url = "https://files.pythonhosted.org/packages/69/cd/4fc391607bca0996db5f3658762106e3d2427beaef9bfd363fd370a3c054/debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79", size = 3559614, upload-time = "2025-04-10T19:46:14.647Z" },
322
- { url = "https://files.pythonhosted.org/packages/1a/42/4e6d2b9d63e002db79edfd0cb5656f1c403958915e0e73ab3e9220012eec/debugpy-1.8.14-cp310-cp310-win32.whl", hash = "sha256:c442f20577b38cc7a9aafecffe1094f78f07fb8423c3dddb384e6b8f49fd2987", size = 5208588, upload-time = "2025-04-10T19:46:16.233Z" },
323
- { url = "https://files.pythonhosted.org/packages/97/b1/cc9e4e5faadc9d00df1a64a3c2d5c5f4b9df28196c39ada06361c5141f89/debugpy-1.8.14-cp310-cp310-win_amd64.whl", hash = "sha256:f117dedda6d969c5c9483e23f573b38f4e39412845c7bc487b6f2648df30fe84", size = 5241043, upload-time = "2025-04-10T19:46:17.768Z" },
324
- { url = "https://files.pythonhosted.org/packages/67/e8/57fe0c86915671fd6a3d2d8746e40485fd55e8d9e682388fbb3a3d42b86f/debugpy-1.8.14-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9", size = 2175064, upload-time = "2025-04-10T19:46:19.486Z" },
325
- { url = "https://files.pythonhosted.org/packages/3b/97/2b2fd1b1c9569c6764ccdb650a6f752e4ac31be465049563c9eb127a8487/debugpy-1.8.14-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2", size = 3132359, upload-time = "2025-04-10T19:46:21.192Z" },
326
- { url = "https://files.pythonhosted.org/packages/c0/ee/b825c87ed06256ee2a7ed8bab8fb3bb5851293bf9465409fdffc6261c426/debugpy-1.8.14-cp311-cp311-win32.whl", hash = "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2", size = 5133269, upload-time = "2025-04-10T19:46:23.047Z" },
327
- { url = "https://files.pythonhosted.org/packages/d5/a6/6c70cd15afa43d37839d60f324213843174c1d1e6bb616bd89f7c1341bac/debugpy-1.8.14-cp311-cp311-win_amd64.whl", hash = "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01", size = 5158156, upload-time = "2025-04-10T19:46:24.521Z" },
328
- { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268, upload-time = "2025-04-10T19:46:26.044Z" },
329
- { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077, upload-time = "2025-04-10T19:46:27.464Z" },
330
- { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127, upload-time = "2025-04-10T19:46:29.467Z" },
331
- { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249, upload-time = "2025-04-10T19:46:31.538Z" },
332
- { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676, upload-time = "2025-04-10T19:46:32.96Z" },
333
- { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514, upload-time = "2025-04-10T19:46:34.336Z" },
334
- { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756, upload-time = "2025-04-10T19:46:36.199Z" },
335
- { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119, upload-time = "2025-04-10T19:46:38.141Z" },
336
- { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230, upload-time = "2025-04-10T19:46:54.077Z" },
325
+ version = "1.8.15"
326
+ source = { registry = "https://pypi.org/simple" }
327
+ sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279, upload-time = "2025-07-15T16:43:29.135Z" }
328
+ wheels = [
329
+ { url = "https://files.pythonhosted.org/packages/69/51/0b4315169f0d945271db037ae6b98c0548a2d48cc036335cd1b2f5516c1b/debugpy-1.8.15-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e9a8125c85172e3ec30985012e7a81ea5e70bbb836637f8a4104f454f9b06c97", size = 2084890, upload-time = "2025-07-15T16:43:31.239Z" },
330
+ { url = "https://files.pythonhosted.org/packages/36/cc/a5391dedb079280d7b72418022e00ba8227ae0b5bc8b2e3d1ecffc5d6b01/debugpy-1.8.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd0b6b5eccaa745c214fd240ea82f46049d99ef74b185a3517dad3ea1ec55d9", size = 3561470, upload-time = "2025-07-15T16:43:32.515Z" },
331
+ { url = "https://files.pythonhosted.org/packages/e8/92/acf64b92010c66b33c077dee3862c733798a2c90e7d14b25c01d771e2a0d/debugpy-1.8.15-cp310-cp310-win32.whl", hash = "sha256:8181cce4d344010f6bfe94a531c351a46a96b0f7987750932b2908e7a1e14a55", size = 5229194, upload-time = "2025-07-15T16:43:33.997Z" },
332
+ { url = "https://files.pythonhosted.org/packages/3f/f5/c58c015c9ff78de35901bea3ab4dbf7946d7a4aa867ee73875df06ba6468/debugpy-1.8.15-cp310-cp310-win_amd64.whl", hash = "sha256:af2dcae4e4cd6e8b35f982ccab29fe65f7e8766e10720a717bc80c464584ee21", size = 5260900, upload-time = "2025-07-15T16:43:35.413Z" },
333
+ { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442, upload-time = "2025-07-15T16:43:36.733Z" },
334
+ { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215, upload-time = "2025-07-15T16:43:38.116Z" },
335
+ { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037, upload-time = "2025-07-15T16:43:39.471Z" },
336
+ { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133, upload-time = "2025-07-15T16:43:40.969Z" },
337
+ { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197, upload-time = "2025-07-15T16:43:42.343Z" },
338
+ { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517, upload-time = "2025-07-15T16:43:44.14Z" },
339
+ { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132, upload-time = "2025-07-15T16:43:45.529Z" },
340
+ { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645, upload-time = "2025-07-15T16:43:46.968Z" },
341
+ { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538, upload-time = "2025-07-15T16:43:48.927Z" },
342
+ { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874, upload-time = "2025-07-15T16:43:50.282Z" },
343
+ { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949, upload-time = "2025-07-15T16:43:52.079Z" },
344
+ { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720, upload-time = "2025-07-15T16:43:53.703Z" },
345
+ { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697, upload-time = "2025-07-15T16:44:07.996Z" },
337
346
  ]
338
347
 
339
348
  [[package]]
@@ -350,7 +359,7 @@ name = "exceptiongroup"
350
359
  version = "1.3.0"
351
360
  source = { registry = "https://pypi.org/simple" }
352
361
  dependencies = [
353
- { name = "typing-extensions", marker = "python_full_version < '3.11'" },
362
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
354
363
  ]
355
364
  sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" }
356
365
  wheels = [
@@ -394,11 +403,9 @@ dev = [
394
403
 
395
404
  [package.metadata]
396
405
  requires-dist = [
397
- { name = "inconnu", extras = ["en", "de", "it", "es", "fr"], marker = "extra == 'all'" },
398
406
  { name = "phonenumbers", specifier = ">=9.0.8" },
399
407
  { name = "spacy", specifier = ">=3.8.7" },
400
408
  ]
401
- provides-extras = ["en", "de", "it", "es", "fr", "all"]
402
409
 
403
410
  [package.metadata.requires-dev]
404
411
  dev = [
@@ -419,14 +426,14 @@ wheels = [
419
426
 
420
427
  [[package]]
421
428
  name = "ipykernel"
422
- version = "6.29.5"
429
+ version = "6.30.0"
423
430
  source = { registry = "https://pypi.org/simple" }
424
431
  dependencies = [
425
432
  { name = "appnope", marker = "sys_platform == 'darwin'" },
426
433
  { name = "comm" },
427
434
  { name = "debugpy" },
428
435
  { name = "ipython", version = "8.37.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
429
- { name = "ipython", version = "9.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
436
+ { name = "ipython", version = "9.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
430
437
  { name = "jupyter-client" },
431
438
  { name = "jupyter-core" },
432
439
  { name = "matplotlib-inline" },
@@ -437,9 +444,9 @@ dependencies = [
437
444
  { name = "tornado" },
438
445
  { name = "traitlets" },
439
446
  ]
440
- sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367, upload-time = "2024-07-01T14:07:22.543Z" }
447
+ sdist = { url = "https://files.pythonhosted.org/packages/38/27/9e6e30ed92f2ac53d29f70b09da8b2dc456e256148e289678fa0e825f46a/ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c", size = 165125, upload-time = "2025-07-21T10:36:09.259Z" }
441
448
  wheels = [
442
- { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173, upload-time = "2024-07-01T14:07:19.603Z" },
449
+ { url = "https://files.pythonhosted.org/packages/1f/3d/00813c3d9b46e3dcd88bd4530e0a3c63c0509e5d8c9eff34723ea243ab04/ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e", size = 117264, upload-time = "2025-07-21T10:36:06.854Z" },
443
450
  ]
444
451
 
445
452
  [[package]]
@@ -469,7 +476,7 @@ wheels = [
469
476
 
470
477
  [[package]]
471
478
  name = "ipython"
472
- version = "9.3.0"
479
+ version = "9.4.0"
473
480
  source = { registry = "https://pypi.org/simple" }
474
481
  resolution-markers = [
475
482
  "python_full_version >= '3.11'",
@@ -487,9 +494,9 @@ dependencies = [
487
494
  { name = "traitlets", marker = "python_full_version >= '3.11'" },
488
495
  { name = "typing-extensions", marker = "python_full_version == '3.11.*'" },
489
496
  ]
490
- sdist = { url = "https://files.pythonhosted.org/packages/dc/09/4c7e06b96fbd203e06567b60fb41b06db606b6a82db6db7b2c85bb72a15c/ipython-9.3.0.tar.gz", hash = "sha256:79eb896f9f23f50ad16c3bc205f686f6e030ad246cc309c6279a242b14afe9d8", size = 4426460, upload-time = "2025-05-31T16:34:55.678Z" }
497
+ sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload-time = "2025-07-01T11:11:30.606Z" }
491
498
  wheels = [
492
- { url = "https://files.pythonhosted.org/packages/3c/99/9ed3d52d00f1846679e3aa12e2326ac7044b5e7f90dc822b60115fa533ca/ipython-9.3.0-py3-none-any.whl", hash = "sha256:1a0b6dd9221a1f5dddf725b57ac0cb6fddc7b5f470576231ae9162b9b3455a04", size = 605320, upload-time = "2025-05-31T16:34:52.154Z" },
499
+ { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload-time = "2025-07-01T11:11:27.85Z" },
493
500
  ]
494
501
 
495
502
  [[package]]
@@ -931,11 +938,11 @@ wheels = [
931
938
 
932
939
  [[package]]
933
940
  name = "phonenumbers"
934
- version = "9.0.8"
941
+ version = "9.0.10"
935
942
  source = { registry = "https://pypi.org/simple" }
936
- sdist = { url = "https://files.pythonhosted.org/packages/86/3a/8dd1d5e15ac347db59a43fc623638d8088f9d511e7f8d8eec7d90b3abb4f/phonenumbers-9.0.8.tar.gz", hash = "sha256:16f03f2cf65b5eee99ed25827d810febcab92b5d76f977e425fcd2e4ca6d4865", size = 2297504, upload-time = "2025-06-25T05:41:38.414Z" }
943
+ sdist = { url = "https://files.pythonhosted.org/packages/d0/b3/0092ef7813f663a06cc0474adfaee5e9c327a2fde416a7926d958fd6cd8a/phonenumbers-9.0.10.tar.gz", hash = "sha256:c2d15a6a9d0534b14a7764f51246ada99563e263f65b80b0251d1a760ac4a1ba", size = 2297752, upload-time = "2025-07-18T08:47:39.477Z" }
937
944
  wheels = [
938
- { url = "https://files.pythonhosted.org/packages/48/2e/23c1eca9f73e332b947c66c431690672783cf49b8418aa650ce06bdf6115/phonenumbers-9.0.8-py2.py3-none-any.whl", hash = "sha256:53d357111c0ead0d6408ae443613b18d3a053431ca1ddf7e881457c0969afcf9", size = 2583252, upload-time = "2025-06-25T05:41:34.815Z" },
945
+ { url = "https://files.pythonhosted.org/packages/93/44/4a200f2e06f6ece2de33ff09978cdccc03e2df8007fadcc706f846167dec/phonenumbers-9.0.10-py2.py3-none-any.whl", hash = "sha256:13b12d269be1f2b363c9bc2868656a7e2e8b50f1a1cef629c75005da6c374c6b", size = 2583494, upload-time = "2025-07-18T08:47:35.808Z" },
939
946
  ]
940
947
 
941
948
  [[package]]
@@ -1181,14 +1188,15 @@ wheels = [
1181
1188
 
1182
1189
  [[package]]
1183
1190
  name = "pytest-asyncio"
1184
- version = "1.0.0"
1191
+ version = "1.1.0"
1185
1192
  source = { registry = "https://pypi.org/simple" }
1186
1193
  dependencies = [
1194
+ { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" },
1187
1195
  { name = "pytest" },
1188
1196
  ]
1189
- sdist = { url = "https://files.pythonhosted.org/packages/d0/d4/14f53324cb1a6381bef29d698987625d80052bb33932d8e7cbf9b337b17c/pytest_asyncio-1.0.0.tar.gz", hash = "sha256:d15463d13f4456e1ead2594520216b225a16f781e144f8fdf6c5bb4667c48b3f", size = 46960, upload-time = "2025-05-26T04:54:40.484Z" }
1197
+ sdist = { url = "https://files.pythonhosted.org/packages/4e/51/f8794af39eeb870e87a8c8068642fc07bce0c854d6865d7dd0f2a9d338c2/pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea", size = 46652, upload-time = "2025-07-16T04:29:26.393Z" }
1190
1198
  wheels = [
1191
- { url = "https://files.pythonhosted.org/packages/30/05/ce271016e351fddc8399e546f6e23761967ee09c8c568bbfbecb0c150171/pytest_asyncio-1.0.0-py3-none-any.whl", hash = "sha256:4f024da9f1ef945e680dc68610b52550e36590a67fd31bb3b4943979a1f90ef3", size = 15976, upload-time = "2025-05-26T04:54:39.035Z" },
1199
+ { url = "https://files.pythonhosted.org/packages/c7/9d/bf86eddabf8c6c9cb1ea9a869d6873b46f105a5d292d3a6f7071f5b07935/pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf", size = 15157, upload-time = "2025-07-16T04:29:24.929Z" },
1192
1200
  ]
1193
1201
 
1194
1202
  [[package]]
@@ -1205,21 +1213,24 @@ wheels = [
1205
1213
 
1206
1214
  [[package]]
1207
1215
  name = "pywin32"
1208
- version = "310"
1216
+ version = "311"
1209
1217
  source = { registry = "https://pypi.org/simple" }
1210
1218
  wheels = [
1211
- { url = "https://files.pythonhosted.org/packages/95/da/a5f38fffbba2fb99aa4aa905480ac4b8e83ca486659ac8c95bce47fb5276/pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1", size = 8848240, upload-time = "2025-03-17T00:55:46.783Z" },
1212
- { url = "https://files.pythonhosted.org/packages/aa/fe/d873a773324fa565619ba555a82c9dabd677301720f3660a731a5d07e49a/pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d", size = 9601854, upload-time = "2025-03-17T00:55:48.783Z" },
1213
- { url = "https://files.pythonhosted.org/packages/3c/84/1a8e3d7a15490d28a5d816efa229ecb4999cdc51a7c30dd8914f669093b8/pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213", size = 8522963, upload-time = "2025-03-17T00:55:50.969Z" },
1214
- { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284, upload-time = "2025-03-17T00:55:53.124Z" },
1215
- { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748, upload-time = "2025-03-17T00:55:55.203Z" },
1216
- { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941, upload-time = "2025-03-17T00:55:57.048Z" },
1217
- { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239, upload-time = "2025-03-17T00:55:58.807Z" },
1218
- { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839, upload-time = "2025-03-17T00:56:00.8Z" },
1219
- { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470, upload-time = "2025-03-17T00:56:02.601Z" },
1220
- { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384, upload-time = "2025-03-17T00:56:04.383Z" },
1221
- { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039, upload-time = "2025-03-17T00:56:06.207Z" },
1222
- { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152, upload-time = "2025-03-17T00:56:07.819Z" },
1219
+ { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" },
1220
+ { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" },
1221
+ { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" },
1222
+ { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" },
1223
+ { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" },
1224
+ { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" },
1225
+ { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" },
1226
+ { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" },
1227
+ { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" },
1228
+ { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" },
1229
+ { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" },
1230
+ { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" },
1231
+ { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" },
1232
+ { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" },
1233
+ { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" },
1223
1234
  ]
1224
1235
 
1225
1236
  [[package]]
@@ -1313,27 +1324,27 @@ wheels = [
1313
1324
 
1314
1325
  [[package]]
1315
1326
  name = "ruff"
1316
- version = "0.12.1"
1317
- source = { registry = "https://pypi.org/simple" }
1318
- sdist = { url = "https://files.pythonhosted.org/packages/97/38/796a101608a90494440856ccfb52b1edae90de0b817e76bfade66b12d320/ruff-0.12.1.tar.gz", hash = "sha256:806bbc17f1104fd57451a98a58df35388ee3ab422e029e8f5cf30aa4af2c138c", size = 4413426, upload-time = "2025-06-26T20:34:14.784Z" }
1319
- wheels = [
1320
- { url = "https://files.pythonhosted.org/packages/06/bf/3dba52c1d12ab5e78d75bd78ad52fb85a6a1f29cc447c2423037b82bed0d/ruff-0.12.1-py3-none-linux_armv6l.whl", hash = "sha256:6013a46d865111e2edb71ad692fbb8262e6c172587a57c0669332a449384a36b", size = 10305649, upload-time = "2025-06-26T20:33:39.242Z" },
1321
- { url = "https://files.pythonhosted.org/packages/8c/65/dab1ba90269bc8c81ce1d499a6517e28fe6f87b2119ec449257d0983cceb/ruff-0.12.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b3f75a19e03a4b0757d1412edb7f27cffb0c700365e9d6b60bc1b68d35bc89e0", size = 11120201, upload-time = "2025-06-26T20:33:42.207Z" },
1322
- { url = "https://files.pythonhosted.org/packages/3f/3e/2d819ffda01defe857fa2dd4cba4d19109713df4034cc36f06bbf582d62a/ruff-0.12.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9a256522893cb7e92bb1e1153283927f842dea2e48619c803243dccc8437b8be", size = 10466769, upload-time = "2025-06-26T20:33:44.102Z" },
1323
- { url = "https://files.pythonhosted.org/packages/63/37/bde4cf84dbd7821c8de56ec4ccc2816bce8125684f7b9e22fe4ad92364de/ruff-0.12.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:069052605fe74c765a5b4272eb89880e0ff7a31e6c0dbf8767203c1fbd31c7ff", size = 10660902, upload-time = "2025-06-26T20:33:45.98Z" },
1324
- { url = "https://files.pythonhosted.org/packages/0e/3a/390782a9ed1358c95e78ccc745eed1a9d657a537e5c4c4812fce06c8d1a0/ruff-0.12.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a684f125a4fec2d5a6501a466be3841113ba6847827be4573fddf8308b83477d", size = 10167002, upload-time = "2025-06-26T20:33:47.81Z" },
1325
- { url = "https://files.pythonhosted.org/packages/6d/05/f2d4c965009634830e97ffe733201ec59e4addc5b1c0efa035645baa9e5f/ruff-0.12.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdecdef753bf1e95797593007569d8e1697a54fca843d78f6862f7dc279e23bd", size = 11751522, upload-time = "2025-06-26T20:33:49.857Z" },
1326
- { url = "https://files.pythonhosted.org/packages/35/4e/4bfc519b5fcd462233f82fc20ef8b1e5ecce476c283b355af92c0935d5d9/ruff-0.12.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:70d52a058c0e7b88b602f575d23596e89bd7d8196437a4148381a3f73fcd5010", size = 12520264, upload-time = "2025-06-26T20:33:52.199Z" },
1327
- { url = "https://files.pythonhosted.org/packages/85/b2/7756a6925da236b3a31f234b4167397c3e5f91edb861028a631546bad719/ruff-0.12.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84d0a69d1e8d716dfeab22d8d5e7c786b73f2106429a933cee51d7b09f861d4e", size = 12133882, upload-time = "2025-06-26T20:33:54.231Z" },
1328
- { url = "https://files.pythonhosted.org/packages/dd/00/40da9c66d4a4d51291e619be6757fa65c91b92456ff4f01101593f3a1170/ruff-0.12.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cc32e863adcf9e71690248607ccdf25252eeeab5193768e6873b901fd441fed", size = 11608941, upload-time = "2025-06-26T20:33:56.202Z" },
1329
- { url = "https://files.pythonhosted.org/packages/91/e7/f898391cc026a77fbe68dfea5940f8213622474cb848eb30215538a2dadf/ruff-0.12.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd49a4619f90d5afc65cf42e07b6ae98bb454fd5029d03b306bd9e2273d44cc", size = 11602887, upload-time = "2025-06-26T20:33:58.47Z" },
1330
- { url = "https://files.pythonhosted.org/packages/f6/02/0891872fc6aab8678084f4cf8826f85c5d2d24aa9114092139a38123f94b/ruff-0.12.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ed5af6aaaea20710e77698e2055b9ff9b3494891e1b24d26c07055459bb717e9", size = 10521742, upload-time = "2025-06-26T20:34:00.465Z" },
1331
- { url = "https://files.pythonhosted.org/packages/2a/98/d6534322c74a7d47b0f33b036b2498ccac99d8d8c40edadb552c038cecf1/ruff-0.12.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:801d626de15e6bf988fbe7ce59b303a914ff9c616d5866f8c79eb5012720ae13", size = 10149909, upload-time = "2025-06-26T20:34:02.603Z" },
1332
- { url = "https://files.pythonhosted.org/packages/34/5c/9b7ba8c19a31e2b6bd5e31aa1e65b533208a30512f118805371dbbbdf6a9/ruff-0.12.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2be9d32a147f98a1972c1e4df9a6956d612ca5f5578536814372113d09a27a6c", size = 11136005, upload-time = "2025-06-26T20:34:04.723Z" },
1333
- { url = "https://files.pythonhosted.org/packages/dc/34/9bbefa4d0ff2c000e4e533f591499f6b834346025e11da97f4ded21cb23e/ruff-0.12.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:49b7ce354eed2a322fbaea80168c902de9504e6e174fd501e9447cad0232f9e6", size = 11648579, upload-time = "2025-06-26T20:34:06.766Z" },
1334
- { url = "https://files.pythonhosted.org/packages/6f/1c/20cdb593783f8f411839ce749ec9ae9e4298c2b2079b40295c3e6e2089e1/ruff-0.12.1-py3-none-win32.whl", hash = "sha256:d973fa626d4c8267848755bd0414211a456e99e125dcab147f24daa9e991a245", size = 10519495, upload-time = "2025-06-26T20:34:08.718Z" },
1335
- { url = "https://files.pythonhosted.org/packages/cf/56/7158bd8d3cf16394928f47c637d39a7d532268cd45220bdb6cd622985760/ruff-0.12.1-py3-none-win_amd64.whl", hash = "sha256:9e1123b1c033f77bd2590e4c1fe7e8ea72ef990a85d2484351d408224d603013", size = 11547485, upload-time = "2025-06-26T20:34:11.008Z" },
1336
- { url = "https://files.pythonhosted.org/packages/91/d0/6902c0d017259439d6fd2fd9393cea1cfe30169940118b007d5e0ea7e954/ruff-0.12.1-py3-none-win_arm64.whl", hash = "sha256:78ad09a022c64c13cc6077707f036bab0fac8cd7088772dcd1e5be21c5002efc", size = 10691209, upload-time = "2025-06-26T20:34:12.928Z" },
1327
+ version = "0.12.4"
1328
+ source = { registry = "https://pypi.org/simple" }
1329
+ sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435, upload-time = "2025-07-17T17:27:19.138Z" }
1330
+ wheels = [
1331
+ { url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824, upload-time = "2025-07-17T17:26:31.412Z" },
1332
+ { url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521, upload-time = "2025-07-17T17:26:35.084Z" },
1333
+ { url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653, upload-time = "2025-07-17T17:26:37.897Z" },
1334
+ { url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993, upload-time = "2025-07-17T17:26:40.68Z" },
1335
+ { url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824, upload-time = "2025-07-17T17:26:43.564Z" },
1336
+ { url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414, upload-time = "2025-07-17T17:26:46.219Z" },
1337
+ { url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216, upload-time = "2025-07-17T17:26:48.883Z" },
1338
+ { url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756, upload-time = "2025-07-17T17:26:51.754Z" },
1339
+ { url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019, upload-time = "2025-07-17T17:26:54.265Z" },
1340
+ { url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890, upload-time = "2025-07-17T17:26:56.914Z" },
1341
+ { url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539, upload-time = "2025-07-17T17:26:59.381Z" },
1342
+ { url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579, upload-time = "2025-07-17T17:27:02.462Z" },
1343
+ { url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982, upload-time = "2025-07-17T17:27:05.343Z" },
1344
+ { url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331, upload-time = "2025-07-17T17:27:08.652Z" },
1345
+ { url = "https://files.pythonhosted.org/packages/35/cf/441b7fc58368455233cfb5b77206c849b6dfb48b23de532adcc2e50ccc06/ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93", size = 10267904, upload-time = "2025-07-17T17:27:11.814Z" },
1346
+ { url = "https://files.pythonhosted.org/packages/ce/7e/20af4a0df5e1299e7368d5ea4350412226afb03d95507faae94c80f00afd/ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a", size = 11209038, upload-time = "2025-07-17T17:27:14.417Z" },
1347
+ { url = "https://files.pythonhosted.org/packages/11/02/8857d0dfb8f44ef299a5dfd898f673edefb71e3b533b3b9d2db4c832dd13/ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e", size = 10469336, upload-time = "2025-07-17T17:27:16.913Z" },
1337
1348
  ]
1338
1349
 
1339
1350
  [[package]]
@@ -1365,14 +1376,14 @@ wheels = [
1365
1376
 
1366
1377
  [[package]]
1367
1378
  name = "smart-open"
1368
- version = "7.1.0"
1379
+ version = "7.3.0.post1"
1369
1380
  source = { registry = "https://pypi.org/simple" }
1370
1381
  dependencies = [
1371
1382
  { name = "wrapt" },
1372
1383
  ]
1373
- sdist = { url = "https://files.pythonhosted.org/packages/21/30/1f41c3d3b8cec82024b4b277bfd4e5b18b765ae7279eb9871fa25c503778/smart_open-7.1.0.tar.gz", hash = "sha256:a4f09f84f0f6d3637c6543aca7b5487438877a21360e7368ccf1f704789752ba", size = 72044, upload-time = "2024-12-17T13:19:17.71Z" }
1384
+ sdist = { url = "https://files.pythonhosted.org/packages/18/2b/5e7234c68ed5bc872ad6ae77b8a421c2ed70dcb1190b44dc1abdeed5e347/smart_open-7.3.0.post1.tar.gz", hash = "sha256:ce6a3d9bc1afbf6234ad13c010b77f8cd36d24636811e3c52c3b5160f5214d1e", size = 51557, upload-time = "2025-07-03T10:06:31.271Z" }
1374
1385
  wheels = [
1375
- { url = "https://files.pythonhosted.org/packages/7a/18/9a8d9f01957aa1f8bbc5676d54c2e33102d247e146c1a3679d3bd5cc2e3a/smart_open-7.1.0-py3-none-any.whl", hash = "sha256:4b8489bb6058196258bafe901730c7db0dcf4f083f316e97269c66f45502055b", size = 61746, upload-time = "2024-12-17T13:19:21.076Z" },
1386
+ { url = "https://files.pythonhosted.org/packages/08/5b/a2a3d4514c64818925f4e886d39981f1926eeb5288a4549c6b3c17ed66bb/smart_open-7.3.0.post1-py3-none-any.whl", hash = "sha256:c73661a2c24bf045c1e04e08fffc585b59af023fe783d57896f590489db66fb4", size = 61946, upload-time = "2025-07-03T10:06:29.599Z" },
1376
1387
  ]
1377
1388
 
1378
1389
  [[package]]
@@ -1651,11 +1662,11 @@ wheels = [
1651
1662
 
1652
1663
  [[package]]
1653
1664
  name = "typing-extensions"
1654
- version = "4.14.0"
1665
+ version = "4.14.1"
1655
1666
  source = { registry = "https://pypi.org/simple" }
1656
- sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload-time = "2025-06-02T14:52:11.399Z" }
1667
+ sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" }
1657
1668
  wheels = [
1658
- { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload-time = "2025-06-02T14:52:10.026Z" },
1669
+ { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" },
1659
1670
  ]
1660
1671
 
1661
1672
  [[package]]
inconnu-0.1.0/Makefile DELETED
@@ -1,39 +0,0 @@
1
- install:
2
- uv sync --group dev
3
-
4
- activate:
5
- uv venv
6
-
7
- install-pip:
8
- uv pip install pip --upgrade
9
-
10
- model-de: install-pip
11
- uv run python -m spacy download de_core_news_sm
12
-
13
- model-it: install-pip
14
- uv run python -m spacy download it_core_news_sm
15
-
16
- model-es: install-pip
17
- uv run python -m spacy download es_core_news_sm
18
-
19
- model-fr: install-pip
20
- uv run python -m spacy download fr_core_news_sm
21
-
22
- update-deps:
23
- uv update
24
-
25
- fix:
26
- uv run ruff check --fix .
27
-
28
- format:
29
- uv run ruff format .
30
-
31
- lint:
32
- uv run ruff check .
33
-
34
- clean: fix format lint
35
- rm -fr .pytest_cache */__pycache__ */*/__pycache__
36
- uv run ruff clean
37
-
38
- test:
39
- uv run pytest -vv
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes