quby 4.0.3 → 5.0.0.pre1

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/lib/quby/questionnaires.rb +1 -0
  3. data/lib/quby/questionnaires/api.rb +5 -1
  4. data/lib/quby/questionnaires/deserializer.rb +433 -0
  5. data/lib/quby/questionnaires/dsl.rb +10 -15
  6. data/lib/quby/questionnaires/entities.rb +1 -0
  7. data/lib/quby/questionnaires/entities/charting/line_chart.rb +23 -0
  8. data/lib/quby/questionnaires/entities/charting/overview_chart.rb +3 -1
  9. data/lib/quby/questionnaires/entities/definition.rb +3 -5
  10. data/lib/quby/questionnaires/entities/fields.rb +0 -15
  11. data/lib/quby/questionnaires/entities/question.rb +9 -32
  12. data/lib/quby/questionnaires/entities/questionnaire.rb +4 -15
  13. data/lib/quby/questionnaires/entities/questions/checkbox_question.rb +0 -24
  14. data/lib/quby/questionnaires/entities/questions/date_question.rb +0 -8
  15. data/lib/quby/questionnaires/entities/score_calculation.rb +36 -3
  16. data/lib/quby/questionnaires/repos.rb +1 -0
  17. data/lib/quby/questionnaires/repos/bundle_disk_repo.rb +51 -0
  18. data/lib/quby/version.rb +1 -1
  19. data/spec/internal/log/test-events.log +166 -0
  20. data/spec/internal/log/test.log +6170 -0
  21. data/spec/internal/tmp/capybara/screenshot_2020-10-27-14-25-21.063.html +207 -0
  22. data/spec/internal/tmp/capybara/screenshot_2020-10-27-14-25-21.063.png +0 -0
  23. data/spec/quby/answers/services/answer_validations_spec.rb +8 -8
  24. data/spec/quby/questionnaires/deserializer/questionnaire_spec.rb +237 -0
  25. data/spec/quby/questionnaires/dsl_spec.rb +0 -9
  26. data/spec/quby/questionnaires/entities/fields_spec.rb +3 -3
  27. data/spec/quby/questionnaires/entities/question_spec.rb +0 -8
  28. data/spec/quby/questionnaires/entities/questionnaire_spec.rb +2 -26
  29. data/spec/quby/table_backend/range_tree_spec.rb +7 -0
  30. data/spec/spec_helper.rb +1 -0
  31. metadata +25 -46
  32. data/lib/quby/questionnaires/dsl/base.rb +0 -20
  33. data/lib/quby/questionnaires/dsl/calls_custom_methods.rb +0 -29
  34. data/lib/quby/questionnaires/dsl/charting/bar_chart_builder.rb +0 -18
  35. data/lib/quby/questionnaires/dsl/charting/chart_builder.rb +0 -91
  36. data/lib/quby/questionnaires/dsl/charting/line_chart_builder.rb +0 -57
  37. data/lib/quby/questionnaires/dsl/charting/overview_chart_builder.rb +0 -31
  38. data/lib/quby/questionnaires/dsl/charting/radar_chart_builder.rb +0 -18
  39. data/lib/quby/questionnaires/dsl/helpers.rb +0 -51
  40. data/lib/quby/questionnaires/dsl/panel_builder.rb +0 -80
  41. data/lib/quby/questionnaires/dsl/question_builder.rb +0 -40
  42. data/lib/quby/questionnaires/dsl/questionnaire_builder.rb +0 -252
  43. data/lib/quby/questionnaires/dsl/questions/base.rb +0 -179
  44. data/lib/quby/questionnaires/dsl/questions/checkbox_question_builder.rb +0 -20
  45. data/lib/quby/questionnaires/dsl/questions/date_question_builder.rb +0 -18
  46. data/lib/quby/questionnaires/dsl/questions/deprecated_question_builder.rb +0 -18
  47. data/lib/quby/questionnaires/dsl/questions/float_question_builder.rb +0 -21
  48. data/lib/quby/questionnaires/dsl/questions/integer_question_builder.rb +0 -21
  49. data/lib/quby/questionnaires/dsl/questions/radio_question_builder.rb +0 -20
  50. data/lib/quby/questionnaires/dsl/questions/select_question_builder.rb +0 -18
  51. data/lib/quby/questionnaires/dsl/questions/string_question_builder.rb +0 -20
  52. data/lib/quby/questionnaires/dsl/questions/text_question_builder.rb +0 -22
  53. data/lib/quby/questionnaires/dsl/score_builder.rb +0 -22
  54. data/lib/quby/questionnaires/dsl/standardized_panel_generators.rb +0 -33
  55. data/lib/quby/questionnaires/dsl/table_builder.rb +0 -48
  56. data/lib/quby/questionnaires/services/definition_validator.rb +0 -298
  57. data/spec/quby/questionnaires/dsl/calls_custom_methods_spec.rb +0 -38
  58. data/spec/quby/questionnaires/dsl/charting/bar_chart_builder_spec.rb +0 -41
  59. data/spec/quby/questionnaires/dsl/charting/chart_builder_spec.rb +0 -127
  60. data/spec/quby/questionnaires/dsl/charting/line_chart_builder_spec.rb +0 -66
  61. data/spec/quby/questionnaires/dsl/charting/radar_chart_builder_spec.rb +0 -41
  62. data/spec/quby/questionnaires/dsl/helpers_spec.rb +0 -80
  63. data/spec/quby/questionnaires/dsl/questionnaire_builder_spec.rb +0 -480
  64. data/spec/quby/questionnaires/services/definition_validator_spec.rb +0 -793
  65. data/spec/support/examples_for_chart_builders.rb +0 -59
