fhir_client 4.0.3 → 5.0.0

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: d385c9e64810e036607e1da44bf1331df35398b1f9e43aedea8c7bb80e080ff0
4
- data.tar.gz: 866d5929b2f4235976ed635a7ab0e795c2fe10903d7e13bfdf6f8a78d9ddc968
3
+ metadata.gz: 4f141904a0b942b381fa973636f64b7974741bc3abf997e947aea99bed7a16ed
4
+ data.tar.gz: '09d8ba15495194f29bc49b8928c066a72f40104f1efd61bc594c4a54de919ff2'
5
5
  SHA512:
6
- metadata.gz: 2796ea338218119eb621b10122d2390abfc3447b384303a49eed9df8d45ab137561640c3bda7fd1ab7d8760866dc82f383640bb1dad83ad72dd893443d711400
7
- data.tar.gz: 0b25a370025e1618bb00e508850d0f926d0544a0da1a392a2ecceea834ac6b59d38b32365e0328de503fbbd9b79e8f10bd0447d6c14bbeea34f3c77797ac79dd
6
+ metadata.gz: 4213d1b6dc0dd9e3252b78d79bf5b40afc5b58d0558c5bd88489468a97e16bc86dfce651def02436132671b8fba694c740bd643503363e6a2415fe365264fc6f
7
+ data.tar.gz: 936fb94723c149d1fa0d7984c6cb36deaac845787cf2d45bfe3c83bb11b8166b118b6286935a6f9643e6300042459a937edebd144b2919dee505311897cd4828
@@ -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.entry.first.resource
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-2019 The MITRE Corporation
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
@@ -19,8 +19,4 @@ task :rubocop do
19
19
  RuboCop::RakeTask.new
20
20
  end
21
21
 
22
- task test: [:rubocop] do
23
- system('open coverage/index.html')
24
- end
25
-
26
22
  task default: [:test]
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', 'Janoo Fernandes']
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.2'
26
- spec.add_dependency 'fhir_stu3_models', '>= 3.0.1'
27
- spec.add_dependency 'fhir_dstu2_models', '>= 1.0.10'
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', '~> 10.0'
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
@@ -315,36 +315,44 @@ 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 = nil
319
- begin
320
- res = 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
- res.client = self unless res.nil?
340
- FHIR.logger.warn "Expected #{klass} but got #{res.class}" if res.class != klass
341
- rescue => e
342
- FHIR.logger.error "Failed to parse #{format} as resource #{klass}: #{e.message}"
343
- res = nil
344
- end
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?
345
344
  res
346
345
  end
347
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
+ element.client = self if element.is_a?(Reference) || element.respond_to?(:resourceType)
353
+ end
354
+ end
355
+
348
356
  def strip_base(path)
349
357
  path.gsub(@base_service_url, '')
350
358
  end
@@ -375,6 +383,7 @@ module FHIR
375
383
  end
376
384
 
377
385
  # Extract the request payload in the specified format, defaults to XML
386
+ # Note that the payload is usually a resource, but could be a form post for searches depending on content type
378
387
  def request_payload(resource, headers)
379
388
  if headers
380
389
  format_specified = headers['Content-Type']
@@ -384,6 +393,10 @@ module FHIR
384
393
  resource.to_xml
385
394
  elsif format_specified.downcase.include?('json')
386
395
  resource.to_json
396
+ elsif format_specified.downcase == 'application/x-www-form-urlencoded'
397
+ # Special case where this is a search body and not a resource.
398
+ # Leave as hash because underlying libraries automatically URL encode it.
399
+ resource
387
400
  else
388
401
  resource.to_xml
389
402
  end
@@ -433,7 +446,7 @@ module FHIR
433
446
  begin
434
447
  response = @client.get(url, headers: headers)
435
448
  rescue => e
436
- unless e.response
449
+ if !e.respond_to?(:response) || e.response.nil?
437
450
  # Re-raise the client error if there's no response. Otherwise, logging
438
451
  # and other things break below!
439
452
  FHIR.logger.error "GET - Request: #{url} failed! No response from server: #{e}"
@@ -480,7 +493,7 @@ module FHIR
480
493
  @reply = FHIR::ClientReply.new(req, res, self)
481
494
  return @reply
482
495
  rescue => e
483
- unless e.response
496
+ if !e.respond_to?(:response) || e.response.nil?
484
497
  # Re-raise the client error if there's no response. Otherwise, logging
485
498
  # and other things break below!
