convoviz 0.4.4__tar.gz → 0.4.6__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 (61) hide show
  1. {convoviz-0.4.4 → convoviz-0.4.6}/PKG-INFO +14 -12
  2. {convoviz-0.4.4 → convoviz-0.4.6}/README.md +13 -11
  3. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/interactive.py +17 -30
  4. {convoviz-0.4.4 → convoviz-0.4.6}/pyproject.toml +43 -34
  5. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/__init__.py +0 -0
  6. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/__main__.py +0 -0
  7. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/analysis/__init__.py +0 -0
  8. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/analysis/graphs.py +0 -0
  9. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/analysis/wordcloud.py +0 -0
  10. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/colormaps.txt +0 -0
  11. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/AmaticSC-Regular.ttf +0 -0
  12. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/ArchitectsDaughter-Regular.ttf +0 -0
  13. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/BebasNeue-Regular.ttf +0 -0
  14. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Borel-Regular.ttf +0 -0
  15. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Courgette-Regular.ttf +0 -0
  16. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/CroissantOne-Regular.ttf +0 -0
  17. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Handjet-Regular.ttf +0 -0
  18. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/IndieFlower-Regular.ttf +0 -0
  19. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Kalam-Regular.ttf +0 -0
  20. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Lobster-Regular.ttf +0 -0
  21. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/MartianMono-Regular.ttf +0 -0
  22. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/MartianMono-Thin.ttf +0 -0
  23. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Montserrat-Regular.ttf +0 -0
  24. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Mooli-Regular.ttf +0 -0
  25. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Pacifico-Regular.ttf +0 -0
  26. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/PlayfairDisplay-Regular.ttf +0 -0
  27. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Raleway-Regular.ttf +0 -0
  28. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/RobotoMono-Regular.ttf +0 -0
  29. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/RobotoMono-Thin.ttf +0 -0
  30. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/RobotoSlab-Regular.ttf +0 -0
  31. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/RobotoSlab-Thin.ttf +0 -0
  32. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Ruwudu-Regular.ttf +0 -0
  33. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Sacramento-Regular.ttf +0 -0
  34. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/SedgwickAveDisplay-Regular.ttf +0 -0
  35. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/ShadowsIntoLight-Regular.ttf +0 -0
  36. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/TitilliumWeb-Regular.ttf +0 -0
  37. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Yellowtail-Regular.ttf +0 -0
  38. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/YsabeauOffice-Regular.ttf +0 -0
  39. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/YsabeauSC-Regular.ttf +0 -0
  40. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/YsabeauSC-Thin.ttf +0 -0
  41. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/fonts/Zeyada-Regular.ttf +0 -0
  42. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/assets/stopwords.txt +0 -0
  43. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/cli.py +0 -0
  44. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/config.py +0 -0
  45. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/exceptions.py +0 -0
  46. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/io/__init__.py +0 -0
  47. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/io/assets.py +0 -0
  48. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/io/loaders.py +0 -0
  49. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/io/writers.py +0 -0
  50. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/logging_config.py +0 -0
  51. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/models/__init__.py +0 -0
  52. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/models/collection.py +0 -0
  53. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/models/conversation.py +0 -0
  54. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/models/message.py +0 -0
  55. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/models/node.py +0 -0
  56. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/pipeline.py +0 -0
  57. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/py.typed +0 -0
  58. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/renderers/__init__.py +0 -0
  59. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/renderers/markdown.py +0 -0
  60. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/renderers/yaml.py +0 -0
  61. {convoviz-0.4.4 → convoviz-0.4.6}/convoviz/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: convoviz
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Summary: Convert your ChatGPT export (ZIP) into clean Markdown text files with inline media, and generate data visualizations like word clouds and usage graphs.
5
5
  Keywords: markdown,chatgpt,openai,visualization,analytics,json,export,data-analysis,obsidian
6
6
  Author: Mohamed Cheikh Sidiya