@@ -8,15 +8,6 @@ module Quby::Questionnaires
8
8
  definition = repo.find('simple')
9
9
  expect(described_class.build_from_definition(definition)).to be_instance_of(Entities::Questionnaire)
10
10
  end
11
-
12
- it 'uses a path on instance eval, so we get correct stack traces' do
13
- definition = Quby::Questionnaires::Entities::Definition.new(key: 'test',
14
- sourcecode: 'raise("problem")',
15
- path: 'spec/fixtures/raising.rb')
16
- expected_backtrace = include(end_with("spec/fixtures/raising.rb:1:in `block in build_from_definition'"))
17
- expect { described_class.build_from_definition(definition) }.to \
18
- raise_exception(having_attributes(backtrace: expected_backtrace))
19
- end
20
11
  end
21
12
  end
22
13
  end
@@ -82,8 +82,8 @@ module Quby::Questionnaires::Entities
82
82
  end
83
83
 
84
84
  describe '#description_for_variable' do
85
- let(:definition) do
86
- %q~
85
+ let(:questionnaire) do
86
+ Quby::Questionnaires::DSL.build("test") do
87
87
  flag key: :flagtest, description_true: 'it true', description_false: 'it false', description: 'it described'
88
88
  textvar key: :textvartest, description: 'tv description'
89
89
  question :v_1, type: :radio, title: 'select a few'
@@ -105,7 +105,7 @@ module Quby::Questionnaires::Entities
105
105
  score_schema :tot, 'Total', [{key: :value, export_key: 'tot', label: 'Score'},
106
106
  {key: :interpretation, export_key: 'tot_i', label: 'Interpretation'}]
107
107
 
108
- ~
108
+ end
109
109
  end
110
110
 
111
111
  it 'returns question context free titles if the variable is a question' do
@@ -42,14 +42,6 @@ module Quby::Questionnaires::Entities
42
42
  let(:valid_question_options) { {type: :string} }
43
43
  subject(:question) { Question.new(:v_1, valid_question_options) }
44
44
 
45
- it 'validates the key to be a symbol' do
46
- questionnaire = Quby::Questionnaires::DSL.build("test2") do
47
- question "key", type: :radio
48
- end
49
- expect(questionnaire.questions.first.valid?).to eq false
50
- expect(questionnaire.questions.first.errors.full_messages).to eq ["Key Is not of type Symbol"]
51
- end
52
-
53
45
  describe 'sbg_key' do
54
46
  it 'can be set by options hash' do
