inferno_core 0.6.11 → 0.6.13

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/inferno/apps/cli/evaluate.rb +8 -7
  3. data/lib/inferno/apps/cli/main.rb +12 -1
  4. data/lib/inferno/apps/cli/requirements.rb +49 -0
  5. data/lib/inferno/apps/cli/requirements_coverage_checker.rb +238 -0
  6. data/lib/inferno/apps/cli/requirements_exporter.rb +2 -2
  7. data/lib/inferno/apps/cli/suite.rb +9 -0
  8. data/lib/inferno/apps/web/controllers/test_sessions/results/io_value.rb +68 -0
  9. data/lib/inferno/apps/web/router.rb +3 -0
  10. data/lib/inferno/apps/web/serializers/requirement.rb +3 -1
  11. data/lib/inferno/apps/web/serializers/result.rb +2 -2
  12. data/lib/inferno/config/boot/requirements.rb +9 -4
  13. data/lib/inferno/dsl/fhir_client.rb +9 -1
  14. data/lib/inferno/dsl/http_client.rb +9 -1
  15. data/lib/inferno/dsl/must_support_assessment.rb +23 -0
  16. data/lib/inferno/dsl/runnable.rb +15 -30
  17. data/lib/inferno/dsl/suite_requirements.rb +26 -26
  18. data/lib/inferno/entities/requirement.rb +24 -10
  19. data/lib/inferno/entities/result.rb +39 -0
  20. data/lib/inferno/entities/test_kit.rb +4 -0
  21. data/lib/inferno/public/bundle.js +11 -11
  22. data/lib/inferno/repositories/repository.rb +19 -0
  23. data/lib/inferno/repositories/requirements.rb +15 -6
  24. data/lib/inferno/repositories/results.rb +6 -3
  25. data/lib/inferno/repositories/runnable_repository.rb +29 -0
  26. data/lib/inferno/repositories/test_groups.rb +2 -2
  27. data/lib/inferno/repositories/test_sessions.rb +1 -0
  28. data/lib/inferno/repositories/test_suites.rb +2 -2
  29. data/lib/inferno/repositories/tests.rb +2 -2
  30. data/lib/inferno/repositories.rb +1 -0
  31. data/lib/inferno/version.rb +1 -1
  32. metadata +5 -2
@@ -64,6 +64,22 @@ module Inferno
64
64
  end
65
65
  end
66
66
 
67
+ def update_non_db_entities_ids(hash, use_database_id: false)
68
+ key_map = {
69
+ test_id: Tests.new,
70
+ test_group_id: TestGroups.new,
71
+ test_suite_id: TestSuites.new
72
+ }
73
+
74
+ key_map.each do |key, repo|
75
+ next unless hash.key?(key)
76
+
77
+ entity = repo.find(hash[key])
78
+ hash[key] = use_database_id ? (entity&.database_id || hash[key]) : (entity&.id || hash[key])
79
+ break
80
+ end
81
+ end
82
+
67
83
  # Create a new record in the database.
68
84
  #
69
85
  # @param params [Hash]
@@ -76,7 +92,9 @@ module Inferno
76
92
  # # handle error
77
93
  # end
78
94
  def create(params)
95
+ update_non_db_entities_ids(params, use_database_id: true)
79
96
  result = self.class::Model.create(db_params(params))
97
+
80
98
  build_entity(result.to_hash.merge(handle_non_db_params(params)))
81
99
  end
82
100
 
@@ -100,6 +118,7 @@ module Inferno
100
118
  # @return [Object] an instance of `#entity_class`
101
119
  def build_entity(params)
102
120
  add_non_db_entities(params)
121
+ update_non_db_entities_ids(params)
103
122
  entity_class.new(params)
104
123
  end
105
124
 
@@ -10,6 +10,8 @@ module Inferno
10
10
  result = []
11
11
 
12
12
  CSV.foreach(path, headers: true, header_converters: :symbol) do |row|
13
+ next if row[:conformance].casecmp? 'deprecated'
14
+
13
15
  req_set = row[:req_set]
14
16
  id = row[:id]
15
17
  sub_requirements_field = row[:subrequirements]
@@ -25,12 +27,14 @@ module Inferno
25
27
  url: row[:url],
26
28
  requirement: row[:requirement],
27
29
  conformance: row[:conformance],
28
- actor: row[:actor],
30
+ actors: row[:actors].split(',').map(&:strip),
29
31
  sub_requirements: sub_requirements,
30
32
  conditionality: row[:conditionality]&.downcase,
31
33
  not_tested_reason: row[:not_tested_reason],
32
34
  not_tested_details: row[:not_tested_details]
33
35
  }
36
+ rescue StandardError => e
37
+ Application[:logger].error("Unable to load requirement: #{combined_id}:\n#{e.full_message.lines.first}")
34
38
  end
35
39
 
36
40
  result.each do |raw_req|
@@ -40,6 +44,10 @@ module Inferno
40
44
  end
41
45
  end
42
46
 
47
+ def requirements_for_actor(requirement_set, actor)
48
+ all.select { |requirement| requirement.requirement_set == requirement_set && requirement.actor?(actor) }
49
+ end
50
+
43
51
  def filter_requirements_by_ids(ids)
44
52
  all.select { |requirement| ids.include?(requirement.id) }
45
53
  end
@@ -57,7 +65,9 @@ module Inferno
57
65
  test_suite
58
66
  .requirement_sets
59
67
  .select do |set|
60
- set.suite_options.all? { |set_option| selected_suite_options.include? set_option }
68
+ set.suite_options.all? do |set_option|
69
+ selected_suite_options.blank? || selected_suite_options.include?(set_option)
70
+ end
61
71
  end
62
72
 
63
73
  requirements =
@@ -72,8 +82,7 @@ module Inferno
72
82
  .flat_map do |requirement_set|
73
83
  all.select do |requirement|
74
84
  requirement.requirement_set == requirement_set.identifier &&
75
- requirement.actor == requirement_set.actor &&
76
- requirement.tested?
85
+ requirement.actor?(requirement_set.actor)
77
86
  end
78
87
  end
79
88
  end
@@ -84,7 +93,7 @@ module Inferno
84
93
  requirement_set
85
94
  .expand_requirement_ids
86
95
  .map { |requirement_id| find(requirement_id) }
87
- .select { |requirement| requirement.actor == requirement_set.actor }
96
+ .select { |requirement| requirement.actor?(requirement_set.actor) }
88
97
  end
89
98
  end
90
99
 
@@ -102,7 +111,7 @@ module Inferno
102
111
  .flat_map(&:sub_requirements)
103
112
  .select do |requirement_id|
104
113
  referenced_requirement_sets.any? do |set|
105
- requirement_id.start_with?("#{set.identifier}@") && (find(requirement_id).actor == set.actor)
114
+ requirement_id.start_with?("#{set.identifier}@") && find(requirement_id)&.actor?(set.actor)
106
115
  end
107
116
  end
108
117
 
@@ -38,6 +38,7 @@ module Inferno
38
38
  # test_id: 'test_id'
39
39
  # )
40
40
  def current_result_for_test_session(test_session_id, params)
41
+ update_non_db_entities_ids(params, use_database_id: true)
41
42
  self.class::Model
42
43
  .where({ test_session_id: }.merge(params))
43
44
  .order(Sequel.desc(:updated_at))
@@ -63,10 +64,12 @@ module Inferno
63
64
  else
64
65
  {}
65
66
  end
67
+ update_non_db_entities_ids(params)
66
68
  entity_class.new(params.merge(runnable))
67
69
  end
68
70
 
69
71
  def result_for_test_run(params)
72
+ update_non_db_entities_ids(params, use_database_id: true)
70
73
  result_hash =
71
74
  self.class::Model
72
75
  .find(params)
@@ -202,9 +205,9 @@ module Inferno
202
205
  end
203
206
 
204
207
  def self.current_results_for_test_session_and_runnables(test_session_id, runnables)
205
- test_ids = runnables.select { |runnable| runnable < Entities::Test }.map!(&:id)
206
- test_group_ids = runnables.select { |runnable| runnable < Entities::TestGroup }.map!(&:id)
207
- test_suite_ids = runnables.select { |runnable| runnable < Entities::TestSuite }.map!(&:id)
208
+ test_ids = runnables.select { |runnable| runnable < Entities::Test }.map!(&:database_id)
209
+ test_group_ids = runnables.select { |runnable| runnable < Entities::TestGroup }.map!(&:database_id)
210
+ test_suite_ids = runnables.select { |runnable| runnable < Entities::TestSuite }.map!(&:database_id)
208
211
 
