inferno_core 0.6.8 → 0.6.10

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/lib/inferno/apps/cli/evaluate/database.yml +15 -0
  3. data/lib/inferno/apps/cli/evaluate/docker-compose.evaluate.yml +16 -0
  4. data/lib/inferno/apps/cli/evaluate.rb +52 -4
  5. data/lib/inferno/apps/cli/main.rb +5 -1
  6. data/lib/inferno/apps/cli/requirements.rb +28 -0
  7. data/lib/inferno/apps/cli/requirements_exporter.rb +194 -0
  8. data/lib/inferno/apps/cli/suite.rb +21 -0
  9. data/lib/inferno/apps/cli/templates/lib/%library_name%/example_suite/patient_group.rb.tt +141 -0
  10. data/lib/inferno/apps/cli/templates/lib/%library_name%/example_suite.rb.tt +128 -0
  11. data/lib/inferno/apps/cli/templates/lib/%library_name%/metadata.rb.tt +65 -3
  12. data/lib/inferno/apps/cli/templates/lib/%library_name%/suite.rb.tt +2 -2
  13. data/lib/inferno/apps/cli/templates/lib/%library_name%/version.rb.tt +1 -0
  14. data/lib/inferno/apps/cli/templates/lib/%library_name%.rb.tt +1 -1
  15. data/lib/inferno/apps/web/controllers/requirements/show.rb +18 -0
  16. data/lib/inferno/apps/web/controllers/test_suites/requirements/index.rb +29 -0
  17. data/lib/inferno/apps/web/router.rb +7 -0
  18. data/lib/inferno/apps/web/serializers/input.rb +1 -0
  19. data/lib/inferno/apps/web/serializers/requirement.rb +18 -0
  20. data/lib/inferno/apps/web/serializers/requirement_set.rb +13 -0
  21. data/lib/inferno/apps/web/serializers/test.rb +1 -0
  22. data/lib/inferno/apps/web/serializers/test_group.rb +1 -0
  23. data/lib/inferno/apps/web/serializers/test_suite.rb +11 -0
  24. data/lib/inferno/config/boot/requirements.rb +40 -0
  25. data/lib/inferno/config/boot/suites.rb +3 -0
  26. data/lib/inferno/dsl/fhir_evaluation/default.yml +68 -0
  27. data/lib/inferno/dsl/fhir_evaluation/evaluator.rb +3 -5
  28. data/lib/inferno/dsl/fhir_evaluation/rules/all_defined_extensions_have_examples.rb +2 -2
  29. data/lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb +76 -0
  30. data/lib/inferno/dsl/fhir_evaluation/rules/all_must_supports_present.rb +1 -1
  31. data/lib/inferno/dsl/fhir_evaluation/rules/all_profiles_have_examples.rb +1 -1
  32. data/lib/inferno/dsl/fhir_evaluation/rules/all_references_resolve.rb +2 -2
  33. data/lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb +2 -2
  34. data/lib/inferno/dsl/fhir_evaluation/rules/all_search_parameters_have_examples.rb +22 -11
  35. data/lib/inferno/dsl/fhir_evaluation/rules/differential_content_has_examples.rb +124 -0
  36. data/lib/inferno/dsl/fhir_evaluation/rules/value_sets_demonstrate.rb +233 -0
  37. data/lib/inferno/dsl/fhir_resource_navigation.rb +11 -2
  38. data/lib/inferno/dsl/fhir_resource_validation.rb +25 -3
  39. data/lib/inferno/dsl/fhirpath_evaluation.rb +25 -1
  40. data/lib/inferno/dsl/input_output_handling.rb +1 -0
  41. data/lib/inferno/dsl/must_support_assessment.rb +15 -3
  42. data/lib/inferno/dsl/requirement_set.rb +82 -0
  43. data/lib/inferno/dsl/runnable.rb +27 -0
  44. data/lib/inferno/dsl/short_id_manager.rb +55 -0
  45. data/lib/inferno/dsl/suite_requirements.rb +46 -0
  46. data/lib/inferno/entities/ig.rb +4 -0
  47. data/lib/inferno/entities/input.rb +14 -5
  48. data/lib/inferno/entities/requirement.rb +75 -0
  49. data/lib/inferno/entities/test.rb +3 -1
  50. data/lib/inferno/entities/test_group.rb +3 -1
  51. data/lib/inferno/entities/test_suite.rb +4 -0
  52. data/lib/inferno/exceptions.rb +6 -0
  53. data/lib/inferno/public/237.bundle.js +1 -1
  54. data/lib/inferno/public/bundle.js +54 -54
  55. data/lib/inferno/public/bundle.js.LICENSE.txt +3 -36
  56. data/lib/inferno/repositories/igs.rb +1 -2
  57. data/lib/inferno/repositories/requirements.rb +120 -0
  58. data/lib/inferno/version.rb +1 -1
  59. data/spec/shared/test_kit_examples.rb +32 -0
  60. metadata +36 -3
  61. data/lib/inferno/apps/cli/templates/lib/%library_name%/patient_group.rb.tt +0 -44
