podojo-cli 0.8.2__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/CHANGELOG.md +10 -0
  2. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/CLAUDE.md +0 -2
  3. podojo_cli-0.9.0/PKG-INFO +145 -0
  4. podojo_cli-0.9.0/README.md +115 -0
  5. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/pyproject.toml +1 -3
  6. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/main.py +0 -2
  7. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/uv.lock +1 -276
  8. podojo_cli-0.8.2/PKG-INFO +0 -47
  9. podojo_cli-0.8.2/README.md +0 -15
  10. podojo_cli-0.8.2/src/podojo_cli/commands/gdrive.py +0 -51
  11. podojo_cli-0.8.2/src/podojo_cli/gdrive/list.py +0 -20
  12. podojo_cli-0.8.2/src/podojo_cli/gdrive/upload.py +0 -56
  13. podojo_cli-0.8.2/src/podojo_cli/video/__init__.py +0 -0
  14. podojo_cli-0.8.2/tests/test_gdrive.py +0 -81
  15. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/.github/workflows/publish.yml +0 -0
  16. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/.gitignore +0 -0
  17. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/__init__.py +0 -0
  18. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/client.py +0 -0
  19. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/__init__.py +0 -0
  20. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/auth.py +0 -0
  21. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/interviews.py +0 -0
  22. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/projects.py +0 -0
  23. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/showreel.py +0 -0
  24. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/synth.py +0 -0
  25. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/transcripts.py +0 -0
  26. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/usertests.py +0 -0
  27. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/commands/videos.py +0 -0
  28. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/config.py +0 -0
  29. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/synth/__init__.py +0 -0
  30. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/synth/driver.py +0 -0
  31. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/synth/session.py +0 -0
  32. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/version_check.py +0 -0
  33. {podojo_cli-0.8.2/src/podojo_cli/gdrive → podojo_cli-0.9.0/src/podojo_cli/video}/__init__.py +0 -0
  34. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/src/podojo_cli/video/showreel.py +0 -0
  35. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/tests/conftest.py +0 -0
  36. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/tests/test_auth.py +0 -0
  37. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/tests/test_interviews.py +0 -0
  38. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/tests/test_projects.py +0 -0
  39. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/tests/test_showreel.py +0 -0
  40. {podojo_cli-0.8.2 → podojo_cli-0.9.0}/tests/test_usertests.py +0 -0
@@ -5,6 +5,16 @@ All notable changes to the Podojo CLI will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org).
7
7
 
8
+ ## [0.9.0] - 2026-05-14
9
+
10
+ ### Removed
11
+ - `gdrive` command group (upload/list). The Google Drive integration was unused; this also drops the `google-auth` and `google-api-python-client` dependencies.
12
+
13
+ ## [0.8.3] - 2026-05-14
14
+
15
+ ### Changed
16
+ - Expanded the README with a full command reference, authentication/config docs, and setup notes for the `showreel` and `synth` extras.
17
+
8
18
  ## [0.8.2] - 2026-05-14
9
19
 
10
20
  ### Changed
@@ -21,8 +21,6 @@ podojo transcripts download <project> <batch_id> -o output.txt
21
21
  podojo videos list <project>
22
22
  podojo videos download <batch_id> -o output.mp4
23
23
  podojo showreel create clips.json -o showreel.mp4