55
47
  expect(questionnaire.question_hash[:date].sbg_key).to eq 'foo'
@@ -432,30 +432,6 @@ module Quby::Questionnaires::Entities
432
432
  end
433
433
  end
434
434
 
435
- describe '#ensure_scores_have_schemas' do
436
- let(:score_missing_schema_quest) do
437
- Quby::Questionnaires::DSL.build("test") do
438
- question :v_1, type: :date, title: 'vraag'
439
-
440
- score(:key, label: 'score') { {value: 'oh no'} }
441
- score(:key2, label: 'score2', schema: [{key: :value, label: 'Score', export_key: :key2}]) { {value: 'oh'} }
442
- score(:key3, label: 'score3') { {value: 'oh no'} }
443
- end
444
- end
445
-
446
- it 'does not validate presense of score schemas by default' do
447
- expect(score_missing_schema_quest.errors.full_messages).to be_blank
448
- end
449
-
450
- describe 'if quby settings require_score_schemas is true' do
451
- before { Quby::Settings.require_score_schemas = true }
452
- it 'validates every score has a score schema' do
453
- expect(score_missing_schema_quest.errors.full_messages).to eq(["Score key is missing a score schema",
454
- "Score key3 is missing a score schema"])
455
- end
456
- end
457
- end
458
-
459
435
  describe '#add_outcome_table' do
460
436
  let(:questionnaire) do
461
437
  Quby::Questionnaires::DSL.build("test") do
@@ -488,8 +464,8 @@ module Quby::Questionnaires::Entities
488
464
  {"fieldKey" => :v_2, "type" => :requires_answer, "explanation" => nil},
489
465
  # a float type automatically adds a validation that the data entered must be parseable as a float
490
466
  {"fieldKey" => :v_2, "type" => :valid_float, "explanation" => nil},
491
- {"fieldKey" => :v_2, "type" => :minimum, "subtype" => :number, "value" => 5},
492
- {"fieldKey" => :v_2, "type" => :maximum, "subtype" => :number, "value" => 10}
467
+ {"fieldKey" => :v_2, "type" => :minimum, "subtype" => :number, "value" => 5, "explanation" => nil},
468
+ {"fieldKey" => :v_2, "type" => :maximum, "subtype" => :number, "value" => 10, "explanation" => nil}
493
469
  ])
494
470
  end
495
471
 
@@ -101,6 +101,13 @@ describe Quby::TableBackend::RangeTree do
101
101
  end
102
102
  end
103
103
 
104
+ describe 'array leaves' do
105
+ it 'returns the leaf fully' do
106
+ tree = described_class.new levels: ['key', 'leaf'], tree: {a: [1, 2, 3], b: [9, 8, 7]}
107
+ expect(tree.lookup(key: :a)).to eq([1, 2, 3])
108
+ end
109
+ end
110
+
104
111
  describe 'parameter validation' do
105
112
  it 'raises when parameter keys do not match header keys' do
106
113
  params = {foo: :bar}
@@ -31,6 +31,7 @@ end
31
31
  require 'rspec/rails'
32
32
  require 'rails-controller-testing'
33
33
 
34
+ require 'quby/compiler'
34
35
  require 'roqua/support/request_logger'
35
36
  require 'capybara/rspec'
36
37
  require 'capybara-screenshot'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quby
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.3
4
+ version: 5.0.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marten Veldthuis
@@ -537,6 +537,20 @@ dependencies:
537
537
  - - "~>"
538
538
  - !ruby/object:Gem::Version
539
539
  version: 0.9.0
540
+ - !ruby/object:Gem::Dependency
541
+ name: quby-compiler
542
+ requirement: !ruby/object:Gem::Requirement
543
+ requirements:
544
+ - - ">="
545
+ - !ruby/object:Gem::Version
546
+ version: '0'
547
+ type: :development
548
+ prerelease: false
549
+ version_requirements: !ruby/object:Gem::Requirement
550
+ requirements:
551
+ - - ">="
552
+ - !ruby/object:Gem::Version
553
+ version: '0'
540
554
  description: Quby is a Rails engine that can render and update answers for questionnaires
