ds-caselaw-marklogic-api-client 22.1.0__tar.gz → 23.0.2__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.

Potentially problematic release.


This version of ds-caselaw-marklogic-api-client might be problematic. Click here for more details.

Files changed (66) hide show
  1. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/PKG-INFO +1 -2
  2. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/pyproject.toml +3 -3
  3. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/documents.py +24 -2
  4. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/utilities/aws.py +15 -1
  5. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/responses/search_response.py +17 -0
  6. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/LICENSE.md +0 -0
  7. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/README.md +0 -0
  8. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/Client.py +0 -0
  9. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/__init__.py +0 -0
  10. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/client_helpers/__init__.py +0 -0
  11. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/client_helpers/search_helpers.py +0 -0
  12. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/content_hash.py +0 -0
  13. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/errors.py +0 -0
  14. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/__init__.py +0 -0
  15. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/judgments.py +0 -0
  16. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/neutral_citation_mixin.py +0 -0
  17. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/press_summaries.py +0 -0
  18. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/utilities/__init__.py +0 -0
  19. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/models/utilities/move.py +0 -0
  20. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/py.typed +0 -0
  21. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/responses/__init__.py +0 -0
  22. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/responses/search_result.py +0 -0
  23. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/responses/xsl/search_match.xsl +0 -0
  24. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/search_parameters.py +0 -0
  25. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xml_helpers.py +0 -0
  26. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xml_tools.py +0 -0
  27. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/break_judgment_checkout.xqy +0 -0
  28. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/checkin_judgment.xqy +0 -0
  29. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/checkout_judgment.xqy +0 -0
  30. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/copy_document.xqy +0 -0
  31. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/delete_judgment.xqy +0 -0
  32. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/document_collections.xqy +0 -0
  33. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/document_exists.xqy +0 -0
  34. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_combined_stats_table.xqy +0 -0
  35. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_components_for_document.xqy +0 -0
  36. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_highest_enrichment_version.xqy +0 -0
  37. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_highest_parser_version.xqy +0 -0
  38. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_judgment.xqy +0 -0
  39. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_judgment_checkout_status.xqy +0 -0
  40. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_judgment_version.xqy +0 -0
  41. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_last_modified.xqy +0 -0
  42. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_pending_enrichment_for_version.xqy +0 -0
  43. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_pending_parse_for_version.xqy +0 -0
  44. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_properties_for_search_results.xqy +0 -0
  45. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_property.xqy +0 -0
  46. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_version_annotation.xqy +0 -0
  47. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/get_version_created.xqy +0 -0
  48. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/insert_document.xqy +0 -0
  49. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/list_judgment_versions.xqy +0 -0
  50. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_boolean_property.xqy +0 -0
  51. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_metadata_citation.xqy +0 -0
  52. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_metadata_court.xqy +0 -0
  53. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_metadata_jurisdiction.xqy +0 -0
  54. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_metadata_name.xqy +0 -0
  55. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_metadata_this_uri.xqy +0 -0
  56. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_metadata_work_expression_date.xqy +0 -0
  57. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/set_property.xqy +0 -0
  58. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/update_document.xqy +0 -0
  59. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/update_locked_judgment.xqy +0 -0
  60. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/user_has_privilege.xqy +0 -0
  61. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/user_has_role.xqy +0 -0
  62. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/validate_all_documents.xqy +0 -0
  63. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/validate_document.xqy +0 -0
  64. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/xslt.xqy +0 -0
  65. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery/xslt_transform.xqy +0 -0
  66. {ds_caselaw_marklogic_api_client-22.1.0 → ds_caselaw_marklogic_api_client-23.0.2}/src/caselawclient/xquery_type_dicts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ds-caselaw-marklogic-api-client
3
- Version: 22.1.0
3
+ Version: 23.0.2
4
4
  Summary: An API client for interacting with the underlying data in Find Caselaw.
5
5
  Home-page: https://github.com/nationalarchives/ds-caselaw-custom-api-client
6
6
  Keywords: national archives,caselaw
@@ -23,7 +23,6 @@ Requires-Dist: mypy-boto3-sns (>=1.26.69,<2.0.0)
23
23
  Requires-Dist: requests (>=2.28.2,<3.0.0)
24
24
  Requires-Dist: requests-toolbelt (>=0.10.1,<1.1.0)
25
25
  Requires-Dist: typing-extensions (>=4.7.1,<5.0.0)
26
- Requires-Dist: urllib3 (>=1.26.15,<2.0.0)
27
26
  Description-Content-Type: text/markdown
28
27
 
29
28
  # The National Archives: Find Case Law
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "ds-caselaw-marklogic-api-client"
3
- version = "22.1.0"
3
+ version = "23.0.2"
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"
@@ -18,7 +18,6 @@ django-environ = "^0.11.0"
18
18
  idna = "^3.4"
19
19
  requests = "^2.28.2"
20
20
  requests-toolbelt = ">=0.10.1,<1.1.0"
21
- urllib3 = "^1.26.15"
22
21
  memoization = "^0.4.0"
23
22
  lxml = "^5.0.0"
24
23
  ds-caselaw-utils = "^1.4.1"
@@ -30,9 +29,10 @@ mypy-boto3-sns = "^1.26.69"
30
29
  [tool.poetry.group.dev.dependencies]
31
30
  coverage = "^7.2.3"
32
31
  pytest = "^7.3.2"