209
212
  fetch(
210
213
  current_results_sql(with_runnables_filter: true),
@@ -0,0 +1,29 @@
1
+ require_relative 'in_memory_repository'
2
+
3
+ module Inferno
4
+ module Repositories
5
+ class RunnableRepository < InMemoryRepository
6
+ def insert(entity)
7
+ raise Exceptions::DuplicateEntityIdException, entity.id if exists?(entity.id)
8
+
9
+ # Safety check to prevent rare database_id collisions from overwriting entries
10
+ if exists?(entity.database_id) && entity.database_id.to_s != entity.id.to_s
11
+ raise Exceptions::DuplicateEntityIdException,
12
+ "database_id: `#{entity.database_id}` generated from original id: `#{entity.id}`"
13
+ end
14
+
15
+ all << entity
16
+ all_by_id[entity.id.to_s] = entity
17
+ all_by_id[entity.database_id.to_s] = entity unless entity.database_id.to_s == entity.id.to_s
18
+
19
+ entity
20
+ end
21
+
22
+ def remove(entity)
23
+ super
24
+
25
+ all_by_id.delete(entity.database_id.to_s) unless entity.database_id.to_s == entity.id.to_s
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,9 +1,9 @@
1
- require_relative 'in_memory_repository'
1
+ require_relative 'runnable_repository'
2
2
 
3
3
  module Inferno
4
4
  module Repositories
5
5
  # Repository that deals with persistence for the `TestGroup` entity.
6
- class TestGroups < InMemoryRepository
6
+ class TestGroups < RunnableRepository
7
7
  end
8
8
  end
9
9
  end
@@ -60,6 +60,7 @@ module Inferno
60
60
 
61
61
  final_params = params.merge(suite_options:)
62
62
  add_non_db_entities(final_params)
63
+ update_non_db_entities_ids(final_params)
63
64
  entity_class.new(final_params)
64
65
  end
65
66
 
@@ -1,9 +1,9 @@
1
- require_relative 'in_memory_repository'
1
+ require_relative 'runnable_repository'
2
2
 
3
3
  module Inferno
4
4
  module Repositories
5
5
  # Repository that deals with persistence for the `TestSuite` entity.
6
- class TestSuites < InMemoryRepository
6
+ class TestSuites < RunnableRepository
7
7
  end
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
- require_relative 'in_memory_repository'
1
+ require_relative 'runnable_repository'
2
2
 
3
3
  module Inferno
4
4
  module Repositories
5
5
  # Repository that deals with persistence for the `Test` entity.
6
- class Tests < InMemoryRepository
6
+ class Tests < RunnableRepository
7
7
  end
8
8
  end
9
9
  end
@@ -4,6 +4,7 @@ require_relative 'repositories/test_groups'
4
4
  require_relative 'repositories/test_suites'
5
5
  require_relative 'repositories/tests'
6
6
  require_relative 'repositories/test_kits'
7
+ require_relative 'repositories/requirements'
7
8
 
8
9
  # Skip loading things which require the db when not necessary, such as CLI
9
10
  # commands which don't need the db
@@ -1,4 +1,4 @@
1
1
  module Inferno
2
2
  # Standard patterns for gem versions: https://guides.rubygems.org/patterns/
3
- VERSION = '0.6.11'.freeze
3
+ VERSION = '0.6.13'.freeze
4
4
  end
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.11
4
+ version: 0.6.13
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-05-30 00:00:00.000000000 Z
13
+ date: 2025-06-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -431,6 +431,7 @@ files:
431
431
  - lib/inferno/apps/cli/migration.rb
432
432
  - lib/inferno/apps/cli/new.rb
433
433
  - lib/inferno/apps/cli/requirements.rb
434
+ - lib/inferno/apps/cli/requirements_coverage_checker.rb
434
435
  - lib/inferno/apps/cli/requirements_exporter.rb
435
436
  - lib/inferno/apps/cli/services.rb
436
437
  - lib/inferno/apps/cli/suite.rb
@@ -494,6 +495,7 @@ files:
494
495
  - lib/inferno/apps/web/controllers/test_sessions/create.rb
495
496
  - lib/inferno/apps/web/controllers/test_sessions/last_test_run.rb
496
497
  - lib/inferno/apps/web/controllers/test_sessions/results/index.rb
498
+ - lib/inferno/apps/web/controllers/test_sessions/results/io_value.rb
497
499
  - lib/inferno/apps/web/controllers/test_sessions/session_data/apply_preset.rb
498
500
  - lib/inferno/apps/web/controllers/test_sessions/session_data/index.rb
499
501
  - lib/inferno/apps/web/controllers/test_sessions/show.rb
@@ -642,6 +644,7 @@ files:
642
644
  - lib/inferno/repositories/requests.rb
643
645
  - lib/inferno/repositories/requirements.rb
644
646
  - lib/inferno/repositories/results.rb
647
+ - lib/inferno/repositories/runnable_repository.rb
645
648
  - lib/inferno/repositories/session_data.rb
646
649
  - lib/inferno/repositories/tags.rb
647
650
  - lib/inferno/repositories/test_groups.rb