Skip to content

Commit 10d230e

Browse files
committed
Record source and import timestamps
1 parent 5fd60e9 commit 10d230e

3 files changed

Lines changed: 17 additions & 0 deletions

File tree

‎src/openstatspec/spss/sav.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import hashlib
44
import json
55
import math
6+
from datetime import UTC, datetime
67
from pathlib import Path
78
from typing import Any
89

@@ -74,6 +75,9 @@ def import_sav_dataset(*, source: str | Path, database_url: str, dataset_id: str
7475
variables=variables, file_label=getattr(meta, "file_label", "") or "",
7576
source_encoding=getattr(meta, "file_encoding", None),
7677
source_sha256=_sha256(source_path),
78+
source_created_at=_iso_datetime(getattr(meta, "creation_time", None)),
79+
source_modified_at=_iso_datetime(getattr(meta, "modification_time", None)),
80+
imported_at=datetime.now(UTC).isoformat(),
7781
documents=json.dumps(list(getattr(meta, "notes", []) or [])),
7882
multiple_response_sets=json.dumps(dict(getattr(meta, "mr_sets", {}) or {}), default=str),
7983
)
@@ -117,6 +121,10 @@ def export_sav_dataset(*, database_url: str, dataset_id: str, destination: str |
117121

118122

119123

124+
125+
def _iso_datetime(value: Any) -> str | None:
126+
return value.isoformat() if value is not None else None
127+
120128
def _sha256(path: Path) -> str:
121129
digest = hashlib.sha256()
122130
with path.open("rb") as source:

‎src/openstatspec/sql/wide.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ def catalog(metadata: MetaData) -> tuple[Table, Table]:
1818
Column("source_format", String(16), nullable=False),
1919
Column("source_name", Text, nullable=False),
2020
Column("source_sha256", String(64), nullable=False),
21+
Column("source_created_at", String(40)),
22+
Column("source_modified_at", String(40)),
23+
Column("imported_at", String(40), nullable=False),
2124
Column("source_encoding", String(128)),
2225
Column("case_count", BigInteger, nullable=False),
2326
Column("file_label", Text, nullable=False, default=""),
@@ -64,6 +67,8 @@ def create_wide_dataset(
6467
rows: Iterable[Mapping[str, Any]], variables: list[dict[str, Any]], file_label: str = "",
6568
source_encoding: str | None = None, documents: str = "[]",
6669
source_sha256: str = "",
70+
source_created_at: str | None = None, source_modified_at: str | None = None,
71+
imported_at: str = "",
6772
multiple_response_sets: str = "{}",
6873
) -> dict[str, Any]:
6974
profile = profile_for_url(database_url)
@@ -87,6 +92,8 @@ def create_wide_dataset(
8792
dataset_id=dataset_id, data_table=data_table.name, source_format=source_format,
8893
source_name=source_name, source_encoding=source_encoding, case_count=len(materialized),
8994
source_sha256=source_sha256,
95+
source_created_at=source_created_at, source_modified_at=source_modified_at,
96+
imported_at=imported_at,
9097
file_label=file_label, documents=documents,
9198
multiple_response_sets=multiple_response_sets,
9299
))

‎tests/test_sav_sqlite.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def test_sav_round_trip_uses_one_wide_table_and_catalog(tmp_path) -> None:
3737
]
3838
assert connection.execute("select source_encoding, documents from dataset_catalog").fetchone() == ("UTF-8", json.dumps(["Fixture note"]))
3939
assert connection.execute("select source_sha256 from dataset_catalog").fetchone() == (hashlib.sha256(source.read_bytes()).hexdigest(),)
40+
created_at, modified_at, imported_at = connection.execute("select source_created_at, source_modified_at, imported_at from dataset_catalog").fetchone()
41+
assert created_at and modified_at and imported_at
4042

4143
openstatspec.export_sav(database_url=database, dataset_id="tiny", destination=exported)
4244
frame, meta = pyreadstat.read_sav(exported, user_missing=True)

0 commit comments

Comments
 (0)