quby 4.0.3 → 5.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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