24
- podojo gdrive setup ~/.podojo-gdrive.json
25
- podojo gdrive upload report.md --title "My Report"
26
24
  ```
27
25
 
28
26
  ## User Tests (Unmoderated Tests)
@@ -0,0 +1,145 @@
1
+ Metadata-Version: 2.4
2
+ Name: podojo-cli
3
+ Version: 0.9.0
4
+ Summary: CLI for the Podojo user research platform
5
+ Project-URL: Homepage, https://github.com/podojo/cli-podojo
6
+ Project-URL: Source, https://github.com/podojo/cli-podojo
7
+ Project-URL: Issues, https://github.com/podojo/cli-podojo/issues
8
+ Project-URL: Changelog, https://github.com/podojo/cli-podojo/blob/main/CHANGELOG.md
9
+ Author-email: Jochen Ade <jochen.ade@podojo.com>
10
+ License-Expression: MIT
11
+ Keywords: cli,podojo,transcripts,user-research,ux-research
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: End Users/Desktop
15
+ Classifier: Intended Audience :: Other Audience
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Utilities
21
+ Requires-Python: >=3.12
22
+ Requires-Dist: httpx>=0.28
23
+ Requires-Dist: keyring>=25.0
24
+ Requires-Dist: pyyaml>=6.0
25
+ Requires-Dist: rich>=13.0
26
+ Requires-Dist: typer>=0.15
27
+ Provides-Extra: synth
28
+ Requires-Dist: playwright>=1.40; extra == 'synth'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # podojo-cli
32
+
33
+ Command-line tool for the [Podojo](https://podojo.com) user research platform.
34
+
35
+ `podojo` lets UX researchers manage projects, upload and transcribe interviews,
36
+ build unmoderated user tests, download research videos, cut showreels, and run
37
+ synthetic test participants — all without leaving the terminal.
38
+
39
+ ## Installation
40
+
41
+ ```bash
42
+ uv tool install podojo-cli
43
+ ```
44
+
45
+ Or with pip:
46
+
47
+ ```bash
48
+ pip install podojo-cli
49
+ ```
50
+
51
+ Requires Python 3.12+. Some commands need extra tooling:
52
+
53
+ - `showreel` requires [`ffmpeg`](https://ffmpeg.org/) on your `PATH` (`brew install ffmpeg`).
54
+ - `synth` requires the optional `synth` extra: `pip install 'podojo-cli[synth]'` then `playwright install chromium`.
55
+
56
+ ## Authentication
57
+
58
+ Log in once with your Podojo API key — it's stored in your system keychain:
59
+
60
+ ```bash
61
+ podojo auth login # prompts for the key
62
+ podojo auth login --key XXX # or pass it directly
63
+ podojo auth logout # remove the stored key
64
+ ```
65
+
66
+ Configuration is read from, in order of precedence:
67
+
68
+ 1. Environment variables — `PODOJO_API_KEY`, `PODOJO_BASE_URL`
69
+ 2. `~/.podojo.toml`
70
+ 3. The system keyring (set by `podojo auth login`)
71
+
72
+ ## Usage
73
+
74
+ ```bash
75
+ podojo --help # top-level help
76
+ podojo <group> --help # help for a command group
77
+ ```
78
+
79
+ ### Projects
80
+
81
+ ```bash
82
+ podojo projects list
83
+ podojo projects create "Checkout Redesign" --brief "Q1 usability study"
84
+ podojo projects upload-doc "Checkout Redesign" brief.md --type brief
85
+ podojo projects get-doc "Checkout Redesign" --type final -o final-report.md
86
+ ```
87
+
88
+ `upload-doc` accepts `brief` and `final` document types; `get-doc` also supports
89
+ `agent`. Embedded images are stripped from markdown before upload.
90
+
91
+ ### Interviews & transcripts
92
+
93
+ ```bash
94
+ podojo interviews upload session-03.mp4 --project "Checkout Redesign"
95
+ podojo transcripts list "Checkout Redesign"
96
+ podojo transcripts download "Checkout Redesign" <batch-id> -o transcript.txt
97
+ ```
98
+
99
+ ### Videos & showreels
100
+
101
+ ```bash
102
+ podojo videos list "Checkout Redesign"
103
+ podojo videos download <batch-id> -o clip.mp4
104
+ podojo showreel create clips.json -o showreel.mp4
105
+ ```
106
+
107
+ The showreel `clips.json` is a list of clips, each with `batch_id`,
108
+ `participant`, `country`, `topic`, `start`, and `end` (`MM:SS` or `HH:MM:SS`).
109
+ Each clip gets an auto-generated title card.
110
+
111
+ ### Unmoderated user tests
112
+
113
+ ```bash
114
+ podojo usertests example > my-test.yaml # print a template to start from
115
+ podojo usertests validate my-test.yaml # check it without creating
116
+ podojo usertests create -f my-test.yaml
117
+ podojo usertests list
118
+ podojo usertests get checkout-usability-v1
119
+ podojo usertests update checkout-usability-v1 -f changes.yaml
120
+ podojo usertests delete checkout-usability-v1
121
+ podojo usertests snippet # recorder script for self-hosted prototypes
122
+ ```
123
+
124
+ ### Synthetic participants
125
+
126
+ The `synth` group drives a Playwright browser through a user test preview so an
127
+ agent (e.g. Claude Code) can act as a synthetic participant:
128
+
129
+ ```bash
130
+ podojo synth start checkout-usability-v1 # or a preview URL
131
+ podojo synth state
132
+ podojo synth click "Get Started"
133
+ podojo synth fill "#answer" "It felt slow"
134
+ podojo synth advance
135
+ podojo synth stop
136
+ ```
137
+
138
+ ## Links
139
+
140
+ - [Source & issues](https://github.com/podojo/cli-podojo)
141
+ - [Changelog](https://github.com/podojo/cli-podojo/blob/main/CHANGELOG.md)
142
+
143
+ ## License
144
+
145
+ MIT
@@ -0,0 +1,115 @@
1
+ # podojo-cli
2
+
3
+ Command-line tool for the [Podojo](https://podojo.com) user research platform.
4
+
5
+ `podojo` lets UX researchers manage projects, upload and transcribe interviews,
6
+ build unmoderated user tests, download research videos, cut showreels, and run
7
+ synthetic test participants — all without leaving the terminal.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ uv tool install podojo-cli
13
+ ```
14
+
15
+ Or with pip:
16
+
17
+ ```bash
18
+ pip install podojo-cli
19
+ ```
20
+
21
+ Requires Python 3.12+. Some commands need extra tooling:
22
+
23
+ - `showreel` requires [`ffmpeg`](https://ffmpeg.org/) on your `PATH` (`brew install ffmpeg`).
24
+ - `synth` requires the optional `synth` extra: `pip install 'podojo-cli[synth]'` then `playwright install chromium`.
25
+
26
+ ## Authentication
27
+
28
+ Log in once with your Podojo API key — it's stored in your system keychain:
29
+
30
+ ```bash
31
+ podojo auth login # prompts for the key
32
+ podojo auth login --key XXX # or pass it directly
33
+ podojo auth logout # remove the stored key
34
+ ```
35
+
36
+ Configuration is read from, in order of precedence:
37
+
38
+ 1. Environment variables — `PODOJO_API_KEY`, `PODOJO_BASE_URL`
39
+ 2. `~/.podojo.toml`
40
+ 3. The system keyring (set by `podojo auth login`)
41
+
42
+ ## Usage
43
+
44
+ ```bash
45
+ podojo --help # top-level help
46
+ podojo <group> --help # help for a command group
47
+ ```
48
+
49
+ ### Projects
50
+
51
+ ```bash
52
+ podojo projects list
53
+ podojo projects create "Checkout Redesign" --brief "Q1 usability study"
54
+ podojo projects upload-doc "Checkout Redesign" brief.md --type brief
55
+ podojo projects get-doc "Checkout Redesign" --type final -o final-report.md
56
+ ```
57
+
58
+ `upload-doc` accepts `brief` and `final` document types; `get-doc` also supports
59
+ `agent`. Embedded images are stripped from markdown before upload.
60
+
61
+ ### Interviews & transcripts
62
+
63
+ ```bash
64
+ podojo interviews upload session-03.mp4 --project "Checkout Redesign"
65
+ podojo transcripts list "Checkout Redesign"
66
+ podojo transcripts download "Checkout Redesign" <batch-id> -o transcript.txt
67
+ ```
68
+
69
+ ### Videos & showreels
70
+
71
+ ```bash
72
+ podojo videos list "Checkout Redesign"
73
+ podojo videos download <batch-id> -o clip.mp4
74
+ podojo showreel create clips.json -o showreel.mp4
75
+ ```
76
+
77
+ The showreel `clips.json` is a list of clips, each with `batch_id`,
78
+ `participant`, `country`, `topic`, `start`, and `end` (`MM:SS` or `HH:MM:SS`).
79
+ Each clip gets an auto-generated title card.
80
+
81
+ ### Unmoderated user tests
82
+
83
+ ```bash
84
+ podojo usertests example > my-test.yaml # print a template to start from
85
+ podojo usertests validate my-test.yaml # check it without creating
86
+ podojo usertests create -f my-test.yaml
87
+ podojo usertests list
88
+ podojo usertests get checkout-usability-v1
89
+ podojo usertests update checkout-usability-v1 -f changes.yaml
90
+ podojo usertests delete checkout-usability-v1
91
+ podojo usertests snippet # recorder script for self-hosted prototypes
92
+ ```
93
+
94
+ ### Synthetic participants
95
+
96
+ The `synth` group drives a Playwright browser through a user test preview so an
97
+ agent (e.g. Claude Code) can act as a synthetic participant:
98
+
99
+ ```bash
100
+ podojo synth start checkout-usability-v1 # or a preview URL
101
+ podojo synth state
102
+ podojo synth click "Get Started"
103
+ podojo synth fill "#answer" "It felt slow"
104
+ podojo synth advance
105
+ podojo synth stop
106
+ ```
107
+
108
+ ## Links
109
+
110
+ - [Source & issues](https://github.com/podojo/cli-podojo)
111
+ - [Changelog](https://github.com/podojo/cli-podojo/blob/main/CHANGELOG.md)
112
+
113
+ ## License
114
+
115
+ MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "podojo-cli"
3
- version = "0.8.2"
3
+ version = "0.9.0"
4
4
  description = "CLI for the Podojo user research platform"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -23,8 +23,6 @@ dependencies = [
23
23
  "httpx>=0.28",
24
24
  "rich>=13.0",
25
25
  "pyyaml>=6.0",
26
- "google-auth>=2.0",
27
- "google-api-python-client>=2.0",
28
26
  "keyring>=25.0",
29
27
  ]
30
28
 
@@ -2,7 +2,6 @@ import typer
2
2
 
3
3
  from .commands import (
4
4
  auth,
5
- gdrive,
6
5
  interviews,
7
6
  projects,
8
7
  showreel,
@@ -33,7 +32,6 @@ app.add_typer(synth.app, name="synth")
33
32
  app.add_typer(transcripts.app, name="transcripts")
34
33
  app.add_typer(videos.app, name="videos")
35
34
  app.add_typer(showreel.app, name="showreel")
36
- app.add_typer(gdrive.app, name="gdrive")
37
35
 
38
36
  if __name__ == "__main__":
39
37
  app()
@@ -46,8 +46,6 @@ dependencies = [
46
46
  ]
47
47
  sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
48
48
  wheels = [
49
- { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" },
50
- { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" },
51
49
  { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" },
52
50
  { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" },
53
51
  { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" },
@@ -55,11 +53,6 @@ wheels = [
55
53
  { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" },
56
54
  { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" },
57
55
  { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" },
58
- { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
59
- { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
60
- { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
61
- { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
62
- { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
63
56
  { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
64
57
  { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
65
58
  { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
@@ -67,88 +60,18 @@ wheels = [
67
60
  { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
68
61
  { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
69
62
  { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
70
- { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
71
- { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
72
- { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
73
- { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
74
- { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
75
63
  { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
76
64
  { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
77
65
  { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
78
66
  { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
79
67
  { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
80
68
  { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
81
- { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
82
- { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
83
- { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
84
- { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
85
- { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
86
69
  { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
87
70
  { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
88
71
  { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
89
72
  { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
90
73
  { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
91
74
  { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
92
- { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
93
- { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
94
- { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
95
- ]
96
-
97
- [[package]]
98
- name = "charset-normalizer"
99
- version = "3.4.5"
100
- source = { registry = "https://pypi.org/simple" }
101
- sdist = { url = "https://files.pythonhosted.org/packages/1d/35/02daf95b9cd686320bb622eb148792655c9412dbb9b67abb5694e5910a24/charset_normalizer-3.4.5.tar.gz", hash = "sha256:95adae7b6c42a6c5b5b559b1a99149f090a57128155daeea91732c8d970d8644", size = 134804, upload-time = "2026-03-06T06:03:19.46Z" }
102
- wheels = [
103
- { url = "https://files.pythonhosted.org/packages/9c/b6/9ee9c1a608916ca5feae81a344dffbaa53b26b90be58cc2159e3332d44ec/charset_normalizer-3.4.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed97c282ee4f994ef814042423a529df9497e3c666dca19be1d4cd1129dc7ade", size = 280976, upload-time = "2026-03-06T06:01:15.276Z" },
104
- { url = "https://files.pythonhosted.org/packages/f8/d8/a54f7c0b96f1df3563e9190f04daf981e365a9b397eedfdfb5dbef7e5c6c/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0294916d6ccf2d069727d65973c3a1ca477d68708db25fd758dd28b0827cff54", size = 189356, upload-time = "2026-03-06T06:01:16.511Z" },
105
- { url = "https://files.pythonhosted.org/packages/42/69/2bf7f76ce1446759a5787cb87d38f6a61eb47dbbdf035cfebf6347292a65/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dc57a0baa3eeedd99fafaef7511b5a6ef4581494e8168ee086031744e2679467", size = 206369, upload-time = "2026-03-06T06:01:17.853Z" },
106
- { url = "https://files.pythonhosted.org/packages/10/9c/949d1a46dab56b959d9a87272482195f1840b515a3380e39986989a893ae/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ed1a9a204f317ef879b32f9af507d47e49cd5e7f8e8d5d96358c98373314fc60", size = 203285, upload-time = "2026-03-06T06:01:19.473Z" },
107
- { url = "https://files.pythonhosted.org/packages/67/5c/ae30362a88b4da237d71ea214a8c7eb915db3eec941adda511729ac25fa2/charset_normalizer-3.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad83b8f9379176c841f8865884f3514d905bcd2a9a3b210eaa446e7d2223e4d", size = 196274, upload-time = "2026-03-06T06:01:20.728Z" },
108
- { url = "https://files.pythonhosted.org/packages/b2/07/c9f2cb0e46cb6d64fdcc4f95953747b843bb2181bda678dc4e699b8f0f9a/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:a118e2e0b5ae6b0120d5efa5f866e58f2bb826067a646431da4d6a2bdae7950e", size = 184715, upload-time = "2026-03-06T06:01:22.194Z" },
109
- { url = "https://files.pythonhosted.org/packages/36/64/6b0ca95c44fddf692cd06d642b28f63009d0ce325fad6e9b2b4d0ef86a52/charset_normalizer-3.4.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:754f96058e61a5e22e91483f823e07df16416ce76afa4ebf306f8e1d1296d43f", size = 193426, upload-time = "2026-03-06T06:01:23.795Z" },
110
- { url = "https://files.pythonhosted.org/packages/50/bc/a730690d726403743795ca3f5bb2baf67838c5fea78236098f324b965e40/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c300cefd9b0970381a46394902cd18eaf2aa00163f999590ace991989dcd0fc", size = 191780, upload-time = "2026-03-06T06:01:25.053Z" },
111
- { url = "https://files.pythonhosted.org/packages/97/4f/6c0bc9af68222b22951552d73df4532b5be6447cee32d58e7e8c74ecbb7b/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c108f8619e504140569ee7de3f97d234f0fbae338a7f9f360455071ef9855a95", size = 185805, upload-time = "2026-03-06T06:01:26.294Z" },
112
- { url = "https://files.pythonhosted.org/packages/dd/b9/a523fb9b0ee90814b503452b2600e4cbc118cd68714d57041564886e7325/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d1028de43596a315e2720a9849ee79007ab742c06ad8b45a50db8cdb7ed4a82a", size = 208342, upload-time = "2026-03-06T06:01:27.55Z" },
113
- { url = "https://files.pythonhosted.org/packages/4d/61/c59e761dee4464050713e50e27b58266cc8e209e518c0b378c1580c959ba/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:19092dde50335accf365cce21998a1c6dd8eafd42c7b226eb54b2747cdce2fac", size = 193661, upload-time = "2026-03-06T06:01:29.051Z" },
114
- { url = "https://files.pythonhosted.org/packages/1c/43/729fa30aad69783f755c5ad8649da17ee095311ca42024742701e202dc59/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4354e401eb6dab9aed3c7b4030514328a6c748d05e1c3e19175008ca7de84fb1", size = 204819, upload-time = "2026-03-06T06:01:30.298Z" },
115
- { url = "https://files.pythonhosted.org/packages/87/33/d9b442ce5a91b96fc0840455a9e49a611bbadae6122778d0a6a79683dd31/charset_normalizer-3.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a68766a3c58fde7f9aaa22b3786276f62ab2f594efb02d0a1421b6282e852e98", size = 198080, upload-time = "2026-03-06T06:01:31.478Z" },
116
- { url = "https://files.pythonhosted.org/packages/56/5a/b8b5a23134978ee9885cee2d6995f4c27cc41f9baded0a9685eabc5338f0/charset_normalizer-3.4.5-cp312-cp312-win32.whl", hash = "sha256:1827734a5b308b65ac54e86a618de66f935a4f63a8a462ff1e19a6788d6c2262", size = 132630, upload-time = "2026-03-06T06:01:33.056Z" },
117
- { url = "https://files.pythonhosted.org/packages/70/53/e44a4c07e8904500aec95865dc3f6464dc3586a039ef0df606eb3ac38e35/charset_normalizer-3.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:728c6a963dfab66ef865f49286e45239384249672cd598576765acc2a640a636", size = 142856, upload-time = "2026-03-06T06:01:34.489Z" },
118
- { url = "https://files.pythonhosted.org/packages/ea/aa/c5628f7cad591b1cf45790b7a61483c3e36cf41349c98af7813c483fd6e8/charset_normalizer-3.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:75dfd1afe0b1647449e852f4fb428195a7ed0588947218f7ba929f6538487f02", size = 132982, upload-time = "2026-03-06T06:01:35.641Z" },
119
- { url = "https://files.pythonhosted.org/packages/f5/48/9f34ec4bb24aa3fdba1890c1bddb97c8a4be1bd84ef5c42ac2352563ad05/charset_normalizer-3.4.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ac59c15e3f1465f722607800c68713f9fbc2f672b9eb649fe831da4019ae9b23", size = 280788, upload-time = "2026-03-06T06:01:37.126Z" },
120
- { url = "https://files.pythonhosted.org/packages/0e/09/6003e7ffeb90cc0560da893e3208396a44c210c5ee42efff539639def59b/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:165c7b21d19365464e8f70e5ce5e12524c58b48c78c1f5a57524603c1ab003f8", size = 188890, upload-time = "2026-03-06T06:01:38.73Z" },
121
- { url = "https://files.pythonhosted.org/packages/42/1e/02706edf19e390680daa694d17e2b8eab4b5f7ac285e2a51168b4b22ee6b/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:28269983f25a4da0425743d0d257a2d6921ea7d9b83599d4039486ec5b9f911d", size = 206136, upload-time = "2026-03-06T06:01:40.016Z" },
122
- { url = "https://files.pythonhosted.org/packages/c7/87/942c3def1b37baf3cf786bad01249190f3ca3d5e63a84f831e704977de1f/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d27ce22ec453564770d29d03a9506d449efbb9fa13c00842262b2f6801c48cce", size = 202551, upload-time = "2026-03-06T06:01:41.522Z" },
123
- { url = "https://files.pythonhosted.org/packages/94/0a/af49691938dfe175d71b8a929bd7e4ace2809c0c5134e28bc535660d5262/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0625665e4ebdddb553ab185de5db7054393af8879fb0c87bd5690d14379d6819", size = 195572, upload-time = "2026-03-06T06:01:43.208Z" },
124
- { url = "https://files.pythonhosted.org/packages/20/ea/dfb1792a8050a8e694cfbde1570ff97ff74e48afd874152d38163d1df9ae/charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:c23eb3263356d94858655b3e63f85ac5d50970c6e8febcdde7830209139cc37d", size = 184438, upload-time = "2026-03-06T06:01:44.755Z" },
125
- { url = "https://files.pythonhosted.org/packages/72/12/c281e2067466e3ddd0595bfaea58a6946765ace5c72dfa3edc2f5f118026/charset_normalizer-3.4.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e6302ca4ae283deb0af68d2fbf467474b8b6aedcd3dab4db187e07f94c109763", size = 193035, upload-time = "2026-03-06T06:01:46.051Z" },
126
- { url = "https://files.pythonhosted.org/packages/ba/4f/3792c056e7708e10464bad0438a44708886fb8f92e3c3d29ec5e2d964d42/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e51ae7d81c825761d941962450f50d041db028b7278e7b08930b4541b3e45cb9", size = 191340, upload-time = "2026-03-06T06:01:47.547Z" },
127
- { url = "https://files.pythonhosted.org/packages/e7/86/80ddba897127b5c7a9bccc481b0cd36c8fefa485d113262f0fe4332f0bf4/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:597d10dec876923e5c59e48dbd366e852eacb2b806029491d307daea6b917d7c", size = 185464, upload-time = "2026-03-06T06:01:48.764Z" },
128
- { url = "https://files.pythonhosted.org/packages/4d/00/b5eff85ba198faacab83e0e4b6f0648155f072278e3b392a82478f8b988b/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5cffde4032a197bd3b42fd0b9509ec60fb70918d6970e4cc773f20fc9180ca67", size = 208014, upload-time = "2026-03-06T06:01:50.371Z" },
129
- { url = "https://files.pythonhosted.org/packages/c8/11/d36f70be01597fd30850dde8a1269ebc8efadd23ba5785808454f2389bde/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2da4eedcb6338e2321e831a0165759c0c620e37f8cd044a263ff67493be8ffb3", size = 193297, upload-time = "2026-03-06T06:01:51.933Z" },
130
- { url = "https://files.pythonhosted.org/packages/1a/1d/259eb0a53d4910536c7c2abb9cb25f4153548efb42800c6a9456764649c0/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:65a126fb4b070d05340a84fc709dd9e7c75d9b063b610ece8a60197a291d0adf", size = 204321, upload-time = "2026-03-06T06:01:53.887Z" },
131
- { url = "https://files.pythonhosted.org/packages/84/31/faa6c5b9d3688715e1ed1bb9d124c384fe2fc1633a409e503ffe1c6398c1/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7a80a9242963416bd81f99349d5f3fce1843c303bd404f204918b6d75a75fd6", size = 197509, upload-time = "2026-03-06T06:01:56.439Z" },
132
- { url = "https://files.pythonhosted.org/packages/fd/a5/c7d9dd1503ffc08950b3260f5d39ec2366dd08254f0900ecbcf3a6197c7c/charset_normalizer-3.4.5-cp313-cp313-win32.whl", hash = "sha256:f1d725b754e967e648046f00c4facc42d414840f5ccc670c5670f59f83693e4f", size = 132284, upload-time = "2026-03-06T06:01:57.812Z" },
133
- { url = "https://files.pythonhosted.org/packages/b9/0f/57072b253af40c8aa6636e6de7d75985624c1eb392815b2f934199340a89/charset_normalizer-3.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:e37bd100d2c5d3ba35db9c7c5ba5a9228cbcffe5c4778dc824b164e5257813d7", size = 142630, upload-time = "2026-03-06T06:01:59.062Z" },
134
- { url = "https://files.pythonhosted.org/packages/31/41/1c4b7cc9f13bd9d369ce3bc993e13d374ce25fa38a2663644283ecf422c1/charset_normalizer-3.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:93b3b2cc5cf1b8743660ce77a4f45f3f6d1172068207c1defc779a36eea6bb36", size = 133254, upload-time = "2026-03-06T06:02:00.281Z" },
135
- { url = "https://files.pythonhosted.org/packages/43/be/0f0fd9bb4a7fa4fb5067fb7d9ac693d4e928d306f80a0d02bde43a7c4aee/charset_normalizer-3.4.5-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8197abe5ca1ffb7d91e78360f915eef5addff270f8a71c1fc5be24a56f3e4873", size = 280232, upload-time = "2026-03-06T06:02:01.508Z" },
136
- { url = "https://files.pythonhosted.org/packages/28/02/983b5445e4bef49cd8c9da73a8e029f0825f39b74a06d201bfaa2e55142a/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2aecdb364b8a1802afdc7f9327d55dad5366bc97d8502d0f5854e50712dbc5f", size = 189688, upload-time = "2026-03-06T06:02:02.857Z" },
137
- { url = "https://files.pythonhosted.org/packages/d0/88/152745c5166437687028027dc080e2daed6fe11cfa95a22f4602591c42db/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a66aa5022bf81ab4b1bebfb009db4fd68e0c6d4307a1ce5ef6a26e5878dfc9e4", size = 206833, upload-time = "2026-03-06T06:02:05.127Z" },
138
- { url = "https://files.pythonhosted.org/packages/cb/0f/ebc15c8b02af2f19be9678d6eed115feeeccc45ce1f4b098d986c13e8769/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d77f97e515688bd615c1d1f795d540f32542d514242067adcb8ef532504cb9ee", size = 202879, upload-time = "2026-03-06T06:02:06.446Z" },
139
- { url = "https://files.pythonhosted.org/packages/38/9c/71336bff6934418dc8d1e8a1644176ac9088068bc571da612767619c97b3/charset_normalizer-3.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01a1ed54b953303ca7e310fafe0fe347aab348bd81834a0bcd602eb538f89d66", size = 195764, upload-time = "2026-03-06T06:02:08.763Z" },
140
- { url = "https://files.pythonhosted.org/packages/b7/95/ce92fde4f98615661871bc282a856cf9b8a15f686ba0af012984660d480b/charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:b2d37d78297b39a9eb9eb92c0f6df98c706467282055419df141389b23f93362", size = 183728, upload-time = "2026-03-06T06:02:10.137Z" },
141
- { url = "https://files.pythonhosted.org/packages/1c/e7/f5b4588d94e747ce45ae680f0f242bc2d98dbd4eccfab73e6160b6893893/charset_normalizer-3.4.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e71bbb595973622b817c042bd943c3f3667e9c9983ce3d205f973f486fec98a7", size = 192937, upload-time = "2026-03-06T06:02:11.663Z" },
142
- { url = "https://files.pythonhosted.org/packages/f9/29/9d94ed6b929bf9f48bf6ede6e7474576499f07c4c5e878fb186083622716/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cd966c2559f501c6fd69294d082c2934c8dd4719deb32c22961a5ac6db0df1d", size = 192040, upload-time = "2026-03-06T06:02:13.489Z" },
143
- { url = "https://files.pythonhosted.org/packages/15/d2/1a093a1cf827957f9445f2fe7298bcc16f8fc5e05c1ed2ad1af0b239035e/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d5e52d127045d6ae01a1e821acfad2f3a1866c54d0e837828538fabe8d9d1bd6", size = 184107, upload-time = "2026-03-06T06:02:14.83Z" },
144
- { url = "https://files.pythonhosted.org/packages/0f/7d/82068ce16bd36135df7b97f6333c5d808b94e01d4599a682e2337ed5fd14/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:30a2b1a48478c3428d047ed9690d57c23038dac838a87ad624c85c0a78ebeb39", size = 208310, upload-time = "2026-03-06T06:02:16.165Z" },
145
- { url = "https://files.pythonhosted.org/packages/84/4e/4dfb52307bb6af4a5c9e73e482d171b81d36f522b21ccd28a49656baa680/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d8ed79b8f6372ca4254955005830fd61c1ccdd8c0fac6603e2c145c61dd95db6", size = 192918, upload-time = "2026-03-06T06:02:18.144Z" },
146
- { url = "https://files.pythonhosted.org/packages/08/a4/159ff7da662cf7201502ca89980b8f06acf3e887b278956646a8aeb178ab/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:c5af897b45fa606b12464ccbe0014bbf8c09191e0a66aab6aa9d5cf6e77e0c94", size = 204615, upload-time = "2026-03-06T06:02:19.821Z" },
147
- { url = "https://files.pythonhosted.org/packages/d6/62/0dd6172203cb6b429ffffc9935001fde42e5250d57f07b0c28c6046deb6b/charset_normalizer-3.4.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1088345bcc93c58d8d8f3d783eca4a6e7a7752bbff26c3eee7e73c597c191c2e", size = 197784, upload-time = "2026-03-06T06:02:21.86Z" },
148
- { url = "https://files.pythonhosted.org/packages/c7/5e/1aab5cb737039b9c59e63627dc8bbc0d02562a14f831cc450e5f91d84ce1/charset_normalizer-3.4.5-cp314-cp314-win32.whl", hash = "sha256:ee57b926940ba00bca7ba7041e665cc956e55ef482f851b9b65acb20d867e7a2", size = 133009, upload-time = "2026-03-06T06:02:23.289Z" },
149
- { url = "https://files.pythonhosted.org/packages/40/65/e7c6c77d7aaa4c0d7974f2e403e17f0ed2cb0fc135f77d686b916bf1eead/charset_normalizer-3.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:4481e6da1830c8a1cc0b746b47f603b653dadb690bcd851d039ffaefe70533aa", size = 143511, upload-time = "2026-03-06T06:02:26.195Z" },
150
- { url = "https://files.pythonhosted.org/packages/ba/91/52b0841c71f152f563b8e072896c14e3d83b195c188b338d3cc2e582d1d4/charset_normalizer-3.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:97ab7787092eb9b50fb47fa04f24c75b768a606af1bcba1957f07f128a7219e4", size = 133775, upload-time = "2026-03-06T06:02:27.473Z" },
151
- { url = "https://files.pythonhosted.org/packages/c5/60/3a621758945513adfd4db86827a5bafcc615f913dbd0b4c2ed64a65731be/charset_normalizer-3.4.5-py3-none-any.whl", hash = "sha256:9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0", size = 55455, upload-time = "2026-03-06T06:03:17.827Z" },
152
75
  ]
153
76
 
154
77
  [[package]]
@@ -181,7 +104,6 @@ dependencies = [
181
104
  ]
182
105
  sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" }
183
106
  wheels = [
184
- { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" },
185
107
  { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" },
186
108
  { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" },
187
109
  { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" },
@@ -193,9 +115,6 @@ wheels = [
193
115
  { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" },
194
116
  { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" },
195
117
  { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" },
196
- { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" },
197
- { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" },
198
- { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" },
199
118
  { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" },
200
119
  { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" },
201
120
  { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" },
@@ -207,9 +126,6 @@ wheels = [
207
126
  { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" },
208
127
  { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" },
209
128
  { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" },
210
- { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" },
211
- { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" },
212
- { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" },
213
129
  { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" },
214
130
  { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" },
215
131
  { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" },
@@ -221,79 +137,6 @@ wheels = [
221
137
  { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" },
222
138
  { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" },
223
139
  { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" },
224
- { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" },
225
- { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" },
226
- ]
227
-
228
- [[package]]
229
- name = "google-api-core"
230
- version = "2.30.0"
231
- source = { registry = "https://pypi.org/simple" }
232
- dependencies = [
233
- { name = "google-auth" },
234
- { name = "googleapis-common-protos" },
235
- { name = "proto-plus" },
236
- { name = "protobuf" },
237
- { name = "requests" },
238
- ]
239
- sdist = { url = "https://files.pythonhosted.org/packages/22/98/586ec94553b569080caef635f98a3723db36a38eac0e3d7eb3ea9d2e4b9a/google_api_core-2.30.0.tar.gz", hash = "sha256:02edfa9fab31e17fc0befb5f161b3bf93c9096d99aed584625f38065c511ad9b", size = 176959, upload-time = "2026-02-18T20:28:11.926Z" }
240
- wheels = [
241
- { url = "https://files.pythonhosted.org/packages/45/27/09c33d67f7e0dcf06d7ac17d196594e66989299374bfb0d4331d1038e76b/google_api_core-2.30.0-py3-none-any.whl", hash = "sha256:80be49ee937ff9aba0fd79a6eddfde35fe658b9953ab9b79c57dd7061afa8df5", size = 173288, upload-time = "2026-02-18T20:28:10.367Z" },
242
- ]
243
-
244
- [[package]]
245
- name = "google-api-python-client"
246
- version = "2.192.0"
247
- source = { registry = "https://pypi.org/simple" }
248
- dependencies = [
249
- { name = "google-api-core" },
250
- { name = "google-auth" },
251
- { name = "google-auth-httplib2" },
252
- { name = "httplib2" },
253
- { name = "uritemplate" },
254
- ]
255
- sdist = { url = "https://files.pythonhosted.org/packages/85/d8/489052a40935e45b9b5b3d6accc14b041360c1507bdc659c2e1a19aaa3ff/google_api_python_client-2.192.0.tar.gz", hash = "sha256:d48cfa6078fadea788425481b007af33fe0ab6537b78f37da914fb6fc112eb27", size = 14209505, upload-time = "2026-03-05T15:17:01.598Z" }
256
- wheels = [
257
- { url = "https://files.pythonhosted.org/packages/e0/76/ec4128f00fefb9011635ae2abc67d7dacd05c8559378f8f05f0c907c38d8/google_api_python_client-2.192.0-py3-none-any.whl", hash = "sha256:63a57d4457cd97df1d63eb89c5fda03c5a50588dcbc32c0115dd1433c08f4b62", size = 14783267, upload-time = "2026-03-05T15:16:58.804Z" },
258
- ]
259
-
260
- [[package]]
261
- name = "google-auth"
262
- version = "2.49.0"
263
- source = { registry = "https://pypi.org/simple" }
264
- dependencies = [
265
- { name = "cryptography" },
266
- { name = "pyasn1-modules" },
267
- { name = "rsa" },
268
- ]
269
- sdist = { url = "https://files.pythonhosted.org/packages/7d/59/7371175bfd949abfb1170aa076352131d7281bd9449c0f978604fc4431c3/google_auth-2.49.0.tar.gz", hash = "sha256:9cc2d9259d3700d7a257681f81052db6737495a1a46b610597f4b8bafe5286ae", size = 333444, upload-time = "2026-03-06T21:53:06.07Z" }
270
- wheels = [
271
- { url = "https://files.pythonhosted.org/packages/37/45/de64b823b639103de4b63dd193480dce99526bd36be6530c2dba85bf7817/google_auth-2.49.0-py3-none-any.whl", hash = "sha256:f893ef7307f19cf53700b7e2f61b5a6affe3aa0edf9943b13788920ab92d8d87", size = 240676, upload-time = "2026-03-06T21:52:38.304Z" },
272
- ]
273
-
274
- [[package]]
275
- name = "google-auth-httplib2"
276
- version = "0.3.0"
277
- source = { registry = "https://pypi.org/simple" }
278
- dependencies = [
279
- { name = "google-auth" },
280
- { name = "httplib2" },
281
- ]
282
- sdist = { url = "https://files.pythonhosted.org/packages/d5/ad/c1f2b1175096a8d04cf202ad5ea6065f108d26be6fc7215876bde4a7981d/google_auth_httplib2-0.3.0.tar.gz", hash = "sha256:177898a0175252480d5ed916aeea183c2df87c1f9c26705d74ae6b951c268b0b", size = 11134, upload-time = "2025-12-15T22:13:51.825Z" }
283
- wheels = [
284
- { url = "https://files.pythonhosted.org/packages/99/d5/3c97526c8796d3caf5f4b3bed2b05e8a7102326f00a334e7a438237f3b22/google_auth_httplib2-0.3.0-py3-none-any.whl", hash = "sha256:426167e5df066e3f5a0fc7ea18768c08e7296046594ce4c8c409c2457dd1f776", size = 9529, upload-time = "2025-12-15T22:13:51.048Z" },
285
- ]
286
-
287
- [[package]]
288
- name = "googleapis-common-protos"
289
- version = "1.73.0"
290
- source = { registry = "https://pypi.org/simple" }
291
- dependencies = [
292
- { name = "protobuf" },
293
- ]
294
- sdist = { url = "https://files.pythonhosted.org/packages/99/96/a0205167fa0154f4a542fd6925bdc63d039d88dab3588b875078107e6f06/googleapis_common_protos-1.73.0.tar.gz", hash = "sha256:778d07cd4fbeff84c6f7c72102f0daf98fa2bfd3fa8bea426edc545588da0b5a", size = 147323, upload-time = "2026-03-06T21:53:09.727Z" }
295
- wheels = [
296
- { url = "https://files.pythonhosted.org/packages/69/28/23eea8acd65972bbfe295ce3666b28ac510dfcb115fac089d3edb0feb00a/googleapis_common_protos-1.73.0-py3-none-any.whl", hash = "sha256:dfdaaa2e860f242046be561e6d6cb5c5f1541ae02cfbcb034371aadb2942b4e8", size = 297578, upload-time = "2026-03-06T21:52:33.933Z" },
297
140
  ]
298
141
 
299
142
  [[package]]
@@ -365,18 +208,6 @@ wheels = [
365
208
  { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
366
209
  ]
367
210
 
368
- [[package]]
369
- name = "httplib2"
370
- version = "0.31.2"
371
- source = { registry = "https://pypi.org/simple" }
372
- dependencies = [
373
- { name = "pyparsing" },
374
- ]
375
- sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload-time = "2026-01-23T11:04:44.165Z" }
376
- wheels = [
377
- { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload-time = "2026-01-23T11:04:42.78Z" },
378
- ]
379
-
380
211
  [[package]]
381
212
  name = "httpx"
382
213
  version = "0.28.1"
@@ -538,11 +369,9 @@ wheels = [
538
369
 
539
370
  [[package]]
540
371
  name = "podojo-cli"
541
- version = "0.8.1"
372
+ version = "0.9.0"
542
373
  source = { editable = "." }
543
374
  dependencies = [
544
- { name = "google-api-python-client" },
545
- { name = "google-auth" },
546
375
  { name = "httpx" },
547
376
  { name = "keyring" },
548
377
  { name = "pyyaml" },
@@ -563,8 +392,6 @@ dev = [
563
392
 
564
393
  [package.metadata]
565
394
  requires-dist = [
566
- { name = "google-api-python-client", specifier = ">=2.0" },
567
- { name = "google-auth", specifier = ">=2.0" },
568
395
  { name = "httpx", specifier = ">=0.28" },
569
396
  { name = "keyring", specifier = ">=25.0" },
570
397
  { name = "playwright", marker = "extra == 'synth'", specifier = ">=1.40" },
@@ -580,54 +407,6 @@ dev = [
580
407
  { name = "pytest-httpx", specifier = ">=0.35" },
581
408
  ]
582
409
 
583
- [[package]]
584
- name = "proto-plus"
585
- version = "1.27.1"
586
- source = { registry = "https://pypi.org/simple" }
587
- dependencies = [
588
- { name = "protobuf" },
589
- ]
590
- sdist = { url = "https://files.pythonhosted.org/packages/3a/02/8832cde80e7380c600fbf55090b6ab7b62bd6825dbedde6d6657c15a1f8e/proto_plus-1.27.1.tar.gz", hash = "sha256:912a7460446625b792f6448bade9e55cd4e41e6ac10e27009ef71a7f317fa147", size = 56929, upload-time = "2026-02-02T17:34:49.035Z" }
591
- wheels = [
592
- { url = "https://files.pythonhosted.org/packages/5d/79/ac273cbbf744691821a9cca88957257f41afe271637794975ca090b9588b/proto_plus-1.27.1-py3-none-any.whl", hash = "sha256:e4643061f3a4d0de092d62aa4ad09fa4756b2cbb89d4627f3985018216f9fefc", size = 50480, upload-time = "2026-02-02T17:34:47.339Z" },
593
- ]
594
-
595
- [[package]]
596
- name = "protobuf"
597
- version = "6.33.5"
598
- source = { registry = "https://pypi.org/simple" }
599
- sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" }
600
- wheels = [
601
- { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" },
602
- { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" },
603
- { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" },
604
- { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" },
605
- { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" },
606
- { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" },
607
- { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" },
608
- ]
609
-
610
- [[package]]
611
- name = "pyasn1"
612
- version = "0.6.2"
613
- source = { registry = "https://pypi.org/simple" }
614
- sdist = { url = "https://files.pythonhosted.org/packages/fe/b6/6e630dff89739fcd427e3f72b3d905ce0acb85a45d4ec3e2678718a3487f/pyasn1-0.6.2.tar.gz", hash = "sha256:9b59a2b25ba7e4f8197db7686c09fb33e658b98339fadb826e9512629017833b", size = 146586, upload-time = "2026-01-16T18:04:18.534Z" }
615
- wheels = [
616
- { url = "https://files.pythonhosted.org/packages/44/b5/a96872e5184f354da9c84ae119971a0a4c221fe9b27a4d94bd43f2596727/pyasn1-0.6.2-py3-none-any.whl", hash = "sha256:1eb26d860996a18e9b6ed05e7aae0e9fc21619fcee6af91cca9bad4fbea224bf", size = 83371, upload-time = "2026-01-16T18:04:17.174Z" },
617
- ]
618
-
619
- [[package]]
620
- name = "pyasn1-modules"
621
- version = "0.4.2"
622
- source = { registry = "https://pypi.org/simple" }
623
- dependencies = [
624
- { name = "pyasn1" },
625
- ]
626
- sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" }
627
- wheels = [
628
- { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" },
629
- ]
630
-
631
410
  [[package]]
632
411
  name = "pycparser"
633
412
  version = "3.0"
@@ -658,15 +437,6 @@ wheels = [
658
437
  { 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" },
659
438
  ]
660
439
 
661
- [[package]]
662
- name = "pyparsing"
663
- version = "3.3.2"
664
- source = { registry = "https://pypi.org/simple" }
665
- sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
666
- wheels = [
667
- { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
668
- ]
669
-
670
440
  [[package]]
671
441
  name = "pytest"
672
442
  version = "9.0.2"
@@ -751,21 +521,6 @@ wheels = [
751
521
  { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
752
522
  ]
753
523
 
754
- [[package]]
755
- name = "requests"
756
- version = "2.32.5"
757
- source = { registry = "https://pypi.org/simple" }
758
- dependencies = [
759
- { name = "certifi" },
760
- { name = "charset-normalizer" },
761
- { name = "idna" },
762
- { name = "urllib3" },
763
- ]
764
- 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" }
765
- wheels = [
766
- { 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" },
767
- ]
768
-
769
524
  [[package]]
770
525
  name = "rich"
771
526
  version = "14.3.3"
@@ -779,18 +534,6 @@ wheels = [
779
534
  { url = "https://files.pythonhosted.org/packages/14/25/b208c5683343959b670dc001595f2f3737e051da617f66c31f7c4fa93abc/rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", size = 310458, upload-time = "2026-02-19T17:23:13.732Z" },
780
535
  ]
781
536
 
782
- [[package]]
783
- name = "rsa"
784
- version = "4.9.1"
785
- source = { registry = "https://pypi.org/simple" }
786
- dependencies = [
787
- { name = "pyasn1" },
788
- ]
789
- sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" }
790
- wheels = [
791
- { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" },
792
- ]
793
-
794
537
  [[package]]
795
538
  name = "secretstorage"
796
539
  version = "3.5.0"
@@ -836,21 +579,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac8
836
579
  wheels = [
837
580
  { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
838
581
  ]
839
-
840
- [[package]]
841
- name = "uritemplate"
842
- version = "4.2.0"
843
- source = { registry = "https://pypi.org/simple" }
844
- sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267, upload-time = "2025-06-02T15:12:06.318Z" }
845
- wheels = [
846
- { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488, upload-time = "2025-06-02T15:12:03.405Z" },
847
- ]
848
-
849
- [[package]]
850
- name = "urllib3"
851
- version = "2.6.3"
852
- source = { registry = "https://pypi.org/simple" }
853
- 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" }
854
- wheels = [
855
- { 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" },
856
- ]
podojo_cli-0.8.2/PKG-INFO DELETED
@@ -1,47 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: podojo-cli
3
- Version: 0.8.2
4
- Summary: CLI for the Podojo user research platform
5
- Project-URL: Homepage, https://github.com/podojo/cli-podojo
6
- Project-URL: Source, https://github.com/podojo/cli-podojo
7
- Project-URL: Issues, https://github.com/podojo/cli-podojo/issues
8
- Project-URL: Changelog, https://github.com/podojo/cli-podojo/blob/main/CHANGELOG.md
9
- Author-email: Jochen Ade <jochen.ade@podojo.com>
10
- License-Expression: MIT
11
- Keywords: cli,podojo,transcripts,user-research,ux-research
12
- Classifier: Development Status :: 4 - Beta
13
- Classifier: Environment :: Console
14
- Classifier: Intended Audience :: End Users/Desktop
15
- Classifier: Intended Audience :: Other Audience
16
- Classifier: License :: OSI Approved :: MIT License
17
- Classifier: Operating System :: OS Independent
18
- Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.12
20
- Classifier: Topic :: Utilities
21
- Requires-Python: >=3.12
22
- Requires-Dist: google-api-python-client>=2.0
23
- Requires-Dist: google-auth>=2.0
24
- Requires-Dist: httpx>=0.28
25
- Requires-Dist: keyring>=25.0
26
- Requires-Dist: pyyaml>=6.0
27
- Requires-Dist: rich>=13.0
28
- Requires-Dist: typer>=0.15
29
- Provides-Extra: synth
30
- Requires-Dist: playwright>=1.40; extra == 'synth'
31
- Description-Content-Type: text/markdown
32
-
33
- # podojo-cli
34
-
35
- CLI for the Podojo user research platform.
36
-
37
- ## Installation
38
-
39
- ```bash
40
- uv tool install podojo-cli
41
- ```
42
-
43
- ## Usage
44
-
45
- ```bash
46
- podojo --help
47
- ```
@@ -1,15 +0,0 @@
1
- # podojo-cli
2
-
3
- CLI for the Podojo user research platform.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- uv tool install podojo-cli
9
- ```
10
-
11
- ## Usage
12
-
13
- ```bash
14
- podojo --help
15
- ```
@@ -1,51 +0,0 @@
1
- from pathlib import Path
2
-
3
- import typer
4
- from rich.console import Console
5
-
6
- from ..gdrive.list import list_files
7
- from ..gdrive.upload import CREDENTIALS_FILENAME, upload_md_as_doc
8
-
9
- app = typer.Typer(help="Upload documents to Google Drive")
10
- console = Console()
11
-
12
-
13
- @app.command("upload")
14
- def upload(
15
- file: Path = typer.Argument(help="Markdown file to upload"),
16
- folder_id: str = typer.Option(..., "--folder-id", "-f", help="Google Drive folder ID"),
17
- title: str = typer.Option(None, "--title", "-t", help="Document title (defaults to filename)"),
18
- ):
19
- """Upload a markdown file to Google Drive as a Google Doc."""
20
- if not file.exists():
21
- console.print(f"[red]Error:[/red] File not found: {file}")
22
- raise typer.Exit(1)
23
-
24
- if not Path(CREDENTIALS_FILENAME).exists():
25
- console.print(f"[red]Error:[/red] {CREDENTIALS_FILENAME} not found in current directory")
26
- raise typer.Exit(1)
27
-
28
- console.print(f"Uploading [bold]{file}[/bold]…", end=" ")
29
- _, url = upload_md_as_doc(str(file), folder_id=folder_id, title=title)
30
- console.print("[green]done[/green]")
31
- console.print(url)
32
-
33
-
34
- @app.command("list")
35
- def list_cmd(
36
- folder_id: str = typer.Option(..., "--folder-id", "-f", help="Google Drive folder ID"),
37
- ):
38
- """List files in a Google Drive folder."""
39
- if not Path(CREDENTIALS_FILENAME).exists():
40
- console.print(f"[red]Error:[/red] {CREDENTIALS_FILENAME} not found in current directory")
41
- raise typer.Exit(1)
42
-
43
- files = list_files(folder_id=folder_id)
44
-
45
- if not files:
46
- console.print("No files found.")
47
- return
48
-
49
- for f in files:
50
- link = f.get("webViewLink", "")
51
- console.print(f"[bold]{f['name']}[/bold] {link}")
@@ -1,20 +0,0 @@
1
- """List files in a Google Drive folder."""
2
-
3
- from .upload import get_drive_service
4
-
5
-
6
- def list_files(folder_id: str) -> list[dict]:
7
- """Return a list of files in the given folder (id, name, mimeType, webViewLink)."""
8
- drive = get_drive_service()
9
-
10
- results = (
11
- drive.files()
12
- .list(
13
- q=f"'{folder_id}' in parents and trashed = false",
14
- fields="files(id, name, mimeType, webViewLink)",
15
- supportsAllDrives=True,
16
- includeItemsFromAllDrives=True,
17
- )
18
- .execute()
19
- )
20
- return results.get("files", [])
@@ -1,56 +0,0 @@
1
- """Upload a markdown file to Google Drive as a Google Doc."""
2
-
3
- import os
4
- from pathlib import Path
5
-
6
- from google.oauth2.service_account import Credentials
7
- from googleapiclient.discovery import build
8
- from googleapiclient.http import MediaFileUpload
9
-
10
-
11
- CREDENTIALS_FILENAME = "service-account.json"
12
-
13
-
14
- def get_drive_service():
15
- credentials_path = Path.cwd() / CREDENTIALS_FILENAME
16
- if not credentials_path.exists():
17
- raise FileNotFoundError(f"{CREDENTIALS_FILENAME} not found in current directory")
18
- creds = Credentials.from_service_account_file(
19
- str(credentials_path),
20
- scopes=["https://www.googleapis.com/auth/drive"],
21
- )
22
- return build("drive", "v3", credentials=creds)
23
-
24
-
25
- def upload_md_as_doc(
26
- md_file: str,
27
- folder_id: str,
28
- title: str | None = None,
29
- ) -> tuple[str, str]:
30
- drive = get_drive_service()
31
-
32
- if not title:
33
- title = os.path.splitext(os.path.basename(md_file))[0]
34
-
35
- parent = folder_id
36
-
37
- media = MediaFileUpload(md_file, mimetype="text/markdown")
38
- file_metadata = {
39
- "name": title,
40
- "mimeType": "application/vnd.google-apps.document",
41
- "parents": [parent],
42
- }
43
- result = (
44
- drive.files()
45
- .create(
46
- body=file_metadata,
47
- media_body=media,
48
- fields="id",
49
- supportsAllDrives=True,
50
- )
51
- .execute()
52
- )
53
-
54
- doc_id = result["id"]
55
- url = f"https://docs.google.com/document/d/{doc_id}/edit"
56
- return doc_id, url
File without changes
@@ -1,81 +0,0 @@
1
- from pathlib import Path
2
- from unittest.mock import MagicMock, patch
3
-
4
- import pytest
5
-
6
- from podojo_cli.main import app
7
- from podojo_cli.gdrive.upload import CREDENTIALS_FILENAME
8
-
9
-
10
- @pytest.fixture
11
- def md_file(tmp_path):
12
- f = tmp_path / "report.md"
13
- f.write_text("# Hello\n\nSome content.")
14
- return f
15
-
16
-
17
- @pytest.fixture
18
- def credentials_file(tmp_path, monkeypatch):
19
- monkeypatch.chdir(tmp_path)
20
- f = tmp_path / CREDENTIALS_FILENAME
21
- f.write_text('{"type": "service_account"}')
22
- return f
23
-
24
-
25
- def test_upload_success(runner, md_file, credentials_file):
26
- mock_upload = MagicMock(return_value=("doc-id-123", "https://docs.google.com/document/d/doc-id-123/edit"))
27
- with patch("podojo_cli.commands.gdrive.upload_md_as_doc", mock_upload):
28
- result = runner.invoke(app, ["gdrive", "upload", str(md_file), "--folder-id", "folder-abc"])
29
-
30
- assert result.exit_code == 0
31
- assert "https://docs.google.com/document/d/doc-id-123/edit" in result.output
32
- mock_upload.assert_called_once_with(str(md_file), folder_id="folder-abc", title=None)
33
-
34
-
35
- def test_upload_with_title(runner, md_file, credentials_file):
36
- mock_upload = MagicMock(return_value=("doc-id-456", "https://docs.google.com/document/d/doc-id-456/edit"))
37
- with patch("podojo_cli.commands.gdrive.upload_md_as_doc", mock_upload):
38
- result = runner.invoke(app, ["gdrive", "upload", str(md_file), "--folder-id", "folder-abc", "--title", "My Report"])
39
-
40
- assert result.exit_code == 0
41
- mock_upload.assert_called_once_with(str(md_file), folder_id="folder-abc", title="My Report")
42
-
43
-
44
- def test_upload_missing_file(runner, credentials_file):
45
- result = runner.invoke(app, ["gdrive", "upload", "/nonexistent/report.md", "--folder-id", "folder-abc"])
46
-
47
- assert result.exit_code == 1
48
- assert "File not found" in result.output
49
-
50
-
51
- def test_upload_no_credentials_file(runner, md_file, tmp_path, monkeypatch):
52
- monkeypatch.chdir(tmp_path)
53
-
54
- result = runner.invoke(app, ["gdrive", "upload", str(md_file), "--folder-id", "folder-abc"])
55
-
56
- assert result.exit_code == 1
57
- assert CREDENTIALS_FILENAME in result.output
58
-
59
-
60
- def test_list_success(runner, credentials_file):
61
- mock_files = [
62
- {"name": "Report A", "mimeType": "application/vnd.google-apps.document", "webViewLink": "https://docs.google.com/document/d/abc/edit"},
63
- {"name": "Report B", "mimeType": "application/vnd.google-apps.document", "webViewLink": "https://docs.google.com/document/d/xyz/edit"},
64
- ]
65
- mock_list = MagicMock(return_value=mock_files)
66
- with patch("podojo_cli.commands.gdrive.list_files", mock_list):
67
- result = runner.invoke(app, ["gdrive", "list", "--folder-id", "folder-abc"])
68
-
69
- assert result.exit_code == 0
70
- assert "Report A" in result.output
71
- assert "Report B" in result.output
72
- mock_list.assert_called_once_with(folder_id="folder-abc")
73
-
74
-
75
- def test_list_no_credentials_file(runner, tmp_path, monkeypatch):
76
- monkeypatch.chdir(tmp_path)
77
-
78
- result = runner.invoke(app, ["gdrive", "list", "--folder-id", "folder-abc"])
79
-
80
- assert result.exit_code == 1
81
- assert CREDENTIALS_FILENAME in result.output
File without changes
File without changes