Commit Graph
10 Commits
Author SHA1 Message Date
Bart BroereandClaude Opus 5.5 ee980b27fe Derive the version from git with verri
Use verri's strawberry flavour through hatchling's code version source, so
versions look like 2026.10.21.0: the HEAD commit date plus the number of
earlier commits that day.

Container images build the sdist in a separate stage that has the git
repository, so they get the same version instead of a +vcs.missing one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:44:26 +02:00
Bart Broere e7ef15fc79 Several variants of the container 2026-10-21 11:48:08 +02:00
Bart BroereandClaude Opus 5.5 f0fb9ddc74 Use Starlette, uvicorn and websockets; rename Docker files to container ones
Serve neo4j-browser with Starlette and uvicorn (the optional browser extra)
instead of a hand-written HTTP server, and handle Bolt over WebSocket with the
websockets library's Sans-I/O protocol. Rename Dockerfile, .dockerignore and
docker/ to Containerfile, .containerignore and container/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:27:25 +02:00
Bart Broere 3e8e498b56 Move peo package to a different spot to prepare it for PyPI 2026-10-21 10:59:30 +02:00
Bart BroereandClaude Opus 5.5 9a25aa11c9 Remove automatic generated property columns
The columns could only be text, since a typed column makes Cypher writes
fail on values of another type. Leave typed columns and views to the
database administrator instead, and document how to set them up.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 15:33:29 +02:00
Bart BroereandClaude Opus 5.5 fd0dda6470 Rename peo4c to peo
Renames the Python package, environment variables (PEO4C_* to PEO_*), the
SQL helper schema, image paths and the entrypoint script.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 15:21:42 +02:00
Bart BroereandClaude Opus 5.5 7bd044ddb9 Add generated SQL columns for graph properties
AGE keeps all properties in one agtype column and its Cypher writes fire
no triggers, so the bridge periodically calls a stored procedure that adds
a stored generated text column for every new property key. Only label
tables with inserts or updates since the previous run are scanned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:26:49 +02:00
Bart BroereandClaude Opus 5.5 04e1c32223 License peo4c under GPL-3.0-or-later and ship third-party notices
- Add the GPL-3.0 LICENSE and SPDX headers to peo4c's own files.
- Add THIRD_PARTY_NOTICES.md listing every bundled component, its
  license and where its license text lives in the image, plus a
  trademark disclaimer; reference it from the README.
- Ship neo4j-browser's LICENSE, NOTICE.txt and LICENSES.txt with a
  source archive of the built commit, as the GPL requires.
- Ship Apache AGE's LICENSE and NOTICE, which the base image lacks.
- Collect license texts for Python packages whose wheels omit them,
  from PyPI sdists or vendored copies in docker/licenses/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:58:27 +02:00
Bart BroereandClaude Opus 5.5 e72af59401 Add pgAdmin to the peo4c image
Install pgAdmin 9.18 in its own virtualenv and run it under gunicorn on
port 5050 next to PostgreSQL and the bridge. On first start the
entrypoint creates the pgAdmin login (PGADMIN_DEFAULT_EMAIL, default
admin@example.com; PGADMIN_DEFAULT_PASSWORD, default POSTGRES_PASSWORD)
and registers the bundled PostgreSQL server. pgAdmin is optional
(PEO4C_PGADMIN=false) and a failure in it does not stop the container.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:19:58 +02:00
Bart BroereandClaude Opus 5.5 47b8f5f746 Add peo4c: neo4j-browser on PostgreSQL + Apache AGE
A single container image with:
- neo4j-browser built from source and served on :7474
- PostgreSQL with Apache AGE (based on apache/age)
- a Python bridge speaking Bolt 4.4/5.0-5.4 over TCP and WebSocket on
  :7687 that runs Cypher through AGE's cypher() function, emulates the
  Neo4j procedures neo4j-browser relies on, and maps databases to AGE
  graphs

Includes workarounds for AGE limitations (parameters are inlined as
literals, `id(x) IN [...]` and the browser's expand-node query are
rewritten) and an end-to-end smoke test using the Neo4j Python driver.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:46:20 +02:00