ds-caselaw-marklogic-api-client 33.0.0__tar.gz → 34.0.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 (86) hide show
  1. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/PKG-INFO +2 -3
  2. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/pyproject.toml +2 -2
  3. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/Client.py +6 -3
  4. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/client_helpers/__init__.py +34 -0
  5. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/documents/__init__.py +2 -0
  6. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/judgments.py +1 -0
  7. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/press_summaries.py +1 -0
  8. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/responses/search_result.py +21 -1
  9. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xml_helpers.py +5 -0
  10. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/insert_document.xqy +2 -6
  11. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery_type_dicts.py +1 -0
  12. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/LICENSE.md +0 -0
  13. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/README.md +0 -0
  14. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/__init__.py +0 -0
  15. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/client_helpers/search_helpers.py +0 -0
  16. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/content_hash.py +0 -0
  17. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/errors.py +0 -0
  18. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/factories.py +0 -0
  19. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/identifier_resolution.py +0 -0
  20. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/__init__.py +0 -0
  21. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/documents/body.py +0 -0
  22. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/documents/exceptions.py +0 -0
  23. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/documents/statuses.py +0 -0
  24. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/documents/transforms/html.xsl +0 -0
  25. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/documents/xml.py +0 -0
  26. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/identifiers/__init__.py +0 -0
  27. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/identifiers/fclid.py +0 -0
  28. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/identifiers/neutral_citation.py +0 -0
  29. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/identifiers/press_summary_ncn.py +0 -0
  30. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/identifiers/unpacker.py +0 -0
  31. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/neutral_citation_mixin.py +0 -0
  32. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/utilities/__init__.py +0 -0
  33. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/utilities/aws.py +0 -0
  34. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/utilities/dates.py +0 -0
  35. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/models/utilities/move.py +0 -0
  36. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/py.typed +0 -0
  37. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/responses/__init__.py +0 -0
  38. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/responses/search_response.py +0 -0
  39. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/responses/xsl/search_match.xsl +0 -0
  40. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/search_parameters.py +0 -0
  41. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/types.py +0 -0
  42. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/break_judgment_checkout.xqy +0 -0
  43. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/checkin_judgment.xqy +0 -0
  44. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/checkout_judgment.xqy +0 -0
  45. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/copy_document.xqy +0 -0
  46. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/delete_judgment.xqy +0 -0
  47. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/document_collections.xqy +0 -0
  48. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/document_exists.xqy +0 -0
  49. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_combined_stats_table.xqy +0 -0
  50. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_components_for_document.xqy +0 -0
  51. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_highest_enrichment_version.xqy +0 -0
  52. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_highest_parser_version.xqy +0 -0
  53. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_judgment.xqy +0 -0
  54. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_judgment_checkout_status.xqy +0 -0
  55. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_judgment_version.xqy +0 -0
  56. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_last_modified.xqy +0 -0
  57. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_next_document_sequence_number.xqy +0 -0
  58. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_pending_enrichment_for_version.xqy +0 -0
  59. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_pending_parse_for_version.xqy +0 -0
  60. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_properties_for_search_results.xqy +0 -0
  61. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_property.xqy +0 -0
  62. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_property_as_node.xqy +0 -0
  63. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_recently_enriched.xqy +0 -0
  64. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_recently_parsed.xqy +0 -0
  65. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_version_annotation.xqy +0 -0
  66. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/get_version_created.xqy +0 -0
  67. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/list_judgment_versions.xqy +0 -0
  68. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/resolve_from_identifier_slug.xqy +0 -0
  69. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/resolve_from_identifier_value.xqy +0 -0
  70. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_boolean_property.xqy +0 -0
  71. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_metadata_citation.xqy +0 -0
  72. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_metadata_court.xqy +0 -0
  73. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_metadata_jurisdiction.xqy +0 -0
  74. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_metadata_name.xqy +0 -0
  75. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_metadata_this_uri.xqy +0 -0
  76. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_metadata_work_expression_date.xqy +0 -0
  77. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_property.xqy +0 -0
  78. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/set_property_as_node.xqy +0 -0
  79. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/update_document.xqy +0 -0
  80. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/update_locked_judgment.xqy +0 -0
  81. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/user_has_privilege.xqy +0 -0
  82. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/user_has_role.xqy +0 -0
  83. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/validate_all_documents.xqy +0 -0
  84. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/validate_document.xqy +0 -0
  85. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/xslt.xqy +0 -0
  86. {ds_caselaw_marklogic_api_client-33.0.0 → ds_caselaw_marklogic_api_client-34.0.1}/src/caselawclient/xquery/xslt_transform.xqy +0 -0
@@ -1,13 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ds-caselaw-marklogic-api-client
3
- Version: 33.0.0
3
+ Version: 34.0.1
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
7
7
  Author: The National Archives
8
- Requires-Python: >=3.9,<4.0
8
+ Requires-Python: >=3.10.0,<4.0.0
9
9
  Classifier: Programming Language :: Python :: 3
10
- Classifier: Programming Language :: Python :: 3.9
11
10
  Classifier: Programming Language :: Python :: 3.10
12
11
  Classifier: Programming Language :: Python :: 3.11
13
12
  Requires-Dist: boto3 (>=1.26.112,<2.0.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "ds-caselaw-marklogic-api-client"
3
- version = "33.0.0"
3
+ version = "34.0.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"
@@ -11,7 +11,7 @@ packages = [
11
11
  ]
12
12
 
13
13
  [tool.poetry.dependencies]
14
- python = "^3.9"
14
+ python = "^3.10.0"
15
15
  certifi = ">=2025.1.31,<2025.2.0"
16
16
  charset-normalizer = "^3.0.0"
17
17
  django-environ = ">=0.12.0"
@@ -572,6 +572,7 @@ class MarklogicApiClient:
572
572
  self,
573
573
  document_uri: DocumentURIString,
574
574
  document_xml: Element,
575
+ document_type: type[Document],
575
576
  annotation: VersionAnnotation,
576
577
  ) -> requests.Response:
577
578
  """
@@ -579,6 +580,7 @@ class MarklogicApiClient:
579
580
 
580
581
  :param document_uri: The URI to insert the document at
581
582
  :param document_xml: The XML of the document to insert
583
+ :param document_type: The type class of the document
582
584
  :param annotation: Annotations to record alongside this version
583
585
 
584
586
  :return: The response object from MarkLogic
@@ -592,6 +594,7 @@ class MarklogicApiClient:
592
594
 
593
595
  vars: query_dicts.InsertDocumentDict = {
594
596
  "uri": uri,
597
+ "type_collection": document_type.type_collection_name,
595
598
  "document": xml.decode("utf-8"),
596
599
  "annotation": annotation.as_json,
597
600
  }
@@ -1068,14 +1071,14 @@ class MarklogicApiClient:
1068
1071
  response = self._send_to_eval(vars, "get_properties_for_search_results.xqy")
1069
1072
  return get_single_string_from_marklogic_response(response)
1070
1073
 
1071
- def search_and_decode_response(self, search_parameters: SearchParameters) -> str:
1074
+ def search_and_decode_response(self, search_parameters: SearchParameters) -> bytes:
1072
1075
  response = self.advanced_search(search_parameters)
1073
- return get_single_string_from_marklogic_response(response)
1076
+ return get_single_bytestring_from_marklogic_response(response)
1074
1077
 
1075
1078
  def search_judgments_and_decode_response(
1076
1079
  self,
1077
1080
  search_parameters: SearchParameters,
1078
- ) -> str:
1081
+ ) -> bytes:
1079
1082
  search_parameters.collections = [DOCUMENT_COLLECTION_URI_JUDGMENT]
1080
1083
  return self.search_and_decode_response(search_parameters)
1081
1084
 
@@ -2,8 +2,19 @@ import json
2
2
  from enum import Enum
3
3
  from typing import Any, Optional, TypedDict
4
4
 
5
+ from lxml import etree
5
6
  from typing_extensions import NotRequired
6
7
 
8
+ from caselawclient.xml_helpers import DEFAULT_NAMESPACES
9
+
10
+ from ..models.documents import Document
11
+ from ..models.judgments import Judgment
12
+ from ..models.press_summaries import PressSummary
13
+
14
+
15
+ class CannotDetermineDocumentType(Exception):
16
+ pass
17
+
7
18
 
8
19
  class AnnotationDataDict(TypedDict):
9
20
  type: str
@@ -112,3 +123,26 @@ class VersionAnnotation:
112
123
 
113
124
  def __str__(self) -> str:
114
125
  return self.as_json
126
+
127
+
128
+ def get_document_type_class(xml: bytes) -> type[Document]:
129
+ """Attempt to get the type of the document based on the top-level structure of the XML document."""
130
+
131
+ node = etree.fromstring(xml)
132
+
133
+ # If the main node is `<judgment>`, it's a judgment
134
+ if node.xpath("/akn:akomaNtoso/akn:judgment", namespaces=DEFAULT_NAMESPACES):
135
+ return Judgment
136
+
137
+ # If the main node is `<doc name='pressSummary'>`, it's a press summary
138
+ if node.xpath("/akn:akomaNtoso/akn:doc[@name='pressSummary']", namespaces=DEFAULT_NAMESPACES):
139
+ return PressSummary
140
+
141
+ # If the document is a parser error with a root element of `error`, it's not of a special type.
142
+ if node.xpath("/error", namespaces=DEFAULT_NAMESPACES):
143
+ return Document
144
+
145
+ # Otherwise, we don't know for sure. Fail out.
146
+ raise CannotDetermineDocumentType(
147
+ "Unable to determine the Document type by its XML",
148
+ )
@@ -61,6 +61,8 @@ class Document:
61
61
  document_noun_plural = "documents"
62
62
  """ The noun for a plural of this document type. """
63
63
 
64
+ type_collection_name: str
65
+
64
66
  attributes_to_validate: list[tuple[str, bool, str]] = [
65
67
  (
66
68
  "is_failure",
@@ -23,6 +23,7 @@ class Judgment(NeutralCitationMixin, Document):
23
23
 
24
24
  document_noun = "judgment"
25
25
  document_noun_plural = "judgments"
26
+ type_collection_name = "judgment"
26
27
 
27
28
  def __init__(self, uri: DocumentURIString, *args: Any, **kwargs: Any) -> None:
28
29
  super().__init__(self.document_noun, uri, *args, **kwargs)
@@ -24,6 +24,7 @@ class PressSummary(NeutralCitationMixin, Document):
24
24
 
25
25
  document_noun = "press summary"
26
26
  document_noun_plural = "press summaries"
27
+ type_collection_name = "press-summary"
27
28
 
28
29
  def __init__(self, uri: DocumentURIString, *args: Any, **kwargs: Any) -> None:
29
30
  super().__init__(self.document_noun, uri, *args, **kwargs)
@@ -3,7 +3,7 @@ import os
3
3
  from datetime import datetime
4
4
  from enum import Enum
5
5
  from functools import cached_property
6
- from typing import Dict, Optional
6
+ from typing import Any, Dict, Optional
7
7
 
8
8
  from dateutil import parser as dateparser
9
9
  from dateutil.parser import ParserError
@@ -12,6 +12,8 @@ from ds_caselaw_utils.types import CourtCode, JurisdictionCode
12
12
  from lxml import etree
13
13
 
14
14
  from caselawclient.Client import MarklogicApiClient
15
+ from caselawclient.models.identifiers import Identifiers
16
+ from caselawclient.models.identifiers.unpacker import unpack_all_identifiers_from_etree
15
17
  from caselawclient.types import DocumentURIString
16
18
  from caselawclient.xml_helpers import get_xpath_match_string
17
19
 
@@ -169,6 +171,21 @@ class SearchResult:
169
171
  self._get_xpath_match_string("@uri").lstrip("/").split(".xml")[0],
170
172
  )
171
173
 
174
+ @property
175
+ def identifiers(self) -> Identifiers:
176
+ identifiers_etrees = self._get_xpath("//identifiers")
177
+ if count := len(identifiers_etrees) != 1:
178
+ logging.warning(f"{count} //identifiers nodes found in search result, expected 1.")
179
+ identifiers_etree = None if not identifiers_etrees else identifiers_etrees[0]
180
+ return unpack_all_identifiers_from_etree(identifiers_etree)
181
+
182
+ @cached_property
183
+ def slug(self) -> str:
184
+ preferred = self.identifiers.preferred()
185
+ if not preferred:
186
+ raise RuntimeError("No preferred identifier for search result")
187
+ return str(preferred.url_slug)
188
+
172
189
  @property
173
190
  def neutral_citation(self) -> str:
174
191
  """
@@ -278,3 +295,6 @@ class SearchResult:
278
295
 
279
296
  def _get_xpath_match_string(self, path: str) -> str:
280
297
  return get_xpath_match_string(self.node, path, namespaces=self.NAMESPACES)
298
+
299
+ def _get_xpath(self, path: str) -> Any:
300
+ return self.node.xpath(path, namespaces=self.NAMESPACES)
@@ -2,6 +2,11 @@ from typing import Dict, Optional
2
2
 
3
3
  from lxml import etree
4
4
 
5
+ DEFAULT_NAMESPACES = {
6
+ "uk": "https://caselaw.nationalarchives.gov.uk/akn",
7
+ "akn": "http://docs.oasis-open.org/legaldocml/ns/akn/3.0",
8
+ }
9
+
5
10
 
6
11
  def get_xpath_match_string(
7
12
  node: etree._Element,
@@ -4,20 +4,16 @@ import module namespace dls = "http://marklogic.com/xdmp/dls" at "/MarkLogic/dls
4
4
 
5
5
  declare variable $uri as xs:string external;
6
6
  declare variable $document as xs:string external;
7
+ declare variable $type_collection as xs:string external;
7
8
  declare variable $annotation as xs:string external;
8
9
 
9
10
  let $document_xml := xdmp:unquote($document)
10
11
 
11
- let $collections :=
12
- if (fn:contains($uri, 'press-summary'))
13
- then ("press-summary")
14
- else ("judgment")
15
-
16
12
  return dls:document-insert-and-manage(
17
13
  $uri,
18
14
  fn:true(),
19
15
  $document_xml,
20
16
  $annotation,
21
17
  (),
22
- $collections
18
+ ($type_collection)
23
19
  )
@@ -133,6 +133,7 @@ class GetVersionCreatedDict(MarkLogicAPIDict):
133
133
  class InsertDocumentDict(MarkLogicAPIDict):
134
134
  annotation: str
135
135
  document: str
136
+ type_collection: str
136
137
  uri: MarkLogicDocumentURIString
137
138
 
138
139