Class: Quby::Compiler::DSL::QuestionnaireBuilder

Inherits:
Object
  • Object
show all
Includes:
CallsCustomMethods, Helpers, StandardizedPanelGenerators
Defined in:
lib/quby/compiler/dsl/questionnaire_builder.rb

Instance Attribute Summary

Attributes included from CallsCustomMethods

#custom_methods

Instance Method Summary collapse

Methods included from Helpers

#check_key_uniqueness, #check_question_keys_uniqueness, #image_alt, #image_tag, #video_tag

Methods included from StandardizedPanelGenerators

#end_panel, #informal_end_panel, #start_panel

Methods included from CallsCustomMethods

#method_missing, #respond_to_missing?

Constructor Details

#initialize(target_instance, lookup_tables:) ⇒ QuestionnaireBuilder

Returns a new instance of QuestionnaireBuilder.



24
25
26
27
28
29
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 24

def initialize(target_instance, lookup_tables:)
  @questionnaire = target_instance
  @lookup_tables = lookup_tables
  @default_question_options = {}
  @custom_methods = {}
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Quby::Compiler::DSL::CallsCustomMethods

Instance Method Details

#abortableObject



94
95
96
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 94

def abortable
  @questionnaire.abortable = true
end

#add_lookup_tree(key, levels:, tree:) ⇒ Object



208
209
210
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 208

def add_lookup_tree(key, levels:, tree:)
  @questionnaire.lookup_tables[key] = {levels: levels, tree: tree}
end

#alarm(**options, &block) ⇒ Object



276
277
278
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 276

def alarm(**options, &block)
  variable(:alarm, action: true, **options, &block)
end

#allow_hotkeys(type = :all) ⇒ Object



103
104
105
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 103

def allow_hotkeys(type = :all)
  @questionnaire.allow_hotkeys = type
end

#allow_switch_to_bulk(value = true) ⇒ Object

deprecated no-op



176
177
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 176

def allow_switch_to_bulk(value=true)
end

#attention(**options, &block) ⇒ Object



272
273
274
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 272

def attention(**options, &block)
  variable(:attention, action: true, **options, &block)
end

#bar_chart(*args, &block) ⇒ Object



295
296
297
298
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 295

def bar_chart(*args, &block)
  builder = BarChartBuilder.new(@questionnaire, *args)
  @questionnaire.add_chart(builder.build(&block))
end

#completion(**options, &block) ⇒ Object



280
281
282
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 280

def completion(**options, &block)
  variable(:completion, completion: true, **options, &block)
end

#css(value) ⇒ Object



165
166
167
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 165

def css(value)
  @questionnaire.extra_css += value
end

#css_vars(value) ⇒ Object

css_vars(“option-gap-y” => 1)



170
171
172
173
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 170

def css_vars(value)
  @questionnaire.css_vars ||= {}
  @questionnaire.css_vars.merge!(value)
end

#custom_method(key, &block) ⇒ Object



197
198
199
200
201
202
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 197

def custom_method(key, &block)
  if PanelBuilder.new(nil, custom_methods: @custom_methods).respond_to? key
    fail 'Custom method trying to override existing method'
  end
  @custom_methods[key] = block
end

#deactivate_answers_requested_at(timestamp) ⇒ Object



153
154
155
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 153

def deactivate_answers_requested_at(timestamp)
  @questionnaire.deactivate_answers_requested_at = timestamp
end

#default_answer_value(value) ⇒ Object



179
180
181
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 179

def default_answer_value(value)
  @questionnaire.default_answer_value = value
end

#default_question_options(**options) ⇒ Object



212
213
214
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 212

def default_question_options(**options)
  @default_question_options.merge!(options)
end

#description(description) ⇒ Object



63
64
65
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 63

def description(description)
  @questionnaire.description = description
end

#do_not_check_checkbox_options_start_with_question_keyObject



317
318
319
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 317

def do_not_check_checkbox_options_start_with_question_key
  @questionnaire.check_checkbox_options_start_with_question_key = false
end

#do_not_check_key_clashesObject



47
48
49
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 47

def do_not_check_key_clashes
  @questionnaire.check_key_clashes = false
end

#do_not_check_score_keys_consistencyObject



51
52
53
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 51

def do_not_check_score_keys_consistency
  @questionnaire.check_score_keys_consistency = false
end

#do_not_validate_htmlObject



55
56
57
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 55

def do_not_validate_html
  @questionnaire.validate_html = false
end

#editable_by_professionalsObject



124
125
126
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 124

def editable_by_professionals
  @questionnaire.editable_by_professionals = true
end

#editable_from_version(number) ⇒ Object



145
146
147
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 145

def editable_from_version(number)
  @questionnaire.editable_from_version = number
end

