ds-caselaw-marklogic-api-client 39.1.0__tar.gz → 39.2.1__tar.gz

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.
Files changed (94) hide show
  1. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/PKG-INFO +6 -4
  2. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/README.md +3 -1
  3. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/pyproject.toml +9 -8
  4. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/Client.py +10 -4
  5. ds_caselaw_marklogic_api_client-39.2.1/src/caselawclient/__init__.py +63 -0
  6. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/documents/__init__.py +5 -1
  7. ds_caselaw_marklogic_api_client-39.2.1/src/caselawclient/models/documents/comparison.py +42 -0
  8. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/identifiers/__init__.py +4 -2
  9. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/utilities/aws.py +2 -0
  10. ds_caselaw_marklogic_api_client-39.1.0/src/caselawclient/__init__.py +0 -40
  11. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/LICENSE.md +0 -0
  12. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/client_helpers/__init__.py +0 -0
  13. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/client_helpers/search_helpers.py +0 -0
  14. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/content_hash.py +0 -0
  15. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/errors.py +0 -0
  16. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/factories.py +0 -0
  17. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/identifier_resolution.py +0 -0
  18. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/__init__.py +0 -0
  19. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/documents/body.py +0 -0
  20. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/documents/exceptions.py +0 -0
  21. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/documents/statuses.py +0 -0
  22. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/documents/transforms/html.xsl +0 -0
  23. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/documents/xml.py +0 -0
  24. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/identifiers/collection.py +0 -0
  25. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/identifiers/exceptions.py +0 -0
  26. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/identifiers/fclid.py +0 -0
  27. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/identifiers/neutral_citation.py +0 -0
  28. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/identifiers/press_summary_ncn.py +0 -0
  29. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/identifiers/unpacker.py +0 -0
  30. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/judgments.py +0 -0
  31. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/neutral_citation_mixin.py +0 -0
  32. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/parser_logs.py +0 -0
  33. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/press_summaries.py +0 -0
  34. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/utilities/__init__.py +0 -0
  35. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/utilities/dates.py +0 -0
  36. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/models/utilities/move.py +0 -0
  37. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/py.typed +0 -0
  38. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/responses/__init__.py +0 -0
  39. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/responses/search_response.py +0 -0
  40. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/responses/search_result.py +0 -0
  41. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/responses/xsl/search_match.xsl +0 -0
  42. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/search_parameters.py +0 -0
  43. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/types.py +0 -0
  44. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xml_helpers.py +0 -0
  45. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/break_judgment_checkout.xqy +0 -0
  46. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/checkin_judgment.xqy +0 -0
  47. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/checkout_judgment.xqy +0 -0
  48. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/copy_document.xqy +0 -0
  49. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/delete_judgment.xqy +0 -0
  50. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/document_collections.xqy +0 -0
  51. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/document_exists.xqy +0 -0
  52. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_combined_stats_table.xqy +0 -0
  53. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_components_for_document.xqy +0 -0
  54. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_highest_enrichment_version.xqy +0 -0
  55. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_highest_parser_version.xqy +0 -0
  56. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_judgment.xqy +0 -0
  57. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_judgment_checkout_status.xqy +0 -0
  58. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_judgment_version.xqy +0 -0
  59. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_last_modified.xqy +0 -0
  60. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_missing_fclid.xqy +0 -0
  61. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_next_document_sequence_number.xqy +0 -0
  62. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_pending_enrichment_for_version.xqy +0 -0
  63. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_pending_parse_for_version.xqy +0 -0
  64. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_properties_for_search_results.xqy +0 -0
  65. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_property.xqy +0 -0
  66. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_property_as_node.xqy +0 -0
  67. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_recently_enriched.xqy +0 -0
  68. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_recently_parsed.xqy +0 -0
  69. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_version_annotation.xqy +0 -0
  70. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/get_version_created.xqy +0 -0
  71. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/insert_document.xqy +0 -0
  72. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/list_judgment_versions.xqy +0 -0
  73. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/resolve_from_identifier_slug.xqy +0 -0
  74. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/resolve_from_identifier_value.xqy +0 -0
  75. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_boolean_property.xqy +0 -0
  76. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_metadata_citation.xqy +0 -0
  77. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_metadata_court.xqy +0 -0
  78. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_metadata_jurisdiction.xqy +0 -0
  79. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_metadata_name.xqy +0 -0
  80. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_metadata_this_uri.xqy +0 -0
  81. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_metadata_work_expression_date.xqy +0 -0
  82. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_property.xqy +0 -0
  83. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/set_property_as_node.xqy +0 -0
  84. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/update_document.xqy +0 -0
  85. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/update_locked_judgment.xqy +0 -0
  86. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/user_has_privilege.xqy +0 -0
  87. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/user_has_role.xqy +0 -0
  88. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/validate_all_documents.xqy +0 -0
  89. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/validate_document.xqy +0 -0
  90. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/xslt.xqy +0 -0
  91. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery/xslt_transform.xqy +0 -0
  92. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xquery_type_dicts.py +0 -0
  93. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xslt/modify_xml_live.xsl +0 -0
  94. {ds_caselaw_marklogic_api_client-39.1.0 → ds_caselaw_marklogic_api_client-39.2.1}/src/caselawclient/xslt/sample.xsl +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ds-caselaw-marklogic-api-client