33
- responses = "^0.24.0"
32
+ responses = "^0.25.0"
34
33
  python-dotenv = "^1.0.0"
35
34
  time-machine = "^2.13.0"
35
+ moto = {version = "^5.0.1", extras = ["all"]}
36
36
 
37
37
  [tool.poetry.group.docs]
38
38
  optional = true
@@ -22,6 +22,7 @@ from .utilities import VersionsDict, render_versions
22
22
  from .utilities.aws import (
23
23
  ParserInstructionsDict,
24
24
  announce_document_event,
25
+ check_docx_exists,
25
26
  delete_documents_from_private_bucket,
26
27
  generate_docx_url,
27
28
  generate_pdf_url,
@@ -167,13 +168,17 @@ class Document:
167
168
  :return: `True` if the document exists, `False` otherwise."""
168
169
  return self.api_client.document_exists(self.uri)
169
170
 
171
+ def docx_exists(self) -> bool:
172
+ """There is a docx in S3 private bucket for this Document"""
173
+ return check_docx_exists(self.uri)
174
+
170
175
  @property
171
176
  def best_human_identifier(self) -> Optional[str]:
172
177
  """
173
178
  Some identifier that is understood by legal professionals to refer to this legal event
174
179
  that is not the name of the document.
175
180
  Typically, this will be the neutral citation number, should it exist.
176
- Should typically overridden in subclasses.
181
+ Should typically be overridden in subclasses.
177
182
  """
178
183
  return None
179
184
 
@@ -272,10 +277,12 @@ class Document:
272
277
 
273
278
  @cached_property
274
279
  def transformation_datetime(self) -> Optional[datetime.datetime]:
280
+ """When was this document successfully parsed or reparsed (date from XML)"""
275
281
  return self.get_latest_manifestation_datetime("transform")
276
282
 
277
283
  @cached_property
278
284
  def enrichment_datetime(self) -> Optional[datetime.datetime]:
285
+ """When was this document successfully enriched (date from XML)"""
279
286
  return self.get_latest_manifestation_datetime("tna-enriched")
280
287
 
281
288
  @cached_property
@@ -591,7 +598,7 @@ class Document:
591
598
  def move(self, new_citation: str) -> None:
592
599
  self.api_client.update_document_uri(self.uri, new_citation)
593
600
 
594
- def reparse(self) -> None:
601
+ def force_reparse(self) -> None:
595
602
  "Send an SNS notification that triggers reparsing, also sending all editor-modifiable metadata and URI"
596
603
 
597
604
  now = datetime.datetime.now(datetime.timezone.utc)
@@ -627,6 +634,21 @@ class Document:
627
634
  parser_instructions=parser_instructions,
628
635
  )
629
636
 
637
+ def reparse(self) -> bool:
638
+ if self.can_reparse:
639
+ self.force_reparse()
640
+ return True
641
+ return False
642
+
643
+ @cached_property
644
+ def can_reparse(self) -> bool:
645
+ """
646
+ Is it sensible to reparse this document?
647
+ """
648
+ if self.docx_exists():
649
+ return True
650
+ return False
651
+
630
652
  class XML:
631
653
  """
632
654
  Represents the XML of a document, and should contain all methods for interacting with it.
@@ -78,6 +78,20 @@ def generate_signed_asset_url(key: str) -> str:
78
78
  )
79
79
 
80
80
 
81
+ def check_docx_exists(uri: str) -> bool:
82
+ """Does the docx for a document URI actually exist?"""
83
+ bucket = env("PRIVATE_ASSET_BUCKET", None)
84
+ s3_key = generate_docx_key(uri)
85
+ client = create_s3_client()
86
+ try:
87
+ client.head_object(Bucket=bucket, Key=s3_key)
88
+ return True
89
+ except botocore.exceptions.ClientError as e:
90
+ if e.response["Error"]["Code"] == "404":
91
+ return False
92
+ raise
93
+
94
+
81
95
  def generate_docx_key(uri: str) -> str:
82
96
  """from a canonical caselaw URI (eat/2022/1) return the S3 key of the associated docx"""
83
97
  return f'{uri}/{uri.replace("/", "_")}.docx'
@@ -227,7 +241,7 @@ def request_parse(
227
241
  .replace("+00:00", "Z"),
228
242
  "function": "fcl-judgment-parse-request",
229
243
  "producer": "FCL",
230
- "executionId": f"fcl_ex_id_{uuid.uuid4()}",
244
+ "executionId": str(uuid.uuid4()),
231
245
  "parentExecutionId": None,
232
246
  },
233
247
  "parameters": {
@@ -45,3 +45,20 @@ class SearchResponse:
45
45
  "//search:response/search:result", namespaces=self.NAMESPACES
46
46
  )
47
47
  return [SearchResult(result, self.client) for result in results]
48
+
49
+ @property
50
+ def facets(self) -> dict[str, str]:
51
+ """
52
+ Returns search facets from the SearchResponse as a dictionary
53
+
54
+ :return: A flattened dictionary of search facet values
55
+ """
56
+ # TODO: preserve the name of the facet (e.g. "court", "year")
57
+ results = self.node.xpath(
58
+ "//search:response/search:facet/search:facet-value",
59
+ namespaces={"search": "http://marklogic.com/appservices/search"},
60
+ )
61
+ facets_dictionary = {
62
+ result.attrib["name"]: result.attrib["count"] for result in results
63
+ }
64
+ return facets_dictionary