#enable_previous_questionnaire_buttonObject



157
158
159
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 157

def enable_previous_questionnaire_button
  @questionnaire.enable_previous_questionnaire_button = true
end

#environments(*environments) ⇒ Object



128
129
130
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 128

def environments(*environments)
  @questionnaire.environments = environments
end

#flag(**flag_options) ⇒ Object



305
306
307
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 305

def flag(**flag_options)
  @questionnaire.add_flag flag_options
end


75
76
77
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 75

def footer(footer)
  @questionnaire.footer = footer
end

#hide_pii_from_researchers(value) ⇒ Object



183
184
185
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 183

def hide_pii_from_researchers(value)
  @questionnaire.anonymous_conditions = @questionnaire.anonymous_conditions.new(hide_pii_from_researchers: value)
end

#hide_values_from_professionals(value) ⇒ Object



187
188
189
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 187

def hide_values_from_professionals(value)
  @questionnaire.anonymous_conditions = @questionnaire.anonymous_conditions.new(hide_values_from_professionals: value)
end

#import_lookup_tree(key) ⇒ Object



204
205
206
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 204

def import_lookup_tree(key)
  @questionnaire.lookup_tables[key] = @lookup_tables.fetch(key)
end

#key(key) ⇒ Object



35
36
37
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 35

def key(key)
  # no-op, key is now passed in to Questionnaire constructor
end

#language(language) ⇒ Object



112
113
114
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 112

def language(language)
  @questionnaire.language = language.to_s
end

#layout_version(version) ⇒ Object



161
162
163
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 161

def layout_version(version)
  @questionnaire.layout_version = version
end

#leave_page_alert(text) ⇒ Object



31
32
33
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 31

def leave_page_alert(text)
  @questionnaire.leave_page_alert = text
end

#license(type, licensor: nil) ⇒ Object



107
108
109
110
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 107

def license(type, licensor: nil)
  @questionnaire.license  = type
  @questionnaire.licensor = licensor
end

#line_chart(*args, &block) ⇒ Object



290
291
292
293
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 290

def line_chart(*args, &block)
  builder = LineChartBuilder.new(@questionnaire, *args)
  @questionnaire.add_chart(builder.build(&block))
end

#original(original_key) ⇒ Object



132
133
134
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 132

def original(original_key)
  @questionnaire.original = original_key
end

#outcome_description(description) ⇒ Object



67
68
69
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 67

def outcome_description(description)
  @questionnaire.outcome_description = description
end

#outcome_regeneration_requested_at(timestamp) ⇒ Object



149
150
151
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 149

def outcome_regeneration_requested_at(timestamp)
  @questionnaire.outcome_regeneration_requested_at = timestamp
end

#outcome_table(**table_options) ⇒ Object



313
314
315
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 313

def outcome_table(**table_options)
  @questionnaire.add_outcome_table(**table_options)
end

#overview_chart(*args, &block) ⇒ Object



284
285
286
287
288
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 284

def overview_chart(*args, &block)
  raise "Cannot define more than one overview chart" if @questionnaire.charts.overview.present?
  builder = OverviewChartBuilder.new(@questionnaire, *args)
  @questionnaire.charts.overview = builder.build(&block)
end

#panel(title = nil, key: nil, **options, &block) ⇒ Object



191
192
193
194
195
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 191

def panel(title = nil, key: nil, **options, &block)
  key ||= "p_#{@questionnaire.panels.size}"
  panel = PanelBuilder.build(title, key:, **options, **default_panel_options, &block)
  @questionnaire.add_panel(panel)
end

#question(key, **options, &block) ⇒ Object

Short-circuit the question command to perform an implicit panel



217
218
219
220
221
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 217

def question(key, **options, &block)
  panel(nil, **default_panel_options) do
    question(key, questionnaire: @questionnaire, **@default_question_options, **options, &block)
  end
end

#radar_chart(*args, &block) ⇒ Object



300
301
302
303
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 300

def radar_chart(*args, &block)
  builder = RadarChartBuilder.new(@questionnaire, *args)
  @questionnaire.add_chart(builder.build(&block))
end

#respondent_types(*respondent_types) ⇒ Object



116
117
118
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 116

def respondent_types(*respondent_types)
  @questionnaire.respondent_types = respondent_types
end

#roqua_keys(*keys) ⇒ Object



39
40
41
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 39

def roqua_keys(*keys)
  @questionnaire.roqua_keys = keys
end

#sbg_domain(sbg_code, outcome:, from: nil, till: nil, sbg_key: nil, primary: false) ⇒ Object



83
84
85
86
87
88
89
90
91
92
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 83

