fhir_client 4.0.4 → 5.0.1
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 +4 -4
- data/.github/workflows/ruby.yml +26 -0
- data/README.md +7 -2
- data/Rakefile +0 -4
- data/fhir_client.gemspec +6 -5
- data/lib/fhir_client.rb +5 -0
- data/lib/fhir_client/client.rb +42 -26
- data/lib/fhir_client/ext/model.rb +4 -7
- data/lib/fhir_client/sections/crud.rb +1 -1
- data/lib/fhir_client/sections/operations.rb +9 -4
- data/lib/fhir_client/sections/search.rb +10 -22
- data/lib/fhir_client/sections/transactions.rb +1 -0
- data/lib/fhir_client/version.rb +1 -1
- metadata +21 -19
- data/.travis.yml +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89d03abbe3eca9297ffb9babe42c7c60c7ca2049dc7281f601a6394e963ff64f
|
4
|
+
data.tar.gz: a2a57d32d9d21a35a8bd7ce8f974615b1b7e8dce9686e146841709e9b6a9aff2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 752717f497d72a424f21b9c7c3e4f48de356fdf9a16678f0808009d8284dd32a4c362dfa89e993acf594245d0b6e4fdef5f3d19ba17ea86226eaf9eab3565d1d
|
7
|
+
data.tar.gz: dcea71cd74854f955b4acfb453ae4263b30c31b29575319f213c48b704ff5a5578409170909bf2a495d59c71601063726abd99b332220dc18fd2091b305b3e3e
|
@@ -0,0 +1,26 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
ruby-version: ['2.6', '2.7']
|
15
|
+
|
16
|
+
steps:
|
17
|
+
- uses: actions/checkout@v2
|
18
|
+
- name: Set up Ruby
|
19
|
+
uses: ruby/setup-ruby@v1
|
20
|
+
with:
|
21
|
+
ruby-version: ${{ matrix.ruby-version }}
|
22
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
23
|
+
- name: Run tests
|
24
|
+
run: bundle exec rake
|
25
|
+
- name: Rubocop
|
26
|
+
run: bundle exec rubocop
|
data/README.md
CHANGED
@@ -151,9 +151,14 @@ client.destroy(FHIR::Patient, patient_id)
|
|
151
151
|
|
152
152
|
### Searching
|
153
153
|
```ruby
|
154
|
+
# via GET
|
154
155
|
reply = client.search(FHIR::Patient, search: {parameters: {name: 'P'}})
|
156
|
+
|
157
|
+
# via POST
|
158
|
+
reply = client.search(FHIR::Patient, search: {body: {name: 'P'}})
|
159
|
+
|
155
160
|
bundle = reply.resource
|
156
|
-
patient = bundle
|
161
|
+
patient = bundle&.entry&.first&.resource
|
157
162
|
```
|
158
163
|
|
159
164
|
### Fetching a Bundle
|
@@ -215,7 +220,7 @@ end
|
|
215
220
|
|
216
221
|
# License
|
217
222
|
|
218
|
-
Copyright 2014-
|
223
|
+
Copyright 2014-2022 The MITRE Corporation
|
219
224
|
|
220
225
|
Licensed under the Apache License, Version 2.0 (the "License");
|
221
226
|
you may not use this file except in compliance with the License.
|
data/Rakefile
CHANGED
data/fhir_client.gemspec
CHANGED
@@ -6,8 +6,9 @@ require 'fhir_client/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = 'fhir_client'
|
8
8
|
spec.version = FHIR::Client::VERSION
|
9
|
-
spec.authors = ['Andre Quina', 'Jason Walonoski', '
|
9
|
+
spec.authors = ['Andre Quina', 'Jason Walonoski', 'Robert Scanlon', 'Reece Adamson']
|
10
10
|
spec.email = ['jwalonoski@mitre.org']
|
11
|
+
spec.licenses = ['Apache-2.0']
|
11
12
|
|
12
13
|
spec.summary = %q{A Gem for handling FHIR client requests in ruby}
|
13
14
|
spec.description = %q{A Gem for handling FHIR client requests in ruby}
|
@@ -22,9 +23,9 @@ Gem::Specification.new do |spec|
|
|
22
23
|
|
23
24
|
spec.add_dependency 'activesupport', '>= 3'
|
24
25
|
spec.add_dependency 'addressable', '>= 2.3'
|
25
|
-
spec.add_dependency 'fhir_models', '>= 4.0
|
26
|
-
spec.add_dependency 'fhir_stu3_models', '>= 3.0
|
27
|
-
spec.add_dependency 'fhir_dstu2_models', '>= 1.0
|
26
|
+
spec.add_dependency 'fhir_models', '>= 4.2.0'
|
27
|
+
spec.add_dependency 'fhir_stu3_models', '>= 3.1.0'
|
28
|
+
spec.add_dependency 'fhir_dstu2_models', '>= 1.1.0'
|
28
29
|
spec.add_dependency 'nokogiri', '>= 1.10.4'
|
29
30
|
spec.add_dependency 'oauth2', '~> 1.1'
|
30
31
|
spec.add_dependency 'rack', '>= 1.5'
|
@@ -32,7 +33,7 @@ Gem::Specification.new do |spec|
|
|
32
33
|
spec.add_dependency 'tilt', '>= 1.1'
|
33
34
|
|
34
35
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
35
|
-
spec.add_development_dependency 'rake', '
|
36
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
36
37
|
spec.add_development_dependency 'pry'
|
37
38
|
spec.add_development_dependency 'webmock'
|
38
39
|
spec.add_development_dependency 'test-unit'
|
data/lib/fhir_client.rb
CHANGED
@@ -3,6 +3,11 @@ require 'fhir_dstu2_models'
|
|
3
3
|
require 'fhir_stu3_models'
|
4
4
|
require 'active_support/all'
|
5
5
|
|
6
|
+
# Default to INFO level logging for all FHIR namespaced logging. Since there is
|
7
|
+
# no single gem that 'owns' the FHIR namespace, we use the client as the spot
|
8
|
+
# to set the default. Otherwise the default is set to DEBUG, which is too high.
|
9
|
+
FHIR.logger.level = Logger::INFO
|
10
|
+
|
6
11
|
root = File.expand_path '.', File.dirname(File.absolute_path(__FILE__))
|
7
12
|
Dir.glob(File.join(root, 'fhir_client', 'sections', '**', '*.rb')).each do |file|
|
8
13
|
require file
|
data/lib/fhir_client/client.rb
CHANGED
@@ -315,35 +315,46 @@ module FHIR
|
|
315
315
|
def parse_reply(klass, format, response)
|
316
316
|
FHIR.logger.debug "Parsing response with {klass: #{klass}, format: #{format}, code: #{response.code}}."
|
317
317
|
return nil unless [200, 201].include? response.code
|
318
|
-
res =
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
318
|
+
res =
|
319
|
+
begin
|
320
|
+
if(@fhir_version == :dstu2 || klass&.ancestors&.include?(FHIR::DSTU2::Model))
|
321
|
+
if(format.include?('xml'))
|
322
|
+
FHIR::DSTU2::Xml.from_xml(response.body)
|
323
|
+
else
|
324
|
+
FHIR::DSTU2::Json.from_json(response.body)
|
325
|
+
end
|
326
|
+
elsif(@fhir_version == :r4 || klass&.ancestors&.include?(FHIR::Model))
|
327
|
+
if(format.include?('xml'))
|
328
|
+
FHIR::Xml.from_xml(response.body)
|
329
|
+
else
|
330
|
+
FHIR::Json.from_json(response.body)
|
331
|
+
end
|
332
|
+
else
|
333
|
+
if(format.include?('xml'))
|
334
|
+
FHIR::STU3::Xml.from_xml(response.body)
|
335
|
+
else
|
336
|
+
FHIR::STU3::Json.from_json(response.body)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
rescue => e
|
340
|
+
FHIR.logger.error "Failed to parse #{format} as resource #{klass}: #{e.message}"
|
341
|
+
nil
|
342
|
+
end
|
343
|
+
set_client_on_resource(res) unless res.nil?
|
344
344
|
res
|
345
345
|
end
|
346
346
|
|
347
|
+
def set_client_on_resource(resource)
|
348
|
+
return if resource.nil?
|
349
|
+
|
350
|
+
resource.client = self
|
351
|
+
resource.each_element do |element, _, _|
|
352
|
+
if element.is_a?(Reference) || element.is_a?(STU3::Reference) || element.is_a?(DSTU2::Reference) || element.respond_to?(:resourceType)
|
353
|
+
element.client = self
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
347
358
|
def strip_base(path)
|
348
359
|
path.gsub(@base_service_url, '')
|
349
360
|
end
|
@@ -374,6 +385,7 @@ module FHIR
|
|
374
385
|
end
|
375
386
|
|
376
387
|
# Extract the request payload in the specified format, defaults to XML
|
388
|
+
# Note that the payload is usually a resource, but could be a form post for searches depending on content type
|
377
389
|
def request_payload(resource, headers)
|
378
390
|
if headers
|
379
391
|
format_specified = headers['Content-Type']
|
@@ -383,6 +395,10 @@ module FHIR
|
|
383
395
|
resource.to_xml
|
384
396
|
elsif format_specified.downcase.include?('json')
|
385
397
|
resource.to_json
|
398
|
+
elsif format_specified.downcase == 'application/x-www-form-urlencoded'
|
399
|
+
# Special case where this is a search body and not a resource.
|
400
|
+
# Leave as hash because underlying libraries automatically URL encode it.
|
401
|
+
resource
|
386
402
|
else
|
387
403
|
resource.to_xml
|
388
404
|
end
|
@@ -2,17 +2,14 @@ module FHIR
|
|
2
2
|
module ModelExtras
|
3
3
|
|
4
4
|
def self.included base
|
5
|
-
base.
|
5
|
+
base.include InstanceMethods
|
6
6
|
base.extend ClassMethods
|
7
|
+
base.attr_writer :client
|
7
8
|
end
|
8
9
|
|
9
10
|
module InstanceMethods
|
10
11
|
def client
|
11
|
-
FHIR::Model.client
|
12
|
-
end
|
13
|
-
|
14
|
-
def client=(client)
|
15
|
-
FHIR::Model.client = client
|
12
|
+
@client || FHIR::Model.client
|
16
13
|
end
|
17
14
|
|
18
15
|
def vread(version_id)
|
@@ -146,4 +143,4 @@ module FHIR
|
|
146
143
|
include FHIR::ModelExtras
|
147
144
|
end
|
148
145
|
end
|
149
|
-
end
|
146
|
+
end
|
@@ -226,7 +226,7 @@ module FHIR
|
|
226
226
|
resource.id = FHIR::ResourceAddress.pull_out_id(resource.class.name.demodulize, reply.self_link)
|
227
227
|
reply.resource = resource # just send back the submitted resource
|
228
228
|
end
|
229
|
-
reply.resource
|
229
|
+
set_client_on_resource(reply.resource)
|
230
230
|
reply.resource_class = resource.class
|
231
231
|
reply
|
232
232
|
end
|
@@ -132,8 +132,11 @@ module FHIR
|
|
132
132
|
add_resource_parameter(params, 'resource', resource)
|
133
133
|
add_parameter(params, 'onlyCertainMatches', 'Boolean', options[:onlyCertainMatches]) unless options[:onlyCertainMatches].nil?
|
134
134
|
add_parameter(params, 'count', 'Integer', options[:matchCount]) if options[:matchCount].is_a?(Integer)
|
135
|
-
post
|
136
|
-
|
135
|
+
post(
|
136
|
+
resource_url(options),
|
137
|
+
params,
|
138
|
+
fhir_headers({content_type: "#{format || @default_format}", accept: "#{format || @default_format}"})
|
139
|
+
).tap { |reply| set_client_on_resource(reply.resource) }
|
137
140
|
end
|
138
141
|
|
139
142
|
#
|
@@ -154,7 +157,8 @@ module FHIR
|
|
154
157
|
params = versioned_resource_class('Parameters').new
|
155
158
|
add_resource_parameter(params, 'resource', resource)
|
156
159
|
add_parameter(params, 'profile', 'Uri', options[:profile_uri]) unless options[:profile_uri].nil?
|
157
|
-
post
|
160
|
+
post(resource_url(options), params, fhir_headers(headers))
|
161
|
+
.tap { |reply| set_client_on_resource(reply.resource) }
|
158
162
|
end
|
159
163
|
|
160
164
|
def validate_existing(resource, id, options = {}, format = @default_format)
|
@@ -165,7 +169,8 @@ module FHIR
|
|
165
169
|
params = versioned_resource_class('Parameters').new
|
166
170
|
add_resource_parameter(params, 'resource', resource)
|
167
171
|
add_parameter(params, 'profile', 'Uri', options[:profile_uri]) unless options[:profile_uri].nil?
|
168
|
-
post
|
172
|
+
post(resource_url(options), params, fhir_headers(headers))
|
173
|
+
.tap { |reply| set_client_on_resource(reply.resource) }
|
169
174
|
end
|
170
175
|
|
171
176
|
private
|
@@ -12,40 +12,28 @@ module FHIR
|
|
12
12
|
options[:resource] = klass
|
13
13
|
options[:format] = format
|
14
14
|
|
15
|
-
reply = if options
|
16
|
-
post resource_url(options), nil, fhir_headers({content_type: 'application/x-www-form-urlencoded'})
|
17
|
-
else
|
15
|
+
reply = if options.dig(:search, :flag) != true && options.dig(:search, :body).nil?
|
18
16
|
get resource_url(options), fhir_headers
|
17
|
+
else
|
18
|
+
options[:search][:flag] = true
|
19
|
+
post resource_url(options), options.dig(:search, :body), fhir_headers({content_type: 'application/x-www-form-urlencoded'})
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
reply.resource = parse_reply(klass, format, reply)
|
22
23
|
reply.resource_class = klass
|
23
24
|
reply
|
24
25
|
end
|
25
26
|
|
27
|
+
# It does not appear that this is part of the specification (any more?)
|
28
|
+
# Investigate removing in next major version.
|
26
29
|
def search_existing(klass, id, options = {}, format = @default_format)
|
27
|
-
options
|
28
|
-
|
29
|
-
reply = if options[:search] && options[:search][:flag]
|
30
|
-
post resource_url(options), nil, fhir_headers({content_type: 'application/x-www-form-urlencoded'})
|
31
|
-
else
|
32
|
-
get resource_url(options), fhir_headers
|
33
|
-
end
|
34
|
-
reply.resource = parse_reply(klass, format, reply)
|
35
|
-
reply.resource_class = klass
|
36
|
-
reply
|
30
|
+
options[:id] = id
|
31
|
+
search(klass, options, format)
|
37
32
|
end
|
38
33
|
|
39
34
|
def search_all(options = {}, format = @default_format)
|
40
35
|
options[:format] = format
|
41
|
-
|
42
|
-
post resource_url(options), nil, fhir_headers({content_type: 'application/x-www-form-urlencoded'})
|
43
|
-
else
|
44
|
-
get resource_url(options), fhir_headers
|
45
|
-
end
|
46
|
-
reply.resource = parse_reply(nil, format, reply)
|
47
|
-
reply.resource_class = nil
|
48
|
-
reply
|
36
|
+
search(nil, options, format)
|
49
37
|
end
|
50
38
|
end
|
51
39
|
end
|
data/lib/fhir_client/version.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fhir_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andre Quina
|
8
8
|
- Jason Walonoski
|
9
|
-
-
|
10
|
-
|
9
|
+
- Robert Scanlon
|
10
|
+
- Reece Adamson
|
11
|
+
autorequire:
|
11
12
|
bindir: exe
|
12
13
|
cert_chain: []
|
13
|
-
date:
|
14
|
+
date: 2021-08-13 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: activesupport
|
@@ -46,42 +47,42 @@ dependencies:
|
|
46
47
|
requirements:
|
47
48
|
- - ">="
|
48
49
|
- !ruby/object:Gem::Version
|
49
|
-
version: 4.0
|
50
|
+
version: 4.2.0
|
50
51
|
type: :runtime
|
51
52
|
prerelease: false
|
52
53
|
version_requirements: !ruby/object:Gem::Requirement
|
53
54
|
requirements:
|
54
55
|
- - ">="
|
55
56
|
- !ruby/object:Gem::Version
|
56
|
-
version: 4.0
|
57
|
+
version: 4.2.0
|
57
58
|
- !ruby/object:Gem::Dependency
|
58
59
|
name: fhir_stu3_models
|
59
60
|
requirement: !ruby/object:Gem::Requirement
|
60
61
|
requirements:
|
61
62
|
- - ">="
|
62
63
|
- !ruby/object:Gem::Version
|
63
|
-
version: 3.0
|
64
|
+
version: 3.1.0
|
64
65
|
type: :runtime
|
65
66
|
prerelease: false
|
66
67
|
version_requirements: !ruby/object:Gem::Requirement
|
67
68
|
requirements:
|
68
69
|
- - ">="
|
69
70
|
- !ruby/object:Gem::Version
|
70
|
-
version: 3.0
|
71
|
+
version: 3.1.0
|
71
72
|
- !ruby/object:Gem::Dependency
|
72
73
|
name: fhir_dstu2_models
|
73
74
|
requirement: !ruby/object:Gem::Requirement
|
74
75
|
requirements:
|
75
76
|
- - ">="
|
76
77
|
- !ruby/object:Gem::Version
|
77
|
-
version: 1.0
|
78
|
+
version: 1.1.0
|
78
79
|
type: :runtime
|
79
80
|
prerelease: false
|
80
81
|
version_requirements: !ruby/object:Gem::Requirement
|
81
82
|
requirements:
|
82
83
|
- - ">="
|
83
84
|
- !ruby/object:Gem::Version
|
84
|
-
version: 1.0
|
85
|
+
version: 1.1.0
|
85
86
|
- !ruby/object:Gem::Dependency
|
86
87
|
name: nokogiri
|
87
88
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,16 +171,16 @@ dependencies:
|
|
170
171
|
name: rake
|
171
172
|
requirement: !ruby/object:Gem::Requirement
|
172
173
|
requirements:
|
173
|
-
- - "
|
174
|
+
- - ">="
|
174
175
|
- !ruby/object:Gem::Version
|
175
|
-
version:
|
176
|
+
version: 12.3.3
|
176
177
|
type: :development
|
177
178
|
prerelease: false
|
178
179
|
version_requirements: !ruby/object:Gem::Requirement
|
179
180
|
requirements:
|
180
|
-
- - "
|
181
|
+
- - ">="
|
181
182
|
- !ruby/object:Gem::Version
|
182
|
-
version:
|
183
|
+
version: 12.3.3
|
183
184
|
- !ruby/object:Gem::Dependency
|
184
185
|
name: pry
|
185
186
|
requirement: !ruby/object:Gem::Requirement
|
@@ -247,11 +248,11 @@ files:
|
|
247
248
|
- ".csslintrc"
|
248
249
|
- ".eslintignore"
|
249
250
|
- ".eslintrc"
|
251
|
+
- ".github/workflows/ruby.yml"
|
250
252
|
- ".gitignore"
|
251
253
|
- ".rubocop.yml"
|
252
254
|
- ".rubocop_todo.yml"
|
253
255
|
- ".simplecov"
|
254
|
-
- ".travis.yml"
|
255
256
|
- Gemfile
|
256
257
|
- LICENSE
|
257
258
|
- README.md
|
@@ -283,9 +284,10 @@ files:
|
|
283
284
|
- lib/fhir_client/version.rb
|
284
285
|
- lib/fhir_client/version_management.rb
|
285
286
|
homepage: https://github.com/fhir-crucible/fhir_client
|
286
|
-
licenses:
|
287
|
+
licenses:
|
288
|
+
- Apache-2.0
|
287
289
|
metadata: {}
|
288
|
-
post_install_message:
|
290
|
+
post_install_message:
|
289
291
|
rdoc_options: []
|
290
292
|
require_paths:
|
291
293
|
- lib
|
@@ -300,9 +302,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
300
302
|
- !ruby/object:Gem::Version
|
301
303
|
version: '0'
|
302
304
|
requirements: []
|
303
|
-
rubyforge_project:
|
305
|
+
rubyforge_project:
|
304
306
|
rubygems_version: 2.7.6.2
|
305
|
-
signing_key:
|
307
|
+
signing_key:
|
306
308
|
specification_version: 4
|
307
309
|
summary: A Gem for handling FHIR client requests in ruby
|
308
310
|
test_files: []
|
data/.travis.yml
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.4
|
4
|
-
- 2.5
|
5
|
-
- 2.6
|
6
|
-
before_install:
|
7
|
-
- gem update --system
|
8
|
-
- gem install bundler
|
9
|
-
before_script:
|
10
|
-
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
11
|
-
- chmod +x ./cc-test-reporter
|
12
|
-
- ./cc-test-reporter before-build
|
13
|
-
script:
|
14
|
-
- bundle exec rake test
|
15
|
-
after_script:
|
16
|
-
- ./cc-test-reporter after-build -t simplecov --exit-code $TRAVIS_TEST_RESULT
|
17
|
-
notifications:
|
18
|
-
email:
|
19
|
-
recipients:
|
20
|
-
- fhir-testing-list@lists.mitre.org
|
21
|
-
on_failure: change
|