inferno_core 0.0.5 → 0.0.8.pre2

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/bin/inferno +7 -0
  3. data/lib/inferno/apps/cli/console.rb +12 -0
  4. data/lib/inferno/apps/cli/main.rb +18 -0
  5. data/lib/inferno/apps/cli/migration.rb +14 -0
  6. data/lib/inferno/apps/cli.rb +8 -0
  7. data/lib/inferno/apps/web/controllers/test_runs/create.rb +15 -2
  8. data/lib/inferno/apps/web/index.html.erb +1 -0
  9. data/lib/inferno/apps/web/serializers/hash_value_extractor.rb +11 -0
  10. data/lib/inferno/apps/web/serializers/test.rb +3 -4
  11. data/lib/inferno/apps/web/serializers/test_group.rb +4 -6
  12. data/lib/inferno/config/application.rb +4 -0
  13. data/lib/inferno/config/boot/db.rb +1 -9
  14. data/lib/inferno/config/boot/logging.rb +2 -0
  15. data/lib/inferno/config/boot/suites.rb +4 -6
  16. data/lib/inferno/db/migrations/001_create_initial_structure.rb +1 -1
  17. data/lib/inferno/db/schema.rb +1 -1
  18. data/lib/inferno/dsl/assertions.rb +85 -0
  19. data/lib/inferno/dsl/configurable.rb +126 -0
  20. data/lib/inferno/dsl/fhir_client.rb +22 -16
  21. data/lib/inferno/dsl/fhir_client_builder.rb +3 -3
  22. data/lib/inferno/dsl/fhir_validation.rb +105 -1
  23. data/lib/inferno/dsl/http_client.rb +14 -12
  24. data/lib/inferno/dsl/http_client_builder.rb +3 -3
  25. data/lib/inferno/dsl/request_storage.rb +26 -17
  26. data/lib/inferno/dsl/results.rb +1 -1
  27. data/lib/inferno/dsl/resume_test_route.rb +10 -10
  28. data/lib/inferno/dsl/runnable.rb +104 -38
  29. data/lib/inferno/entities/header.rb +14 -7
  30. data/lib/inferno/entities/message.rb +16 -8
  31. data/lib/inferno/entities/request.rb +34 -21
  32. data/lib/inferno/entities/result.rb +36 -29
  33. data/lib/inferno/entities/session_data.rb +12 -6
  34. data/lib/inferno/entities/test.rb +29 -2
  35. data/lib/inferno/entities/test_group.rb +8 -0
  36. data/lib/inferno/entities/test_run.rb +29 -6
  37. data/lib/inferno/entities/test_session.rb +16 -10
  38. data/lib/inferno/exceptions.rb +12 -0
  39. data/lib/inferno/public/217.bundle.js +1 -1
  40. data/lib/inferno/public/bundle.js +154 -1
  41. data/lib/inferno/public/bundle.js.LICENSE.txt +15 -0
  42. data/lib/inferno/repositories/in_memory_repository.rb +1 -1
  43. data/lib/inferno/repositories/results.rb +1 -1
  44. data/lib/inferno/repositories/test_runs.rb +15 -0
  45. data/lib/inferno/spec_support.rb +1 -1
  46. data/lib/inferno/test_runner.rb +21 -19
  47. data/lib/inferno/utils/markdown_formatter.rb +15 -0
  48. data/lib/inferno/utils/middleware/request_logger.rb +9 -3
  49. data/lib/inferno/utils/migration.rb +17 -0
  50. data/lib/inferno/version.rb +1 -1
  51. data/lib/inferno.rb +0 -4
  52. data/spec/factories/request.rb +14 -7
  53. metadata +46 -10
  54. data/bin/inferno-console +0 -8
@@ -19,6 +19,12 @@ object-assign
19
19
  * @license MIT
20
20
  */
21
21
 
