inferno_core 1.1.2 → 1.2.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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/inferno/apps/cli/execute_script.rb +918 -0
  3. data/lib/inferno/apps/cli/main.rb +46 -0
  4. data/lib/inferno/apps/cli/session/cancel_run.rb +47 -0
  5. data/lib/inferno/apps/cli/session/connection.rb +47 -0
  6. data/lib/inferno/apps/cli/session/create_session.rb +159 -0
  7. data/lib/inferno/apps/cli/session/errors.rb +45 -0
  8. data/lib/inferno/apps/cli/session/session_compare.rb +391 -0
  9. data/lib/inferno/apps/cli/session/session_data.rb +39 -0
  10. data/lib/inferno/apps/cli/session/session_details.rb +27 -0
  11. data/lib/inferno/apps/cli/session/session_results.rb +39 -0
  12. data/lib/inferno/apps/cli/session/session_status.rb +69 -0
  13. data/lib/inferno/apps/cli/session/start_run.rb +245 -0
  14. data/lib/inferno/apps/cli/session_commands.rb +66 -0
  15. data/lib/inferno/apps/cli/templates/%library_name%.gemspec.tt +1 -1
  16. data/lib/inferno/apps/cli/templates/.gitignore +4 -0
  17. data/lib/inferno/apps/cli/templates/README.md.tt +14 -0
  18. data/lib/inferno/apps/cli/templates/Rakefile.tt +13 -0
  19. data/lib/inferno/apps/cli/templates/execution_scripts/%library_name%_script.yaml.tt +20 -0
  20. data/lib/inferno/apps/cli/templates/execution_scripts/%library_name%_script_expected.json.tt +244 -0
  21. data/lib/inferno/apps/cli/templates/execution_scripts/README.md.tt +16 -0
  22. data/lib/inferno/dsl/fhir_resource_navigation.rb +145 -27
  23. data/lib/inferno/dsl/must_support_assessment.rb +93 -23
  24. data/lib/inferno/dsl/must_support_metadata_extractor.rb +139 -21
  25. data/lib/inferno/dsl/resume_test_route.rb +4 -3
  26. data/lib/inferno/exceptions.rb +6 -0
  27. data/lib/inferno/repositories/test_sessions.rb +3 -0
  28. data/lib/inferno/utils/execution_script_runner.rb +90 -0
  29. data/lib/inferno/utils/preset_processor.rb +2 -0
  30. data/lib/inferno/version.rb +1 -1
  31. metadata +18 -2
@@ -44,8 +44,8 @@ module Inferno
44
44
  end
45
45
 
46
46
  # @private
47
- def update_result(waiting_result)
48
- results_repo.update_result(waiting_result.id, result)
47
+ def update_result(waiting_result, message)
48
+ results_repo.update_result(waiting_result.id, result, message)
49
49
  end
50
50
 
51
51
  # @private
@@ -80,6 +80,7 @@ module Inferno
80
80
  request = Inferno::Entities::Request.from_hanami_request(req)
81
81
 
82
82
  test_run_identifier = instance_exec(request, &test_run_identifier_block)
83
+ result_message = request.query_parameters['message']
83
84
 
84
85
  test_run = find_test_run(test_run_identifier)
85
86
 
@@ -90,7 +91,7 @@ module Inferno
90
91
  waiting_result = find_waiting_result(test_run)
91
92
  test = find_test(waiting_result)
92
93
 
93
- update_result(waiting_result)
94
+ update_result(waiting_result, result_message)
94
95
  persist_request(request, test_run, waiting_result, test)
95
96
 
96
97
  Jobs.perform(Jobs::ResumeTestRun, test_run.id)
@@ -120,6 +120,12 @@ module Inferno
120
120
  end
121
121
  end
122
122
 
123
+ class UnknownPreset < RuntimeError
124
+ def initialize(preset_id, suite_id)
125
+ super("Preset '#{preset_id}' not found for suite '#{suite_id}'")
126
+ end
127
+ end
128
+
123
129
  class InvalidRunnableIdException < StandardError
124
130
  def initialize(id)