3
- Version: 39.1.0
3
+ Version: 39.2.1
4
4
  Summary: An API client for interacting with the underlying data in Find Caselaw.
5
5
  Keywords: national archives,caselaw
6
6
  Author: The National Archives
@@ -11,13 +11,13 @@ Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
13
  Requires-Dist: boto3 (>=1.26.112,<2.0.0)
14
- Requires-Dist: certifi (>=2025.7.9,<2025.8.0)
14
+ Requires-Dist: certifi (>=2025.8.3,<2025.9.0)
15
15
  Requires-Dist: charset-normalizer (>=3.0.0,<4.0.0)
16
16
  Requires-Dist: defusedxml (>=0.7.1,<0.8.0)
17
17
  Requires-Dist: django-environ (>=0.12.0)
18
18
  Requires-Dist: ds-caselaw-utils (>=2.0.0,<3.0.0)
19
19
  Requires-Dist: idna (>=3.4,<4.0)
20
- Requires-Dist: lxml (>=5.0.0,<6.0.0)
20
+ Requires-Dist: lxml (>=6.0.0,<7.0.0)
21
21
  Requires-Dist: memoization (>=0.4.0,<0.5.0)
22
22
  Requires-Dist: mypy-boto3-s3 (>=1.26.104,<2.0.0)
23
23
  Requires-Dist: mypy-boto3-sns (>=1.26.69,<2.0.0)