@@ -194,6 +194,19 @@ Interested in contributing? Check out the **[Contributing Guide](https://github.
194
194
 
195
195
  ## 📝 Notes
196
196
 
197
+ <details>
198
+ <summary><strong>Offline</strong></summary>
199
+
200
+ Word clouds use NLTK stopwords. If you're offline and NLTK data isn't installed yet, pre-download it:
201
+
202
+ ```bash
203
+ python -c "import nltk; nltk.download('stopwords')"
204
+ ```
205
+
206
+ **NOTE:** The install script already handles this, so you can immediately go offline after running it.
207
+
208
+ </details>
209
+
197
210
  <details>
198
211
  <summary><strong>About This Project</strong></summary>
199
212
 
@@ -212,17 +225,6 @@ It should also work as a library, so you can import and use the models and funct
212
225
 
213
226
  </details>
214
227
 
215
- <details>
216
- <summary><strong>Offline / Reproducible Runs</strong></summary>
217
-
218
- Word clouds use NLTK stopwords. If you're offline and NLTK data isn't installed yet, pre-download it:
219
-
220
- ```bash
221
- python -c "import nltk; nltk.download('stopwords')"
222
- ```
223
-
224
- </details>
225
-
226
228
  <details>
227
229
  <summary><strong>Bookmarklet (Experimental)</strong></summary>
228
230
 
@@ -169,6 +169,19 @@ Interested in contributing? Check out the **[Contributing Guide](https://github.
169
169
 
170
170
  ## 📝 Notes
171
171
 
172
+ <details>
173
+ <summary><strong>Offline</strong></summary>
174
+
175
+ Word clouds use NLTK stopwords. If you're offline and NLTK data isn't installed yet, pre-download it:
176
+
177
+ ```bash
178
+ python -c "import nltk; nltk.download('stopwords')"
179
+ ```
180
+
181
+ **NOTE:** The install script already handles this, so you can immediately go offline after running it.
182
+
183
+ </details>
184
+
172
185
  <details>
173
186
  <summary><strong>About This Project</strong></summary>
174
187
 
@@ -187,17 +200,6 @@ It should also work as a library, so you can import and use the models and funct
187
200
 
188
201
  </details>
189
202
 
190
- <details>
191
- <summary><strong>Offline / Reproducible Runs</strong></summary>
192
-
193
- Word clouds use NLTK stopwords. If you're offline and NLTK data isn't installed yet, pre-download it:
194
-
195
- ```bash
196
- python -c "import nltk; nltk.download('stopwords')"
197
- ```
198
-
199
- </details>
200
-
201
203
  <details>
202
204
  <summary><strong>Bookmarklet (Experimental)</strong></summary>
203
205
 
@@ -8,10 +8,16 @@ from questionary import Choice, Style, checkbox, select
8
8
  from questionary import path as qst_path
9
9
  from questionary import text as qst_text
10
10
 
11
- from convoviz.config import ConvovizConfig, OutputKind, get_default_config
11
+ from convoviz.config import ConvovizConfig, OutputKind, YAMLConfig, get_default_config
12
12
  from convoviz.io.loaders import find_latest_zip, validate_zip
13
13
  from convoviz.utils import colormaps, default_font_path, font_names, font_path, validate_header
14
14
 
15
+ OUTPUT_TITLES = {
16
+ OutputKind.MARKDOWN: "Markdown conversations",
17
+ OutputKind.GRAPHS: "Graphs (usage analytics)",
18
+ OutputKind.WORDCLOUDS: "Word clouds",
19
+ }
20
+
15
21
  CUSTOM_STYLE = Style(
16
22
  [
17
23
  ("qmark", "fg:#34eb9b bold"),
@@ -92,7 +98,7 @@ def run_interactive_config(initial_config: ConvovizConfig | None = None) -> Conv
92
98
  input_default = str(config.input_path) if config.input_path else ""
93
99
  input_result: str = _ask_or_cancel(
94
100
  qst_path(
95
- "Enter the path to the export ZIP, conversations JSON, or extracted directory:",
101
+ "Enter the path to the export ZIP:", # , conversations JSON, or extracted directory:",
96
102
  default=input_default,
97
103
  validate=_validate_input_path,
98
104
  style=CUSTOM_STYLE,
@@ -118,9 +124,12 @@ def run_interactive_config(initial_config: ConvovizConfig | None = None) -> Conv
118
124
 
119
125
  # Prompt for outputs to generate
120
126
  output_choices = [
121
- Choice(title="Markdown conversations", value=OutputKind.MARKDOWN, checked=True),
122
- Choice(title="Graphs (usage analytics)", value=OutputKind.GRAPHS, checked=True),
123
- Choice(title="Word clouds", value=OutputKind.WORDCLOUDS, checked=True),
127
+ Choice(
128
+ title=OUTPUT_TITLES.get(kind, kind.value.title()),
129
+ value=kind,
130
+ checked=kind in config.outputs,
131
+ )
132
+ for kind in OutputKind
124
133
  ]
125
134
 
126
135
  selected_outputs: list[OutputKind] = _ask_or_cancel(
@@ -172,20 +181,9 @@ def run_interactive_config(initial_config: ConvovizConfig | None = None) -> Conv
172
181
 
173
182
  # Prompt for YAML headers
174
183
  yaml_config = config.conversation.yaml
184
+ yaml_fields = list(YAMLConfig.model_fields.keys())
175
185
  yaml_choices = [
176
- Choice(title=field, checked=getattr(yaml_config, field))
177
- for field in [
178
- "title",
179
- "tags",
180
- "chat_link",
181
- "create_time",
182
- "update_time",
183
- "model",
184
- "used_plugins",
185
- "message_count",
186
- "content_types",
187
- "custom_instructions",
188
- ]
186
+ Choice(title=field, checked=getattr(yaml_config, field)) for field in yaml_fields
189
187
  ]
190
188
 
191
189
  selected: list[str] = _ask_or_cancel(
@@ -197,18 +195,7 @@ def run_interactive_config(initial_config: ConvovizConfig | None = None) -> Conv
197
195
  )
198
196
 
199
197
  selected_set = set(selected)
200
- for field_name in [
201
- "title",
202
- "tags",
203
- "chat_link",
204
- "create_time",
205
- "update_time",
206
- "model",
207
- "used_plugins",
208
- "message_count",
209
- "content_types",
210
- "custom_instructions",
211
- ]:
198
+ for field_name in yaml_fields:
212
199
  setattr(yaml_config, field_name, field_name in selected_set)
213
200
 
214
201
  # Prompt for wordcloud settings (only if wordclouds output is selected)
@@ -1,7 +1,12 @@
1
1
  [project]
2
2
  name = "convoviz"
3
- version = "0.4.4"
3
+ version = "0.4.6"
4
4
  description = "Convert your ChatGPT export (ZIP) into clean Markdown text files with inline media, and generate data visualizations like word clouds and usage graphs."
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ authors = [
8
+ { name = "Mohamed Cheikh Sidiya", email = "mohamedcheikhsidiya77@gmail.com" },
9
+ ]
5
10
  license = "MIT"
6
11
  keywords = [
7
12
  "markdown",
@@ -19,11 +24,6 @@ classifiers = [
19
24
  "Programming Language :: Python :: 3",
20
25
  "Programming Language :: Python :: 3.12",
21
26
  ]
22
- readme = "README.md"
23
- requires-python = ">=3.12"
24
- authors = [
25
- { name = "Mohamed Cheikh Sidiya", email = "mohamedcheikhsidiya77@gmail.com" },
26
- ]
27
27
  dependencies = [
28
28
  "orjson>=3.11.5",
29
29
  "pydantic>=2.12.5",
@@ -34,37 +34,11 @@ dependencies = [
34
34
  "typer>=0.21.0",
35
35
  ]
36
36
 
37
- [project.optional-dependencies]
38
- viz = ["nltk>=3.9.2", "wordcloud>=1.9.5"]
39
-
40
37
  [project.urls]
41
38
  Repository = "https://github.com/mohamed-chs/convoviz"
42
39
 
43
- [build-system]
44
- requires = ["uv_build"]
45
- build-backend = "uv_build"
46
-
47
- [tool.uv.build-backend]
48
- # Add this line to tell uv your code is in the root, not in src/
49
- module-root = "."
50
-
51
- # Files to exclude from the Source Distribution (sdist)
52
- source-exclude = [
53
- ".github",
54
- ".vscode",
55
- ".gitattributes",
56
- ".gitignore",
57
- "dev",
58
- "playground.ipynb",
59
- "pyproject.toml.bak",
60
- "uv.lock",
61
- "demo",
62
- "js",
63
- "tests",
64
- ]
65
-
66
- [project.scripts]
67
- convoviz = "convoviz.cli:main_entry"
40
+ [project.optional-dependencies]
41
+ viz = ["nltk>=3.9.2", "wordcloud>=1.9.5"]
68
42
 
69
43
  [dependency-groups]
70
44
  dev = [
@@ -75,8 +49,20 @@ dev = [
75
49
  # Viz extras for testing (wordcloud pulls in matplotlib + pillow)
76
50
  "nltk>=3.9.2",
77
51
  "wordcloud>=1.9.5",
52
+ "poethepoet>=0.40.0",
78
53
  ]
79
54
 
55
+ # run with 'uv run poe <task>' eg. 'uv run poe fmt'
56
+ # or if poe is installed globally, 'poe fmt'
57
+ [tool.poe.tasks]
58
+ lint = "ruff check --fix convoviz tests"
59
+ fmt = "ruff format"
60
+ test = "pytest"
61
+ ty = "ty check convoviz"
62
+
63
+ [project.scripts]
64
+ convoviz = "convoviz.cli:main_entry"
65
+
80
66
  [tool.ruff]
81
67
  target-version = "py312"
82
68
  line-length = 100
@@ -107,3 +93,26 @@ python-version = "3.12"
107
93
  [tool.pytest.ini_options]
108
94
  testpaths = ["tests"]
109
95
  pythonpath = ["."]
96
+
97
+ [build-system]
98
+ requires = ["uv_build"]
99
+ build-backend = "uv_build"
100
+
101
+ [tool.uv.build-backend]
102
+ # Add this line to tell uv your code is in the root, not in src/
103
+ module-root = "."
104
+
105
+ # Files to exclude from the Source Distribution (sdist)
106
+ source-exclude = [
107
+ ".github",
108
+ ".vscode",
109
+ ".gitattributes",
110
+ ".gitignore",
111
+ "dev",
112
+ "playground.ipynb",
113
+ "pyproject.toml.bak",
114
+ "uv.lock",
115
+ "demo",
116
+ "js",
117
+ "tests",
118
+ ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes