Skip to content

Commit ef91adc

Browse files
committed
test / quickstart fixes
1 parent a066b1c commit ef91adc

5 files changed

Lines changed: 73 additions & 27 deletions

File tree

examples/advanced/file_upload.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -152,18 +152,18 @@ def backoff(op, *, delays=(0,2,5,10), retry_status=(400,403,404,409,412,429,500,
152152
raise last
153153

154154
# --------------------------- Table ensure ---------------------------
155-
TABLE_SCHEMA_NAME = "new_FileSample"
155+
TABLE_LOGICAL_NAME = "new_filesample"
156156
# If user wants new publisher prefix / naming, adjust above.
157157

158158
def ensure_table():
159-
# Check by schema
160-
existing = client.get_table_info(TABLE_SCHEMA_NAME)
159+
# Check by logical name
160+
existing = client.get_table_info(TABLE_LOGICAL_NAME)
161161
if existing:
162-
print({"table": TABLE_SCHEMA_NAME, "existed": True})
162+
print({"table": TABLE_LOGICAL_NAME, "existed": True})
163163
return existing
164-
log("client.create_table('new_filesample', schema={new_title})")
165-
info = client.create_table(TABLE_SCHEMA_NAME, {"new_title": "string"})
166-
print({"table": TABLE_SCHEMA_NAME, "existed": False, "metadata_id": info.get('metadata_id')})
164+
log(f"client.create_table('{TABLE_LOGICAL_NAME}', schema={{'new_title': 'string'}})")
165+
info = client.create_table(TABLE_LOGICAL_NAME, {"new_title": "string"})
166+
print({"table": TABLE_LOGICAL_NAME, "existed": False, "metadata_id": info.get('metadata_id')})
167167
return info
168168

169169
try:
@@ -388,8 +388,8 @@ def get_dataset_info(file_path: Path):
388388
# --------------------------- Cleanup ---------------------------
389389
if cleanup_record and record_id:
390390
try:
391-
log(f"client.delete('{entity_set}', '{record_id}')")
392-
backoff(lambda: client.delete(entity_set, record_id))
391+
log(f"client.delete('{logical}', '{record_id}')")
392+
backoff(lambda: client.delete(logical, record_id))
393393
print({"record_deleted": True})
394394
except Exception as e: # noqa: BLE001
395395
print({"record_deleted": False, "error": str(e)})
@@ -398,8 +398,8 @@ def get_dataset_info(file_path: Path):
398398

399399
if cleanup_table:
400400
try:
401-
log(f"client.delete_table('{TABLE_SCHEMA_NAME}')")
402-
client.delete_table(TABLE_SCHEMA_NAME)
401+
log(f"client.delete_table('{TABLE_LOGICAL_NAME}')")
402+
client.delete_table(TABLE_LOGICAL_NAME)
403403
print({"table_deleted": True})
404404
except Exception as e: # noqa: BLE001
405405
print({"table_deleted": False, "error": str(e)})

examples/advanced/pandas_integration.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ def backoff_retry(op, *, delays=(0, 2, 5, 10, 20), retry_http_statuses=(400, 403
5454
table_info = None
5555
created_this_run = False
5656

57-
# First check for existing table
58-
existing = client.get_table_info("SampleItem")
57+
# First check for existing table (use logical name - lowercase with prefix)
58+
existing = client.get_table_info("new_sampleitem")
5959
if existing:
6060
table_info = existing
6161
created_this_run = False
@@ -68,16 +68,16 @@ def backoff_retry(op, *, delays=(0, 2, 5, 10, 20), retry_http_statuses=(400, 403
6868
})
6969

7070
else:
71-
# Create it since it doesn't exist
71+
# Create it since it doesn't exist (use logical name)
7272
try:
7373
table_info = client.create_table(
74-
"SampleItem",
74+
"new_sampleitem",
7575
{
76-
"code": "string",
77-
"count": "int",
78-
"amount": "decimal",
79-
"when": "datetime",
80-
"active": "bool",
76+
"new_code": "string",
77+
"new_count": "int",
78+
"new_amount": "decimal",
79+
"new_when": "datetime",
80+
"new_active": "bool",
8181
},
8282
)
8383
created_this_run = True if table_info and table_info.get("columns_created") else False
@@ -217,10 +217,10 @@ def _retry_if(ex: Exception) -> bool:
217217
# 6) Cleanup: delete the custom table if it exists
218218
print("Cleanup (Metadata):")
219219
try:
220-
# Delete if present, regardless of whether it was created in this run
221-
info = client.get_table_info("SampleItem")
220+
# Delete if present, regardless of whether it was created in this run (use logical name)
221+
info = client.get_table_info("new_sampleitem")
222222
if info:
223-
client.delete_table("SampleItem")
223+
client.delete_table("new_sampleitem")
224224
print({"table_deleted": True})
225225
else:
226226
print({"table_deleted": False, "reason": "not found"})

examples/basic/quickstart.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -646,11 +646,11 @@ def _ensure_removed():
646646
print("Cleanup (Metadata):")
647647
if delete_table_at_end:
648648
try:
649-
log_call("client.get_table_info('new_SampleItem')")
650-
info = client.get_table_info("new_SampleItem")
649+
log_call("client.get_table_info('new_sampleitem')")
650+
info = client.get_table_info("new_sampleitem")
651651
if info:
652-
log_call("client.delete_table('new_SampleItem')")
653-
client.delete_table("new_SampleItem")
652+
log_call("client.delete_table('new_sampleitem')")
653+
client.delete_table("new_sampleitem")
654654
print({"table_deleted": True})
655655
else:
656656
print({"table_deleted": False, "reason": "not found"})

src/dataverse_sdk/data/odata.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,9 @@ def _create_multiple(self, entity_set: str, logical_name: str, records: List[Dic
255255
# --- Derived helpers for high-level client ergonomics ---
256256
def _primary_id_attr(self, logical_name: str) -> str:
257257
"""Return primary key attribute using metadata; error if unavailable."""
258+
# Normalize logical name for case-insensitive lookup
259+
logical_name = self._normalize_logical_name(logical_name)
260+
258261
# Get from unified metadata cache
259262
if logical_name in self._entity_metadata_cache:
260263
pid = self._entity_metadata_cache[logical_name].get('primary_id_attribute')
@@ -713,6 +716,9 @@ def _logical_to_schema_name(self, logical_name: str) -> str:
713716
Use this ONLY when creating new entities where we control the SchemaName.
714717
For existing entities, use _get_entity_schema_name() to get the actual SchemaName from server.
715718
"""
719+
# Normalize logical name first
720+
logical_name = self._normalize_logical_name(logical_name)
721+
716722
if "_" not in logical_name:
717723
# No prefix, just capitalize first letter
718724
return logical_name[:1].upper() + logical_name[1:]

tests/unit/data/test_naming_normalization.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,5 +608,45 @@ def test_attribute_cache_case_insensitive():
608608
assert ("NEW_SAMPLEITEM", "NEW_TITLE") not in c._attribute_schema_cache
609609

610610

611+
def test_primary_id_attr_case_insensitive():
612+
"""Test that _primary_id_attr normalizes logical names for cache lookup."""
613+
responses = [
614+
(200, {}, MD_SAMPLE_ITEM) # Only ONE server call should be made
615+
]
616+
c = TestableClient(responses)
617+
618+
# Multiple lookups with different casings
619+
pid1 = c._primary_id_attr("new_sampleitem")
620+
pid2 = c._primary_id_attr("NEW_SAMPLEITEM")
621+
pid3 = c._primary_id_attr("New_SampleItem")
622+
pid4 = c._primary_id_attr(" new_sampleitem ") # With whitespace
623+
624+
# All should return the same primary ID attribute
625+
assert pid1 == pid2 == pid3 == pid4 == "new_sampleitemid"
626+
627+
# Verify only 1 HTTP call was made (all others used cache)
628+
assert len(c._http.calls) == 1
629+
630+
# Verify the cache key is normalized (lowercase)
631+
assert "new_sampleitem" in c._entity_metadata_cache
632+
assert "NEW_SAMPLEITEM" not in c._entity_metadata_cache
633+
634+
635+
def test_logical_to_schema_name_case_insensitive():
636+
"""Test that _logical_to_schema_name normalizes input for consistent output."""
637+
c = TestableClient([])
638+
639+
# All variations should produce the same SchemaName
640+
assert c._logical_to_schema_name("new_sampleitem") == "new_Sampleitem"
641+
assert c._logical_to_schema_name("NEW_SAMPLEITEM") == "new_Sampleitem"
642+
assert c._logical_to_schema_name("New_SampleItem") == "new_Sampleitem"
643+
assert c._logical_to_schema_name(" new_sampleitem ") == "new_Sampleitem"
644+
645+
# Test without prefix
646+
assert c._logical_to_schema_name("account") == "Account"
647+
assert c._logical_to_schema_name("ACCOUNT") == "Account"
648+
assert c._logical_to_schema_name("Account") == "Account"
649+
650+
611651
if __name__ == "__main__":
612652
pytest.main([__file__, "-v"])

0 commit comments

Comments
 (0)