@noeva/analytics-core 0.3.2 → 0.3.3

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  Le versioni del pacchetto che i repository dei progetti installano (ADR 0005). Prima di
4
4
  `analytics upgrade` si legge cosa cambia fra la versione installata e la nuova.
5
5
 
6
+ ## 0.3.3 — 6 novembre 2026
7
+
8
+ - Il contenitore parla Oracle: l'extra `oracle` di wrenai (oracledb in modalita' thin,
9
+ Oracle 12.1 e successivi). Per una sorgente 11.2 serve la modalita' thick, con
10
+ l'Instant Client, che il contenitore non ha.
11
+ - `correggi-oracle.py` corregge in build il connettore Oracle di wrenai 0.15.0, che
12
+ leggeva i `NUMBER` senza precisione (colonne non vincolate, `SUM`, divisioni) come
13
+ interi e troncava i decimali senza errori. Si ferma se una versione nuova di wrenai
14
+ cambia il connettore. Un `FLOAT` (anche `CAST(... AS DOUBLE)`, che il motore traduce in
15
+ `DOUBLE PRECISION`) faceva fallire la query: ora e' virgola mobile.
16
+ - Si ricostruisce il contenitore: `docker compose --env-file .env.local up -d --build`.
17
+
6
18
  ## 0.3.2 — 6 novembre 2026
7
19
 
8
20
  - Su Windows la CLI non partiva: la cartella del pacchetto si ricavava con
@@ -44,11 +44,18 @@ USER wren
44
44
  WORKDIR /home/wren
45
45
 
46
46
  # mcp<2: wrenai importa mcp.server.fastmcp, tolto nell'SDK 2.x.
47
+ # `oracle` porta oracledb in modalita' thin (Oracle 12.1 e successivi, niente
48
+ # Instant Client).
47
49
  ARG WRENAI_VERSION=0.15.0
48
50
  RUN pip install --user \
49
- "wrenai[mssql,clickhouse,postgres,memory-onnx,mcp,main]==${WRENAI_VERSION}" \
51
+ "wrenai[mssql,clickhouse,postgres,oracle,memory-onnx,mcp,main]==${WRENAI_VERSION}" \
50
52
  "mcp[cli]>=1.19,<2"
51
53
 
54
+ # Il connettore Oracle di wrenai 0.15.0 tronca i decimali dei NUMBER senza
55
+ # precisione: vedi correggi-oracle.py.
56
+ COPY correggi-oracle.py /tmp/correggi-oracle.py
57
+ RUN python /tmp/correggi-oracle.py
58
+
52
59
  RUN python -c "import pyodbc; \
53
60
  drivers = pyodbc.drivers(); \
54
61
  assert any('SQL Server' in d for d in drivers), f'driver ODBC assente: {drivers}'; \
@@ -0,0 +1,39 @@
1
+ """Corregge il connettore Oracle di wrenai 0.15.0, che tronca i decimali.
2
+
3
+ `wren/connector/oracle.py` traduce un NUMBER senza precisione in int64: e' il tipo
4
+ delle colonne non vincolate (molte, nei data mart Oracle) e di ogni espressione
5
+ calcolata da Oracle (SUM, divisioni, ROUND). Il risultato e' 400,68 € letto come
6
+ 400, senza errori. Qui, quando i metadati non dicono la precisione, decidono i
7
+ valori: tutti interi -> int64, altrimenti float64. Un FLOAT(p) (scala -127: e'
8
+ anche il CAST(... AS DOUBLE) che il motore traduce in DOUBLE PRECISION) diventava
9
+ decimal(38,0) e la query falliva: diventa float64.
10
+
11
+ Si applica in build (Dockerfile) e si ferma se il connettore e' cambiato: a una
12
+ versione nuova di wrenai si controlla se la correzione serve ancora.
13
+ """
14
+ import pathlib
15
+ import sys
16
+
17
+ import wren.connector.oracle as connettore
18
+
19
+ file = pathlib.Path(connettore.__file__)
20
+ sorgente = file.read_text()
21
+ prima = """ if db_type == oracledb.DB_TYPE_NUMBER:
22
+ arrow_type = _ora_number_type(precision, scale)"""
23
+ dopo = """ if db_type == oracledb.DB_TYPE_NUMBER and not precision and scale in (None, -127):
24
+ # NUMBER senza precisione: decidono i valori (correggi-oracle.py).
25
+ vals = [v for v in col_values[i] if v is not None]
26
+ arrow_type = pa.int64() if all(isinstance(v, int) for v in vals) else pa.float64()
27
+ elif db_type == oracledb.DB_TYPE_NUMBER and scale == -127:
28
+ # FLOAT(p), anche CAST(... AS DOUBLE PRECISION): virgola mobile.
29
+ arrow_type = pa.float64()
30
+ elif db_type == oracledb.DB_TYPE_NUMBER:
31
+ arrow_type = _ora_number_type(precision, scale)"""
32
+
33
+ if dopo in sorgente:
34
+ print("connettore Oracle: gia' corretto")
35
+ sys.exit(0)
36
+ if sorgente.count(prima) != 1:
37
+ sys.exit("connettore Oracle cambiato: rivedere correggi-oracle.py")
38
+ file.write_text(sorgente.replace(prima, dopo))
39
+ print("connettore Oracle: corretto", file)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noeva/analytics-core",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Gli strumenti di un progetto NOEVA Analytics nel suo repository: moduli di pagina, snapshot, verifica dello standard e kit dell'agente (ADR 0005).",
5
5
  "type": "module",
6
6
  "bin": {