refigure 0.3.1__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. {refigure-0.3.1 → refigure-0.3.2}/.gitignore +1 -0
  2. {refigure-0.3.1 → refigure-0.3.2}/PKG-INFO +55 -3
  3. {refigure-0.3.1 → refigure-0.3.2}/README.md +54 -2
  4. {refigure-0.3.1 → refigure-0.3.2}/pyproject.toml +1 -1
  5. {refigure-0.3.1 → refigure-0.3.2}/ATTRIBUTION.md +0 -0
  6. {refigure-0.3.1 → refigure-0.3.2}/LICENSE +0 -0
  7. {refigure-0.3.1 → refigure-0.3.2}/NOTICE +0 -0
  8. {refigure-0.3.1 → refigure-0.3.2}/refigure/__init__.py +0 -0
  9. {refigure-0.3.1 → refigure-0.3.2}/refigure/__main__.py +0 -0
  10. {refigure-0.3.1 → refigure-0.3.2}/refigure/_io.py +0 -0
  11. {refigure-0.3.1 → refigure-0.3.2}/refigure/api.py +0 -0
  12. {refigure-0.3.1 → refigure-0.3.2}/refigure/cli.py +0 -0
  13. {refigure-0.3.1 → refigure-0.3.2}/refigure/core/__init__.py +0 -0
  14. {refigure-0.3.1 → refigure-0.3.2}/refigure/core/chart_data.py +0 -0
  15. {refigure-0.3.1 → refigure-0.3.2}/refigure/core/chart_render.py +0 -0
  16. {refigure-0.3.1 → refigure-0.3.2}/refigure/core/zipsafe.py +0 -0
  17. {refigure-0.3.1 → refigure-0.3.2}/refigure/docx/__init__.py +0 -0
  18. {refigure-0.3.1 → refigure-0.3.2}/refigure/docx_groups.py +0 -0
  19. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/__init__.py +0 -0
  20. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/_lru.py +0 -0
  21. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/auth.py +0 -0
  22. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/cli.py +0 -0
  23. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/exceptions.py +0 -0
  24. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/server.py +0 -0
  25. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/state.py +0 -0
  26. {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/vlm_cache.py +0 -0
  27. {refigure-0.3.1 → refigure-0.3.2}/refigure/py.typed +0 -0
  28. {refigure-0.3.1 → refigure-0.3.2}/refigure/vlm/__init__.py +0 -0
  29. {refigure-0.3.1 → refigure-0.3.2}/refigure/vlm/cache.py +0 -0
  30. {refigure-0.3.1 → refigure-0.3.2}/refigure/vlm/client.py +0 -0
  31. {refigure-0.3.1 → refigure-0.3.2}/refigure/xlsx/__init__.py +0 -0
  32. {refigure-0.3.1 → refigure-0.3.2}/refigure/xlsx/charts.py +0 -0
  33. {refigure-0.3.1 → refigure-0.3.2}/tests/__init__.py +0 -0
  34. {refigure-0.3.1 → refigure-0.3.2}/tests/support.py +0 -0
  35. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/__init__.py +0 -0
  36. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/__init__.py +0 -0
  37. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_data.py +0 -0
  38. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_render.py +0 -0
  39. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_render_missing_mermaidx.py +0 -0
  40. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_render_visual.py +0 -0
  41. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/docx/__init__.py +0 -0
  42. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/docx/test_docx.py +0 -0
  43. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/__init__.py +0 -0
  44. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/conftest.py +0 -0
  45. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_auth.py +0 -0
  46. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_batch.py +0 -0
  47. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_bridge.py +0 -0
  48. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_cli.py +0 -0
  49. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_http.py +0 -0
  50. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_lru.py +0 -0
  51. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_prompts.py +0 -0
  52. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_resources.py +0 -0
  53. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_schema_pin.py +0 -0
  54. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_state.py +0 -0
  55. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_tools.py +0 -0
  56. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_vlm_cache.py +0 -0
  57. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_cli.py +0 -0
  58. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_concurrency.py +0 -0
  59. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_docx_chart_group_coexistence.py +0 -0
  60. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_docx_groups.py +0 -0
  61. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_io.py +0 -0
  62. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_optional_dependency_guards.py +0 -0
  63. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_property_based.py +0 -0
  64. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_robustness.py +0 -0
  65. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_vlm_max_markers.py +0 -0
  66. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_xml_security.py +0 -0
  67. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/__init__.py +0 -0
  68. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_soffice_profile_isolation.py +0 -0
  69. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_vlm.py +0 -0
  70. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_vlm_cache.py +0 -0
  71. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_vlm_client.py +0 -0
  72. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/xlsx/__init__.py +0 -0
  73. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/xlsx/test_xlsx.py +0 -0
  74. {refigure-0.3.1 → refigure-0.3.2}/tests/unit/xlsx/test_xlsx_charts.py +0 -0
@@ -54,6 +54,7 @@ CLAUDE.local.md
54
54
  docs/*
55
55
  !docs/assets/
56
56
  CLAUDE.md
57
+ BACKLOG.md
57
58
 
58
59
  # Real-document integration test fixtures (2026-08-05): 26/27 are checked
59
60
  # in — clean, well-documented redistribution licenses (see ATTRIBUTION.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: refigure
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: DOCX/XLSX -> Markdown conversion with native OOXML chart-data extraction (no rasterize/OCR/VLM needed) + optional VLM interpretation for figures with no native chart data
5
5
  Project-URL: Homepage, https://github.com/HelgDemidov/refigure
6
6
  Project-URL: Repository, https://github.com/HelgDemidov/refigure
@@ -151,6 +151,9 @@ refigure report.docx --vlm # needs the system soffice/LibreOf
151
151
  - **MCP server included** — `refigure-mcp` console command (`[mcp]` extra),
152
152
  stdio or Streamable HTTP, tools/resources/prompts, batch conversion with
153
153
  per-file isolation (see below).
154
+ - **Docker image** — `ghcr.io/helgdemidov/refigure`, both console commands
155
+ on `PATH`, `soffice`/LibreOffice baked in — the VLM composite-figure
156
+ path works turnkey, no manual LibreOffice install (see below).
154
157
 
155
158
  ## CLI
156
159
 
@@ -243,6 +246,52 @@ fairness soft-cap once 2+ callers are configured; `refigure-mcp --help`
243
246
  covers every tuning flag (concurrency, timeouts, resource-store limits,
244
247
  batch size, VLM ceiling).
245
248
 
249
+ ## Docker
250
+
251
+ One image, both surfaces — `refigure` and `refigure-mcp` are already on
252
+ `PATH`, no separate CLI/MCP builds to choose between. The one thing this
253
+ format buys over `pip`/`uvx` that neither can: the system `soffice`/
254
+ LibreOffice binary the VLM composite-figure path needs is baked in, not a
255
+ manual install.
256
+
257
+ ```bash
258
+ docker pull ghcr.io/helgdemidov/refigure:0.3.1
259
+ ```
260
+
261
+ CLI, via a bind mount (the image's working directory is already `/data`):
262
+
263
+ ```bash
264
+ docker run --rm -v "$PWD:/data:ro" ghcr.io/helgdemidov/refigure:0.3.1 \
265
+ refigure /data/report.docx
266
+ ```
267
+
268
+ MCP, stdio — the client launches the container itself:
269
+
270
+ ```json
271
+ {
272
+ "mcpServers": {
273
+ "refigure": {
274
+ "command": "docker",
275
+ "args": ["run", "-i", "--rm", "ghcr.io/helgdemidov/refigure:0.3.1", "refigure-mcp"]
276
+ }
277
+ }
278
+ }
279
+ ```
280
+
281
+ MCP, Streamable HTTP — `--mcp-http-host 0.0.0.0` is required here, not
282
+ optional: the default `127.0.0.1` bind is unreachable through `-p` port
283
+ publishing (Docker's NAT reaches the container's external network
284
+ interface, not its loopback), so the "obvious" invocation without this
285
+ flag would silently never respond:
286
+
287
+ ```bash
288
+ echo "sk-... = alice" > tokens.txt
289
+ docker run --rm -p 8000:8000 -v "$PWD/tokens.txt:/data/tokens.txt:ro" \
290
+ ghcr.io/helgdemidov/refigure:0.3.1 \
291
+ refigure-mcp --transport http --mcp-http-host 0.0.0.0 \
292
+ --mcp-auth-token-file /data/tokens.txt
293
+ ```
294
+
246
295
  ## Real examples
247
296
 
248
297
  Full `convert()` output on real, openly-licensed documents — not
@@ -307,8 +356,11 @@ else:
307
356
  markdown = refigure.xlsx.convert(path).markdown
308
357
  ```
309
358
 
310
- `v0.3.0` published via trusted publishing (GitHub↔PyPI, no stored tokens).
311
- `refigure-md` is a reserved alternate name, not an active release.
359
+ `v0.3.1` published via trusted publishing (GitHub↔PyPI, no stored tokens),
360
+ also on GHCR as `ghcr.io/helgdemidov/refigure` and on the official
361
+ [MCP Registry](https://registry.modelcontextprotocol.io) as
362
+ `io.github.HelgDemidov/refigure`. `refigure-md` is a reserved alternate
363
+ name, not an active release.
312
364
 
313
365
  ## License
314
366
 
@@ -111,6 +111,9 @@ refigure report.docx --vlm # needs the system soffice/LibreOf
111
111
  - **MCP server included** — `refigure-mcp` console command (`[mcp]` extra),
112
112
  stdio or Streamable HTTP, tools/resources/prompts, batch conversion with
113
113
  per-file isolation (see below).
114
+ - **Docker image** — `ghcr.io/helgdemidov/refigure`, both console commands
115
+ on `PATH`, `soffice`/LibreOffice baked in — the VLM composite-figure
116
+ path works turnkey, no manual LibreOffice install (see below).
114
117
 
115
118
  ## CLI
116
119
 
@@ -203,6 +206,52 @@ fairness soft-cap once 2+ callers are configured; `refigure-mcp --help`
203
206
  covers every tuning flag (concurrency, timeouts, resource-store limits,
204
207
  batch size, VLM ceiling).
205
208
 
209
+ ## Docker
210
+
211
+ One image, both surfaces — `refigure` and `refigure-mcp` are already on
212
+ `PATH`, no separate CLI/MCP builds to choose between. The one thing this
213
+ format buys over `pip`/`uvx` that neither can: the system `soffice`/
214
+ LibreOffice binary the VLM composite-figure path needs is baked in, not a
215
+ manual install.
216
+
217
+ ```bash
218
+ docker pull ghcr.io/helgdemidov/refigure:0.3.1
219
+ ```
220
+
221
+ CLI, via a bind mount (the image's working directory is already `/data`):
222
+
223
+ ```bash
224
+ docker run --rm -v "$PWD:/data:ro" ghcr.io/helgdemidov/refigure:0.3.1 \
225
+ refigure /data/report.docx
226
+ ```
227
+
228
+ MCP, stdio — the client launches the container itself:
229
+
230
+ ```json
231
+ {
232
+ "mcpServers": {
233
+ "refigure": {
234
+ "command": "docker",
235
+ "args": ["run", "-i", "--rm", "ghcr.io/helgdemidov/refigure:0.3.1", "refigure-mcp"]
236
+ }
237
+ }
238
+ }
239
+ ```
240
+
241
+ MCP, Streamable HTTP — `--mcp-http-host 0.0.0.0` is required here, not
242
+ optional: the default `127.0.0.1` bind is unreachable through `-p` port
243
+ publishing (Docker's NAT reaches the container's external network
244
+ interface, not its loopback), so the "obvious" invocation without this
245
+ flag would silently never respond:
246
+
247
+ ```bash
248
+ echo "sk-... = alice" > tokens.txt
249
+ docker run --rm -p 8000:8000 -v "$PWD/tokens.txt:/data/tokens.txt:ro" \
250
+ ghcr.io/helgdemidov/refigure:0.3.1 \
251
+ refigure-mcp --transport http --mcp-http-host 0.0.0.0 \
252
+ --mcp-auth-token-file /data/tokens.txt
253
+ ```
254
+
206
255
  ## Real examples
207
256
 
208
257
  Full `convert()` output on real, openly-licensed documents — not
@@ -267,8 +316,11 @@ else:
267
316
  markdown = refigure.xlsx.convert(path).markdown
268
317
  ```
269
318
 
270
- `v0.3.0` published via trusted publishing (GitHub↔PyPI, no stored tokens).
271
- `refigure-md` is a reserved alternate name, not an active release.
319
+ `v0.3.1` published via trusted publishing (GitHub↔PyPI, no stored tokens),
320
+ also on GHCR as `ghcr.io/helgdemidov/refigure` and on the official
321
+ [MCP Registry](https://registry.modelcontextprotocol.io) as
322
+ `io.github.HelgDemidov/refigure`. `refigure-md` is a reserved alternate
323
+ name, not an active release.
272
324
 
273
325
  ## License
274
326
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "refigure"
7
- version = "0.3.1"
7
+ version = "0.3.2"
8
8
  description = "DOCX/XLSX -> Markdown conversion with native OOXML chart-data extraction (no rasterize/OCR/VLM needed) + optional VLM interpretation for figures with no native chart data"
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes