us_core_test_kit 1.1.0 → 1.1.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a121ebdf4c6d4f64205243404d6a60ffa914c360c82b12a5d87db7dfdc5cdcea
4
- data.tar.gz: 653526a65dbbba58f5e2b2e1022c82f61e7df87dc988af09f9d7da0c041f9f9f
3
+ metadata.gz: 15c0bd80e82b8148c3d1e1aee402b51e8b6e8250e202f7c3e0e0918ad74b84f1
4
+ data.tar.gz: 5fd2682554e541fd6660be5fb820d14a5f412bab4bf0f13b07e36dcf46db67da
5
5
  SHA512:
6
- metadata.gz: deb705f62b68c74d8dbe4875bbb5eeeb03320d62b725229a797882558469d8cb8e09c75bd2ce71fa9c9426c2d2e8cab363ee77af621fc3ad83bb36b141f052f6
7
- data.tar.gz: dac0ba9320a455434c6d976b926828ed16997d6f7434f121683a9d6ef8671315af861a6d6887cf2b4f240043718481a9d2a1c8e9bafac7ec4b62577e501f9da3
6
+ metadata.gz: 2f4f271d76a5859d69ff4637ef27506a336cffc6a98a200b977daee40837a438684fa18088dff657f6139a01f006db12300ee126fa5c6575440ac30cd903127f
7
+ data.tar.gz: 2dcf5f55861560c01b29ac09fcfa525c69fda894785bb0f388a982a656fc9dac78795b7ffb100227c073c409a16964da462058caea4e4393484a52feda353ae7
@@ -29,7 +29,7 @@ module USCoreTestKit
29
29
 
30
30
  if provenances.present?
31
31
  has_agent = provenances.any? do |provenance|
32
- provenance.target.any? { |target| target.reference.end_with?("DocumentReference/#{docref.id}") } &&
32
+ provenance.target.any? { |target| target.reference.present? && target.reference.end_with?("DocumentReference/#{docref.id}") } &&
33
33
  provenance.agent.any? { |agent| agent.who.present? || agent.onBehalfOf.present? }
34
34
  end
35
35
  end
@@ -84,21 +84,25 @@ module USCoreTestKit
84
84
  type_path = '' if type_path == '$this'
85
85
  type_element =
86
86
  if type_path.present?
87
- elements.find { |element| element.id == "#{current_element.id}.#{type_path}" }
87
+ profile_elements.find { |element| element.id == "#{current_element.id}.#{type_path}" }
88
88
  else
89
89
  current_element
90
90
  end
91
91
 
92
92
  type_code = type_element.type.first.code
93
93
 
94
+ discriminator = {
95
+ type: 'type',
96
+ code: type_code.upcase_first
97
+ }
98
+
99
+ discriminator[:path] = type_path unless type_path.empty?
100
+
94
101
  {
95
102
  slice_id: current_element.id,
96
103
  slice_name: current_element.sliceName,
97
104
  path: current_element.path.gsub("#{resource}.", ''),
98
- discriminator: {
99
- type: 'type',
100
- code: type_code.upcase_first
101
- }
105
+ discriminator: discriminator
102
106
  }.tap do |metadata|
103
107
  if is_uscdi_requirement_element?(current_element)
104
108
  metadata[:uscdi_only] = true
@@ -107,7 +107,7 @@ module USCoreTestKit
107
107
  must_supports[:elements].delete_if { |element| element[:path].start_with?('media') }
108
108
  end
109
109
 
110
- # genderIdentify is removed as directed by ASTP/ONC enforcement discretion issued on March 21, 2025:
110
+ # genderIdentify is removed as directed by ONC enforcement discretion issued on March 21, 2025:
111
111
  # https://www.healthit.gov/topic/certification-ehrs/enforcement-discretion
112
112
  def remove_patient_gender_identity
113
113
  return unless profile.type == 'Patient'
@@ -1,5 +1,6 @@
1
1
  module USCoreTestKit
2
2
  module GranularScope
3
+ require 'uri'
3
4
 
4
5
  def granular_scopes
5
6
  @granular_scopes ||=
@@ -37,6 +38,25 @@ module USCoreTestKit
37
38
  end
38
39
  end
39
40
 
41
+ def resolve_url(url_string)
42
+ return nil if url_string.nil?
43
+
44
+ uri = URI.parse(url_string)
45
+ # If already absolute, return as-is
46
+ return url_string if uri.absolute?
47
+
48
+ # If relative, resolve against the configured FHIR base URL
49
+ # Per FHIR spec, relative URLs are interpreted relative to the FHIR base URL
50
+ # Strip leading slash from relative URL if present to prevent URI.join from
51
+ # treating it as absolute path from root, and ensure base has trailing slash
52
+ base_with_slash = url.end_with?('/') ? url : "#{url}/"
53
+ relative_without_leading_slash = url_string.start_with?('/') ? url_string[1..-1] : url_string
54
+ resolved = URI.join(base_with_slash, relative_without_leading_slash)
55
+ resolved.to_s
56
+ rescue URI::InvalidURIError
57
+ url_string
58
+ end
59
+
40
60
  def previous_request_resources
41
61
  first_request = previous_requests.first
42
62
  next_page_url = nil
@@ -49,10 +69,14 @@ module USCoreTestKit
49
69
  []
50
70
  end
51
71
 
52
- first_request = request if request.url != next_page_url
72
+ # Check if current request URL matches the next page URL from the previous request
73
+ # If not, this is a new search, so update first_request
74
+ resolved_next_page_url = resolve_url(next_page_url)
75
+ first_request = request if request.url != resolved_next_page_url
53
76
 
54
77
  request_resource_hash[first_request].concat(request_resources)
55
78
 
79
+ # Extract the next page URL from the current request's bundle for the next iteration
56
80
  next if request.resource&.resourceType != 'Bundle'
57
81
 
58
82
  next_page_url = request.resource&.link&.find { |link| link.relation == 'next' }&.url
@@ -66,26 +66,22 @@ module USCoreTestKit
66
66
  end
67
67
 
68
68
  def query_in_scope?(resource_type, params)
69
- received_scopes.split(' ').each do |scope|
69
+ received_scopes.split(' ').any? do |scope|
70
70
  parsed_scope = URI.parse(scope)
71
71
 
72
72
  # check for resource type, search scope, and matched params
73
- next unless parsed_scope.path =~ /\/#{resource_type}\./ &&
74
- parsed_scope.path.split('.')[1].include?('s') &&
75
- granular_params_present?(parsed_scope.query, params)
76
-
77
- return true
73
+ parsed_scope.path =~ /\/#{resource_type}\./ &&
74
+ parsed_scope.path.split('.')[1].include?('s') &&
75
+ search_is_for_the_granular_values?(parsed_scope.query, params)
78
76
  end
79
-
80
- false
81
77
  end
82
78
 
83
- def granular_params_present?(granular_params, search_params)
84
- CGI.parse(granular_params).each do |param_name, value|
85
- return false unless search_params.key?(param_name) && value.include?(search_params[param_name])
79
+ def search_is_for_the_granular_values?(granular_params, search_params)
80
+ return false if granular_params.blank? # ignore resource-level scopes
81
+
82
+ CGI.parse(granular_params).all? do |param_name, value|
83
+ search_params.key?(param_name) && value.include?(search_params[param_name])
86
84
  end
87
-
88
- true
89
85
  end
90
86
 
91
87
  def previous_resources(params)
@@ -84,7 +84,7 @@ module USCoreTestKit
84
84
  found_one_reference = false
85
85
 
86
86
  resolve_one_reference = resources.any? do |resource|
87
- value_found = resolve_path(resource, path)
87
+ value_found = resolve_path(resource, path).select { |v| v.is_a?(FHIR::Reference) }
88
88
  next if value_found.empty?
89
89
 
90
90
  found_one_reference = true
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module USCoreTestKit
4
- VERSION = '1.1.0'
5
- LAST_UPDATED = '2025-12-01'
4
+ VERSION = '1.1.2'
5
+ LAST_UPDATED = '2026-05-13'
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: us_core_test_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen MacVicar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-12-02 00:00:00.000000000 Z
11
+ date: 2026-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inferno_core
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '1.2'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 1.0.2
22
+ version: 1.2.2
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '1.0'
29
+ version: '1.2'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 1.0.2
32
+ version: 1.2.2
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: smart_app_launch_test_kit
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -37,6 +37,9 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '1.0'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.0.1
40
43
  type: :runtime
41
44
  prerelease: false
42
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -44,6 +47,9 @@ dependencies:
44
47
  - - "~>"
45
48
  - !ruby/object:Gem::Version
46
49
  version: '1.0'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.0.1
47
53
  - !ruby/object:Gem::Dependency
48
54
  name: tls_test_kit
49
55
  requirement: !ruby/object:Gem::Requirement
@@ -51,6 +57,9 @@ dependencies:
51
57
  - - "~>"
52
58
  - !ruby/object:Gem::Version
53
59
  version: '1.0'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.2
54
63
  type: :runtime
55
64
  prerelease: false
56
65
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,6 +67,9 @@ dependencies:
58
67
  - - "~>"
59
68
  - !ruby/object:Gem::Version
60
69
  version: '1.0'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.0.2
61
73
  - !ruby/object:Gem::Dependency
62
74
  name: database_cleaner-sequel
63
75
  requirement: !ruby/object:Gem::Requirement