def sbg_domain(sbg_code, outcome:, from: nil, till: nil, sbg_key: nil, primary: false)
  @questionnaire.sbg_domains << {
    sbg_code: sbg_code,
    from: from,
    till: till,
    outcome: outcome,
    sbg_key: sbg_key || @questionnaire.sbg_key,
    primary: primary
  }
end

#sbg_key(sbg_key) ⇒ Object



79
80
81
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 79

def sbg_key(sbg_key)
  @questionnaire.sbg_key = sbg_key
end

#score(key, **options, &block) ⇒ Object



250
251
252
253
254
255
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 250

def score(key, **options, &block)
  @questionnaire.errors.add "Score #{key}", 'misses label in score call' if options[:label].blank?
  schema = options.delete(:schema)
  score_schema(key, options[:label], schema, sbg_key: options[:sbg_key]) if schema.present?
  variable(key, score: true, **options, &block)
end

#score_schema(key, label, subscore_schemas = nil, sbg_key: nil, &block) ⇒ Object



257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 257

def score_schema(key, label, subscore_schemas = nil, sbg_key: nil, &block)
  if block
    schema, calculations = ScoreSchemaBuilder.build(key:, label:, sbg_key:, &block)
    @questionnaire.add_score_schema schema
    calculations.each do |calculation|
      @questionnaire.add_score_calculation calculation
    end
  else
    @questionnaire.add_score_schema Entities::ScoreSchema.new key:,
                                                              label:,
                                                              sbg_key:,
                                                              subscore_schemas:
  end
end

#seeds_patch(value) ⇒ Object



43
44
45
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 43

def seeds_patch(value)
  @questionnaire.seeds_patch = value
end

#sexp_variable(key, type: :number, &block) ⇒ Object



237
238
239
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 237

def sexp_variable(key, type: :number, &block)
  @questionnaire.add_sexp_variable(key, SexpVariableBuilder.new(key, type:, &block).build)
end

#sexp_visibility_rule(sexp_key:, show_questions: [], hide_questions: []) ⇒ Object



321
322
323
324
325
326
327
328
329
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 321

def sexp_visibility_rule(sexp_key:, show_questions: [], hide_questions: [])
  condition = {
    type: 'sexp_variable_true',
    sexp_key:
  }
  @questionnaire.extra_visibility_rules.concat(
    Entities::VisibilityRule.for_condition(condition, show_questions:, hide_questions:)
  )
end

#short_description(description) ⇒ Object



71
72
73
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 71

def short_description(description)
  @questionnaire.short_description = description
end

#table(**options, &block) ⇒ Object

Short-circuit the table command to perform an implicit panel



231
232
233
234
235
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 231

def table(**options, &block)
  panel(nil, **default_panel_options) do
    table(**options, &block)
  end
end

#tags(*tags) ⇒ Object



120
121
122
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 120

def tags(*tags)
  @questionnaire.tags = tags
end

#text(value, **options) ⇒ Object

Short-circuit the text command to perform an implicit panel



224
225
226
227
228
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 224

def text(value, **options)
  panel(nil, **default_panel_options) do
    text(value, **options)
  end
end

#textvar(**textvar_options) ⇒ Object



309
310
311
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 309

def textvar(**textvar_options)
  @questionnaire.add_textvar textvar_options
end

#title(title) ⇒ Object



59
60
61
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 59

def title(title)
  @questionnaire.title = title
end

#translatable_into(*languages) ⇒ Object

No args to generate locale file for original language.



99
100
101
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 99

def translatable_into(*languages)
  @questionnaire.translatable_into = languages.map(&:to_s)
end

#variable(key, **options, &block) ⇒ Object

variable :totaal do

# Plain old Ruby code here, executed in the scope of the answer
# variables are private to the score calculation
q01 + q02 + q03

end



246
247
248
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 246

def variable(key, **options, &block)
  @questionnaire.add_score_calculation ScoreBuilder.new(key, **options, &block).build
end

#version(number, release_notes:, regenerate_outcome: false, deactivate_answers: false) ⇒ Object



136
137
138
139
140
141
142
143
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 136

def version(number, release_notes:, regenerate_outcome: false, deactivate_answers: false)
  @questionnaire.versions << Entities::Version.new(
    number:,
    release_notes:,
    regenerate_outcome:,
    deactivate_answers:,
  )
end

#visibility_rule(type:, field_key:, show_questions: [], hide_questions: [], **condition_options) ⇒ Object

condition: { type: ‘answered’, field_key: ‘v_1’ }



332
333
334
335
336
# File 'lib/quby/compiler/dsl/questionnaire_builder.rb', line 332

def visibility_rule(type:, field_key:, show_questions: [], hide_questions: [],  **condition_options)
  @questionnaire.extra_visibility_rules.concat(
    Entities::VisibilityRule.for_condition({type:, field_key:, **condition_options}, show_questions:, hide_questions:)
  )
end