125
131
  super("ID '#{id}' exceeds the maximum id length of 255 characters")
@@ -1,6 +1,7 @@
1
1
  require 'base62-rb'
2
2
  require_relative 'repository'
3
3
  require_relative '../utils/preset_processor'
4
+ require_relative '../exceptions'
4
5
 
5
6
  module Inferno
6
7
  module Repositories
@@ -46,6 +47,8 @@ module Inferno
46
47
 
47
48
  def apply_preset(test_session, preset_id)
48
49
  preset = presets_repo.find(preset_id)
50
+ raise Exceptions::UnknownPreset.new(preset_id, test_session.test_suite_id) unless preset.present?
51
+
49
52
  Utils::PresetProcessor.new(preset, test_session).processed_inputs.each do |input|
50
53
  session_data_repo.save(input.merge(test_session_id: test_session.id))
51
54
  end
@@ -0,0 +1,90 @@
1
+ require 'open3'
2
+
3
+ module Inferno
4
+ module Utils
5
+ module ExecutionScriptRunner
6
+ def self.run_all(pattern: 'execution_scripts/**/*.yaml', inferno_base_url: nil, allow_known_errors: false)
7
+ scripts = Dir.glob(pattern)
8
+
9
+ if scripts.empty?
10
+ warn "No scripts found matching: #{pattern}"
11
+ exit 1
12
+ end
13
+
14
+ puts "Found #{scripts.length} script(s) to run.\n\n"
15
+
16
+ passed = []
17
+ failed = []
18
+
19
+ scripts.each do |config|
20
+ unless config.end_with?('.yaml', '.yml')
21
+ warn "Skipping non-YAML file: #{config}"
22
+ next
23
+ end
24
+
25
+ result = run_script(config, inferno_base_url:, allow_known_errors:)
26
+ (result == :pass ? passed : failed) << config
27
+
28
+ puts
29
+ end
30
+
31
+ print_summary(passed, failed)
32
+ end
33
+
34
+ def self.run_script(config, inferno_base_url:, allow_known_errors:)
35
+ puts '=' * 60
36
+ puts "Running: #{config}"
37
+ puts '=' * 60
38
+
39
+ allow_commands = File.basename(config, '.yaml').include?('_with_commands')
40
+ cmd = ['bundle', 'exec', 'inferno', 'execute_script', config]
41
+ cmd += ['--inferno-base-url', inferno_base_url] if inferno_base_url
42
+ cmd += ['--allow-commands'] if allow_commands
43
+ output, status = Open3.capture2e(*cmd)
44
+ puts output
45
+
46
+ determine_result(config, status.exitstatus, output, allow_known_errors)
47
+ end
48
+
49
+ def self.determine_result(config, return_code, output, allow_known_errors)
50
+ known_error = allow_known_errors && File.basename(config, '.yaml').end_with?('_error')
51
+ return determine_known_error_result(config, output) if known_error && !return_code.zero?
52
+ return (:pass.tap { puts '=> PASS' }) if return_code.zero?
53
+
54
+ puts "=> FAIL (exit code #{return_code})"
55
+ :fail
56
+ end
57
+
58
+ def self.determine_known_error_result(config, output)
59
+ expected_file = File.join(File.dirname(config), "#{File.basename(config, '.yaml')}_expected.json")
60
+ if (output.include?('"errors"') || output.include?('skipping comparison')) && !File.exist?(expected_file)
61
+ puts '=> PASS (known-error script exited with 3 due to expected error before comparison)'
62
+ :pass
63
+ elsif output.include?('Actual results matched expected results? true')
64
+ puts '=> PASS (known-error script exited with 3 and results matched expected)'
65
+ :pass
66
+ else
67
+ puts '=> FAIL (exited with 3 but results did not match expected)'
68
+ :fail
69
+ end
70
+ end
71
+
72
+ def self.print_summary(passed, failed)
73
+ puts '=' * 60
74
+ puts "Results: #{passed.length} passed, #{failed.length} failed"
75
+ puts '=' * 60
76
+
77
+ if passed.any?
78
+ puts 'Passed:'
79
+ passed.each { |s| puts " #{s}" }
80
+ end
81
+
82
+ return unless failed.any?
83
+
84
+ puts 'Failed:'
85
+ failed.each { |s| puts " #{s}" }
86
+ exit 1
87
+ end
88
+ end
89
+ end
90
+ end
@@ -17,6 +17,8 @@ module Inferno
17
17
  # Returns the list of inputs which need to be persisted, with options