@@ -37,7 +37,9 @@ This repository is part of the [Find Case Law](https://caselaw.nationalarchives.
37
37
 
38
38
  # MarkLogic API Client
39
39
 
40
- [![PyPI](https://img.shields.io/pypi/v/ds-caselaw-marklogic-api-client)](https://pypi.org/project/ds-caselaw-marklogic-api-client/) ![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/pypi/ds-caselaw-marklogic-api-client)
40
+ [![PyPI](https://img.shields.io/pypi/v/ds-caselaw-marklogic-api-client)](https://pypi.org/project/ds-caselaw-marklogic-api-client/)
41
+ ![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/pypi/ds-caselaw-marklogic-api-client)
42
+ ![Code Coverage](https://img.shields.io/codecov/c/github/nationalarchives/ds-caselaw-custom-api-client)
41
43
 
42
44
  This is an API Client for connecting to Marklogic for The National Archive's Caselaw site.
43
45
 
@@ -4,7 +4,9 @@ This repository is part of the [Find Case Law](https://caselaw.nationalarchives.
4
4
 
5
5
  # MarkLogic API Client
6
6
 
7
- [![PyPI](https://img.shields.io/pypi/v/ds-caselaw-marklogic-api-client)](https://pypi.org/project/ds-caselaw-marklogic-api-client/) ![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/pypi/ds-caselaw-marklogic-api-client)
7
+ [![PyPI](https://img.shields.io/pypi/v/ds-caselaw-marklogic-api-client)](https://pypi.org/project/ds-caselaw-marklogic-api-client/)
8
+ ![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/pypi/ds-caselaw-marklogic-api-client)
9
+ ![Code Coverage](https://img.shields.io/codecov/c/github/nationalarchives/ds-caselaw-custom-api-client)
8
10
 
9
11
  This is an API Client for connecting to Marklogic for The National Archive's Caselaw site.
10
12
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "ds-caselaw-marklogic-api-client"
3
- version = "39.1.0"
3
+ version = "39.2.1"
4
4
  description = "An API client for interacting with the underlying data in Find Caselaw."
5
5
  authors = ["The National Archives"]
6
6
  homepage = "https://github.com/nationalarchives/ds-caselaw-custom-api-client"
@@ -12,14 +12,14 @@ packages = [
12
12
 
13
13
  [tool.poetry.dependencies]
14
14
  python = "^3.10.0"
15
- certifi = ">=2025.7.9,<2025.8.0"
15
+ certifi = ">=2025.8.3,<2025.9.0"
16
16
  charset-normalizer = "^3.0.0"
17
17
  django-environ = ">=0.12.0"
18
18
  idna = "^3.4"
19
19
  requests = "^2.28.2"
20
20
  requests-toolbelt = ">=0.10.1,<1.1.0"
21
21
  memoization = "^0.4.0"
22
- lxml = "^5.0.0"
22
+ lxml = "^6.0.0"
23
23
  ds-caselaw-utils = "^2.0.0"
24
24
  boto3 = "^1.26.112"
25
25
  typing-extensions = "^4.7.1"
@@ -32,13 +32,14 @@ sqids = "^0.5.0"
32
32
  defusedxml = "^0.7.1"
33
33
 
34
34
  [tool.poetry.group.dev.dependencies]
35
- coverage = "7.10.1"
35
+ coverage = "7.10.3"
36
36
  pytest = "8.4.1"
37
+ pytest-cov = "6.2.1"
37
38
  beautifulsoup4 = "4.13.4"
38
- responses = "0.25.7"
39
+ responses = "0.25.8"
39
40
  python-dotenv = "1.1.1"
40
- time-machine = "2.16.0"
41
- moto = {version = "5.1.8", extras = ["all"]}
41
+ time-machine = "2.17.0"
42
+ moto = {version = "5.1.10", extras = ["all"]}
42
43
 
43
44
  [tool.poetry.group.docs]
44
45
  optional = true
@@ -77,7 +78,7 @@ extend-select = ["W", "I", "SLF", "SIM", "C90", "S"]
77
78
  unfixable = ["ERA"]
78
79
 
79
80
  [tool.ruff.lint.extend-per-file-ignores]
80
- "tests/*" = ["S101"] # `assert` is fine in tests
81
+ "tests/*" = ["S101"] # `assert` is fine in tests
81
82
  "smoketest/*" = ["S101"] # `assert` is fine in tests
82
83
  "tests/client/test_client.py" = ["SLF001"] # TODO: This really shouldn't be the case, but it's not important to fix right now.
83
84
 
@@ -56,6 +56,11 @@ from .errors import (
56
56
  )
57
57
 
58
58
  env = environ.Env()
59
+
60
+ # Requests timeouts: https://requests.readthedocs.io/en/latest/user/advanced/
61
+ CONNECT_TIMEOUT = float(os.environ.get("CONNECT_TIMEOUT", "3.05"))
62
+ READ_TIMEOUT = float(os.environ.get("READ_TIMEOUT", "10.0"))
63
+
59
64
  ROOT_DIR = os.path.dirname(os.path.realpath(__file__))
60
65
  DEFAULT_XSL_TRANSFORM = "accessible-html.xsl"
61
66
 
@@ -170,6 +175,7 @@ class MarklogicApiClient:
170
175
  error_code_classes: dict[str, Type[MarklogicAPIError]] = {
171
176
  "XDMP-DOCNOTFOUND": MarklogicResourceNotFoundError,
172
177
  "XDMP-LOCKCONFLICT": MarklogicResourceLockedError,
178
+ "XDMP-LOCKED": MarklogicResourceLockedError,
173
179
  "DLS-UNMANAGED": MarklogicResourceUnmanagedError,
174
180
  "DLS-NOTCHECKEDOUT": MarklogicResourceNotCheckedOutError,
175
181
  "DLS-CHECKOUTCONFLICT": MarklogicCheckoutConflictError,
@@ -317,11 +323,13 @@ class MarklogicApiClient:
317
323
  self,
318
324
  vars: query_dicts.MarkLogicAPIDict,
319
325
  xquery_file_name: str,
326
+ timeout: tuple[float, float] = (CONNECT_TIMEOUT, READ_TIMEOUT),
320
327
  ) -> requests.Response:
321
328
  return self.eval(
322
329
  self._xquery_path(xquery_file_name),
323
330
  vars=json.dumps(vars),
324
331
  accept_header="application/xml",
332
+ timeout=timeout,
325
333
  )
326
334
 
327
335
  def _eval_and_decode(
@@ -724,6 +732,7 @@ class MarklogicApiClient:
724
732
  xquery_path: str,
725
733
  vars: str,
726
734
  accept_header: str = "multipart/mixed",
735
+ timeout: tuple[float, float] = (CONNECT_TIMEOUT, READ_TIMEOUT),
727
736
  ) -> requests.Response:
728
737
  headers = {
729
738
  "Content-type": "application/x-www-form-urlencoded",
@@ -743,6 +752,7 @@ class MarklogicApiClient:
743
752
  url=self._path_to_request_url(path),
744
753
  headers=headers,
745
754
  data=data,
755
+ timeout=timeout,
746
756
  )
747
757
  # Raise relevant exception for an erroneous response
748
758
  self._raise_for_status(response)
@@ -1052,10 +1062,6 @@ class MarklogicApiClient:
1052
1062
  if show_unpublished and not self.user_can_view_unpublished_judgments(
1053
1063
  self.username,
1054
1064
  ):
1055
- # The user cannot view unpublished judgments but is requesting to see them
1056
- logging.warning(
1057
- f"User {self.username} is attempting to view unpublished judgments but does not have that privilege.",
1058
- )
1059
1065
  return False
1060
1066
  return show_unpublished
1061
1067
 
@@ -0,0 +1,63 @@
1
+ import os
2
+
3
+ if os.getenv("PDOC_DYNAMIC_VERSION") == "1":
4
+ from pathlib import Path
5
+
6
+ import tomllib
7
+
8
+ pyproject_path = Path(__file__).parent.parent.parent / "pyproject.toml"
9
+ with pyproject_path.open("rb") as f:
10
+ __version__ = tomllib.load(f)["tool"]["poetry"]["version"]
11
+ __pip_version_string__ = f"~={__version__}"
12
+ __poetry_version_string__ = f' = "^{__version__}"'
13
+
14
+ else:
15
+ __pip_version_string__ = ""
16
+ __poetry_version_string__ = ""
17
+
18
+ __doc__ = f"""
19
+
20
+ # Installation
21
+
22
+ Include the API client in your project using Pip or Poetry:
23
+
24
+ ```bash
25
+ pip install ds-caselaw-marklogic-api-client
26
+ ```
27
+
28
+ ```bash
29
+ poetry add ds-caselaw-marklogic-api-client
30
+ ```
31
+
32
+ or in your projects `requirements.txt` with:
33
+
34
+ ```text
35
+ ds-caselaw-marklogic-api-client{__pip_version_string__}
36
+ ```
37
+
38
+ or `pyproject.toml` for Poetry with:
39
+
40
+ ```text
41
+ ds-caselaw-marklogic-api-client{__poetry_version_string__}
42
+ ```
43
+
44
+ # Usage
45
+
46
+ ## Initialising the client
47
+
48
+ Import the `MarklogicApiClient` class and instantiate with appropriate credentials:
49
+
50
+ ```python
51
+
52
+ from caselawclient.Client import MarklogicApiClient
53
+
54
+ client = MarklogicApiClient(
55
+ host="hostname",
56
+ username="username",
57
+ password="password",
58
+ use_https=True,
59
+ )
60
+
61
+ ```
62
+
63
+ """
@@ -9,6 +9,7 @@ from ds_caselaw_utils.courts import CourtNotFoundException
9
9
  from ds_caselaw_utils.types import NeutralCitationString
10
10
  from requests_toolbelt.multipart import decoder
11
11
 
12
+ import caselawclient.models.documents.comparison as comparison
12
13
  from caselawclient.errors import (
13
14
  DocumentNotFoundError,
14
15
  NotSupportedOnVersion,
@@ -421,7 +422,7 @@ class Document:
421
422
  uri=self.uri,
422
423
  status="publish",
423
424
  )
424
- self.enrich()
425
+ self.enrich(accept_failures=True)
425
426
 
426
427
  def unpublish(self) -> None:
427
428
  self.api_client.break_checkout(self.uri)
@@ -583,3 +584,6 @@ class Document:
583
584
  return self.body.apply_xslt(
584
585
  "modify_xml_live.xsl", work_uri=work_uri, expression_uri=expression_uri, manifestation_uri=manifestation_uri
585
586
  )
587
+
588
+ def compare_to(self, that_doc: "Document") -> comparison.Comparison:
589
+ return comparison.Comparison(self, that_doc)
@@ -0,0 +1,42 @@
1
+ from typing import TypedDict
2
+
3
+ import caselawclient.models.documents
4
+
5
+
6
+ class AttributeComparison(TypedDict):
7
+ """Results from a comparison of one attribute across two documents"""
8
+
9
+ label: str
10
+ this_value: str
11
+ that_value: str
12
+ match: bool
13
+
14
+
15
+ class Comparison(dict[str, AttributeComparison]):
16
+ def __init__(
17
+ self, this_doc: "caselawclient.models.documents.Document", that_doc: "caselawclient.models.documents.Document"
18
+ ):
19
+ # court, date, title
20
+ self["court"] = AttributeComparison(
21
+ label="court",
22
+ this_value=this_doc.court,
23
+ that_value=that_doc.court,
24
+ match=this_doc.court == that_doc.court,
25
+ )
26
+
27
+ self["date"] = AttributeComparison(
28
+ label="date",
29
+ this_value=this_doc.body.document_date_as_string,
30
+ that_value=that_doc.body.document_date_as_string,
31
+ match=this_doc.body.document_date_as_string == that_doc.body.document_date_as_string,
32
+ )
33
+ self["name"] = AttributeComparison(
34
+ label="name",
35
+ this_value=this_doc.name,
36
+ that_value=that_doc.name,
37
+ match=this_doc.name == that_doc.name,
38
+ )
39
+
40
+ def match(self) -> bool:
41
+ """Is this comparison an exact match across all attributes?"""
42
+ return all(x["match"] for x in self.values())
@@ -166,8 +166,10 @@ class Identifier(ABC):
166
166
  """
167
167
  resolutions = [
168
168
  resolution
169
- for resolution in api_client.resolve_from_identifier_value(identifier_value=self.value)
170
- if resolution.identifier_namespace == self.schema.namespace
169
+ for resolution in api_client.resolve_from_identifier_value(
170
+ identifier_value=self.value, published_only=False
171
+ )
172
+ if resolution.identifier_namespace == self.schema.namespace and resolution.identifier_uuid != self.uuid
171
173
  ]
172
174
  if len(resolutions) > 0:
173
175
  return SuccessFailureMessageTuple(
@@ -96,6 +96,8 @@ def check_docx_exists(uri: DocumentURIString) -> bool:
96
96
  except botocore.exceptions.ClientError as e:
97
97
  if e.response["Error"]["Code"] == "404":
98
98
  return False
99
+ if e.response["Error"]["Code"] == "403":
100
+ e.add_note("403 on reading {s3_key}")
99
101
  raise
100
102
 
101
103
 
@@ -1,40 +0,0 @@
1
- """
2
-
3
- # Installation
4
-
5
- Include the API client in your project using Pip or Poetry:
6
-
7
- ```bash
8
- pip install ds-caselaw-marklogic-api-client
9
- ```
10
-
11
- ```bash
12
- poetry add ds-caselaw-marklogic-api-client
13
- ```
14
-
15
- or in your projects `requirements.txt` with:
16
-
17
- ```text
18
- ds-caselaw-marklogic-api-client~=12.0.0
19
- ```
20
-
21
- # Usage
22
-
23
- ## Initialising the client
24
-
25
- Import the `MarklogicApiClient` class and instantiate with appropriate credentials:
26
-
27
- ```python
28
-
29
- from caselawclient.Client import MarklogicApiClient
30
-
31
- client = MarklogicApiClient(
32
- host="hostname",
33
- username="username",
34
- password="password",
35
- use_https=True,
36
- )
37
-
38
- ```
39
-
40
- """