22
+ /** @license MUI v5.2.0
23
+ *
24
+ * This source code is licensed under the MIT license found in the
25
+ * LICENSE file in the root directory of this source tree.
26
+ */
27
+
22
28
  /** @license React v0.20.2
23
29
  * scheduler.production.min.js
24
30
  *
@@ -55,6 +61,15 @@ object-assign
55
61
  * LICENSE file in the root directory of this source tree.
56
62
  */
57
63
 
64
+ /** @license React v17.0.2
65
+ * react-jsx-runtime.production.min.js
66
+ *
67
+ * Copyright (c) Facebook, Inc. and its affiliates.
68
+ *
69
+ * This source code is licensed under the MIT license found in the
70
+ * LICENSE file in the root directory of this source tree.
71
+ */
72
+
58
73
  /** @license React v17.0.2
59
74
  * react.production.min.js
60
75
  *
@@ -24,7 +24,7 @@ module Inferno
24
24
  @all ||= []
25
25
  end
26
26
 
27
- # @api private
27
+ # @private
28
28
  def all_by_id
29
29
  @all_by_id ||= {}
30
30
  @all_by_id.length == all.length ? @all_by_id : index_by_id
@@ -31,7 +31,7 @@ module Inferno
31
31
  end
32
32
 
33
33
  # Get the current result for a particular test/group
34
- # @api private
34
+ # @private
35
35
  # @example
36
36
  # repo.current_result_for_test_session(
37
37
  # test_session_id,
@@ -13,6 +13,14 @@ module Inferno
13
13
  }
14
14
  end
15
15
 
16
+ def build_entity(params)
17
+ super.tap do |test_run|
18
+ test_run&.results&.map! do |result|
19
+ result.is_a?(Entities::Result) ? result : Entities::Result.new(result)
20
+ end
21
+ end
22
+ end
23
+
16
24
  def results_for_test_run(test_run_id)
17
25
  test_run_hash =
18
26
  self.class::Model
@@ -107,6 +115,13 @@ module Inferno
107
115
  super
108
116
  end
109
117
  end
118
+
119
+ def active_test_run_for_session?(test_session_id)
120
+ self.class::Model
121
+ .where(test_session_id: test_session_id)
122
+ .exclude(status: 'done')
123
+ .count.positive?
124
+ end
110
125
  end
111
126
  end
112
127
  end
@@ -1,5 +1,5 @@
1
1
  module Inferno
2
- # @api private
2
+ # @private
3
3
  # This module provides constants so that unit tests in suite repositories can
4
4
  # load the factories defined in inferno.
5
5
  module SpecSupport
@@ -1,6 +1,9 @@
1
+ require_relative './utils/markdown_formatter'
2
+
1
3
  module Inferno
2
- # @api private
4
+ # @private
3
5
  class TestRunner
6
+ include Inferno::Utils::MarkdownFormatter
4
7
  attr_reader :test_session, :test_run, :resuming
5
8
 
6
9
  def initialize(test_session:, test_run:, resume: false)
@@ -35,13 +38,13 @@ module Inferno
35
38
  run_results.values
36
39
  end
37
40
 
38
- def run(runnable)
41
+ def run(runnable, scratch = {})
39
42
  if runnable < Entities::Test
40
- return existing_test_result(runnable) || run_test(runnable) if resuming
43
+ return existing_test_result(runnable) || run_test(runnable, scratch) if resuming
41
44
 
42
- run_test(runnable)
45
+ run_test(runnable, scratch)
43
46
  else
44
- run_group(runnable)
47
+ run_group(runnable, scratch)
45
48
  end
46
49
  end
47
50
 
@@ -49,22 +52,22 @@ module Inferno
49
52
  results_repo.result_for_test_run(runnable.reference_hash.merge(test_run_id: test_run.id))
50
53
  end
51
54
 
52
- def run_test(test)
55
+ def run_test(test, scratch)
53
56
  inputs = load_inputs(test)
54
57
 
55
58
  input_json_string = JSON.generate(inputs)
56
- test_instance = test.new(inputs: inputs, test_session_id: test_session.id)
59
+ test_instance = test.new(inputs: inputs, test_session_id: test_session.id, scratch: scratch)
57
60
 
58
61
  result = begin
59
62
  test_instance.load_named_requests
60
63
  test_instance.instance_eval(&test.block)
61
64
  'pass'
62
65
  rescue Exceptions::TestResultException => e
63
- test_instance.result_message = e.message
66
+ test_instance.result_message = format_markdown(e.message)
64
67
  e.result
65
68
  rescue StandardError => e
66
69
  Application['logger'].error(e.full_message)
67
- test_instance.result_message = "Error: #{e.message}"
70
+ test_instance.result_message = format_markdown("Error: #{e.message}\n\n#{e.backtrace.first}")
68
71
  'error'
69
72
  end
70
73
 
@@ -95,10 +98,10 @@ module Inferno
95
98
  test_result
96
99
  end
97
100
 
98
- def run_group(group)
101
+ def run_group(group, scratch)
99
102
  results = []
100
103
  group.children.each do |child|
101
- result = run(child)
104
+ result = run(child, scratch)
102
105
  results << result
103
106
  break if results.last.waiting?
104
107
  end
@@ -132,26 +135,25 @@ module Inferno
132
135
  end
133
136
 
134
137
  def load_inputs(runnable)
135
- runnable.inputs.each_with_object({}) do |input, input_hash|
136
- name = input[:name]
137
- input_hash[name] = session_data_repo.load(test_session_id: test_session.id, name: name)
138
+ runnable.inputs.each_with_object({}) do |input_identifier, input_hash|
139
+ input_alias = runnable.config.input_name(input_identifier)
140
+ input_hash[input_identifier] = session_data_repo.load(test_session_id: test_session.id, name: input_alias)
138
141
  end
139
142
  end
140
143
 
141
144
  def save_outputs(runnable_instance)
142
145
  outputs =
143
- runnable_instance.outputs.map do |output_name|
146
+ runnable_instance.outputs_to_persist.map do |output_identifier, value|
144
147
  {
145
- name: output_name,
146
- value: runnable_instance.send(output_name)
148
+ name: runnable_instance.class.config.output_name(output_identifier),
149
+ value: value
147
150
  }
148
151
  end
152
+
149
153
  outputs.compact!
150
154
  outputs.each do |output|
151
155
  session_data_repo.save(output.merge(test_session_id: test_session.id))
152
156
  end
153
-
154
- outputs
155
157
  end
156
158
 
157
159
  def persist_result(params)
@@ -0,0 +1,15 @@
1
+ module Inferno
2
+ module Utils
3
+ # @private
4
+ module MarkdownFormatter
5
+ def format_markdown(markdown) # rubocop:disable Metrics/CyclomaticComplexity
6
+ lines = markdown.lines
7
+
8
+ return markdown if lines.any? { |line| line.match?(/^\S/) }
9
+
10
+ natural_indent = lines.collect { |l| l.index(/[^ ]/) }.select { |l| !l.nil? && l.positive? }.min || 0
11
+ markdown.lines.map { |l| l[natural_indent..] || "\n" }.join
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,6 +1,6 @@
1
1
  module Inferno
2
2
  module Utils
3
- # @api private
3
+ # @private
4
4
  module Middleware
5
5
  class RequestLogger
6
6
  attr_reader :app
@@ -9,6 +9,10 @@ module Inferno
9
9
  @app = app
10
10
  end
11
11
 
12
+ def verbose_logging?
13
+ @verbose_logging ||= ENV['VERBOSE_REQUEST_LOGGING']&.downcase == true
14
+ end
15
+
12
16
  def logger
13
17
  @logger ||= Application['logger']
14
18
  end
@@ -35,7 +39,9 @@ module Inferno
35
39
  logger.info("#{status} in #{elapsed.in_milliseconds} ms")
36
40
  return unless body.present?
37
41
 
38
- if body.length > 100
42
+ body = body.is_a?(Array) ? body.join : body
43
+
44
+ if body.length > 100 && !verbose_logging?
39
45
  logger.info("#{body[0..100]}...")
40
46
  else
41
47
  logger.info(body)
@@ -56,7 +62,7 @@ module Inferno
56
62
 
57
63
  return unless body.present?
58
64
 
59
- if body.length > 100
65
+ if body.length > 100 && !verbose_logging?
60
66
  logger.info("#{body[0..100]}...")
61
67
  else
62
68
  logger.info(body)
@@ -0,0 +1,17 @@
1
+ module Inferno
2
+ module Utils
3
+ class Migration
4
+ def run
5
+ db = Inferno::Application['db.connection']
6
+ migration_path = File.join(Inferno::Application.root, 'lib', 'inferno', 'db', 'migrations')
7
+ Sequel::Migrator.run(db, migration_path)
8
+
9
+ if ENV['APP_ENV'] == 'development' # rubocop:disable Style/GuardClause
10
+ schema_path = File.join(Inferno::Application.root, 'lib', 'inferno', 'db', 'schema.rb')
11
+ db.extension :schema_dumper
12
+ File.open(schema_path, 'w') { |f| f.print(db.dump_schema_migration) }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module Inferno
2
- VERSION = '0.0.5'.freeze
2
+ VERSION = '0.0.8.pre2'.freeze
3
3
  end
data/lib/inferno.rb CHANGED
@@ -1,7 +1,3 @@
1
- require 'active_support/all'
2
- require 'dotenv'
3
- require 'dry/system/container'
4
- require 'sequel'
5
1
  require_relative 'inferno/config/application'
6
2
  require_relative 'inferno/dsl'
7
3
  require_relative 'inferno/entities'
@@ -12,6 +12,20 @@ FactoryBot.define do
12
12
  name { nil }
13
13
  status { 200 }
14
14
  direction { 'outgoing' }
15
+ headers do
16
+ [
17
+ {
18
+ type: 'request',
19
+ name: 'Request-Header',
20
+ value: 'REQUEST HEADER VALUE'
21
+ },
22
+ {
23
+ type: 'response',
24
+ name: 'Response-Header',
25
+ value: 'RESPONSE HEADER VALUE'
26
+ }
27
+ ]
28
+ end
15
29
 
16
30
  request_body { nil }
17
31
 
@@ -24,12 +38,5 @@ FactoryBot.define do
24
38
  to_create do |instance|
25
39
  Inferno::Repositories::Requests.new.create(instance.to_hash)
26
40
  end
27
-
28
- after(:create) do |instance, evaluator|
29
- instance.instance_variable_set(
30
- :@headers,
31
- repo_create_list(:header, evaluator.header_count, request_id: instance.index)
32
- )
33
- end
34
41
  end
35
42
  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.0.5
4
+ version: 0.0.8.pre2
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: 2021-08-10 00:00:00.000000000 Z
13
+ date: 2021-12-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -54,6 +54,20 @@ dependencies:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
56
  version: '2.7'
57
+ - !ruby/object:Gem::Dependency
58
+ name: dry-configurable
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '='
62
+ - !ruby/object:Gem::Version
63
+ version: 0.12.0
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '='
69
+ - !ruby/object:Gem::Version
70
+ version: 0.12.0
57
71
  - !ruby/object:Gem::Dependency
58
72
  name: dry-system
59
73
  requirement: !ruby/object:Gem::Requirement
@@ -86,16 +100,16 @@ dependencies:
86
100
  name: fhir_client
87
101
  requirement: !ruby/object:Gem::Requirement
88
102
  requirements:
89
- - - "~>"
103
+ - - ">="
90
104
  - !ruby/object:Gem::Version
91
- version: '4.0'
105
+ version: 5.0.3
92
106
  type: :runtime
93
107
  prerelease: false
94
108
  version_requirements: !ruby/object:Gem::Requirement
95
109
  requirements:
96
- - - "~>"
110
+ - - ">="
97
111
  - !ruby/object:Gem::Version
98
- version: '4.0'
112
+ version: 5.0.3
99
113
  - !ruby/object:Gem::Dependency
100
114
  name: fhir_models
101
115
  requirement: !ruby/object:Gem::Requirement
@@ -250,6 +264,20 @@ dependencies:
250
264
  - - "~>"
251
265
  - !ruby/object:Gem::Version
252
266
  version: '1.4'
267
+ - !ruby/object:Gem::Dependency
268
+ name: thor
269
+ requirement: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - "~>"
272
+ - !ruby/object:Gem::Version
273
+ version: 1.1.0
274
+ type: :runtime
275
+ prerelease: false
276
+ version_requirements: !ruby/object:Gem::Requirement
277
+ requirements:
278
+ - - "~>"
279
+ - !ruby/object:Gem::Version
280
+ version: 1.1.0
253
281
  - !ruby/object:Gem::Dependency
254
282
  name: codecov
255
283
  requirement: !ruby/object:Gem::Requirement
@@ -423,13 +451,17 @@ description: Inferno Core is an open source tool for testing data exchanges enab
423
451
  email:
424
452
  - inferno@groups.mitre.org
425
453
  executables:
426
- - inferno-console
454
+ - inferno
427
455
  extensions: []
428
456
  extra_rdoc_files: []
429
457
  files:
430
458
  - LICENSE
431
- - bin/inferno-console
459
+ - bin/inferno
432
460
  - lib/inferno.rb
461
+ - lib/inferno/apps/cli.rb
462
+ - lib/inferno/apps/cli/console.rb
463
+ - lib/inferno/apps/cli/main.rb
464
+ - lib/inferno/apps/cli/migration.rb
433
465
  - lib/inferno/apps/web/application.rb
434
466
  - lib/inferno/apps/web/controllers/controller.rb
435
467
  - lib/inferno/apps/web/controllers/requests/show.rb
@@ -445,6 +477,7 @@ files:
445
477
  - lib/inferno/apps/web/controllers/test_suites/show.rb
446
478
  - lib/inferno/apps/web/index.html.erb
447
479
  - lib/inferno/apps/web/router.rb
480
+ - lib/inferno/apps/web/serializers/hash_value_extractor.rb
448
481
  - lib/inferno/apps/web/serializers/header.rb
449
482
  - lib/inferno/apps/web/serializers/input.rb
450
483
  - lib/inferno/apps/web/serializers/message.rb
@@ -472,6 +505,7 @@ files:
472
505
  - lib/inferno/db/schema.rb
473
506
  - lib/inferno/dsl.rb
474
507
  - lib/inferno/dsl/assertions.rb
508
+ - lib/inferno/dsl/configurable.rb
475
509
  - lib/inferno/dsl/fhir_client.rb
476
510
  - lib/inferno/dsl/fhir_client_builder.rb
477
511
  - lib/inferno/dsl/fhir_validation.rb
@@ -522,7 +556,9 @@ files:
522
556
  - lib/inferno/repositories/validate_runnable_reference.rb
523
557
  - lib/inferno/spec_support.rb
524
558
  - lib/inferno/test_runner.rb
559
+ - lib/inferno/utils/markdown_formatter.rb
525
560
  - lib/inferno/utils/middleware/request_logger.rb
561
+ - lib/inferno/utils/migration.rb
526
562
  - lib/inferno/version.rb
527
563
  - spec/factories/header.rb
528
564
  - spec/factories/message.rb
@@ -552,9 +588,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
552
588
  version: 2.7.0
553
589
  required_rubygems_version: !ruby/object:Gem::Requirement
554
590
  requirements:
555
- - - ">="
591
+ - - ">"
556
592
  - !ruby/object:Gem::Version
557
- version: '0'
593
+ version: 1.3.1
558
594
  requirements: []
559
595
  rubygems_version: 3.1.6
560
596
  signing_key:
data/bin/inferno-console DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'pry'
4
- require_relative '../lib/inferno'
5
-
6
- Inferno::Application.finalize!
7
-
8
- Pry.start