541
555
  defined in a custom DSL.
542
556
  email:
@@ -742,31 +756,8 @@ files:
742
756
  - lib/quby/pdf_renderer.rb
743
757
  - lib/quby/questionnaires.rb
744
758
  - lib/quby/questionnaires/api.rb
759
+ - lib/quby/questionnaires/deserializer.rb
745
760
  - lib/quby/questionnaires/dsl.rb
746
- - lib/quby/questionnaires/dsl/base.rb
747
- - lib/quby/questionnaires/dsl/calls_custom_methods.rb
748
- - lib/quby/questionnaires/dsl/charting/bar_chart_builder.rb
749
- - lib/quby/questionnaires/dsl/charting/chart_builder.rb
750
- - lib/quby/questionnaires/dsl/charting/line_chart_builder.rb
751
- - lib/quby/questionnaires/dsl/charting/overview_chart_builder.rb
752
- - lib/quby/questionnaires/dsl/charting/radar_chart_builder.rb
753
- - lib/quby/questionnaires/dsl/helpers.rb
754
- - lib/quby/questionnaires/dsl/panel_builder.rb
755
- - lib/quby/questionnaires/dsl/question_builder.rb
756
- - lib/quby/questionnaires/dsl/questionnaire_builder.rb
757
- - lib/quby/questionnaires/dsl/questions/base.rb
758
- - lib/quby/questionnaires/dsl/questions/checkbox_question_builder.rb
759
- - lib/quby/questionnaires/dsl/questions/date_question_builder.rb
760
- - lib/quby/questionnaires/dsl/questions/deprecated_question_builder.rb
761
- - lib/quby/questionnaires/dsl/questions/float_question_builder.rb
762
- - lib/quby/questionnaires/dsl/questions/integer_question_builder.rb
763
- - lib/quby/questionnaires/dsl/questions/radio_question_builder.rb
764
- - lib/quby/questionnaires/dsl/questions/select_question_builder.rb
765
- - lib/quby/questionnaires/dsl/questions/string_question_builder.rb
766
- - lib/quby/questionnaires/dsl/questions/text_question_builder.rb
767
- - lib/quby/questionnaires/dsl/score_builder.rb
768
- - lib/quby/questionnaires/dsl/standardized_panel_generators.rb
769
- - lib/quby/questionnaires/dsl/table_builder.rb
770
761
  - lib/quby/questionnaires/entities.rb
771
762
  - lib/quby/questionnaires/entities/charting/bar_chart.rb
772
763
  - lib/quby/questionnaires/entities/charting/chart.rb
@@ -803,9 +794,9 @@ files:
803
794
  - lib/quby/questionnaires/entities/visibility_rule.rb
804
795
  - lib/quby/questionnaires/repos.rb
805
796
  - lib/quby/questionnaires/repos/base.rb
797
+ - lib/quby/questionnaires/repos/bundle_disk_repo.rb
806
798
  - lib/quby/questionnaires/repos/disk_repo.rb
807
799
  - lib/quby/questionnaires/repos/memory_repo.rb
808
- - lib/quby/questionnaires/services/definition_validator.rb
809
800
  - lib/quby/questionnaires/specs.rb
810
801
  - lib/quby/questionnaires/specs/api_specs.rb
811
802
  - lib/quby/questionnaires/specs/repo_specs.rb
@@ -6333,6 +6324,8 @@ files:
6333
6324
  - spec/internal/tmp/capybara/screenshot_2020-10-22-10-23-49.678.png
6334
6325
  - spec/internal/tmp/capybara/screenshot_2020-10-22-10-23-52.495.html
6335
6326
  - spec/internal/tmp/capybara/screenshot_2020-10-22-10-23-52.495.png
6327
+ - spec/internal/tmp/capybara/screenshot_2020-10-27-14-25-21.063.html
6328
+ - spec/internal/tmp/capybara/screenshot_2020-10-27-14-25-21.063.png
6336
6329
  - spec/javascripts/ajax_callbacks_spec.coffee
6337
6330
  - spec/javascripts/flag_spec.coffee
