ralph-py-cli 0.3.2__tar.gz → 0.4.2__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.
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/PKG-INFO +53 -2
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/README.md +51 -1
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/pyproject.toml +2 -1
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/cli.py +248 -5
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/tests/test_runner_integration.py +124 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/uv.lock +371 -1
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/.gitignore +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/CLAUDE.md +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/LICENSE +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/example_plans/numbers.md +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/example_plans/numbers_change.md +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/install.sh +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/__init__.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/__init__.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/agent_runner.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/agents/__init__.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/agents/base.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/agents/claude.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/agents/opencode.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/claude_runner.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/interactive.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/ralph_plan_helper.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/src/ralph_py_cli/utils/token_usage.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/tests/__init__.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/tests/conftest.py +0 -0
- {ralph_py_cli-0.3.2 → ralph_py_cli-0.4.2}/tests/test_token_usage.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ralph-py-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.2
|
|
4
4
|
Summary: A CLI application for running Claude Code iteratively on design documents
|
|
5
5
|
Project-URL: Homepage, https://github.com/rdubwiley09/ralph-py-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/rdubwiley09/ralph-py-cli
|
|
@@ -22,6 +22,7 @@ Classifier: Topic :: Software Development :: Code Generators
|
|
|
22
22
|
Classifier: Topic :: Utilities
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
24
|
Requires-Dist: pandas>=2.3.3
|
|
25
|
+
Requires-Dist: pip-audit>=2.10.0
|
|
25
26
|
Requires-Dist: playwright>=1.57.0
|
|
26
27
|
Requires-Dist: textual>=0.50.0
|
|
27
28
|
Requires-Dist: typer>=0.12.0
|
|
@@ -73,7 +74,7 @@ Both agents support the same Ralph loop workflow with iterative execution and in
|
|
|
73
74
|
|
|
74
75
|
## CLI Usage
|
|
75
76
|
|
|
76
|
-
Ralph provides
|
|
77
|
+
Ralph provides three commands: `run`, `run-endlessly`, and `plan`.
|
|
77
78
|
|
|
78
79
|
### Running the Loop
|
|
79
80
|
|
|
@@ -121,6 +122,56 @@ ralph run ./my-project \
|
|
|
121
122
|
- `1` - Error occurred (timeout, process error, etc.)
|
|
122
123
|
- `2` - Max iterations reached without completion
|
|
123
124
|
|
|
125
|
+
### Running Endlessly
|
|
126
|
+
|
|
127
|
+
The `run-endlessly` command runs Claude Code continuously, ignoring completion markers and only stopping on errors or manual cancellation. This is useful for iterative improvement and exploration without predefined endpoints.
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Run endlessly with manual stop (Ctrl+C)
|
|
131
|
+
ralph run-endlessly ./my-project --plan "Continuously improve code quality"
|
|
132
|
+
|
|
133
|
+
# Run endlessly from plan file
|
|
134
|
+
ralph run-endlessly ./my-project --plan-file design.md
|
|
135
|
+
|
|
136
|
+
# With maximum iteration limit
|
|
137
|
+
ralph run-endlessly ./my-project --plan-file design.md --max-iterations 50
|
|
138
|
+
|
|
139
|
+
# With options
|
|
140
|
+
ralph run-endlessly ./my-project \
|
|
141
|
+
--plan-file design.md \
|
|
142
|
+
--max-iterations 100 \
|
|
143
|
+
--timeout 600 \
|
|
144
|
+
--model claude-sonnet-4-20250514 \
|
|
145
|
+
--verbose
|
|
146
|
+
|
|
147
|
+
# Using OpenCode agent
|
|
148
|
+
ralph run-endlessly ./my-project \
|
|
149
|
+
--plan "Continuously improve code" \
|
|
150
|
+
--agent opencode \
|
|
151
|
+
--model opencode/glm-4.7-free
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Options:**
|
|
155
|
+
- `--plan, -p` - Plan text describing what to build
|
|
156
|
+
- `--plan-file, -f` - Read plan from a file
|
|
157
|
+
- `--max-iterations, -n` - Maximum iterations (optional, omit for endless)
|
|
158
|
+
- `--timeout, -t` - Timeout per iteration in seconds (default: 300)
|
|
159
|
+
- `--agent, -a` - Agent to use: `claude` or `opencode` (default: claude)
|
|
160
|
+
- `--model, -m` - Model override for the agent
|
|
161
|
+
- `--verbose, -v` - Show detailed output
|
|
162
|
+
|
|
163
|
+
**Key differences from `run`:**
|
|
164
|
+
- No interactive prompts between iterations
|
|
165
|
+
- Continues through COMPLETED and MISSING_MARKER statuses
|
|
166
|
+
- Stops only on:
|
|
167
|
+
- 3 consecutive errors (TIMEOUT or PROCESS_ERROR)
|
|
168
|
+
- Manual cancellation (Ctrl+C)
|
|
169
|
+
- Maximum iterations reached (if --max-iterations specified)
|
|
170
|
+
|
|
171
|
+
**Exit codes:**
|
|
172
|
+
- `1` - Stopped due to consecutive errors
|
|
173
|
+
- `2` - Cancelled by user or max iterations reached
|
|
174
|
+
|
|
124
175
|
### Improving a Plan
|
|
125
176
|
|
|
126
177
|
The `plan` command restructures your plan into small, atomic steps optimized for iterative execution:
|
|
@@ -44,7 +44,7 @@ Both agents support the same Ralph loop workflow with iterative execution and in
|
|
|
44
44
|
|
|
45
45
|
## CLI Usage
|
|
46
46
|
|
|
47
|
-
Ralph provides
|
|
47
|
+
Ralph provides three commands: `run`, `run-endlessly`, and `plan`.
|
|
48
48
|
|
|
49
49
|
### Running the Loop
|
|
50
50
|
|
|
@@ -92,6 +92,56 @@ ralph run ./my-project \
|
|
|
92
92
|
- `1` - Error occurred (timeout, process error, etc.)
|
|
93
93
|
- `2` - Max iterations reached without completion
|
|
94
94
|
|
|
95
|
+
### Running Endlessly
|
|
96
|
+
|
|
97
|
+
The `run-endlessly` command runs Claude Code continuously, ignoring completion markers and only stopping on errors or manual cancellation. This is useful for iterative improvement and exploration without predefined endpoints.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# Run endlessly with manual stop (Ctrl+C)
|
|
101
|
+
ralph run-endlessly ./my-project --plan "Continuously improve code quality"
|
|
102
|
+
|
|
103
|
+
# Run endlessly from plan file
|
|
104
|
+
ralph run-endlessly ./my-project --plan-file design.md
|
|
105
|
+
|
|
106
|
+
# With maximum iteration limit
|
|
107
|
+
ralph run-endlessly ./my-project --plan-file design.md --max-iterations 50
|
|
108
|
+
|
|
109
|
+
# With options
|
|
110
|
+
ralph run-endlessly ./my-project \
|
|
111
|
+
--plan-file design.md \
|
|
112
|
+
--max-iterations 100 \
|
|
113
|
+
--timeout 600 \
|
|
114
|
+
--model claude-sonnet-4-20250514 \
|
|
115
|
+
--verbose
|
|
116
|
+
|
|
117
|
+
# Using OpenCode agent
|
|
118
|
+
ralph run-endlessly ./my-project \
|
|
119
|
+
--plan "Continuously improve code" \
|
|
120
|
+
--agent opencode \
|
|
121
|
+
--model opencode/glm-4.7-free
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Options:**
|
|
125
|
+
- `--plan, -p` - Plan text describing what to build
|
|
126
|
+
- `--plan-file, -f` - Read plan from a file
|
|
127
|
+
- `--max-iterations, -n` - Maximum iterations (optional, omit for endless)
|
|
128
|
+
- `--timeout, -t` - Timeout per iteration in seconds (default: 300)
|
|
129
|
+
- `--agent, -a` - Agent to use: `claude` or `opencode` (default: claude)
|
|
130
|
+
- `--model, -m` - Model override for the agent
|
|
131
|
+
- `--verbose, -v` - Show detailed output
|
|
132
|
+
|
|
133
|
+
**Key differences from `run`:**
|
|
134
|
+
- No interactive prompts between iterations
|
|
135
|
+
- Continues through COMPLETED and MISSING_MARKER statuses
|
|
136
|
+
- Stops only on:
|
|
137
|
+
- 3 consecutive errors (TIMEOUT or PROCESS_ERROR)
|
|
138
|
+
- Manual cancellation (Ctrl+C)
|
|
139
|
+
- Maximum iterations reached (if --max-iterations specified)
|
|
140
|
+
|
|
141
|
+
**Exit codes:**
|
|
142
|
+
- `1` - Stopped due to consecutive errors
|
|
143
|
+
- `2` - Cancelled by user or max iterations reached
|
|
144
|
+
|
|
95
145
|
### Improving a Plan
|
|
96
146
|
|
|
97
147
|
The `plan` command restructures your plan into small, atomic steps optimized for iterative execution:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "ralph-py-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.2"
|
|
4
4
|
description = "A CLI application for running Claude Code iteratively on design documents"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -24,6 +24,7 @@ classifiers = [
|
|
|
24
24
|
]
|
|
25
25
|
dependencies = [
|
|
26
26
|
"pandas>=2.3.3",
|
|
27
|
+
"pip-audit>=2.10.0",
|
|
27
28
|
"playwright>=1.57.0",
|
|
28
29
|
"textual>=0.50.0",
|
|
29
30
|
"typer>=0.12.0",
|
|
@@ -51,7 +51,9 @@ def run_loop(
|
|
|
51
51
|
state.current_iteration += 1
|
|
52
52
|
i = state.current_iteration
|
|
53
53
|
|
|
54
|
-
console.print(
|
|
54
|
+
console.print(
|
|
55
|
+
f"[bold blue]Iteration {i}/{state.total_iterations}[/bold blue] - In Progress"
|
|
56
|
+
)
|
|
55
57
|
|
|
56
58
|
result = run_agent_iteration(
|
|
57
59
|
agent_type=state.agent_type,
|
|
@@ -81,7 +83,11 @@ def run_loop(
|
|
|
81
83
|
_print_session_summary(state.token_tracker)
|
|
82
84
|
return i, RunStatus.COMPLETED, message
|
|
83
85
|
|
|
84
|
-
if result.status in (
|
|
86
|
+
if result.status in (
|
|
87
|
+
RunStatus.TIMEOUT,
|
|
88
|
+
RunStatus.PROCESS_ERROR,
|
|
89
|
+
RunStatus.MISSING_MARKER,
|
|
90
|
+
):
|
|
85
91
|
error_detail = result.error_message or result.status.value
|
|
86
92
|
message = f"Stopped at iteration {i} due to: {error_detail}"
|
|
87
93
|
console.print(f"[bold red]{message}[/bold red]")
|
|
@@ -89,7 +95,9 @@ def run_loop(
|
|
|
89
95
|
return i, result.status, message
|
|
90
96
|
|
|
91
97
|
# IMPROVED - continue to next iteration
|
|
92
|
-
console.print(
|
|
98
|
+
console.print(
|
|
99
|
+
f"[cyan] Improved:[/cyan] {result.output_message or result.summary}"
|
|
100
|
+
)
|
|
93
101
|
|
|
94
102
|
# Prompt user between iterations if interactive and not skipping
|
|
95
103
|
is_last_iteration = state.current_iteration >= state.total_iterations
|
|
@@ -109,6 +117,116 @@ def run_loop(
|
|
|
109
117
|
return state.total_iterations, RunStatus.IMPROVED, message
|
|
110
118
|
|
|
111
119
|
|
|
120
|
+
def run_endless_loop(
|
|
121
|
+
folder: Path,
|
|
122
|
+
state: LoopState,
|
|
123
|
+
timeout: float,
|
|
124
|
+
model: Optional[str],
|
|
125
|
+
verbose: bool,
|
|
126
|
+
max_iterations: Optional[int] = None,
|
|
127
|
+
max_consecutive_errors: int = 3,
|
|
128
|
+
) -> tuple[int, RunStatus, str]:
|
|
129
|
+
"""Run the Claude Code iteration loop endlessly until stopped.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
folder: Target folder path.
|
|
133
|
+
state: The mutable loop state containing plan and iteration info.
|
|
134
|
+
timeout: Timeout per iteration in seconds.
|
|
135
|
+
model: Optional model override.
|
|
136
|
+
verbose: Show detailed output.
|
|
137
|
+
max_iterations: Optional maximum number of iterations (None for endless).
|
|
138
|
+
max_consecutive_errors: Stop after this many consecutive errors.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
Tuple of (iterations_run, final_status, message).
|
|
142
|
+
"""
|
|
143
|
+
consecutive_errors = 0
|
|
144
|
+
|
|
145
|
+
try:
|
|
146
|
+
while True:
|
|
147
|
+
state.current_iteration += 1
|
|
148
|
+
i = state.current_iteration
|
|
149
|
+
|
|
150
|
+
# Check if max_iterations is reached
|
|
151
|
+
if max_iterations is not None and i > max_iterations:
|
|
152
|
+
message = f"Ran {max_iterations} iteration{'s' if max_iterations > 1 else ''} (max_iterations reached)"
|
|
153
|
+
console.print(f"[bold yellow]{message}[/bold yellow]")
|
|
154
|
+
_print_session_summary(state.token_tracker)
|
|
155
|
+
return i - 1, RunStatus.IMPROVED, message
|
|
156
|
+
|
|
157
|
+
console.print(f"[bold blue]Iteration {i}[/bold blue] - In Progress")
|
|
158
|
+
|
|
159
|
+
result = run_agent_iteration(
|
|
160
|
+
agent_type=state.agent_type,
|
|
161
|
+
plan_text=state.plan_text,
|
|
162
|
+
folder_path=str(folder),
|
|
163
|
+
timeout_seconds=timeout,
|
|
164
|
+
model=model,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
# Track token usage if available
|
|
168
|
+
if result.token_usage:
|
|
169
|
+
state.token_tracker.add_usage(result.token_usage)
|
|
170
|
+
console.print(f" {result.token_usage.format_compact()}")
|
|
171
|
+
|
|
172
|
+
if verbose:
|
|
173
|
+
console.print(f" Status: {result.status.value}")
|
|
174
|
+
if result.summary:
|
|
175
|
+
console.print(f" Summary: {result.summary}")
|
|
176
|
+
if result.duration_seconds:
|
|
177
|
+
console.print(f" Duration: {result.duration_seconds:.1f}s")
|
|
178
|
+
|
|
179
|
+
if result.status == RunStatus.COMPLETED:
|
|
180
|
+
# Display message but continue (don't stop)
|
|
181
|
+
console.print(
|
|
182
|
+
f" [green]Completed:[/green] {result.output_message or result.summary}"
|
|
183
|
+
)
|
|
184
|
+
consecutive_errors = 0 # Reset error counter
|
|
185
|
+
continue
|
|
186
|
+
|
|
187
|
+
if result.status == RunStatus.IMPROVED:
|
|
188
|
+
# Display message and continue
|
|
189
|
+
console.print(
|
|
190
|
+
f" [cyan]Improved:[/cyan] {result.output_message or result.summary}"
|
|
191
|
+
)
|
|
192
|
+
consecutive_errors = 0 # Reset error counter
|
|
193
|
+
continue
|
|
194
|
+
|
|
195
|
+
if result.status == RunStatus.MISSING_MARKER:
|
|
196
|
+
# Display warning and continue
|
|
197
|
+
console.print(
|
|
198
|
+
f" [yellow]Warning:[/yellow] No marker found - output missing required tags"
|
|
199
|
+
)
|
|
200
|
+
consecutive_errors = (
|
|
201
|
+
0 # Reset error counter (MISSING_MARKER counts as success)
|
|
202
|
+
)
|
|
203
|
+
continue
|
|
204
|
+
|
|
205
|
+
if result.status in (RunStatus.TIMEOUT, RunStatus.PROCESS_ERROR):
|
|
206
|
+
# Increment error counter
|
|
207
|
+
consecutive_errors += 1
|
|
208
|
+
error_detail = result.error_message or result.status.value
|
|
209
|
+
console.print(f" [red]Error:[/red] {error_detail}")
|
|
210
|
+
|
|
211
|
+
if consecutive_errors >= max_consecutive_errors:
|
|
212
|
+
message = f"Stopped at iteration {i} after {consecutive_errors} consecutive errors"
|
|
213
|
+
console.print(f"[bold red]{message}[/bold red]")
|
|
214
|
+
_print_session_summary(state.token_tracker)
|
|
215
|
+
return i, result.status, message
|
|
216
|
+
|
|
217
|
+
console.print(
|
|
218
|
+
f" [yellow]Consecutive errors: {consecutive_errors}/{max_consecutive_errors}[/yellow]"
|
|
219
|
+
)
|
|
220
|
+
continue
|
|
221
|
+
|
|
222
|
+
except KeyboardInterrupt:
|
|
223
|
+
message = f"Cancelled by user after {state.current_iteration} iteration{'s' if state.current_iteration > 1 else ''}"
|
|
224
|
+
console.print()
|
|
225
|
+
console.print(f"[bold yellow]{message}[/bold yellow]")
|
|
226
|
+
_print_session_summary(state.token_tracker)
|
|
227
|
+
return state.current_iteration, RunStatus.IMPROVED, message
|
|
228
|
+
|
|
229
|
+
|
|
112
230
|
def _print_session_summary(tracker: TokenUsageTracker) -> None:
|
|
113
231
|
"""Print session summary with token usage and tier percentages.
|
|
114
232
|
|
|
@@ -255,7 +373,9 @@ def run(
|
|
|
255
373
|
console.print("[dim]Interactive prompts disabled[/dim]")
|
|
256
374
|
console.print()
|
|
257
375
|
|
|
258
|
-
state = LoopState(
|
|
376
|
+
state = LoopState(
|
|
377
|
+
plan_text=plan_text, total_iterations=iterations, agent_type=agent
|
|
378
|
+
)
|
|
259
379
|
|
|
260
380
|
iterations_run, status, message = run_loop(
|
|
261
381
|
folder, state, timeout, model, verbose, interactive
|
|
@@ -271,6 +391,127 @@ def run(
|
|
|
271
391
|
raise typer.Exit(code=1)
|
|
272
392
|
|
|
273
393
|
|
|
394
|
+
@app.command()
|
|
395
|
+
def run_endlessly(
|
|
396
|
+
folder: Path = typer.Argument(
|
|
397
|
+
...,
|
|
398
|
+
help="Target folder path to run Claude Code on",
|
|
399
|
+
exists=True,
|
|
400
|
+
file_okay=False,
|
|
401
|
+
dir_okay=True,
|
|
402
|
+
resolve_path=True,
|
|
403
|
+
),
|
|
404
|
+
plan: Optional[str] = typer.Option(
|
|
405
|
+
None,
|
|
406
|
+
"--plan",
|
|
407
|
+
"-p",
|
|
408
|
+
help="Plan text string describing what to build",
|
|
409
|
+
),
|
|
410
|
+
plan_file: Optional[Path] = typer.Option(
|
|
411
|
+
None,
|
|
412
|
+
"--plan-file",
|
|
413
|
+
"-f",
|
|
414
|
+
help="Read plan from file (alternative to --plan)",
|
|
415
|
+
exists=True,
|
|
416
|
+
file_okay=True,
|
|
417
|
+
dir_okay=False,
|
|
418
|
+
),
|
|
419
|
+
max_iterations: Optional[int] = typer.Option(
|
|
420
|
+
None,
|
|
421
|
+
"--max-iterations",
|
|
422
|
+
"-n",
|
|
423
|
+
help="Maximum number of iterations (omit for endless)",
|
|
424
|
+
min=1,
|
|
425
|
+
),
|
|
426
|
+
timeout: float = typer.Option(
|
|
427
|
+
300.0,
|
|
428
|
+
"--timeout",
|
|
429
|
+
"-t",
|
|
430
|
+
help="Timeout per iteration in seconds",
|
|
431
|
+
min=1.0,
|
|
432
|
+
),
|
|
433
|
+
model: Optional[str] = typer.Option(
|
|
434
|
+
None,
|
|
435
|
+
"--model",
|
|
436
|
+
"-m",
|
|
437
|
+
help="Optional model override for the agent",
|
|
438
|
+
),
|
|
439
|
+
agent: str = typer.Option(
|
|
440
|
+
"claude",
|
|
441
|
+
"--agent",
|
|
442
|
+
"-a",
|
|
443
|
+
help="Agent to use: claude or opencode",
|
|
444
|
+
),
|
|
445
|
+
verbose: bool = typer.Option(
|
|
446
|
+
False,
|
|
447
|
+
"--verbose",
|
|
448
|
+
"-v",
|
|
449
|
+
help="Show detailed output",
|
|
450
|
+
),
|
|
451
|
+
) -> None:
|
|
452
|
+
"""Run endlessly on a project until consecutive errors or manual cancellation.
|
|
453
|
+
|
|
454
|
+
The CLI runs Claude Code in a loop continuously, ignoring completion markers
|
|
455
|
+
and only stopping on:
|
|
456
|
+
- 3 consecutive TIMEOUT or PROCESS_ERROR statuses
|
|
457
|
+
- Manual cancellation (Ctrl+C)
|
|
458
|
+
- Maximum iterations reached (if --max-iterations specified)
|
|
459
|
+
|
|
460
|
+
Unlike the 'run' command, this continues through COMPLETED and MISSING_MARKER
|
|
461
|
+
statuses, making it suitable for iterative improvement and exploration.
|
|
462
|
+
"""
|
|
463
|
+
try:
|
|
464
|
+
plan_text = resolve_plan_text(plan, plan_file)
|
|
465
|
+
except typer.BadParameter as e:
|
|
466
|
+
console.print(f"[bold red]Error:[/bold red] {e}")
|
|
467
|
+
raise typer.Exit(code=1)
|
|
468
|
+
|
|
469
|
+
# Validate agent type
|
|
470
|
+
if agent not in ["claude", "opencode"]:
|
|
471
|
+
console.print(f"[bold red]Error:[/bold red] Unknown agent type: {agent}")
|
|
472
|
+
console.print("[dim]Available agents: claude, opencode[/dim]")
|
|
473
|
+
raise typer.Exit(code=1)
|
|
474
|
+
|
|
475
|
+
# Set default model for opencode if not specified
|
|
476
|
+
if agent == "opencode" and model is None:
|
|
477
|
+
model = "opencode/glm-4.7-free"
|
|
478
|
+
|
|
479
|
+
# Check agent availability
|
|
480
|
+
available, error = check_agent_available(agent)
|
|
481
|
+
if not available:
|
|
482
|
+
console.print(f"[bold red]Error:[/bold red] {error}")
|
|
483
|
+
console.print(f"[dim]Make sure '{agent}' is installed and in your PATH[/dim]")
|
|
484
|
+
raise typer.Exit(code=1)
|
|
485
|
+
|
|
486
|
+
console.print(f"[bold]Running on:[/bold] {folder}")
|
|
487
|
+
console.print(f"[bold]Agent:[/bold] {agent}")
|
|
488
|
+
if max_iterations is not None:
|
|
489
|
+
console.print(f"[bold]Max iterations:[/bold] {max_iterations}")
|
|
490
|
+
else:
|
|
491
|
+
console.print(f"[bold]Max iterations:[/bold] endless")
|
|
492
|
+
if model:
|
|
493
|
+
console.print(f"[bold]Model:[/bold] {model}")
|
|
494
|
+
console.print("[dim]Press Ctrl+C to stop[/dim]")
|
|
495
|
+
console.print()
|
|
496
|
+
|
|
497
|
+
# Use a large number for total_iterations if max_iterations is not specified
|
|
498
|
+
total_iterations = max_iterations if max_iterations is not None else 999999
|
|
499
|
+
state = LoopState(
|
|
500
|
+
plan_text=plan_text, total_iterations=total_iterations, agent_type=agent
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
iterations_run, status, message = run_endless_loop(
|
|
504
|
+
folder, state, timeout, model, verbose, max_iterations
|
|
505
|
+
)
|
|
506
|
+
|
|
507
|
+
# Exit codes based on status
|
|
508
|
+
if status in (RunStatus.TIMEOUT, RunStatus.PROCESS_ERROR):
|
|
509
|
+
raise typer.Exit(code=1)
|
|
510
|
+
else:
|
|
511
|
+
# User cancelled or exhausted iterations
|
|
512
|
+
raise typer.Exit(code=2)
|
|
513
|
+
|
|
514
|
+
|
|
274
515
|
@app.command()
|
|
275
516
|
def plan(
|
|
276
517
|
plan: Optional[str] = typer.Option(
|
|
@@ -363,7 +604,9 @@ def plan(
|
|
|
363
604
|
|
|
364
605
|
if output:
|
|
365
606
|
output.write_text(result.improved_plan)
|
|
366
|
-
console.print(
|
|
607
|
+
console.print(
|
|
608
|
+
f"[bold green]Improved plan written to:[/bold green] {output}"
|
|
609
|
+
)
|
|
367
610
|
else:
|
|
368
611
|
console.print("[bold green]Improved Plan:[/bold green]")
|
|
369
612
|
console.print()
|
|
@@ -313,3 +313,127 @@ class TestRunAgentIterationIntegration:
|
|
|
313
313
|
)
|
|
314
314
|
|
|
315
315
|
assert result.status == RunStatus.TIMEOUT, f"Expected TIMEOUT, got {result.status}"
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
@pytest.mark.slow
|
|
319
|
+
@pytest.mark.integration
|
|
320
|
+
class TestRunEndlesslyIntegration:
|
|
321
|
+
"""Integration tests for the run_endlessly command."""
|
|
322
|
+
|
|
323
|
+
def test_run_endlessly_with_max_iterations(self):
|
|
324
|
+
"""Test that run_endlessly stops at max_iterations count."""
|
|
325
|
+
from ralph_py_cli.cli import run_endless_loop
|
|
326
|
+
from ralph_py_cli.utils.interactive import LoopState
|
|
327
|
+
|
|
328
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
329
|
+
numbers_file = Path(tmpdir) / "numbers.txt"
|
|
330
|
+
numbers_file.write_text("1\n2\n3\n")
|
|
331
|
+
|
|
332
|
+
state = LoopState(
|
|
333
|
+
plan_text="Add a new number to numbers.txt (the next number in sequence).",
|
|
334
|
+
total_iterations=999999,
|
|
335
|
+
agent_type="claude",
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
iterations_run, status, message = run_endless_loop(
|
|
339
|
+
folder=Path(tmpdir),
|
|
340
|
+
state=state,
|
|
341
|
+
timeout=120.0,
|
|
342
|
+
model=None,
|
|
343
|
+
verbose=False,
|
|
344
|
+
max_iterations=2,
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
assert iterations_run == 2, f"Expected 2 iterations, got {iterations_run}"
|
|
348
|
+
assert "max_iterations reached" in message.lower()
|
|
349
|
+
|
|
350
|
+
def test_run_endlessly_continues_on_completed(self):
|
|
351
|
+
"""Test that run_endlessly continues past COMPLETED marker."""
|
|
352
|
+
from ralph_py_cli.cli import run_endless_loop
|
|
353
|
+
from ralph_py_cli.utils.interactive import LoopState
|
|
354
|
+
|
|
355
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
356
|
+
doc_file = Path(tmpdir) / "document.txt"
|
|
357
|
+
doc_file.write_text("Count: 0\n")
|
|
358
|
+
|
|
359
|
+
state = LoopState(
|
|
360
|
+
plan_text="Increment the count in document.txt by 1. This is a complete, simple task.",
|
|
361
|
+
total_iterations=999999,
|
|
362
|
+
agent_type="claude",
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
iterations_run, status, message = run_endless_loop(
|
|
366
|
+
folder=Path(tmpdir),
|
|
367
|
+
state=state,
|
|
368
|
+
timeout=120.0,
|
|
369
|
+
model=None,
|
|
370
|
+
verbose=False,
|
|
371
|
+
max_iterations=3,
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
# Should run all 3 iterations even if some complete
|
|
375
|
+
assert iterations_run == 3, f"Expected 3 iterations, got {iterations_run}"
|
|
376
|
+
assert "max_iterations reached" in message.lower()
|
|
377
|
+
|
|
378
|
+
# Verify the file was modified multiple times
|
|
379
|
+
content = doc_file.read_text()
|
|
380
|
+
# After 3 iterations, count should be at least 1 (probably higher)
|
|
381
|
+
assert "1" in content or "2" in content or "3" in content
|
|
382
|
+
|
|
383
|
+
def test_run_endlessly_continues_on_missing_marker(self):
|
|
384
|
+
"""Test that run_endlessly continues with warning on MISSING_MARKER."""
|
|
385
|
+
from ralph_py_cli.cli import run_endless_loop
|
|
386
|
+
from ralph_py_cli.utils.interactive import LoopState
|
|
387
|
+
|
|
388
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
389
|
+
test_file = Path(tmpdir) / "test.txt"
|
|
390
|
+
test_file.write_text("content")
|
|
391
|
+
|
|
392
|
+
# Use a vague plan that might not always trigger markers
|
|
393
|
+
state = LoopState(
|
|
394
|
+
plan_text="Look at test.txt.",
|
|
395
|
+
total_iterations=999999,
|
|
396
|
+
agent_type="claude",
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
iterations_run, status, message = run_endless_loop(
|
|
400
|
+
folder=Path(tmpdir),
|
|
401
|
+
state=state,
|
|
402
|
+
timeout=120.0,
|
|
403
|
+
model=None,
|
|
404
|
+
verbose=False,
|
|
405
|
+
max_iterations=2,
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
# Should complete all iterations regardless of markers
|
|
409
|
+
assert iterations_run == 2, f"Expected 2 iterations, got {iterations_run}"
|
|
410
|
+
assert "max_iterations reached" in message.lower()
|
|
411
|
+
|
|
412
|
+
def test_run_endlessly_stops_on_consecutive_errors(self):
|
|
413
|
+
"""Test that run_endlessly stops after 3 consecutive timeouts."""
|
|
414
|
+
from ralph_py_cli.cli import run_endless_loop
|
|
415
|
+
from ralph_py_cli.utils.interactive import LoopState
|
|
416
|
+
|
|
417
|
+
with tempfile.TemporaryDirectory() as tmpdir:
|
|
418
|
+
test_file = Path(tmpdir) / "test.txt"
|
|
419
|
+
test_file.write_text("test content")
|
|
420
|
+
|
|
421
|
+
state = LoopState(
|
|
422
|
+
plan_text="Do a very complex analysis of the entire codebase that will timeout.",
|
|
423
|
+
total_iterations=999999,
|
|
424
|
+
agent_type="claude",
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
iterations_run, status, message = run_endless_loop(
|
|
428
|
+
folder=Path(tmpdir),
|
|
429
|
+
state=state,
|
|
430
|
+
timeout=0.1, # Very short timeout to force failures
|
|
431
|
+
model=None,
|
|
432
|
+
verbose=False,
|
|
433
|
+
max_iterations=10, # Set high max but should stop on errors
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
# Should stop after 3 consecutive timeouts
|
|
437
|
+
assert iterations_run == 3, f"Expected 3 iterations (3 consecutive errors), got {iterations_run}"
|
|
438
|
+
assert status == RunStatus.TIMEOUT
|
|
439
|
+
assert "consecutive errors" in message.lower()
|
|
@@ -16,6 +16,131 @@ wheels = [
|
|
|
16
16
|
{ 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" },
|
|
17
17
|
]
|
|
18
18
|
|
|
19
|
+
[[package]]
|
|
20
|
+
name = "boolean-py"
|
|
21
|
+
version = "5.0"
|
|
22
|
+
source = { registry = "https://pypi.org/simple" }
|
|
23
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload-time = "2025-04-03T10:39:49.734Z" }
|
|
24
|
+
wheels = [
|
|
25
|
+
{ url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload-time = "2025-04-03T10:39:48.449Z" },
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[[package]]
|
|
29
|
+
name = "cachecontrol"
|
|
30
|
+
version = "0.14.4"
|
|
31
|
+
source = { registry = "https://pypi.org/simple" }
|
|
32
|
+
dependencies = [
|
|
33
|
+
{ name = "msgpack" },
|
|
34
|
+
{ name = "requests" },
|
|
35
|
+
]
|
|
36
|
+
sdist = { url = "https://files.pythonhosted.org/packages/2d/f6/c972b32d80760fb79d6b9eeb0b3010a46b89c0b23cf6329417ff7886cd22/cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1", size = 16150, upload-time = "2025-11-14T04:32:13.138Z" }
|
|
37
|
+
wheels = [
|
|
38
|
+
{ url = "https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b", size = 22247, upload-time = "2025-11-14T04:32:11.733Z" },
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[package.optional-dependencies]
|
|
42
|
+
filecache = [
|
|
43
|
+
{ name = "filelock" },
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[[package]]
|
|
47
|
+
name = "certifi"
|
|
48
|
+
version = "2026.1.4"
|
|
49
|
+
source = { registry = "https://pypi.org/simple" }
|
|
50
|
+
sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" }
|
|
51
|
+
wheels = [
|
|
52
|
+
{ url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" },
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
[[package]]
|
|
56
|
+
name = "charset-normalizer"
|
|
57
|
+
version = "3.4.4"
|
|
58
|
+
source = { registry = "https://pypi.org/simple" }
|
|
59
|
+
sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
|
|
60
|
+
wheels = [
|
|
61
|
+
{ url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" },
|
|
62
|
+
{ url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" },
|
|
63
|
+
{ url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" },
|
|
64
|
+
{ url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" },
|
|
65
|
+
{ url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" },
|
|
66
|
+
{ url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" },
|
|
67
|
+
{ url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" },
|
|
68
|
+
{ url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" },
|
|
69
|
+
{ url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" },
|
|
70
|
+
{ url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" },
|
|
71
|
+
{ url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" },
|
|
72
|
+
{ url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" },
|
|
73
|
+
{ url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" },
|
|
74
|
+
{ url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" },
|
|
75
|
+
{ url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" },
|
|
76
|
+
{ url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" },
|
|
77
|
+
{ url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" },
|
|
78
|
+
{ url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" },
|
|
79
|
+
{ url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" },
|
|
80
|
+
{ url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" },
|
|
81
|
+
{ url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" },
|
|
82
|
+
{ url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" },
|
|
83
|
+
{ url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" },
|
|
84
|
+
{ url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" },
|
|
85
|
+
{ url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" },
|
|
86
|
+
{ url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" },
|
|
87
|
+
{ url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" },
|
|
88
|
+
{ url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" },
|
|
89
|
+
{ url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" },
|
|
90
|
+
{ url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" },
|
|
91
|
+
{ url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" },
|
|
92
|
+
{ url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" },
|
|
93
|
+
{ url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" },
|
|
94
|
+
{ url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" },
|
|
95
|
+
{ url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" },
|
|
96
|
+
{ url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" },
|
|
97
|
+
{ url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" },
|
|
98
|
+
{ url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" },
|
|
99
|
+
{ url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" },
|
|
100
|
+
{ url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" },
|
|
101
|
+
{ url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" },
|
|
102
|
+
{ url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" },
|
|
103
|
+
{ url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" },
|
|
104
|
+
{ url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" },
|
|
105
|
+
{ url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" },
|
|
106
|
+
{ url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" },
|
|
107
|
+
{ url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" },
|
|
108
|
+
{ url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" },
|
|
109
|
+
{ url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" },
|
|
110
|
+
{ url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" },
|
|
111
|
+
{ url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" },
|
|
112
|
+
{ url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" },
|
|
113
|
+
{ url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" },
|
|
114
|
+
{ url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" },
|
|
115
|
+
{ url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" },
|
|
116
|
+
{ url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" },
|
|
117
|
+
{ url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" },
|
|
118
|
+
{ url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" },
|
|
119
|
+
{ url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" },
|
|
120
|
+
{ url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" },
|
|
121
|
+
{ url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" },
|
|
122
|
+
{ url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" },
|
|
123
|
+
{ url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" },
|
|
124
|
+
{ url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" },
|
|
125
|
+
{ url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" },
|
|
126
|
+
{ url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" },
|
|
127
|
+
{ url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" },
|
|
128
|
+
{ url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" },
|
|
129
|
+
{ url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" },
|
|
130
|
+
{ url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" },
|
|
131
|
+
{ url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" },
|
|
132
|
+
{ url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" },
|
|
133
|
+
{ url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" },
|
|
134
|
+
{ url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" },
|
|
135
|
+
{ url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" },
|
|
136
|
+
{ url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" },
|
|
137
|
+
{ url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" },
|
|
138
|
+
{ url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" },
|
|
139
|
+
{ url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" },
|
|
140
|
+
{ url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" },
|
|
141
|
+
{ url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
|
|
142
|
+
]
|
|
143
|
+
|
|
19
144
|
[[package]]
|
|
20
145
|
name = "click"
|
|
21
146
|
version = "8.3.1"
|
|
@@ -37,6 +162,31 @@ wheels = [
|
|
|
37
162
|
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
|
38
163
|
]
|
|
39
164
|
|
|
165
|
+
[[package]]
|
|
166
|
+
name = "cyclonedx-python-lib"
|
|
167
|
+
version = "11.6.0"
|
|
168
|
+
source = { registry = "https://pypi.org/simple" }
|
|
169
|
+
dependencies = [
|
|
170
|
+
{ name = "license-expression" },
|
|
171
|
+
{ name = "packageurl-python" },
|
|
172
|
+
{ name = "py-serializable" },
|
|
173
|
+
{ name = "sortedcontainers" },
|
|
174
|
+
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
|
175
|
+
]
|
|
176
|
+
sdist = { url = "https://files.pythonhosted.org/packages/89/ed/54ecfa25fc145c58bf4f98090f7b6ffe5188d0759248c57dde44427ea239/cyclonedx_python_lib-11.6.0.tar.gz", hash = "sha256:7fb85a4371fa3a203e5be577ac22b7e9a7157f8b0058b7448731474d6dea7bf0", size = 1408147, upload-time = "2025-12-02T12:28:46.446Z" }
|
|
177
|
+
wheels = [
|
|
178
|
+
{ url = "https://files.pythonhosted.org/packages/c7/1b/534ad8a5e0f9470522811a8e5a9bc5d328fb7738ba29faf357467a4ef6d0/cyclonedx_python_lib-11.6.0-py3-none-any.whl", hash = "sha256:94f4aae97db42a452134dafdddcfab9745324198201c4777ed131e64c8380759", size = 511157, upload-time = "2025-12-02T12:28:44.158Z" },
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
[[package]]
|
|
182
|
+
name = "defusedxml"
|
|
183
|
+
version = "0.7.1"
|
|
184
|
+
source = { registry = "https://pypi.org/simple" }
|
|
185
|
+
sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" }
|
|
186
|
+
wheels = [
|
|
187
|
+
{ url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
|
|
188
|
+
]
|
|
189
|
+
|
|
40
190
|
[[package]]
|
|
41
191
|
name = "exceptiongroup"
|
|
42
192
|
version = "1.3.1"
|
|
@@ -49,6 +199,15 @@ wheels = [
|
|
|
49
199
|
{ url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
|
|
50
200
|
]
|
|
51
201
|
|
|
202
|
+
[[package]]
|
|
203
|
+
name = "filelock"
|
|
204
|
+
version = "3.20.3"
|
|
205
|
+
source = { registry = "https://pypi.org/simple" }
|
|
206
|
+
sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" }
|
|
207
|
+
wheels = [
|
|
208
|
+
{ url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" },
|
|
209
|
+
]
|
|
210
|
+
|
|
52
211
|
[[package]]
|
|
53
212
|
name = "greenlet"
|
|
54
213
|
version = "3.3.0"
|
|
@@ -104,6 +263,15 @@ wheels = [
|
|
|
104
263
|
{ url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload-time = "2025-12-04T14:27:33.531Z" },
|
|
105
264
|
]
|
|
106
265
|
|
|
266
|
+
[[package]]
|
|
267
|
+
name = "idna"
|
|
268
|
+
version = "3.11"
|
|
269
|
+
source = { registry = "https://pypi.org/simple" }
|
|
270
|
+
sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
|
|
271
|
+
wheels = [
|
|
272
|
+
{ url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
|
|
273
|
+
]
|
|
274
|
+
|
|
107
275
|
[[package]]
|
|
108
276
|
name = "iniconfig"
|
|
109
277
|
version = "2.3.0"
|
|
@@ -113,6 +281,18 @@ wheels = [
|
|
|
113
281
|
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
|
|
114
282
|
]
|
|
115
283
|
|
|
284
|
+
[[package]]
|
|
285
|
+
name = "license-expression"
|
|
286
|
+
version = "30.4.4"
|
|
287
|
+
source = { registry = "https://pypi.org/simple" }
|
|
288
|
+
dependencies = [
|
|
289
|
+
{ name = "boolean-py" },
|
|
290
|
+
]
|
|
291
|
+
sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload-time = "2025-07-22T11:13:32.17Z" }
|
|
292
|
+
wheels = [
|
|
293
|
+
{ url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload-time = "2025-07-22T11:13:31.217Z" },
|
|
294
|
+
]
|
|
295
|
+
|
|
116
296
|
[[package]]
|
|
117
297
|
name = "linkify-it-py"
|
|
118
298
|
version = "2.0.3"
|
|
@@ -163,6 +343,67 @@ wheels = [
|
|
|
163
343
|
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
|
|
164
344
|
]
|
|
165
345
|
|
|
346
|
+
[[package]]
|
|
347
|
+
name = "msgpack"
|
|
348
|
+
version = "1.1.2"
|
|
349
|
+
source = { registry = "https://pypi.org/simple" }
|
|
350
|
+
sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" }
|
|
351
|
+
wheels = [
|
|
352
|
+
{ url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" },
|
|
353
|
+
{ url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" },
|
|
354
|
+
{ url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" },
|
|
355
|
+
{ url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" },
|
|
356
|
+
{ url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" },
|
|
357
|
+
{ url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" },
|
|
358
|
+
{ url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" },
|
|
359
|
+
{ url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" },
|
|
360
|
+
{ url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" },
|
|
361
|
+
{ url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" },
|
|
362
|
+
{ url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" },
|
|
363
|
+
{ url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" },
|
|
364
|
+
{ url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" },
|
|
365
|
+
{ url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" },
|
|
366
|
+
{ url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" },
|
|
367
|
+
{ url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" },
|
|
368
|
+
{ url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" },
|
|
369
|
+
{ url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" },
|
|
370
|
+
{ url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" },
|
|
371
|
+
{ url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" },
|
|
372
|
+
{ url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" },
|
|
373
|
+
{ url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" },
|
|
374
|
+
{ url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" },
|
|
375
|
+
{ url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" },
|
|
376
|
+
{ url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" },
|
|
377
|
+
{ url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" },
|
|
378
|
+
{ url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" },
|
|
379
|
+
{ url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" },
|
|
380
|
+
{ url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" },
|
|
381
|
+
{ url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" },
|
|
382
|
+
{ url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" },
|
|
383
|
+
{ url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" },
|
|
384
|
+
{ url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" },
|
|
385
|
+
{ url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" },
|
|
386
|
+
{ url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" },
|
|
387
|
+
{ url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" },
|
|
388
|
+
{ url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" },
|
|
389
|
+
{ url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" },
|
|
390
|
+
{ url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" },
|
|
391
|
+
{ url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" },
|
|
392
|
+
{ url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" },
|
|
393
|
+
{ url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" },
|
|
394
|
+
{ url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" },
|
|
395
|
+
{ url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" },
|
|
396
|
+
{ url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" },
|
|
397
|
+
{ url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" },
|
|
398
|
+
{ url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" },
|
|
399
|
+
{ url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" },
|
|
400
|
+
{ url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" },
|
|
401
|
+
{ url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" },
|
|
402
|
+
{ url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" },
|
|
403
|
+
{ url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" },
|
|
404
|
+
{ url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" },
|
|
405
|
+
]
|
|
406
|
+
|
|
166
407
|
[[package]]
|
|
167
408
|
name = "numpy"
|
|
168
409
|
version = "2.2.6"
|
|
@@ -311,6 +552,15 @@ wheels = [
|
|
|
311
552
|
{ url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" },
|
|
312
553
|
]
|
|
313
554
|
|
|
555
|
+
[[package]]
|
|
556
|
+
name = "packageurl-python"
|
|
557
|
+
version = "0.17.6"
|
|
558
|
+
source = { registry = "https://pypi.org/simple" }
|
|
559
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f5/d6/3b5a4e3cfaef7a53869a26ceb034d1ff5e5c27c814ce77260a96d50ab7bb/packageurl_python-0.17.6.tar.gz", hash = "sha256:1252ce3a102372ca6f86eb968e16f9014c4ba511c5c37d95a7f023e2ca6e5c25", size = 50618, upload-time = "2025-11-24T15:20:17.998Z" }
|
|
560
|
+
wheels = [
|
|
561
|
+
{ url = "https://files.pythonhosted.org/packages/b1/2f/c7277b7615a93f51b5fbc1eacfc1b75e8103370e786fd8ce2abf6e5c04ab/packageurl_python-0.17.6-py3-none-any.whl", hash = "sha256:31a85c2717bc41dd818f3c62908685ff9eebcb68588213745b14a6ee9e7df7c9", size = 36776, upload-time = "2025-11-24T15:20:16.962Z" },
|
|
562
|
+
]
|
|
563
|
+
|
|
314
564
|
[[package]]
|
|
315
565
|
name = "packaging"
|
|
316
566
|
version = "25.0"
|
|
@@ -382,6 +632,61 @@ wheels = [
|
|
|
382
632
|
{ url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" },
|
|
383
633
|
]
|
|
384
634
|
|
|
635
|
+
[[package]]
|
|
636
|
+
name = "pip"
|
|
637
|
+
version = "25.3"
|
|
638
|
+
source = { registry = "https://pypi.org/simple" }
|
|
639
|
+
sdist = { url = "https://files.pythonhosted.org/packages/fe/6e/74a3f0179a4a73a53d66ce57fdb4de0080a8baa1de0063de206d6167acc2/pip-25.3.tar.gz", hash = "sha256:8d0538dbbd7babbd207f261ed969c65de439f6bc9e5dbd3b3b9a77f25d95f343", size = 1803014, upload-time = "2025-10-25T00:55:41.394Z" }
|
|
640
|
+
wheels = [
|
|
641
|
+
{ url = "https://files.pythonhosted.org/packages/44/3c/d717024885424591d5376220b5e836c2d5293ce2011523c9de23ff7bf068/pip-25.3-py3-none-any.whl", hash = "sha256:9655943313a94722b7774661c21049070f6bbb0a1516bf02f7c8d5d9201514cd", size = 1778622, upload-time = "2025-10-25T00:55:39.247Z" },
|
|
642
|
+
]
|
|
643
|
+
|
|
644
|
+
[[package]]
|
|
645
|
+
name = "pip-api"
|
|
646
|
+
version = "0.0.34"
|
|
647
|
+
source = { registry = "https://pypi.org/simple" }
|
|
648
|
+
dependencies = [
|
|
649
|
+
{ name = "pip" },
|
|
650
|
+
]
|
|
651
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b9/f1/ee85f8c7e82bccf90a3c7aad22863cc6e20057860a1361083cd2adacb92e/pip_api-0.0.34.tar.gz", hash = "sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625", size = 123017, upload-time = "2024-07-09T20:32:30.641Z" }
|
|
652
|
+
wheels = [
|
|
653
|
+
{ url = "https://files.pythonhosted.org/packages/91/f7/ebf5003e1065fd00b4cbef53bf0a65c3d3e1b599b676d5383ccb7a8b88ba/pip_api-0.0.34-py3-none-any.whl", hash = "sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb", size = 120369, upload-time = "2024-07-09T20:32:29.099Z" },
|
|
654
|
+
]
|
|
655
|
+
|
|
656
|
+
[[package]]
|
|
657
|
+
name = "pip-audit"
|
|
658
|
+
version = "2.10.0"
|
|
659
|
+
source = { registry = "https://pypi.org/simple" }
|
|
660
|
+
dependencies = [
|
|
661
|
+
{ name = "cachecontrol", extra = ["filecache"] },
|
|
662
|
+
{ name = "cyclonedx-python-lib" },
|
|
663
|
+
{ name = "packaging" },
|
|
664
|
+
{ name = "pip-api" },
|
|
665
|
+
{ name = "pip-requirements-parser" },
|
|
666
|
+
{ name = "platformdirs" },
|
|
667
|
+
{ name = "requests" },
|
|
668
|
+
{ name = "rich" },
|
|
669
|
+
{ name = "tomli" },
|
|
670
|
+
{ name = "tomli-w" },
|
|
671
|
+
]
|
|
672
|
+
sdist = { url = "https://files.pythonhosted.org/packages/bd/89/0e999b413facab81c33d118f3ac3739fd02c0622ccf7c4e82e37cebd8447/pip_audit-2.10.0.tar.gz", hash = "sha256:427ea5bf61d1d06b98b1ae29b7feacc00288a2eced52c9c58ceed5253ef6c2a4", size = 53776, upload-time = "2025-12-01T23:42:40.612Z" }
|
|
673
|
+
wheels = [
|
|
674
|
+
{ url = "https://files.pythonhosted.org/packages/be/f3/4888f895c02afa085630a3a3329d1b18b998874642ad4c530e9a4d7851fe/pip_audit-2.10.0-py3-none-any.whl", hash = "sha256:16e02093872fac97580303f0848fa3ad64f7ecf600736ea7835a2b24de49613f", size = 61518, upload-time = "2025-12-01T23:42:39.193Z" },
|
|
675
|
+
]
|
|
676
|
+
|
|
677
|
+
[[package]]
|
|
678
|
+
name = "pip-requirements-parser"
|
|
679
|
+
version = "32.0.1"
|
|
680
|
+
source = { registry = "https://pypi.org/simple" }
|
|
681
|
+
dependencies = [
|
|
682
|
+
{ name = "packaging" },
|
|
683
|
+
{ name = "pyparsing" },
|
|
684
|
+
]
|
|
685
|
+
sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359, upload-time = "2022-12-21T15:25:22.732Z" }
|
|
686
|
+
wheels = [
|
|
687
|
+
{ url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648, upload-time = "2022-12-21T15:25:21.046Z" },
|
|
688
|
+
]
|
|
689
|
+
|
|
385
690
|
[[package]]
|
|
386
691
|
name = "platformdirs"
|
|
387
692
|
version = "4.5.1"
|
|
@@ -419,6 +724,18 @@ wheels = [
|
|
|
419
724
|
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
|
|
420
725
|
]
|
|
421
726
|
|
|
727
|
+
[[package]]
|
|
728
|
+
name = "py-serializable"
|
|
729
|
+
version = "2.1.0"
|
|
730
|
+
source = { registry = "https://pypi.org/simple" }
|
|
731
|
+
dependencies = [
|
|
732
|
+
{ name = "defusedxml" },
|
|
733
|
+
]
|
|
734
|
+
sdist = { url = "https://files.pythonhosted.org/packages/73/21/d250cfca8ff30c2e5a7447bc13861541126ce9bd4426cd5d0c9f08b5547d/py_serializable-2.1.0.tar.gz", hash = "sha256:9d5db56154a867a9b897c0163b33a793c804c80cee984116d02d49e4578fc103", size = 52368, upload-time = "2025-07-21T09:56:48.07Z" }
|
|
735
|
+
wheels = [
|
|
736
|
+
{ url = "https://files.pythonhosted.org/packages/9b/bf/7595e817906a29453ba4d99394e781b6fabe55d21f3c15d240f85dd06bb1/py_serializable-2.1.0-py3-none-any.whl", hash = "sha256:b56d5d686b5a03ba4f4db5e769dc32336e142fc3bd4d68a8c25579ebb0a67304", size = 23045, upload-time = "2025-07-21T09:56:46.848Z" },
|
|
737
|
+
]
|
|
738
|
+
|
|
422
739
|
[[package]]
|
|
423
740
|
name = "pyee"
|
|
424
741
|
version = "13.0.0"
|
|
@@ -440,6 +757,15 @@ wheels = [
|
|
|
440
757
|
{ url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
|
|
441
758
|
]
|
|
442
759
|
|
|
760
|
+
[[package]]
|
|
761
|
+
name = "pyparsing"
|
|
762
|
+
version = "3.3.1"
|
|
763
|
+
source = { registry = "https://pypi.org/simple" }
|
|
764
|
+
sdist = { url = "https://files.pythonhosted.org/packages/33/c1/1d9de9aeaa1b89b0186e5fe23294ff6517fce1bc69149185577cd31016b2/pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c", size = 1550512, upload-time = "2025-12-23T03:14:04.391Z" }
|
|
765
|
+
wheels = [
|
|
766
|
+
{ url = "https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82", size = 121793, upload-time = "2025-12-23T03:14:02.103Z" },
|
|
767
|
+
]
|
|
768
|
+
|
|
443
769
|
[[package]]
|
|
444
770
|
name = "pytest"
|
|
445
771
|
version = "9.0.2"
|
|
@@ -495,10 +821,11 @@ wheels = [
|
|
|
495
821
|
|
|
496
822
|
[[package]]
|
|
497
823
|
name = "ralph-py-cli"
|
|
498
|
-
version = "0.
|
|
824
|
+
version = "0.4.2"
|
|
499
825
|
source = { editable = "." }
|
|
500
826
|
dependencies = [
|
|
501
827
|
{ name = "pandas" },
|
|
828
|
+
{ name = "pip-audit" },
|
|
502
829
|
{ name = "playwright" },
|
|
503
830
|
{ name = "textual" },
|
|
504
831
|
{ name = "typer" },
|
|
@@ -513,6 +840,7 @@ dev = [
|
|
|
513
840
|
[package.metadata]
|
|
514
841
|
requires-dist = [
|
|
515
842
|
{ name = "pandas", specifier = ">=2.3.3" },
|
|
843
|
+
{ name = "pip-audit", specifier = ">=2.10.0" },
|
|
516
844
|
{ name = "playwright", specifier = ">=1.57.0" },
|
|
517
845
|
{ name = "textual", specifier = ">=0.50.0" },
|
|
518
846
|
{ name = "typer", specifier = ">=0.12.0" },
|
|
@@ -524,6 +852,21 @@ dev = [
|
|
|
524
852
|
{ name = "pytest-asyncio", specifier = ">=0.23.0" },
|
|
525
853
|
]
|
|
526
854
|
|
|
855
|
+
[[package]]
|
|
856
|
+
name = "requests"
|
|
857
|
+
version = "2.32.5"
|
|
858
|
+
source = { registry = "https://pypi.org/simple" }
|
|
859
|
+
dependencies = [
|
|
860
|
+
{ name = "certifi" },
|
|
861
|
+
{ name = "charset-normalizer" },
|
|
862
|
+
{ name = "idna" },
|
|
863
|
+
{ name = "urllib3" },
|
|
864
|
+
]
|
|
865
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
|
|
866
|
+
wheels = [
|
|
867
|
+
{ url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
|
|
868
|
+
]
|
|
869
|
+
|
|
527
870
|
[[package]]
|
|
528
871
|
name = "rich"
|
|
529
872
|
version = "14.2.0"
|
|
@@ -555,6 +898,15 @@ wheels = [
|
|
|
555
898
|
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
|
|
556
899
|
]
|
|
557
900
|
|
|
901
|
+
[[package]]
|
|
902
|
+
name = "sortedcontainers"
|
|
903
|
+
version = "2.4.0"
|
|
904
|
+
source = { registry = "https://pypi.org/simple" }
|
|
905
|
+
sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" }
|
|
906
|
+
wheels = [
|
|
907
|
+
{ url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" },
|
|
908
|
+
]
|
|
909
|
+
|
|
558
910
|
[[package]]
|
|
559
911
|
name = "textual"
|
|
560
912
|
version = "7.3.0"
|
|
@@ -626,6 +978,15 @@ wheels = [
|
|
|
626
978
|
{ url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" },
|
|
627
979
|
]
|
|
628
980
|
|
|
981
|
+
[[package]]
|
|
982
|
+
name = "tomli-w"
|
|
983
|
+
version = "1.2.0"
|
|
984
|
+
source = { registry = "https://pypi.org/simple" }
|
|
985
|
+
sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" }
|
|
986
|
+
wheels = [
|
|
987
|
+
{ url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" },
|
|
988
|
+
]
|
|
989
|
+
|
|
629
990
|
[[package]]
|
|
630
991
|
name = "typer"
|
|
631
992
|
version = "0.21.1"
|
|
@@ -667,3 +1028,12 @@ sdist = { url = "https://files.pythonhosted.org/packages/91/7a/146a99696aee0609e
|
|
|
667
1028
|
wheels = [
|
|
668
1029
|
{ url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229, upload-time = "2024-02-09T16:52:00.371Z" },
|
|
669
1030
|
]
|
|
1031
|
+
|
|
1032
|
+
[[package]]
|
|
1033
|
+
name = "urllib3"
|
|
1034
|
+
version = "2.6.3"
|
|
1035
|
+
source = { registry = "https://pypi.org/simple" }
|
|
1036
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
|
|
1037
|
+
wheels = [
|
|
1038
|
+
{ url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
|
|
1039
|
+
]
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|