inferno_core 0.3.5 → 0.3.6
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 +4 -4
- data/lib/inferno/apps/web/controllers/test_runs/create.rb +8 -4
- data/lib/inferno/apps/web/controllers/test_sessions/create.rb +2 -3
- data/lib/inferno/apps/web/serializers/input.rb +6 -2
- data/lib/inferno/apps/web/serializers/test.rb +4 -1
- data/lib/inferno/apps/web/serializers/test_group.rb +8 -3
- data/lib/inferno/apps/web/serializers/test_suite.rb +7 -2
- data/lib/inferno/config/boot/presets.rb +1 -1
- data/lib/inferno/dsl/http_client.rb +14 -4
- data/lib/inferno/dsl/http_client_builder.rb +6 -1
- data/lib/inferno/dsl/input_output_handling.rb +35 -41
- data/lib/inferno/entities/input.rb +2 -1
- data/lib/inferno/entities/test_suite.rb +6 -0
- data/lib/inferno/public/bg-header-1920x170.png +0 -0
- data/lib/inferno/public/bundle.js +15 -15
- data/lib/inferno/public/healthit.gov.logo.png +0 -0
- data/lib/inferno/repositories/presets.rb +10 -1
- data/lib/inferno/version.rb +1 -1
- metadata +21 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2f0cad7d368810c89ee2571e1f8aa6705d6b74b1ad058b8f179269a7705c2df7
|
4
|
+
data.tar.gz: 7f1ab19849ca3454f536b06963df78abc91c5dc7cbde24e796338836cd081e10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7ff909be62d859f3a0755f787fb8d893edaadffd16cc70dd18f47cfe0184b2ec82330a7f51a02617c4b8afb6710e3282492a9a2f23cf82e37650548cbd9dd4b
|
7
|
+
data.tar.gz: 5832f7eb12e90626ebd9ca84e945a3afc631e5d63d024381548ed7c3fc373ff85ca9ea34533a79eefedb7e8ab8d80d65229d2fffd180c7d289586528b29dfb03
|
@@ -11,8 +11,8 @@ module Inferno
|
|
11
11
|
|
12
12
|
PARAMS = [:test_session_id, :test_suite_id, :test_group_id, :test_id].freeze
|
13
13
|
|
14
|
-
def verify_runnable(runnable, inputs)
|
15
|
-
missing_inputs = runnable&.missing_inputs(inputs)
|
14
|
+
def verify_runnable(runnable, inputs, selected_suite_options)
|
15
|
+
missing_inputs = runnable&.missing_inputs(inputs, selected_suite_options)
|
16
16
|
user_runnable = runnable&.user_runnable?
|
17
17
|
raise Inferno::Exceptions::RequiredInputsNotFound, missing_inputs if missing_inputs&.any?
|
18
18
|
raise Inferno::Exceptions::NotUserRunnableException unless user_runnable
|
@@ -26,7 +26,7 @@ module Inferno
|
|
26
26
|
&.last
|
27
27
|
|
28
28
|
if input.nil?
|
29
|
-
Inferno::Application['logger'].
|
29
|
+
Inferno::Application['logger'].warn(
|
30
30
|
"Unknown input `#{input_params[:name]}` for #{test_run.runnable.id}: #{test_run.runnable.title}"
|
31
31
|
)
|
32
32
|
next
|
@@ -51,7 +51,11 @@ module Inferno
|
|
51
51
|
return
|
52
52
|
end
|
53
53
|
|
54
|
-
verify_runnable(
|
54
|
+
verify_runnable(
|
55
|
+
repo.build_entity(create_params(params)).runnable,
|
56
|
+
params[:inputs],
|
57
|
+
test_session.suite_options
|
58
|
+
)
|
55
59
|
|
56
60
|
test_run = repo.create(create_params(params).merge(status: 'queued'))
|
57
61
|
|
@@ -6,9 +6,8 @@ module Inferno
|
|
6
6
|
PARAMS = [:test_suite_id, :suite_options].freeze
|
7
7
|
|
8
8
|
def call(raw_params)
|
9
|
-
|
10
|
-
|
11
|
-
params = query_params.merge(body_params)
|
9
|
+
params = raw_params.to_h
|
10
|
+
params.merge!(JSON.parse(request.body.string).symbolize_keys) unless request.body.string.blank?
|
12
11
|
|
13
12
|
session = repo.create(create_params(params))
|
14
13
|
|
@@ -6,9 +6,13 @@ module Inferno
|
|
6
6
|
class Input < Serializer
|
7
7
|
identifier :name
|
8
8
|
|
9
|
-
field :
|
9
|
+
field :title, if: :field_present?
|
10
10
|
field :description, if: :field_present?
|
11
|
-
field :
|
11
|
+
field :type, if: :field_present?
|
12
|
+
field :default, if: :field_present?
|
13
|
+
field :optional, if: :field_present?
|
14
|
+
field :options, if: :field_present?
|
15
|
+
field :locked, if: :field_present?
|
12
16
|
field :value, if: :field_present?
|
13
17
|
end
|
14
18
|
end
|
@@ -7,7 +7,10 @@ module Inferno
|
|
7
7
|
field :short_id
|
8
8
|
field :title
|
9
9
|
field :short_title
|
10
|
-
field :
|
10
|
+
field :inputs do |test, options|
|
11
|
+
suite_options = options[:suite_options]
|
12
|
+
Input.render_as_hash(test.available_inputs(suite_options).values)
|
13
|
+
end
|
11
14
|
field :output_definitions, name: :outputs, extractor: HashValueExtractor
|
12
15
|
field :description
|
13
16
|
field :short_description
|
@@ -16,12 +16,17 @@ module Inferno
|
|
16
16
|
field :optional?, name: :optional
|
17
17
|
|
18
18
|
field :test_groups do |group, options|
|
19
|
-
|
19
|
+
suite_options = options[:suite_options]
|
20
|
+
TestGroup.render_as_hash(group.groups(suite_options), suite_options: suite_options)
|
20
21
|
end
|
21
22
|
field :tests do |group, options|
|
22
|
-
|
23
|
+
suite_options = options[:suite_options]
|
24
|
+
Test.render_as_hash(group.tests(suite_options), suite_options: suite_options)
|
25
|
+
end
|
26
|
+
field :inputs do |group, options|
|
27
|
+
suite_options = options[:suite_options]
|
28
|
+
Input.render_as_hash(group.available_inputs(suite_options).values)
|
23
29
|
end
|
24
|
-
field :available_inputs, name: :inputs, extractor: HashValueExtractor, blueprint: Input
|
25
30
|
field :output_definitions, name: :outputs, extractor: HashValueExtractor
|
26
31
|
end
|
27
32
|
end
|
@@ -11,6 +11,7 @@ module Inferno
|
|
11
11
|
field :input_instructions
|
12
12
|
field :test_count
|
13
13
|
field :version
|
14
|
+
field :links
|
14
15
|
association :suite_options, blueprint: SuiteOption
|
15
16
|
association :presets, view: :summary, blueprint: Preset
|
16
17
|
end
|
@@ -18,10 +19,14 @@ module Inferno
|
|
18
19
|
view :full do
|
19
20
|
include_view :summary
|
20
21
|
field :test_groups do |suite, options|
|
21
|
-
|
22
|
+
suite_options = options[:suite_options]
|
23
|
+
TestGroup.render_as_hash(suite.groups(suite_options), suite_options: suite_options)
|
22
24
|
end
|
23
25
|
field :configuration_messages
|
24
|
-
field :
|
26
|
+
field :inputs do |suite, options|
|
27
|
+
suite_options = options[:suite_options]
|
28
|
+
Input.render_as_hash(suite.available_inputs(suite_options).values)
|
29
|
+
end
|
25
30
|
end
|
26
31
|
end
|
27
32
|
end
|
@@ -4,7 +4,7 @@ Inferno::Application.boot(:presets) do
|
|
4
4
|
init do
|
5
5
|
use :suites
|
6
6
|
|
7
|
-
files_to_load = Dir.glob(
|
7
|
+
files_to_load = Dir.glob(['config/presets/*.json', 'config/presets/*.json.erb'])
|
8
8
|
files_to_load.map! { |path| File.realpath(path) }
|
9
9
|
presets_repo = Inferno::Repositories::Presets.new
|
10
10
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'faraday_middleware'
|
2
|
+
|
1
3
|
require_relative 'request_storage'
|
2
4
|
require_relative 'tcp_exception_handler'
|
3
5
|
|
@@ -75,7 +77,7 @@ module Inferno
|
|
75
77
|
if client
|
76
78
|
client.get(url, nil, options[:headers])
|
77
79
|
elsif url.match?(%r{\Ahttps?://})
|
78
|
-
|
80
|
+
connection.get(url, nil, options[:headers])
|
79
81
|
else
|
80
82
|
raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
|
81
83
|
end
|
@@ -83,6 +85,14 @@ module Inferno
|
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
88
|
+
# @private
|
89
|
+
def connection
|
90
|
+
Faraday.new do |f|
|
91
|
+
f.request :url_encoded
|
92
|
+
f.use FaradayMiddleware::FollowRedirects
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
86
96
|
# Perform an HTTP POST request
|
87
97
|
#
|
88
98
|
# @param url [String] if this request is using a defined client, this will
|
@@ -103,7 +113,7 @@ module Inferno
|
|
103
113
|
if client
|
104
114
|
client.post(url, body, options[:headers])
|
105
115
|
elsif url.match?(%r{\Ahttps?://})
|
106
|
-
|
116
|
+
connection.post(url, body, options[:headers])
|
107
117
|
else
|
108
118
|
raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
|
109
119
|
end
|
@@ -128,7 +138,7 @@ module Inferno
|
|
128
138
|
if client
|
129
139
|
client.delete(url, nil, options[:headers])
|
130
140
|
elsif url.match?(%r{\Ahttps?://})
|
131
|
-
|
141
|
+
connection.delete(url, nil, options[:headers])
|
132
142
|
else
|
133
143
|
raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
|
134
144
|
end
|
@@ -167,7 +177,7 @@ module Inferno
|
|
167
177
|
if client
|
168
178
|
response = client.get(url, nil, options[:headers]) { |req| req.options.on_data = collector }
|
169
179
|
elsif url.match?(%r{\Ahttps?://})
|
170
|
-
response =
|
180
|
+
response = connection.get(url, nil, options[:headers]) { |req| req.options.on_data = collector }
|
171
181
|
else
|
172
182
|
raise StandardError, 'Must use an absolute url or define an HTTP client with a base url'
|
173
183
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'faraday_middleware'
|
2
|
+
|
1
3
|
module Inferno
|
2
4
|
module DSL
|
3
5
|
# This module contains the HTTP DSL available to test writers.
|
@@ -12,7 +14,10 @@ module Inferno
|
|
12
14
|
params = { url: url }
|
13
15
|
params.merge!(headers: headers) if headers
|
14
16
|
|
15
|
-
Faraday.new(params)
|
17
|
+
Faraday.new(params) do |f|
|
18
|
+
f.request :url_encoded
|
19
|
+
f.use FaradayMiddleware::FollowRedirects
|
20
|
+
end
|
16
21
|
end
|
17
22
|
|
18
23
|
# Define the base url for an HTTP client. A string or symbol can be
|
@@ -90,17 +90,17 @@ module Inferno
|
|
90
90
|
end
|
91
91
|
|
92
92
|
# @private
|
93
|
-
def required_inputs
|
94
|
-
available_inputs
|
93
|
+
def required_inputs(selected_suite_options)
|
94
|
+
available_inputs(selected_suite_options)
|
95
95
|
.reject { |_, input| input.optional }
|
96
96
|
.map { |_, input| input.name }
|
97
97
|
end
|
98
98
|
|
99
99
|
# @private
|
100
|
-
def missing_inputs(submitted_inputs)
|
100
|
+
def missing_inputs(submitted_inputs, selected_suite_options)
|
101
101
|
submitted_inputs = [] if submitted_inputs.nil?
|
102
102
|
|
103
|
-
required_inputs.map(&:to_s) - submitted_inputs.map { |input| input[:name] }
|
103
|
+
required_inputs(selected_suite_options).map(&:to_s) - submitted_inputs.map { |input| input[:name] }
|
104
104
|
end
|
105
105
|
|
106
106
|
# Define a particular order for inputs to be presented in the API/UI
|
@@ -153,52 +153,46 @@ module Inferno
|
|
153
153
|
# Inputs available for this runnable's children. A running list of outputs
|
154
154
|
# created by the children is used to exclude any inputs which are provided
|
155
155
|
# by an earlier child's output.
|
156
|
-
def children_available_inputs
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
else
|
169
|
-
new_definition
|
170
|
-
end
|
171
|
-
|
172
|
-
next if child_outputs.include?(updated_definition.name.to_sym)
|
173
|
-
|
174
|
-
definitions[updated_definition.name.to_sym] = updated_definition
|
156
|
+
def children_available_inputs(selected_suite_options = nil)
|
157
|
+
child_outputs = []
|
158
|
+
children(selected_suite_options).each_with_object({}) do |child, definitions|
|
159
|
+
new_definitions = child.available_inputs(selected_suite_options).map(&:dup)
|
160
|
+
new_definitions.each do |input, new_definition|
|
161
|
+
existing_definition = definitions[input]
|
162
|
+
|
163
|
+
updated_definition =
|
164
|
+
if existing_definition.present?
|
165
|
+
existing_definition.merge_with_child(new_definition)
|
166
|
+
else
|
167
|
+
new_definition
|
175
168
|
end
|
176
169
|
|
177
|
-
|
178
|
-
|
170
|
+
next if child_outputs.include?(updated_definition.name.to_sym)
|
171
|
+
|
172
|
+
definitions[updated_definition.name.to_sym] = updated_definition
|
179
173
|
end
|
174
|
+
|
175
|
+
child_outputs.concat(child.all_outputs).uniq!
|
176
|
+
end
|
180
177
|
end
|
181
178
|
|
182
179
|
# @private
|
183
180
|
# Inputs available for the user for this runnable and all its children.
|
184
|
-
def available_inputs
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
.each_with_object({}) do |(_, input), inputs|
|
191
|
-
inputs[input.name.to_sym] = input
|
192
|
-
end
|
193
|
-
|
194
|
-
available_inputs.each do |input, current_definition|
|
195
|
-
child_definition = children_available_inputs[input]
|
196
|
-
current_definition.merge_with_child(child_definition)
|
181
|
+
def available_inputs(selected_suite_options = nil)
|
182
|
+
available_inputs =
|
183
|
+
config.inputs
|
184
|
+
.slice(*inputs)
|
185
|
+
.each_with_object({}) do |(_, input), inputs|
|
186
|
+
inputs[input.name.to_sym] = Entities::Input.new(input.to_hash)
|
197
187
|
end
|
198
188
|
|
199
|
-
|
200
|
-
|
201
|
-
|
189
|
+
available_inputs.each do |input, current_definition|
|
190
|
+
child_definition = children_available_inputs(selected_suite_options)[input]
|
191
|
+
current_definition.merge_with_child(child_definition)
|
192
|
+
end
|
193
|
+
|
194
|
+
available_inputs = children_available_inputs(selected_suite_options).merge(available_inputs)
|
195
|
+
order_available_inputs(available_inputs)
|
202
196
|
end
|
203
197
|
end
|
204
198
|
end
|
Binary file
|