From e5d97262332946daaeb5d12ec32cfd6a33e4282d Mon Sep 17 00:00:00 2001 From: Katherine Bargar Date: Wed, 12 Nov 2025 18:00:26 +0000 Subject: [PATCH 1/4] Ensure example python script runs --- examples/folio_demo.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/examples/folio_demo.py b/examples/folio_demo.py index 12949ca..9e8ba27 100644 --- a/examples/folio_demo.py +++ b/examples/folio_demo.py @@ -3,6 +3,8 @@ import sys +import httpx + import ldlite # Demo sites @@ -29,8 +31,8 @@ password="admin", ) -ld.connect_db(filename="ldlite.db") -# For PostgreSQL, use connect_db_postgresql() instead of connect_db(): +ld.experimental_connect_db_sqlite(filename="ldlite.sqlite") +# For PostgreSQL, use connect_db_postgresql() instead: # ld.connect_db_postgresql(dsn='dbname=ldlite host=localhost user=ldlite') queries: list[tuple[str, ...] | tuple[str, str, object, int]] = [ @@ -38,7 +40,8 @@ ("folio_agreements.erm_resource", "/erm/resource"), ("folio_agreements.org", "/erm/org"), ("folio_agreements.refdata_value", "/erm/refdata"), - ("folio_agreements.usage_data_provider", "/usage-data-providers"), + # This endpoint doesn't work in EBSCO environments + # ("folio_agreements.usage_data_provider", "/usage-data-providers"), ("folio_audit.circulation_logs", "/audit-data/circulation/logs"), ("folio_circulation.audit_loan", "/loan-storage/loan-history"), ( @@ -165,7 +168,7 @@ "/acquisitions-units-storage/memberships", ), ("folio_orders.alert", "/orders-storage/alerts"), - ("folio_orders.order_invoice_relationship/orders-storage/order-invoice-relns"), + ("folio_orders.order_invoice_relationship", "/orders-storage/order-invoice-relns"), ("folio_orders.order_templates", "/orders-storage/order-templates"), ("folio_orders.pieces", "/orders-storage/pieces"), ("folio_orders.po_line", "/orders-storage/po-lines"), @@ -176,10 +179,10 @@ ("folio_organizations.contacts", "/organizations-storage/contacts"), ("folio_organizations.emails", "/organizations-storage/emails"), ("folio_organizations.interfaces", "/organizations-storage/interfaces"), - ("folio_organizations.organizations", "/organizations-storage/organizations"), + ("folio_organizations.organizations", "/organizations/organizations"), ("folio_organizations.phone_numbers", "/organizations-storage/phone-numbers"), ("folio_organizations.urls", "/organizations-storage/urls"), - ("folio_source_record.records", "/source-storage/records", {}, 2), + ("folio_source_record.records", "/source-storage/records", 2), ("folio_users.addresstype", "/addresstypes"), ("folio_users.departments", "/departments"), ("folio_users.groups", "/groups"), @@ -187,25 +190,31 @@ ("folio_users.users", "/users"), ] +errors: list[tuple[str, BaseException]] = [] tables: list[str] = [] for q in queries: try: - if len(q) == 4: + if len(q) == 3: tables += ld.query( table=q[0], path=q[1], - query=str(q[2]), - json_depth=int(q[3]), + json_depth=int(q[2]), ) else: - tables += ld.query(table=q[0], path=q[1], query=str(q[2])) - except (ValueError, RuntimeError) as e: - print( - 'folio_demo.py: error processing "' + str(q[1]) + '": ' + str(e), - file=sys.stderr, - ) + tables += ld.query(table=q[0], path=q[1]) + except (ValueError, RuntimeError, httpx.HTTPError) as e: + errors += [(q[1], e)] print() print("Tables:") for t in tables: print(t) print("(" + str(len(tables)) + " tables)") +if len(errors) > 0: + print() + print("Errors:") + for p, e in errors: + print( + 'folio_demo.py: error processing "' + p + '": ' + str(e), + file=sys.stderr, + ) +print("(" + str(len(errors)) + " errors)") From 39103baf9fc7bdaa3571909575514ba54624c0fa Mon Sep 17 00:00:00 2001 From: Katherine Bargar Date: Wed, 12 Nov 2025 18:02:17 +0000 Subject: [PATCH 2/4] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c610db3..77abe26 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ Please see [MIGRATING.md](./MIGRATING.md) for information on breaking changes. ### Fixed - Endpoints which return system fields before the record list +- Example python script ### Changed From 74366901b6cfbff4722407d0c4dc8e794c5da957 Mon Sep 17 00:00:00 2001 From: Katherine Bargar Date: Wed, 12 Nov 2025 18:06:43 +0000 Subject: [PATCH 3/4] Document the installation with postgres issue --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 80c1741..819ea9d 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,12 @@ To install LDLite or upgrade to the latest version: ```bash $ python -m pip install --upgrade ldlite ``` - (On some systems it might be `python3` rather than `python`.) + +If you encounter the error `ImportError: no pq wrapper available.` you can either +* Run `python -m pip install psycopg[binary]` +* Ensure the libpq package is installed for your operating system + Check out the [migration guide](./MIGRATING.md) for more information about major version upgrades. To extract and transform data: From 9497b097f5165f766ac3150013a2d58080b517aa Mon Sep 17 00:00:00 2001 From: Katherine Bargar Date: Wed, 12 Nov 2025 18:12:29 +0000 Subject: [PATCH 4/4] Ignore .sqlite files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5c922ab..eb4e9c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ !precious.toml +ldlite.sqlite ldlite.db ldlite.db.wal