@@ -14,9 +14,9 @@
14
14
 
15
15
  /**
16
16
  * @license React
17
- * react-is.production.min.js
17
+ * react-is.production.js
18
18
  *
19
- * Copyright (c) Facebook, Inc. and its affiliates.
19
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
20
20
  *
21
21
  * This source code is licensed under the MIT license found in the
22
22
  * LICENSE file in the root directory of this source tree.
@@ -53,46 +53,13 @@
53
53
  */
54
54
 
55
55
  /**
56
- * @mui/styled-engine v6.1.1
56
+ * @mui/styled-engine v6.4.8
57
57
  *
58
58
  * @license MIT
59
59
  * This source code is licensed under the MIT license found in the
60
60
  * LICENSE file in the root directory of this source tree.
61
61
  */
62
62
 
63
- /**
64
- * @remix-run/router v1.21.0
65
- *
66
- * Copyright (c) Remix Software Inc.
67
- *
68
- * This source code is licensed under the MIT license found in the
69
- * LICENSE.md file in the root directory of this source tree.
70
- *
71
- * @license MIT
72
- */
73
-
74
- /**
75
- * React Router DOM v6.28.1
76
- *
77
- * Copyright (c) Remix Software Inc.
78
- *
79
- * This source code is licensed under the MIT license found in the
80
- * LICENSE.md file in the root directory of this source tree.
81
- *
82
- * @license MIT
83
- */
84
-
85
- /**
86
- * React Router v6.28.1
87
- *
88
- * Copyright (c) Remix Software Inc.
89
- *
90
- * This source code is licensed under the MIT license found in the
91
- * LICENSE.md file in the root directory of this source tree.
92
- *
93
- * @license MIT
94
- */
95
-
96
63
  /** @license React v16.13.1
97
64
  * react-is.production.min.js
98
65
  *
@@ -18,8 +18,7 @@ module Inferno
18
18
  def find_or_load(id_or_path)
19
19
  return find(id_or_path) if exists?(id_or_path)
20
20
 
21
- ig_by_path = find_by_path(id_or_path)
22
-
21
+ ig_by_path = find_by_path(id_or_path) || find_by_path(find_local_file(id_or_path))
23
22
  return ig_by_path if ig_by_path
24
23
 
25
24
  load(id_or_path)
@@ -0,0 +1,120 @@
1
+ require 'csv'
2
+ require_relative 'in_memory_repository'
3
+ require_relative '../entities/requirement'
4
+
5
+ module Inferno
6
+ module Repositories
7
+ # Repository that deals with persistence for the `Requirement` entity.
8
+ class Requirements < InMemoryRepository
9
+ def insert_from_file(path)
10
+ result = []
11
+
12
+ CSV.foreach(path, headers: true, header_converters: :symbol) do |row|
13
+ req_set = row[:req_set]
14
+ id = row[:id]
15
+ sub_requirements_field = row[:subrequirements]
16
+
17
+ combined_id = "#{req_set}@#{id}"
18
+
19
+ # Processing sub requirements: e.g. "170.315(g)(31)_hti-2-proposal@5,17,23,26,27,32,35,38-41"
20
+ sub_requirements = Inferno::Entities::Requirement.expand_requirement_ids(sub_requirements_field)
21
+
22
+ result << {
23
+ requirement_set: req_set,
24
+ id: combined_id,
25
+ url: row[:url],
26
+ requirement: row[:requirement],
27
+ conformance: row[:conformance],
28
+ actor: row[:actor],
29
+ sub_requirements: sub_requirements,
30
+ conditionality: row[:conditionality]&.downcase,
31
+ not_tested_reason: row[:not_tested_reason],
32
+ not_tested_details: row[:not_tested_details]
33
+ }
34
+ end
35
+
36
+ result.each do |raw_req|
37
+ requirement = Entities::Requirement.new(raw_req)
38
+
39
+ insert(requirement)
40
+ end
41
+ end
42
+
43
+ def filter_requirements_by_ids(ids)
44
+ all.select { |requirement| ids.include?(requirement.id) }
45
+ end
46
+
47
+ def requirements_for_suite(test_suite_id, test_session_id = nil)
48
+ test_suite = Inferno::Repositories::TestSuites.new.find(test_suite_id)
49
+ selected_suite_options =
50
+ if test_session_id.present?
51
+ Inferno::Repositories::TestSessions.new.find(test_session_id).suite_options
52
+ else
53
+ []
54
+ end
55
+
56
+ requirement_sets =
57
+ test_suite
58
+ .requirement_sets
59
+ .select do |set|
60
+ set.suite_options.all? { |set_option| selected_suite_options.include? set_option }
61
+ end
62
+
63
+ requirements =
64
+ complete_requirement_set_requirements(requirement_sets) +
65
+ filtered_requirement_set_requirements(requirement_sets)
66
+
67
+ add_referenced_requirement_set_requirements(requirements, requirement_sets).uniq
68
+ end
69
+
70
+ def complete_requirement_set_requirements(requirement_sets)
71
+ requirement_sets.select(&:complete?)
72
+ .flat_map do |requirement_set|
73
+ all.select do |requirement|
74
+ requirement.requirement_set == requirement_set.identifier &&
75
+ requirement.actor == requirement_set.actor &&
76
+ requirement.tested?
77
+ end
78
+ end
79
+ end
80
+
81
+ def filtered_requirement_set_requirements(requirement_sets)
82
+ requirement_sets.select(&:filtered?)
83
+ .flat_map do |requirement_set|
84
+ requirement_set
85
+ .expand_requirement_ids
86
+ .map { |requirement_id| find(requirement_id) }
87
+ .select { |requirement| requirement.actor == requirement_set.actor }
88
+ end
89
+ end
90
+
91
+ def add_referenced_requirement_set_requirements( # rubocop:disable Metrics/CyclomaticComplexity
92
+ requirements_to_process,
93
+ requirement_sets,
94
+ processed_requirements = []
95
+ )
96
+ return processed_requirements if requirements_to_process.blank?
97
+
98
+ referenced_requirement_sets = requirement_sets.select(&:referenced?)
99
+
100
+ referenced_requirement_ids =
101
+ requirements_to_process
102
+ .flat_map(&:sub_requirements)
103
+ .select do |requirement_id|
104
+ referenced_requirement_sets.any? do |set|
105
+ requirement_id.start_with?("#{set.identifier}@") && (find(requirement_id).actor == set.actor)
106
+ end
107
+ end
108
+
109
+ new_requirements =
110
+ referenced_requirement_ids.map { |id| find(id) } - requirements_to_process - processed_requirements
111
+
112
+ add_referenced_requirement_set_requirements(
113
+ new_requirements,
114
+ referenced_requirement_sets,
115
+ (processed_requirements + requirements_to_process).uniq
116
+ )
117
+ end
118
+ end
119
+ end
120
+ end
@@ -1,4 +1,4 @@
1
1
  module Inferno
2
2
  # Standard patterns for gem versions: https://guides.rubygems.org/patterns/
3
- VERSION = '0.6.8'.freeze
3
+ VERSION = '0.6.10'.freeze
4
4
  end
@@ -168,6 +168,38 @@ RSpec.shared_examples 'platform_deployable_test_kit' do
168
168
  end
169
169
  end
170
170
  end
171
+
172
+ context 'when short_id map file present' do
173
+ it 'contains a short_id for every suite test and group' do
174
+ suites.each do |suite|
175
+ short_id_map = suite.short_id_map.dup
176
+ next unless short_id_map
177
+
178
+ runnable_ids = suite.all_descendants.map(&:id)
179
+ missing_ids = runnable_ids.reject { |id| short_id_map.delete(id).present? }
180
+
181
+ expect(missing_ids).to be_empty, <<~MSG
182
+ The following runnables in #{suite.short_id_file_path} are missing short_ids:
183
+ #{missing_ids.join(', ')}
184
+ MSG
185
+ end
186
+ end
187
+
188
+ it 'does not contain any extra short ids' do
189
+ suites.each do |suite|
190
+ short_id_map = suite.short_id_map.dup
191
+ next unless short_id_map
192
+
193
+ runnable_ids = suite.all_descendants.map(&:id)
194
+ extra_ids = short_id_map.keys - runnable_ids
195
+
196
+ expect(extra_ids).to be_empty, <<~MSG
197
+ #{suite.short_id_file_path} contains the following ids which do not belong
198
+ to any runnable: #{extra_ids.join(', ')}
199
+ MSG
200
+ end
201
+ end
202
+ end
171
203
  end
172
204
 
173
205
  describe 'presets' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inferno_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.8
4
+ version: 0.6.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen MacVicar
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-03-28 00:00:00.000000000 Z
13
+ date: 2025-05-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -320,6 +320,20 @@ dependencies:
320
320
  - - "~>"
321
321
  - !ruby/object:Gem::Version
322
322
  version: '13.0'
323
+ - !ruby/object:Gem::Dependency
324
+ name: roo
325
+ requirement: !ruby/object:Gem::Requirement
326
+ requirements:
327
+ - - "~>"
328
+ - !ruby/object:Gem::Version
329
+ version: 2.10.1
330
+ type: :runtime
331
+ prerelease: false
332
+ version_requirements: !ruby/object:Gem::Requirement
333
+ requirements:
334
+ - - "~>"
335
+ - !ruby/object:Gem::Version
336
+ version: 2.10.1
323
337
  - !ruby/object:Gem::Dependency
324
338
  name: sequel
325
339
  requirement: !ruby/object:Gem::Requirement
@@ -405,6 +419,8 @@ files:
405
419
  - lib/inferno/apps/cli.rb
406
420
  - lib/inferno/apps/cli/console.rb
407
421
  - lib/inferno/apps/cli/evaluate.rb
422
+ - lib/inferno/apps/cli/evaluate/database.yml
423
+ - lib/inferno/apps/cli/evaluate/docker-compose.evaluate.yml
408
424
  - lib/inferno/apps/cli/execute.rb
409
425
  - lib/inferno/apps/cli/execute/console_outputter.rb
410
426
  - lib/inferno/apps/cli/execute/json_outputter.rb
@@ -414,6 +430,8 @@ files:
414
430
  - lib/inferno/apps/cli/main.rb
415
431
  - lib/inferno/apps/cli/migration.rb
416
432
  - lib/inferno/apps/cli/new.rb
433
+ - lib/inferno/apps/cli/requirements.rb
434
+ - lib/inferno/apps/cli/requirements_exporter.rb
417
435
  - lib/inferno/apps/cli/services.rb
418
436
  - lib/inferno/apps/cli/suite.rb
419
437
  - lib/inferno/apps/cli/suite_input_template.rb
@@ -450,11 +468,12 @@ files:
450
468
  - lib/inferno/apps/cli/templates/docs/_Footer.md
451
469
  - lib/inferno/apps/cli/templates/docs/_Sidebar.md
452
470
  - lib/inferno/apps/cli/templates/lib/%library_name%.rb.tt
471
+ - lib/inferno/apps/cli/templates/lib/%library_name%/example_suite.rb.tt
472
+ - lib/inferno/apps/cli/templates/lib/%library_name%/example_suite/patient_group.rb.tt
453
473
  - lib/inferno/apps/cli/templates/lib/%library_name%/igs/.keep
454
474
  - lib/inferno/apps/cli/templates/lib/%library_name%/igs/README.md
455
475
  - lib/inferno/apps/cli/templates/lib/%library_name%/igs/put_ig_package_dot_tgz_here
456
476
  - lib/inferno/apps/cli/templates/lib/%library_name%/metadata.rb.tt
457
- - lib/inferno/apps/cli/templates/lib/%library_name%/patient_group.rb.tt
458
477
  - lib/inferno/apps/cli/templates/lib/%library_name%/suite.rb.tt
459
478
  - lib/inferno/apps/cli/templates/lib/%library_name%/version.rb.tt
460
479
  - lib/inferno/apps/cli/templates/run.sh
@@ -465,6 +484,7 @@ files:
465
484
  - lib/inferno/apps/web/application.rb
466
485
  - lib/inferno/apps/web/controllers/controller.rb
467
486
  - lib/inferno/apps/web/controllers/requests/show.rb
487
+ - lib/inferno/apps/web/controllers/requirements/show.rb
468
488
  - lib/inferno/apps/web/controllers/test_runs/create.rb
469
489
  - lib/inferno/apps/web/controllers/test_runs/destroy.rb
470
490
  - lib/inferno/apps/web/controllers/test_runs/results/index.rb
@@ -479,6 +499,7 @@ files:
479
499
  - lib/inferno/apps/web/controllers/test_sessions/show.rb
480
500
  - lib/inferno/apps/web/controllers/test_suites/check_configuration.rb
481
501
  - lib/inferno/apps/web/controllers/test_suites/index.rb
502
+ - lib/inferno/apps/web/controllers/test_suites/requirements/index.rb
482
503
  - lib/inferno/apps/web/controllers/test_suites/show.rb
483
504
  - lib/inferno/apps/web/index.html.erb
484
505
  - lib/inferno/apps/web/router.rb
@@ -489,6 +510,8 @@ files:
489
510
  - lib/inferno/apps/web/serializers/message.rb
490
511
  - lib/inferno/apps/web/serializers/preset.rb
491
512
  - lib/inferno/apps/web/serializers/request.rb
513
+ - lib/inferno/apps/web/serializers/requirement.rb
514
+ - lib/inferno/apps/web/serializers/requirement_set.rb
492
515
  - lib/inferno/apps/web/serializers/result.rb
493
516
  - lib/inferno/apps/web/serializers/serializer.rb
494
517
  - lib/inferno/apps/web/serializers/session_data.rb
@@ -505,6 +528,7 @@ files:
505
528
  - lib/inferno/config/boot/ig_files.rb
506
529
  - lib/inferno/config/boot/logging.rb
507
530
  - lib/inferno/config/boot/presets.rb
531
+ - lib/inferno/config/boot/requirements.rb
508
532
  - lib/inferno/config/boot/sidekiq.rb
509
533
  - lib/inferno/config/boot/suites.rb
510
534
  - lib/inferno/config/boot/validator.rb
@@ -528,6 +552,7 @@ files:
528
552
  - lib/inferno/dsl/fhir_client_builder.rb
529
553
  - lib/inferno/dsl/fhir_evaluation/config.rb
530
554
  - lib/inferno/dsl/fhir_evaluation/dataset_loader.rb
555
+ - lib/inferno/dsl/fhir_evaluation/default.yml
531
556
  - lib/inferno/dsl/fhir_evaluation/evaluation_context.rb
532
557
  - lib/inferno/dsl/fhir_evaluation/evaluation_result.rb
533
558
  - lib/inferno/dsl/fhir_evaluation/evaluator.rb
@@ -535,11 +560,14 @@ files:
535
560
  - lib/inferno/dsl/fhir_evaluation/reference_extractor.rb
536
561
  - lib/inferno/dsl/fhir_evaluation/rule.rb
537
562
  - lib/inferno/dsl/fhir_evaluation/rules/all_defined_extensions_have_examples.rb
563
+ - lib/inferno/dsl/fhir_evaluation/rules/all_extensions_used.rb
538
564
  - lib/inferno/dsl/fhir_evaluation/rules/all_must_supports_present.rb
539
565
  - lib/inferno/dsl/fhir_evaluation/rules/all_profiles_have_examples.rb
540
566
  - lib/inferno/dsl/fhir_evaluation/rules/all_references_resolve.rb
541
567
  - lib/inferno/dsl/fhir_evaluation/rules/all_resources_reachable.rb
542
568
  - lib/inferno/dsl/fhir_evaluation/rules/all_search_parameters_have_examples.rb
569
+ - lib/inferno/dsl/fhir_evaluation/rules/differential_content_has_examples.rb
570
+ - lib/inferno/dsl/fhir_evaluation/rules/value_sets_demonstrate.rb
543
571
  - lib/inferno/dsl/fhir_resource_navigation.rb
544
572
  - lib/inferno/dsl/fhir_resource_validation.rb
545
573
  - lib/inferno/dsl/fhir_validation.rb
@@ -556,11 +584,14 @@ files:
556
584
  - lib/inferno/dsl/oauth_credentials.rb
557
585
  - lib/inferno/dsl/primitive_type.rb
558
586
  - lib/inferno/dsl/request_storage.rb
587
+ - lib/inferno/dsl/requirement_set.rb
559
588
  - lib/inferno/dsl/results.rb
560
589
  - lib/inferno/dsl/resume_test_route.rb
561
590
  - lib/inferno/dsl/runnable.rb
591
+ - lib/inferno/dsl/short_id_manager.rb
562
592
  - lib/inferno/dsl/suite_endpoint.rb
563
593
  - lib/inferno/dsl/suite_option.rb
594
+ - lib/inferno/dsl/suite_requirements.rb
564
595
  - lib/inferno/dsl/tcp_exception_handler.rb
565
596
  - lib/inferno/dsl/value_extractor.rb
566
597
  - lib/inferno/entities.rb
@@ -573,6 +604,7 @@ files:
573
604
  - lib/inferno/entities/message.rb
574
605
  - lib/inferno/entities/preset.rb
575
606
  - lib/inferno/entities/request.rb
607
+ - lib/inferno/entities/requirement.rb
576
608
  - lib/inferno/entities/result.rb
577
609
  - lib/inferno/entities/session_data.rb
578
610
  - lib/inferno/entities/test.rb
@@ -607,6 +639,7 @@ files:
607
639
  - lib/inferno/repositories/presets.rb
608
640
  - lib/inferno/repositories/repository.rb
609
641
  - lib/inferno/repositories/requests.rb
642
+ - lib/inferno/repositories/requirements.rb
610
643
  - lib/inferno/repositories/results.rb
611
644
  - lib/inferno/repositories/session_data.rb
612
645
  - lib/inferno/repositories/tags.rb
@@ -1,44 +0,0 @@
1
- module <%= module_name %>
2
- class PatientGroup < Inferno::TestGroup
3
- title 'Patient Tests'
4
- description 'Verify that the server makes Patient resources available'
5
- id :patient_group
6
-
7
- test do
8
- title 'Server returns requested Patient resource from the Patient read interaction'
9
- description %(
10
- Verify that Patient resources can be read from the server.
11
- )
12
-
13
- input :patient_id,
14
- title: 'Patient ID'
15
-
16
- # Named requests can be used by other tests
17
- makes_request :patient
18
-
19
- run do
20
- fhir_read(:patient, patient_id, name: :patient)
21
-
22
- assert_response_status(200)
23
- assert_resource_type(:patient)
24
- assert resource.id == patient_id,
25
- "Requested resource with id #{patient_id}, received resource with id #{resource.id}"
26
- end
27
- end
28
-
29
- test do
30
- title 'Patient resource is valid'
31
- description %(
32
- Verify that the Patient resource returned from the server is a valid FHIR resource.
33
- )
34
- # This test will use the response from the :patient request in the
35
- # previous test
36
- uses_request :patient
37
-
38
- run do
39
- assert_resource_type(:patient)
40
- assert_valid_resource
41
- end
42
- end
43
- end
44
- end