6338
6331
  - spec/javascripts/flags_collection_spec.coffee
@@ -6370,13 +6363,7 @@ files:
6370
6363
  - spec/quby/lookup_table_spec.rb
6371
6364
  - spec/quby/markdown_parser_spec.rb
6372
6365
  - spec/quby/pdf_renderer_spec.rb
6373
- - spec/quby/questionnaires/dsl/calls_custom_methods_spec.rb
6374
- - spec/quby/questionnaires/dsl/charting/bar_chart_builder_spec.rb
6375
- - spec/quby/questionnaires/dsl/charting/chart_builder_spec.rb
6376
- - spec/quby/questionnaires/dsl/charting/line_chart_builder_spec.rb
6377
- - spec/quby/questionnaires/dsl/charting/radar_chart_builder_spec.rb
6378
- - spec/quby/questionnaires/dsl/helpers_spec.rb
6379
- - spec/quby/questionnaires/dsl/questionnaire_builder_spec.rb
6366
+ - spec/quby/questionnaires/deserializer/questionnaire_spec.rb
6380
6367
  - spec/quby/questionnaires/dsl_spec.rb
6381
6368
  - spec/quby/questionnaires/entities/charting/bar_chart_spec.rb
6382
6369
  - spec/quby/questionnaires/entities/charting/chart_spec.rb
@@ -6398,7 +6385,6 @@ files:
6398
6385
  - spec/quby/questionnaires/entities/textvar_spec.rb
6399
6386
  - spec/quby/questionnaires/repos/disk_repo_spec.rb
6400
6387
  - spec/quby/questionnaires/repos/memory_repo_spec.rb
6401
- - spec/quby/questionnaires/services/definition_validator_spec.rb
6402
6388
  - spec/quby/range_categories_spec.rb
6403
6389
  - spec/quby/table_backend/range_tree_spec.rb
6404
6390
  - spec/rcov.opts
@@ -6407,7 +6393,6 @@ files:
6407
6393
  - spec/spec_helper.rb
6408
6394
  - spec/support/engine_controller_testing.rb
6409
6395
  - spec/support/examples_for_chart.rb
6410
- - spec/support/examples_for_chart_builders.rb
6411
6396
  - spec/support/feature_helpers.rb
6412
6397
  - spec/support/javascript_numericality_validations.rb
6413
6398
  - spec/support/questionnaire_helpers.rb
@@ -6465,9 +6450,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
6465
6450
  version: '2.0'
6466
6451
  required_rubygems_version: !ruby/object:Gem::Requirement
6467
6452
  requirements:
6468
- - - ">="
6453
+ - - ">"
6469
6454
  - !ruby/object:Gem::Version
6470
- version: '0'
6455
+ version: 1.3.1
6471
6456
  requirements: []
6472
6457
  rubygems_version: 3.1.4
6473
6458
  signing_key:
@@ -6479,15 +6464,8 @@ test_files:
6479
6464
  - spec/quby/i18n_spec.rb
6480
6465
  - spec/quby/questionnaires/repos/memory_repo_spec.rb
6481
6466
  - spec/quby/questionnaires/repos/disk_repo_spec.rb
6467
+ - spec/quby/questionnaires/deserializer/questionnaire_spec.rb
6482
6468
  - spec/quby/questionnaires/dsl_spec.rb
6483
- - spec/quby/questionnaires/dsl/questionnaire_builder_spec.rb
6484
- - spec/quby/questionnaires/dsl/helpers_spec.rb
6485
- - spec/quby/questionnaires/dsl/charting/chart_builder_spec.rb
6486
- - spec/quby/questionnaires/dsl/charting/line_chart_builder_spec.rb
6487
- - spec/quby/questionnaires/dsl/charting/radar_chart_builder_spec.rb
6488
- - spec/quby/questionnaires/dsl/charting/bar_chart_builder_spec.rb
6489
- - spec/quby/questionnaires/dsl/calls_custom_methods_spec.rb
6490
- - spec/quby/questionnaires/services/definition_validator_spec.rb
6491
6469
  - spec/quby/questionnaires/entities/outcome_table_spec.rb