18
18
  # applied.
19
19
  def processed_inputs
20
+ return [] unless preset.present?
21
+
20
22
  preset.inputs
21
23
  .map { |input| input_for_options(input) }
22
24
  .compact
@@ -1,4 +1,4 @@
1
1
  module Inferno
2
2
  # Standard patterns for gem versions: https://guides.rubygems.org/patterns/
3
- VERSION = '1.1.2'.freeze
3
+ VERSION = '1.2.1'.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: 1.1.2
4
+ version: 1.2.1
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: 2026-03-30 00:00:00.000000000 Z
13
+ date: 2026-04-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -483,6 +483,7 @@ files:
483
483
  - lib/inferno/apps/cli/execute/plain_outputter.rb
484
484
  - lib/inferno/apps/cli/execute/quiet_outputter.rb
485
485
  - lib/inferno/apps/cli/execute/serialize.rb
486
+ - lib/inferno/apps/cli/execute_script.rb
486
487
  - lib/inferno/apps/cli/main.rb
487
488
  - lib/inferno/apps/cli/migration.rb
488
489
  - lib/inferno/apps/cli/new.rb
@@ -490,6 +491,17 @@ files:
490
491
  - lib/inferno/apps/cli/requirements_coverage_checker.rb
491
492
  - lib/inferno/apps/cli/requirements_exporter.rb
492
493
  - lib/inferno/apps/cli/services.rb
494
+ - lib/inferno/apps/cli/session/cancel_run.rb
495
+ - lib/inferno/apps/cli/session/connection.rb
496
+ - lib/inferno/apps/cli/session/create_session.rb
497
+ - lib/inferno/apps/cli/session/errors.rb
498
+ - lib/inferno/apps/cli/session/session_compare.rb
499
+ - lib/inferno/apps/cli/session/session_data.rb
500
+ - lib/inferno/apps/cli/session/session_details.rb
501
+ - lib/inferno/apps/cli/session/session_results.rb
502
+ - lib/inferno/apps/cli/session/session_status.rb
503
+ - lib/inferno/apps/cli/session/start_run.rb
504
+ - lib/inferno/apps/cli/session_commands.rb
493
505
  - lib/inferno/apps/cli/suite.rb
494
506
  - lib/inferno/apps/cli/suite_input_template.rb
495
507
  - lib/inferno/apps/cli/suites.rb
@@ -524,6 +536,9 @@ files:
524
536
  - lib/inferno/apps/cli/templates/docs/README.md.tt
525
537
  - lib/inferno/apps/cli/templates/docs/_Footer.md
526
538
  - lib/inferno/apps/cli/templates/docs/_Sidebar.md
539
+ - lib/inferno/apps/cli/templates/execution_scripts/%library_name%_script.yaml.tt
540
+ - lib/inferno/apps/cli/templates/execution_scripts/%library_name%_script_expected.json.tt
541
+ - lib/inferno/apps/cli/templates/execution_scripts/README.md.tt
527
542
  - lib/inferno/apps/cli/templates/lib/%library_name%.rb.tt
528
543
  - lib/inferno/apps/cli/templates/lib/%library_name%/example_suite.rb.tt
529
544
  - lib/inferno/apps/cli/templates/lib/%library_name%/example_suite/patient_group.rb.tt
@@ -724,6 +739,7 @@ files:
724
739
  - lib/inferno/route_storage.rb
725
740
  - lib/inferno/spec_support.rb
726
741
  - lib/inferno/test_runner.rb
742
+ - lib/inferno/utils/execution_script_runner.rb
727
743
  - lib/inferno/utils/ig_downloader.rb
728
744
  - lib/inferno/utils/markdown_formatter.rb
729
745
  - lib/inferno/utils/middleware/request_logger.rb