Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
180 lines (170 loc) · 7.83 KB
/
Copy pathpyproject.toml
File metadata and controls
180 lines (170 loc) · 7.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
[build-system]
# setup.py imports only setuptools, so the build needs no JPype. A build-time jpype1 was compiled from
# source on a Python without a JPype wheel (3.15, until JPype > 1.7.1) and failed there. `build` is a
# frontend, not a backend requirement.
# setuptools 70.1 is the first release with its own bdist_wheel command, which setup.py subclasses to
# tag the wheel py3-none-<platform>.
requires = ["setuptools>=70.1", "wheel"]
build-backend = "setuptools.build_meta"
# This file defines the package metadata for arcadedb.
# During build, the version is overwritten from the bundled ArcadeDB engine jar via
# scripts/extract_version.py
[project]
name = "arcadedb-jvm"
version = "0.0.0"
description = "ArcadeDB embedded multi-model database, JVM build with a bundled JRE (no Java installation needed). The native build is the package arcadedb; both import as arcadedb"
readme = "README.md"
# The upper bound is JPype: jpype1 1.7.1 has wheels for CPython 3.11 to 3.14 and none for 3.15 (JPype
# merged 3.15 support in jpype-project/jpype#1501, not released yet). The wheels of this package are
# py3-none-<platform>, so the wheel tag no longer keeps an installer off an interpreter: without this cap an installer
# would put the wheel on 3.15 and then try to build JPype from source.
# REMOVE THE CAP when jpype1 ships cp315 wheels: then add the 3.15 classifier below, 3.15 to PYTHONS in
# scripts/select_matrix.py and the cap in tests/test_select_matrix.py.
requires-python = ">=3.11,<3.15"
license = { text = "Apache-2.0" }
authors = [
{ name = "Taewoon Kim", email = "taewoon@humem.ai" }
]
keywords = ["database", "graph", "document", "multi-model", "nosql", "arcadedb", "embedded", "jre", "java", "jvm"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: Database",
"Topic :: Software Development :: Libraries :: Python Modules",
]
dependencies = [
"jpype1>=1.5.0",
]
[tool.uv]
# This pyproject is the *package definition* consumed by the wheel build
# (scripts/build.sh). It is not a uv project: tests run against the built wheel,
# with its `test` extra, in a throwaway `uv run --no-project --with` environment
# (see README, Testing). `managed = false` makes uv skip it during project
# discovery, so `uv run` never tries to sync this package.
managed = false
[project.optional-dependencies]
test = [
"pytest>=9.0.3",
"pytest-cov",
"numpy>=1.26.4",
"requests>=2.33.0", # HTTP API / docs-example tests
# Real clients for the bundled wire protocols. Test-only: none of these
# reaches an end user's install, and without them three shipped protocols
# are covered by nothing but the jars being present in the archive.
"psycopg[binary]>=3.1", # Postgres wire
"adbc-driver-postgresql>=1.12", # Postgres wire, Arrow ADBC (26.10.1+)
"redis>=5.0", # Redis wire
"neo4j>=5.0", # Bolt
"pyarrow>=23.0.1", # ResultSet.to_arrow(); <23.0.1 has PYSEC-2026-113
"polars>=1.0", # ResultSet.to_polars(), insert_dataframe() with a Polars frame
# ResultSet.to_dataframe(). Absent until 2026-08-04, which meant its two
# tests called importorskip("pandas") and skipped in every CI run this
# package has ever had: a public, documented method with no executed
# coverage. Same shape as the arrow gap, but in the extras DEFINITION
# rather than an install command, so no amount of care at install time
# would have caught it.
"pandas>=2.2.0",
# Reference engines for tests/test_equivalence.py (humemai/arcadedb-embedded-python#347): the same question asked
# of a second engine over the same data. All three have wheels for every CI platform, so the file never skips.
"duckdb>=1.4.2",
"ladybug>=0.21.2",
"networkx>=3.4",
# tests/test_wheel_packages.py runs `setup.py build_py` on a copy of the sources to prove the JVM wheel ships every
# subpackage; Python 3.12+ venvs have no setuptools, so without it here the test fails on those legs instead of running.
# Floor 84.1.0: the dependency-floor audit resolves the lowest version; pip-audit (2026-10-24) finds no known
# vulnerability in 84.1.0, while 78.1.1 still has PYSEC-2026-3447 and GHSA-xmj3-9gf7-h52w.
"setuptools>=84.1.0",
]
dev = [
"black",
"isort",
"mypy",
"pytest>=9.0.3",
"pytest-cov",
"numpy>=1.26.4",
"requests>=2.33.0", # HTTP API / docs-example tests
"bandit>=1.9.1",
]
vector = [
"numpy>=1.26.4",
]
# Optional: ResultSet.to_arrow(). The columnar bridge already emits packed
# columns with a null bitmap, so this adds no Java and no jars to the wheel;
# pyarrow is only needed to wrap those buffers. Without it to_arrow() returns
# None and callers fall back to to_columns().
arrow = [
"pyarrow>=23.0.1",
"numpy>=1.26.4",
]
# Optional: ResultSet.to_dataframe(). Shipped and documented long before this
# extra existed, so the only way to discover the dependency was to call the
# method and read the ImportError. `arrow` had an extra and `pandas` did not,
# for two methods on the same class doing the same kind of thing.
#
# Note the two differ in how they FAIL, and that is deliberate on to_arrow's
# side rather than an oversight here: to_arrow() returns None so callers can
# fall back to to_columns(), while to_dataframe() raises ImportError. Changing
# to_dataframe to match would break callers relying on the exception, so it
# stays as it is and is documented rather than quietly aligned.
pandas = [
"pandas>=2.2.0",
"numpy>=1.26.4",
]
# Optional: ResultSet.to_polars() and insert_dataframe() with a Polars frame. Both go
# through Arrow, so pyarrow comes with it. insert_dataframe() with a pandas frame needs
# `uv add 'arcadedb-jvm[arrow,pandas]'` (the pandas extra alone has no pyarrow,
# because to_dataframe() does not need it).
polars = [
"polars>=1.0",
"pyarrow>=23.0.1",
"numpy>=1.26.4",
]
examples = [
"py7zr>=1.1.3", # Required for Stack Exchange data downloads
]
[project.urls]
Homepage = "https://github.com/ArcadeData/arcadedb-python"
Documentation = "https://docs.arcadedb.com/arcadedb-python/"
Repository = "https://github.com/ArcadeData/arcadedb-python"
"Bug Tracker" = "https://github.com/ArcadeData/arcadedb-python/issues"
"ArcadeDB Upstream" = "https://github.com/ArcadeData/arcadedb"
[tool.setuptools]
packages = ["arcadedb", "arcadedb._native"]
package-dir = { "" = "src" }
include-package-data = true
[tool.setuptools.package-data]
arcadedb = [
"jars/*.jar",
"jre/**/*",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = "-v --tb=short"
# A test still running after 10 minutes dumps every thread's stack, so a hang
# explains itself instead of ending as a silent CI step timeout (one Windows
# job sat 25 minutes in test_per_index_cache_params on 2026-09-27; its rerun
# passed). The whole suite takes about four minutes.
faulthandler_timeout = 600
markers = [
"server: tests that require server/studio support",
"server_wire: speaks a bundled wire protocol with its real client",
"integration: tests that require external components",
]
[tool.bandit]
# Skip recursion into test data and build artifacts.
# Patterns are matched as substrings, so anchor with leading "/" to avoid
# accidentally excluding files like examples/11_vector_index_build.py.
exclude_dirs = ["/tests/.cache/", "/build/", "/dist/"]
# B101 (assert_used) is the standard pytest idiom and the production source
# (src/) intentionally contains no assert statements - so we skip it globally
# rather than maintaining a per-file glob list.
skips = ["B101"]