quby-compiler 0.4.8 → 0.4.11
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/CHANGELOG.md +13 -0
- data/lib/quby/compiler/entities/questionnaire.rb +0 -1
- data/lib/quby/compiler/outputs/quby_frontend_v2_serializer.rb +15 -2
- data/lib/quby/compiler/outputs/roqua_serializer.rb +59 -56
- data/lib/quby/compiler/services/definition_validator.rb +2 -2
- data/lib/quby/compiler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8b2f73a073de0f20b5dfd57b8e8c3b65c1878abce2cb109e67fe1cc302900b02
|
4
|
+
data.tar.gz: fec490f89c77a497fbac304a381e150aec1fc8e8e4e06950aff20424561fb69c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70bbcf09fa8b4d789ec22eaebb06b46a10bbdfcf5a5125f205f26307cceb471aef5c1e5e30a5b7ea510f64a304a59e21a40c64b3c40dde6935f291f04237e6de
|
7
|
+
data.tar.gz: 887f84082878e3a49dda34d8c92f62db3849e5ee716e0a69f9d1b92c1543cc1a3fe21fd65c5603c7703ce4168404dab75fc191f4999bd0aeeb032137d41e50e4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
# 0.4.11
|
2
|
+
|
3
|
+
* roqua.json: Baseline for a chart now always exports as a hash of gender/age => value
|
4
|
+
|
5
|
+
# 0.4.10
|
6
|
+
|
7
|
+
* quby2.json: Fix validations json (regex-serialization and key-capitalization)
|
8
|
+
* roqua.json: Change questions, options, date_parts, scores, subscores and outcome_tables from hash to array, since ordering is important and not all systems preserve the order of hashes (like pg's jsonb)
|
9
|
+
|
10
|
+
# 0.4.9
|
11
|
+
|
12
|
+
* roqua.json: Fix html stripping for string with no whitespace
|
13
|
+
|
1
14
|
# 0.4.8
|
2
15
|
|
3
16
|
* roqua.json:
|
@@ -6,10 +6,23 @@ module Quby
|
|
6
6
|
@questionnaire = questionnaire
|
7
7
|
end
|
8
8
|
|
9
|
+
# TODO: Move all attributes here from Questionnaire#as_json
|
9
10
|
def as_json(options = {})
|
10
|
-
@questionnaire.as_json
|
11
|
+
@questionnaire.as_json.merge \
|
12
|
+
validations: validations
|
13
|
+
end
|
14
|
+
|
15
|
+
def validations
|
16
|
+
@questionnaire.validations.map do |validation|
|
17
|
+
validation.config.compact
|
18
|
+
.transform_keys{ _1.to_s.camelize(:lower) }
|
19
|
+
.tap do |validation_hsh|
|
20
|
+
# otherwise ruby will put a (?-mix around the regex, which js errors on.
|
21
|
+
validation_hsh['matcher'] = validation_hsh['matcher'].source.to_s if validation_hsh['matcher']
|
22
|
+
end.as_json
|
23
|
+
end
|
11
24
|
end
|
12
25
|
end
|
13
26
|
end
|
14
27
|
end
|
15
|
-
end
|
28
|
+
end
|
@@ -60,9 +60,8 @@ module Quby
|
|
60
60
|
case chart
|
61
61
|
when Quby::Compiler::Entities::Charting::LineChart
|
62
62
|
{
|
63
|
-
y_label: chart.y_label,
|
64
63
|
tonality: chart.tonality,
|
65
|
-
baseline:
|
64
|
+
baseline: chart_baseline(chart.baseline),
|
66
65
|
clinically_relevant_change: chart.clinically_relevant_change,
|
67
66
|
}
|
68
67
|
when Quby::Compiler::Entities::Charting::OverviewChart
|
@@ -89,6 +88,17 @@ module Quby
|
|
89
88
|
}
|
90
89
|
end
|
91
90
|
|
91
|
+
def chart_baseline(baseline)
|
92
|
+
case baseline
|
93
|
+
when nil
|
94
|
+
nil
|
95
|
+
when Float, Integer
|
96
|
+
{default: {default: baseline}}
|
97
|
+
when Hash
|
98
|
+
baseline
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
92
102
|
# configuration for outcome tables.
|
93
103
|
# tables:
|
94
104
|
# <outcome_table_name:Symbol>: # each entry is a table.
|
@@ -107,15 +117,18 @@ module Quby
|
|
107
117
|
|
108
118
|
def outcome_tables_from_definition
|
109
119
|
# hash of tables, with the score keys (rows) and subscore keys (columns) used for each
|
110
|
-
tables =
|
120
|
+
tables = []
|
111
121
|
# hash of `subscore_key: subscore_label` pairs used in tables
|
112
122
|
headers = {}
|
113
123
|
|
114
124
|
questionnaire.outcome_tables.each do |table|
|
115
|
-
tables
|
116
|
-
|
117
|
-
|
118
|
-
|
125
|
+
tables << {
|
126
|
+
key: table.key,
|
127
|
+
name: table.name,
|
128
|
+
default_collapsed: table.default_collapsed,
|
129
|
+
score_keys: table.score_keys,
|
130
|
+
subscore_keys: table.subscore_keys
|
131
|
+
}.compact
|
119
132
|
|
120
133
|
table.subscore_keys.each do |subscore_key|
|
121
134
|
table.score_keys.find do |score_key|
|
@@ -142,6 +155,7 @@ module Quby
|
|
142
155
|
questionnaire.score_schemas.values.each do |schema|
|
143
156
|
schema.subscore_schemas.each do |subschema|
|
144
157
|
next if subschema.outcome_table.blank?
|
158
|
+
tables[subschema.outcome_table][:key] = subschema.outcome_table
|
145
159
|
tables[subschema.outcome_table][:subscore_keys] << subschema.key
|
146
160
|
tables[subschema.outcome_table][:score_keys] << schema.key
|
147
161
|
headers[subschema.key] = subschema.label
|
@@ -150,7 +164,7 @@ module Quby
|
|
150
164
|
|
151
165
|
{
|
152
166
|
headers: headers,
|
153
|
-
tables: tables,
|
167
|
+
tables: tables.values,
|
154
168
|
}
|
155
169
|
end
|
156
170
|
|
@@ -170,25 +184,22 @@ module Quby
|
|
170
184
|
# date_parts [nil/{..}]
|
171
185
|
# options: [nil/{..}]
|
172
186
|
def questions
|
173
|
-
questionnaire.sorted_questions.reject{_1.type == :hidden}.
|
174
|
-
|
175
|
-
question.key,
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
options: options_for(question)
|
190
|
-
}.compact
|
191
|
-
]
|
187
|
+
questionnaire.sorted_questions.reject{_1.type == :hidden}.map { |question|
|
188
|
+
{
|
189
|
+
key: question.key,
|
190
|
+
sbg_key: question.sbg_key,
|
191
|
+
type: QUBY_TYPE_TO_ROQUA_TYPE.fetch(question.type),
|
192
|
+
title: parse_markdown_and_strip_tags(question.title),
|
193
|
+
context_free_title: question.context_free_title,
|
194
|
+
unit: question.unit,
|
195
|
+
deprecated: question.hidden.presence,
|
196
|
+
default_invisible: question.default_invisible.presence,
|
197
|
+
parent_question_key: question.parent&.key,
|
198
|
+
parent_option_key: question.parent_option_key,
|
199
|
+
title_question_key: question.title_question&.key,
|
200
|
+
date_parts: date_parts_for(question),
|
201
|
+
options: options_for(question)
|
202
|
+
}.compact
|
192
203
|
}
|
193
204
|
end
|
194
205
|
|
@@ -197,13 +208,11 @@ module Quby
|
|
197
208
|
def date_parts_for(question)
|
198
209
|
return nil unless question.type == :date
|
199
210
|
|
200
|
-
question.components.
|
201
|
-
|
202
|
-
component,
|
203
|
-
{
|
204
|
-
|
205
|
-
}
|
206
|
-
]
|
211
|
+
question.components.map { |component|
|
212
|
+
{
|
213
|
+
part: component,
|
214
|
+
key: question.send("#{component}_key")
|
215
|
+
}
|
207
216
|
}
|
208
217
|
end
|
209
218
|
|
@@ -216,22 +225,19 @@ module Quby
|
|
216
225
|
return nil if question.options.empty?
|
217
226
|
|
218
227
|
question.options.reject { |option| option.inner_title || option.placeholder }
|
219
|
-
.
|
220
|
-
|
221
|
-
option.key,
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
child_question_keys: option.questions.map(&:key).presence
|
227
|
-
}.compact
|
228
|
-
]
|
228
|
+
.map { |option|
|
229
|
+
{
|
230
|
+
key: option.key,
|
231
|
+
value: (option.value.to_s unless question.type == :check_box),
|
232
|
+
description: option.context_free_description || parse_markdown_and_strip_tags(option.description),
|
233
|
+
child_question_keys: option.questions.map(&:key).presence
|
234
|
+
}.compact
|
229
235
|
}
|
230
236
|
end
|
231
237
|
|
232
238
|
# [{ key: { .., subscores: { subkey: {..} } } }]
|
233
239
|
def scores
|
234
|
-
questionnaire.score_schemas.
|
240
|
+
questionnaire.score_schemas.values.map { |score|
|
235
241
|
{
|
236
242
|
key: score.key,
|
237
243
|
label: score.label,
|
@@ -242,16 +248,13 @@ module Quby
|
|
242
248
|
|
243
249
|
# { subkey: {..} }
|
244
250
|
def subscores_for(score)
|
245
|
-
score.subscore_schemas.
|
246
|
-
|
247
|
-
subscore.key,
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
only_for_export: subscore.only_for_export.presence
|
253
|
-
}.compact
|
254
|
-
]
|
251
|
+
score.subscore_schemas.map { |subscore|
|
252
|
+
{
|
253
|
+
key: subscore.key,
|
254
|
+
label: subscore.label,
|
255
|
+
export_key: subscore.export_key,
|
256
|
+
only_for_export: subscore.only_for_export.presence
|
257
|
+
}.compact
|
255
258
|
}
|
256
259
|
end
|
257
260
|
|
@@ -264,7 +267,7 @@ module Quby
|
|
264
267
|
doc.css('br, hr, img').each { |node| node.replace(' ') }
|
265
268
|
end \
|
266
269
|
.text
|
267
|
-
.gsub
|
270
|
+
.gsub(/\s+/, ' ')
|
268
271
|
.presence
|
269
272
|
end
|
270
273
|
end
|
@@ -137,14 +137,14 @@ module Quby
|
|
137
137
|
unknown_questions = flag.shows_questions.select { |key| !questionnaire.key_in_use?(key) }
|
138
138
|
return if unknown_questions.blank?
|
139
139
|
|
140
|
-
fail ArgumentError, "Flag '#{key}' has unknown shows_questions keys #{unknown_questions}"
|
140
|
+
fail ArgumentError, "Flag '#{flag.key}' has unknown shows_questions keys #{unknown_questions}"
|
141
141
|
end
|
142
142
|
|
143
143
|
def validate_flag_hides(questionnaire, flag)
|
144
144
|
unknown_questions = flag.hides_questions.select { |key| !questionnaire.key_in_use?(key) }
|
145
145
|
return if unknown_questions.blank?
|
146
146
|
|
147
|
-
fail ArgumentError, "Flag '#{key}' has unknown hides_questions keys #{unknown_questions}"
|
147
|
+
fail ArgumentError, "Flag '#{flag.key}' has unknown hides_questions keys #{unknown_questions}"
|
148
148
|
end
|
149
149
|
|
150
150
|
def validate_flag_depends_on(questionnaire, flag)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quby-compiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marten Veldthuis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|