6492
6470
  - spec/quby/questionnaires/entities/textvar_spec.rb
6493
6471
  - spec/quby/questionnaires/entities/sub_score_schema_spec.rb
@@ -10864,6 +10842,7 @@ test_files:
10864
10842
  - spec/internal/tmp/capybara/screenshot_2020-07-10-09-51-51.554.html
10865
10843
  - spec/internal/tmp/capybara/screenshot_2020-05-20-16-42-30.602.html
10866
10844
  - spec/internal/tmp/capybara/screenshot_2020-07-10-09-52-10.631.png
10845
+ - spec/internal/tmp/capybara/screenshot_2020-10-27-14-25-21.063.png
10867
10846
  - spec/internal/tmp/capybara/screenshot_2020-10-19-17-52-57.803.html
10868
10847
  - spec/internal/tmp/capybara/screenshot_2020-07-10-09-51-48.849.html
10869
10848
  - spec/internal/tmp/capybara/screenshot_2020-10-22-10-23-41.012.html
@@ -11022,6 +11001,7 @@ test_files:
11022
11001
  - spec/internal/tmp/capybara/screenshot_2020-08-20-11-34-12.962.png
11023
11002
  - spec/internal/tmp/capybara/screenshot_2020-10-19-16-04-07.136.png
11024
11003
  - spec/internal/tmp/capybara/screenshot_2020-10-19-18-32-38.667.png
11004
+ - spec/internal/tmp/capybara/screenshot_2020-10-27-14-25-21.063.html
11025
11005
  - spec/internal/tmp/capybara/screenshot_2020-10-19-16-04-04.546.png
11026
11006
  - spec/internal/tmp/capybara/screenshot_2020-10-19-17-46-33.383.png
11027
11007
  - spec/internal/tmp/capybara/screenshot_2020-08-20-11-33-55.775.html
@@ -12029,7 +12009,6 @@ test_files:
12029
12009
  - spec/rcov.opts
12030
12010
  - spec/requests/quby/answers_spec.rb
12031
12011
  - spec/support/examples_for_chart.rb
12032
- - spec/support/examples_for_chart_builders.rb
12033
12012
  - spec/support/testsuite_controller.rb
12034
12013
  - spec/support/questionnaire_helpers.rb
