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.
- {refigure-0.3.1 → refigure-0.3.2}/.gitignore +1 -0
- {refigure-0.3.1 → refigure-0.3.2}/PKG-INFO +55 -3
- {refigure-0.3.1 → refigure-0.3.2}/README.md +54 -2
- {refigure-0.3.1 → refigure-0.3.2}/pyproject.toml +1 -1
- {refigure-0.3.1 → refigure-0.3.2}/ATTRIBUTION.md +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/LICENSE +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/NOTICE +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/__main__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/_io.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/api.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/cli.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/core/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/core/chart_data.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/core/chart_render.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/core/zipsafe.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/docx/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/docx_groups.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/_lru.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/auth.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/cli.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/exceptions.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/server.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/state.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/mcp/vlm_cache.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/py.typed +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/vlm/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/vlm/cache.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/vlm/client.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/xlsx/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/refigure/xlsx/charts.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/support.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_data.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_render.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_render_missing_mermaidx.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/core/test_chart_render_visual.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/docx/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/docx/test_docx.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/conftest.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_auth.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_batch.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_bridge.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_cli.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_http.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_lru.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_prompts.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_resources.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_schema_pin.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_state.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_tools.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/mcp/test_vlm_cache.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_cli.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_concurrency.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_docx_chart_group_coexistence.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_docx_groups.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_io.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_optional_dependency_guards.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_property_based.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_robustness.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_vlm_max_markers.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/test_xml_security.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_soffice_profile_isolation.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_vlm.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_vlm_cache.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/vlm/test_vlm_client.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/xlsx/__init__.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/xlsx/test_xlsx.py +0 -0
- {refigure-0.3.1 → refigure-0.3.2}/tests/unit/xlsx/test_xlsx_charts.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: refigure
|
|
3
|
-
Version: 0.3.
|
|
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.
|
|
311
|
-
|
|
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.
|
|
271
|
-
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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
|