486
499
  FHIR.logger.error "GET - Request: #{url} failed! No response from server: #{e}"
@@ -515,7 +528,7 @@ module FHIR
515
528
  begin
516
529
  response = @client.post(url, headers: headers, body: payload)
517
530
  rescue => e
518
- unless e.response
531
+ if !e.respond_to?(:response) || e.response.nil?
519
532
  # Re-raise the client error if there's no response. Otherwise, logging
520
533
  # and other things break below!
521
534
  FHIR.logger.error "POST - Request: #{url} failed! No response from server: #{e}"
@@ -562,7 +575,7 @@ module FHIR
562
575
  begin
563
576
  response = @client.put(url, headers: headers, body: payload)
564
577
  rescue => e
565
- unless e.response
578
+ if !e.respond_to?(:response) || e.response.nil?
566
579
  # Re-raise the client error if there's no response. Otherwise, logging
567
580
  # and other things break below!
568
581
  FHIR.logger.error "PUT - Request: #{url} failed! No response from server: #{e}"
@@ -609,7 +622,7 @@ module FHIR
609
622
  begin
610
623
  response = @client.patch(url, headers: headers, body: payload)
611
624
  rescue => e
612
- unless e.response
625
+ if !e.respond_to?(:response) || e.response.nil?
613
626
  # Re-raise the client error if there's no response. Otherwise, logging
614
627
  # and other things break below!
615
628
  FHIR.logger.error "PATCH - Request: #{url} failed! No response from server: #{e}"
@@ -645,7 +658,7 @@ module FHIR
645
658
  @reply = FHIR::ClientReply.new(request.args, res, self)
646
659
  end
647
660
  rescue => e
648
- unless e.response
661
+ if !e.respond_to?(:response) || e.response.nil?
649
662
  # Re-raise the client error if there's no response. Otherwise, logging
650
663
  # and other things break below!
651
664
  FHIR.logger.error "PATCH - Request: #{url} failed! No response from server: #{e}"
@@ -677,7 +690,7 @@ module FHIR
677
690
  begin
678
691
  response = @client.delete(url, headers: headers)
679
692
  rescue => e
680
- unless e.response
693
+ if !e.respond_to?(:response) || e.response.nil?
681
694
  # Re-raise the client error if there's no response. Otherwise, logging
682
695
  # and other things break below!
683
696
  FHIR.logger.error "DELETE - Request: #{url} failed! No response from server: #{e}"
@@ -2,17 +2,14 @@ module FHIR
2
2
  module ModelExtras
3
3
 
4
4
  def self.included base
5
- base.send :include, InstanceMethods
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.client = self
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 resource_url(options), params, fhir_headers({content_type: "#{format || @default_format}",
136
- accept: "#{format || @default_format}"})
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 resource_url(options), params, fhir_headers(headers)
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 resource_url(options), params, fhir_headers(headers)
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[:search] && options[:search][:flag]
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
- # reply = get resource_url(options), fhir_headers(options)
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.merge!(resource: klass, id: id, format: format)
28
- # if options[:search][:flag]
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
- reply = if options[:search] && options[:search][:flag]
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
@@ -74,6 +74,7 @@ module FHIR
74
74
  rescue
75
75
  reply.resource = nil
76
76
  end
77
+ set_client_on_resource(reply.resource)
77
78
  reply.resource_class = reply.resource.class
78
79
  reply
79
80
  end
@@ -1,5 +1,5 @@
1
1
  module FHIR
2
2
  class Client
3
- VERSION = '4.0.3'
3
+ VERSION = '5.0.0'.freeze
4
4
  end
5
5
  end
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.0.3
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andre Quina
8
8
  - Jason Walonoski
9
- - Janoo Fernandes
10
- autorequire:
9
+ - Robert Scanlon
10
+ - Reece Adamson
11
+ autorequire:
11
12
  bindir: exe
12
13
  cert_chain: []
13
- date: 2019-09-30 00:00:00.000000000 Z
14
+ date: 2021-08-12 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.2
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.2
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.1
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.1
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.10
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.10
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: '10.0'
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: '10.0'
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,8 +302,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
300
302
  - !ruby/object:Gem::Version
301
303
  version: '0'
302
304
  requirements: []
303
- rubygems_version: 3.0.2
304
- signing_key:
305
+ rubyforge_project:
306
+ rubygems_version: 2.7.6.2
307
+ signing_key:
305
308
  specification_version: 4
306
309
  summary: A Gem for handling FHIR client requests in ruby
307
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