12035
12014
  - spec/support/javascript_numericality_validations.rb
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'quby/questionnaires/dsl/helpers'
4
- require 'quby/questionnaires/dsl/calls_custom_methods'
5
-
6
- module Quby
7
- module Questionnaires
8
- module DSL
9
- class Base
10
- include Helpers
11
-
12
- def self.build(*args, &block)
13
- builder = new(*args)
14
- builder.instance_eval(&block) if block
15
- builder.build
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Quby
4
- module Questionnaires
5
- module DSL
6
- module CallsCustomMethods
7
- attr_reader :custom_methods
8
-
9
- def initialize(*args)
10
- options = args.last.is_a?(::Hash) ? args.last : {}
11
- @custom_methods = options[:custom_methods] || {}
12
- super
13
- end
14
-
15
- def method_missing(method_sym, *args, &block)
16
- if @custom_methods.key? method_sym
17
- instance_exec(*args, &custom_methods[method_sym])
18
- else
19
- super
20
- end
21
- end
22
-
23
- def respond_to_missing?(method_name, include_private = false)
24
- custom_methods.key?(method_name) || super
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'quby/questionnaires/entities/charting/bar_chart'
4
- require_relative 'chart_builder'
5
-
6
- module Quby
7
- module Questionnaires
8
- module DSL
9
- class BarChartBuilder < ChartBuilder
10
- set_chart_class(Entities::Charting::BarChart)
11
-
12
- def plotline(value, color)
13
- @chart.plotlines << {value: value, color: color, width: 1, zIndex: 3}
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'quby/questionnaires/entities'
4
-
5
- module Quby
6
- module Questionnaires
7
- module DSL
8
- class ChartBuilder
9
- # rubocop:disable AccessorMethodName
10
- def self.set_chart_class(chart_class)
11
- @chart_class = chart_class
12
- end
13
- # rubocop:enable AccessorMethodName
14
-
15
- def self.chart_class
16
- @chart_class
17
- end
18
-
19
- def initialize(questionnaire, key, options = {})
20
- @chart = self.class.chart_class.new(key, options)
21
- @questionnaire = questionnaire
22
- end
23
-
24
- def title(title)
25
- @chart.title = title
26
- end
27
-
28
- def range(range)
29
- @chart.y_range = range
30
- end
31
-
32
- def tick_interval(tick_interval)
33
- @chart.tick_interval = tick_interval
34
- end
35
-
36
- def y_categories(y_categories)
37
- @chart.y_categories = y_categories
38
- end
39
-
40
- def y_range_categories(*y_range_categories)
41
- @chart.y_range_categories = RangeCategories.new(*y_range_categories).as_range_hash
42
- end
43
-
44
- def plotband(from, to, color)
45
- @chart.plotbands << {from: from, to: to, color: color}
46
- end
47
-
48
- def plot(key, options = {})
49
- unless plottable = @questionnaire.find_plottable(key)
50
- fail "Questionnaire #{@questionnaire.key} chart #{@chart.key} references unknown score or question #{key}"
51
- end
52
-
53
- configure_options plottable, options
54
-
55
- @chart.plottables << Entities::Charting::Plottable.new(plottable.key, options)
56
- end
57
-
58
- def chart_type(type)
59
- @chart.chart_type = type
60
- end
61
-
62
- def build(&block)
63
- instance_eval(&block)
64
- validate!
65
- @chart
66
- end
67
-
68
- def validate!
69
- if @chart.y_categories.present? && @chart.y_range.present? &&
70
- @chart.y_range != (0..(@chart.y_categories.count - 1))
71
- fail ArgumentError, 'Y_categories size and range do not match'
72
- end
73
-
74
- true
75
- end
76
-
77
- private
78
-
79
- def configure_options(plottable, options)
80
- case plottable
81
- when Entities::ScoreCalculation
82
- options.reverse_merge! plottable.options
83
- when Entities::Question
84
- options[:label] ||= plottable.title
85
- end
86
- options[:questionnaire_key] = @questionnaire.key
87
- end
88
- end
89
- end
90
- end
91
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'quby/questionnaires/entities/charting/line_chart'
4
- require_relative 'chart_builder'
5
-
6
- module Quby
7
- module Questionnaires
8
- module DSL
9
- class LineChartBuilder < ChartBuilder
10
- set_chart_class(Entities::Charting::LineChart)
11
-
12
- def y_axis_label(label)
13
- @chart.y_label = label
14
- end
15
-
16
- def tonality(value)
17
- @chart.tonality = value
18
- end
19
-
20
- # value - Number or a hash `{from_age..to_age => {female: 5, default: 4}, .., default: { default: 3 }}`
21
- # block - deprecated.
22
- def baseline(value = nil, &block)
23
- unless value.nil? ^ block.nil?
24
- fail ArgumentError, "Must give either value or a block"
25
- end
26
-
27
- if value && value.is_a?(Hash)
28
- @chart.baseline = ->(age, gender) {
29
- age_match = value.find { |age_range, _v| age && age_range === age }
30
- hash_by_gender = (age_match&.last || value.stringify_keys["default"])
31
-
32
- gender_match = hash_by_gender.find {|gender_key, _v| gender && gender_key.to_s == gender.to_s }
33
- gender_match&.last || hash_by_gender.stringify_keys['default']
34
- }
35
- elsif value
36
- @chart.baseline = ->(age, gender) { value }
37
- end
38
-
39
- if block
40
- if block.arity != 2
41
- fail ArgumentError, "Given block must take two arguments"
42
- end
43
- @chart.baseline = block
44
- end
45
- end
46
-
47
- def clinically_relevant_change(value)
48
- @chart.clinically_relevant_change = value
49
- end
50
-
51
- def validate!
52
- fail "Chart #{@chart.key} has no range specified" unless @chart.y_range
53
- end
54
- end
55
- end
56
- end
57
- end