anywidget-graph 0.4.2__tar.gz → 0.4.4__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.
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/.github/workflows/ci.yml +1 -1
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/.github/workflows/grafeo-latest.yml +1 -1
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/CHANGELOG.md +14 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/PKG-INFO +7 -4
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/README.md +1 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/pyproject.toml +6 -4
- anywidget_graph-0.4.4/scripts/vendor/build.mjs +40 -0
- anywidget_graph-0.4.4/scripts/vendor/entry.mjs +7 -0
- anywidget_graph-0.4.4/scripts/vendor/package-lock.json +642 -0
- anywidget_graph-0.4.4/scripts/vendor/package.json +19 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/__init__.py +1 -1
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/__init__.py +6 -7
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/index.js +2 -3
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/neo4j.js +9 -1
- anywidget_graph-0.4.4/src/anywidget_graph/ui/vendor/graph-libs.LICENSES.txt +201 -0
- anywidget_graph-0.4.4/src/anywidget_graph/ui/vendor/graph-libs.min.js +312 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/test_ui.py +36 -4
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/uv.lock +34 -32
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/.github/workflows/pypi.yml +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/.gitignore +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/.python-version +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/LICENSE +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/assets/demo.png +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/examples/demo.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/examples/test_hierarchy.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/examples/test_large_graph.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/backends/__init__.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/backends/arango.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/backends/cosmosdb.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/backends/grafeo.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/backends/ladybug.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/backends/neo4j.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/__init__.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/base.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/common.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/cypher.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/gql.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/graphql.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/gremlin.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/converters/sparql.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/demo.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/py.typed +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/defaults.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/grafeo-embed.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/grafeo-result.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/grafeo.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/icons.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/lanes.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/properties.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/results.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/schema.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/settings.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/styles.css +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/ui/toolbar.js +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/src/anywidget_graph/widget.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/__init__.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/conftest.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/js/grafeo-result.test.mjs +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/js/lanes.test.mjs +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/test_backends_grafeo.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/test_demo.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/test_grafeo_contract.py +0 -0
- {anywidget_graph-0.4.2 → anywidget_graph-0.4.4}/tests/test_graph.py +0 -0
|
@@ -11,7 +11,7 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
strategy:
|
|
13
13
|
matrix:
|
|
14
|
-
python-version: ["3.12", "3.13", "3.14"]
|
|
14
|
+
python-version: ["3.12", "3.13", "3.14", "3.15"]
|
|
15
15
|
env:
|
|
16
16
|
# Without this, uv follows .python-version and every job runs 3.12
|
|
17
17
|
UV_PYTHON: ${{ matrix.python-version }}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.4.4 2026-10-19
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- **The widget loads without a CDN**: graphology, sigma, graphology-layout, graphology-layout-forceatlas2 and d3-force are bundled with the widget (`ui/vendor/graph-libs.min.js`, built from pinned npm versions by `scripts/vendor`, licenses in `ui/vendor/graph-libs.LICENSES.txt`) instead of loaded from esm.sh on every render. A page that could not reach esm.sh or cdn.jsdelivr.net (offline, a network filter, a blocker, a CDN outage) showed "Failed to fetch dynamically imported module" instead of the graph
|
|
8
|
+
- **neo4j-driver loads when a Neo4j connection is made**: it was imported from cdn.jsdelivr.net with the widget, so every host needed the CDN even without Neo4j. The Neo4j backend and the Grafeo WASM backend are now the only parts that load code from the network, and only when they connect
|
|
9
|
+
|
|
10
|
+
## 0.4.3 2026-10-12
|
|
11
|
+
|
|
12
|
+
### Improvements
|
|
13
|
+
|
|
14
|
+
- **Python 3.15**: supported, and tested in CI on 3.12 to 3.15. marimo, which the widget does not import, installs on 3.12 to 3.14 only for now: its dependency loro has no 3.15 wheels yet (the widget works in marimo as soon as marimo installs on 3.15)
|
|
15
|
+
- **marimo moved to the `examples` extra**: the widget does not import marimo, so it is no longer a dependency; `pip install anywidget-graph[examples]` adds marimo to run the apps in `examples/`
|
|
16
|
+
|
|
3
17
|
## 0.4.2 2026-10-09
|
|
4
18
|
|
|
5
19
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: anywidget-graph
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.4
|
|
4
4
|
Summary: Interactive graph visualization for Python notebooks using anywidget
|
|
5
5
|
Project-URL: Homepage, https://grafeo.dev/
|
|
6
6
|
Project-URL: Repository, https://github.com/GrafeoDB/anywidget-graph
|
|
@@ -17,20 +17,22 @@ Classifier: Programming Language :: Python :: 3
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.15
|
|
20
21
|
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
21
22
|
Requires-Python: >=3.12
|
|
22
23
|
Requires-Dist: anywidget>=0.9.21
|
|
23
|
-
Requires-Dist: marimo>=0.19.9
|
|
24
24
|
Provides-Extra: cosmosdb
|
|
25
25
|
Requires-Dist: gremlinpython>=3.8; extra == 'cosmosdb'
|
|
26
26
|
Provides-Extra: demo
|
|
27
27
|
Provides-Extra: dev
|
|
28
|
-
Requires-Dist: marimo>=0.20; extra == 'dev'
|
|
28
|
+
Requires-Dist: marimo>=0.20; (python_version < '3.15') and extra == 'dev'
|
|
29
29
|
Requires-Dist: prek>=0.5; extra == 'dev'
|
|
30
30
|
Requires-Dist: pytest>=9.1; extra == 'dev'
|
|
31
|
-
Requires-Dist: ruff>=0.
|
|
31
|
+
Requires-Dist: ruff>=0.17; extra == 'dev'
|
|
32
32
|
Requires-Dist: ty>=0.0; extra == 'dev'
|
|
33
33
|
Provides-Extra: embed
|
|
34
|
+
Provides-Extra: examples
|
|
35
|
+
Requires-Dist: marimo>=0.19.9; (python_version < '3.15') and extra == 'examples'
|
|
34
36
|
Provides-Extra: grafeo
|
|
35
37
|
Requires-Dist: grafeo<0.7,>=0.5.44; extra == 'grafeo'
|
|
36
38
|
Provides-Extra: networkx
|
|
@@ -68,6 +70,7 @@ uv add "anywidget-graph[networkx]" # NetworkX support
|
|
|
68
70
|
uv add "anywidget-graph[pandas]" # pandas support
|
|
69
71
|
uv add "anywidget-graph[grafeo]" # Grafeo backend
|
|
70
72
|
uv add "anywidget-graph[cosmosdb]" # CosmosDB / Gremlin support
|
|
73
|
+
uv add "anywidget-graph[examples]" # marimo, to run the apps in examples/
|
|
71
74
|
```
|
|
72
75
|
|
|
73
76
|
## Quick Start
|
|
@@ -27,6 +27,7 @@ uv add "anywidget-graph[networkx]" # NetworkX support
|
|
|
27
27
|
uv add "anywidget-graph[pandas]" # pandas support
|
|
28
28
|
uv add "anywidget-graph[grafeo]" # Grafeo backend
|
|
29
29
|
uv add "anywidget-graph[cosmosdb]" # CosmosDB / Gremlin support
|
|
30
|
+
uv add "anywidget-graph[examples]" # marimo, to run the apps in examples/
|
|
30
31
|
```
|
|
31
32
|
|
|
32
33
|
## Quick Start
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "anywidget-graph"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.4"
|
|
4
4
|
description = "Interactive graph visualization for Python notebooks using anywidget"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -17,26 +17,28 @@ classifiers = [
|
|
|
17
17
|
"Programming Language :: Python :: 3.12",
|
|
18
18
|
"Programming Language :: Python :: 3.13",
|
|
19
19
|
"Programming Language :: Python :: 3.14",
|
|
20
|
+
"Programming Language :: Python :: 3.15",
|
|
20
21
|
"Topic :: Scientific/Engineering :: Visualization",
|
|
21
22
|
]
|
|
22
23
|
|
|
23
24
|
dependencies = [
|
|
24
25
|
"anywidget>=0.9.21",
|
|
25
|
-
"marimo>=0.19.9",
|
|
26
26
|
]
|
|
27
27
|
|
|
28
28
|
[project.optional-dependencies]
|
|
29
29
|
dev = [
|
|
30
30
|
"prek>=0.5",
|
|
31
31
|
"pytest>=9.1",
|
|
32
|
-
"ruff>=0.
|
|
32
|
+
"ruff>=0.17",
|
|
33
33
|
"ty>=0.0",
|
|
34
|
-
"marimo>=0.20",
|
|
34
|
+
"marimo>=0.20; python_version < '3.15'",
|
|
35
35
|
]
|
|
36
36
|
networkx = ["networkx>=3"]
|
|
37
37
|
pandas = ["pandas>=3"]
|
|
38
38
|
grafeo = ["grafeo>=0.5.44,<0.7"]
|
|
39
39
|
cosmosdb = ["gremlinpython>=3.8"]
|
|
40
|
+
# marimo, to run the apps in examples/; it pulls in loro, which has no Python 3.15 wheels yet
|
|
41
|
+
examples = ["marimo>=0.19.9; python_version < '3.15'"]
|
|
40
42
|
embed = [] # Marker extra: WASM loads from CDN on demand
|
|
41
43
|
demo = [] # Marker extra: enables demo mode with pre-populated dataset
|
|
42
44
|
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Bundle the graph libraries into one script the widget inlines, and collect the licenses of every bundled package.
|
|
2
|
+
// Run after `npm ci` in this folder: npm run build
|
|
3
|
+
import { build } from "esbuild";
|
|
4
|
+
import { readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
5
|
+
import { dirname, join } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const out = join(here, "..", "..", "src", "anywidget_graph", "ui", "vendor");
|
|
10
|
+
|
|
11
|
+
const result = await build({
|
|
12
|
+
entryPoints: [join(here, "entry.mjs")],
|
|
13
|
+
bundle: true,
|
|
14
|
+
format: "iife",
|
|
15
|
+
globalName: "anywidgetGraphVendor",
|
|
16
|
+
minify: true,
|
|
17
|
+
legalComments: "none",
|
|
18
|
+
target: "es2020",
|
|
19
|
+
metafile: true,
|
|
20
|
+
outfile: join(out, "graph-libs.min.js"),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Every package that ended up in the bundle, with its license text
|
|
24
|
+
const packages = new Map();
|
|
25
|
+
for (const input of Object.keys(result.metafile.inputs)) {
|
|
26
|
+
const match = /node_modules[\\/]((?:@[^\\/]+[\\/])?[^\\/]+)/.exec(input);
|
|
27
|
+
if (match) packages.set(match[1].replace("\\", "/"), true);
|
|
28
|
+
}
|
|
29
|
+
const sections = [...packages.keys()].sort().map((name) => {
|
|
30
|
+
const folder = join(here, "node_modules", name);
|
|
31
|
+
const { version, license } = JSON.parse(readFileSync(join(folder, "package.json"), "utf8"));
|
|
32
|
+
const file = readdirSync(folder).find((f) => /^licen[cs]e/i.test(f));
|
|
33
|
+
const text = file ? readFileSync(join(folder, file), "utf8").trim() : `(no license file; package.json says ${license})`;
|
|
34
|
+
return `== ${name}@${version} (${license})\n\n${text}\n`;
|
|
35
|
+
});
|
|
36
|
+
writeFileSync(
|
|
37
|
+
join(out, "graph-libs.LICENSES.txt"),
|
|
38
|
+
`Licenses of the packages bundled in graph-libs.min.js (built by scripts/vendor)\n\n${sections.join("\n")}`,
|
|
39
|
+
);
|
|
40
|
+
console.log(`graph-libs.min.js: ${[...packages.keys()].sort().join(", ")}`);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// The libraries the widget uses, under the names its modules expect (see ui/__init__.py)
|
|
2
|
+
export { default as Graph } from "graphology";
|
|
3
|
+
export { default as Sigma } from "sigma";
|
|
4
|
+
export { default as circular } from "graphology-layout/circular.js";
|
|
5
|
+
export { default as random } from "graphology-layout/random.js";
|
|
6
|
+
export { default as forceAtlas2 } from "graphology-layout-forceatlas2";
|
|
7
|
+
export * as d3Force from "d3-force";
|