diff --git a/lib/quby/compiler/dsl.rb b/lib/quby/compiler/dsl.rb index d1177be688428446bbd258acdfbb6ad6cde8fdee..219984352ac498749e48093a4ac7f76c6aeb144a 100644 --- a/lib/quby/compiler/dsl.rb +++ b/lib/quby/compiler/dsl.rb @@ -10,15 +10,15 @@ module Quby module DSL def self.build_from_definition(definition) Entities::Questionnaire.new(definition.key, last_update: definition.timestamp).tap do |questionnaire| - builder = QuestionnaireBuilder.new(questionnaire) + builder = QuestionnaireBuilder.new(questionnaire, lookup_tables: definition.lookup_tables) builder.instance_eval(definition.sourcecode, definition.path) if definition.sourcecode questionnaire.callback_after_dsl_enhance_on_questions end end - def self.build(key, sourcecode = nil, path: nil, timestamp: nil, &block) + def self.build(key, sourcecode = nil, path: nil, timestamp: nil, lookup_tables: {}, &block) Entities::Questionnaire.new(key, last_update: timestamp).tap do |questionnaire| - builder = QuestionnaireBuilder.new(questionnaire) + builder = QuestionnaireBuilder.new(questionnaire, lookup_tables: lookup_tables) builder.instance_eval(sourcecode, path || key) if sourcecode builder.instance_eval(&block) if block questionnaire.callback_after_dsl_enhance_on_questions diff --git a/lib/quby/compiler/dsl/questionnaire_builder.rb b/lib/quby/compiler/dsl/questionnaire_builder.rb index 69bd27a3ca47d1946c9ee54288ca991c733872b5..f18c8f0a5ecda74e786e6adbb57d1346496ade45 100644 --- a/lib/quby/compiler/dsl/questionnaire_builder.rb +++ b/lib/quby/compiler/dsl/questionnaire_builder.rb @@ -19,7 +19,7 @@ module Quby include StandardizedPanelGenerators include Helpers - def initialize(target_instance, lookup_tables: nil) + def initialize(target_instance, lookup_tables:) @questionnaire = target_instance @lookup_tables = lookup_tables @default_question_options = {} diff --git a/lib/quby/compiler/entities/definition.rb b/lib/quby/compiler/entities/definition.rb index a0960716d6254b5c413871b6198f5b41425598de..f02adde4b051c72e5cd25b4d5edd71c2e264802c 100644 --- a/lib/quby/compiler/entities/definition.rb +++ b/lib/quby/compiler/entities/definition.rb @@ -10,13 +10,14 @@ module Quby extend ActiveModel::Naming include ActiveModel::Validations - attr_accessor :key, :sourcecode, :timestamp, :path + attr_accessor :key, :sourcecode, :timestamp, :path, :lookup_tables - def initialize(key:, path:, sourcecode: "", timestamp: nil) + def initialize(key:, path:, sourcecode: "", timestamp: nil, lookup_tables: {}) @path = path @key = key @sourcecode = sourcecode @timestamp = timestamp + @lookup_tables = lookup_tables end validates_with Services::DefinitionValidator diff --git a/lib/quby/compiler/instance.rb b/lib/quby/compiler/instance.rb index bd1b9fd45f508d41933c1ec8e3cc9d2d5a8aed60..5f724c9e06ecdba69a7c5627c72bbd5ff7ee2953 100644 --- a/lib/quby/compiler/instance.rb +++ b/lib/quby/compiler/instance.rb @@ -63,7 +63,7 @@ module Quby end def validate(key:, sourcecode:) - definition = Entities::Definition.new(key: key, sourcecode: sourcecode, path: "validating '#{key}'") + definition = Entities::Definition.new(key: key, sourcecode: sourcecode, path: "validating '#{key}'", lookup_tables: lookup_tables) definition.valid? definition end diff --git a/lib/quby/compiler/services/definition_validator.rb b/lib/quby/compiler/services/definition_validator.rb index d3a39e6dbdeaf5bffa1e0576a88cba1650475993..6785a6bddb6ce3b172cbbfbb21f3a7999f866348 100644 --- a/lib/quby/compiler/services/definition_validator.rb +++ b/lib/quby/compiler/services/definition_validator.rb @@ -30,7 +30,7 @@ module Quby rescue Exception => exception # rubocop:disable Lint/RescueException definition.errors.add(:sourcecode, {message: "Questionnaire error: #{definition.key}\n" \ "#{exception.message}", - backtrace: exception.backtrace[0..5].join("<br/>")}) + backtrace: exception.backtrace[0..20]}) end def validate_fields(questionnaire) diff --git a/spec/quby/compiler/dsl/helpers_spec.rb b/spec/quby/compiler/dsl/helpers_spec.rb index cc507e6279b9d3ab2cdbe1d771c75e5e74d2ba69..32b553eff2ed3525eb9f60561864f7d44127dbeb 100644 --- a/spec/quby/compiler/dsl/helpers_spec.rb +++ b/spec/quby/compiler/dsl/helpers_spec.rb @@ -5,7 +5,8 @@ require 'spec_helper' module Quby::Compiler::DSL describe Helpers do let(:questionnaire) { Quby::Compiler::Entities::Questionnaire.new("example") } - let(:builder) { QuestionnaireBuilder.new(questionnaire) } + let(:lookup_tables) { {} } + let(:builder) { QuestionnaireBuilder.new(questionnaire, lookup_tables: lookup_tables) } # this helper has some extra tests to check that helpers are included everywhere describe '.image_tag' do diff --git a/spec/quby/compiler/dsl/questionnaire_builder_spec.rb b/spec/quby/compiler/dsl/questionnaire_builder_spec.rb index 15011494bb09d23f4646d555140d201355ce75aa..03bbc36d9430554e2ec9baae1fe1ef22771ae881 100644 --- a/spec/quby/compiler/dsl/questionnaire_builder_spec.rb +++ b/spec/quby/compiler/dsl/questionnaire_builder_spec.rb @@ -5,7 +5,8 @@ require 'spec_helper' module Quby::Compiler::DSL describe QuestionnaireBuilder do let(:questionnaire) { Quby::Compiler::Entities::Questionnaire.new("example") } - let(:builder) { QuestionnaireBuilder.new(questionnaire) } + let(:lookup_tables) { {} } + let(:builder) { QuestionnaireBuilder.new(questionnaire, lookup_tables: lookup_tables) } it 'sets title' do dsl { title 'Foo' } diff --git a/spec/quby/compiler/services/definition_validator_spec.rb b/spec/quby/compiler/services/definition_validator_spec.rb index 59f9ac26cabb31e7c9b5abccf38dbbc7d1686599..65309bc1a871870ce1dbf936a4fa22bd25318958 100644 --- a/spec/quby/compiler/services/definition_validator_spec.rb +++ b/spec/quby/compiler/services/definition_validator_spec.rb @@ -809,5 +809,17 @@ module Quby::Compiler::Services expect(definition.errors.full_messages.first).to include('That tag isn\'t allowed here') end end + + describe 'when using lookup tables' do + it 'can validate an externally referenced table' do + definition = Quby::Compiler::Entities::Definition.new( + key: 'test', + sourcecode: "title 'foo'; import_lookup_tree 'bar'", + path: 'fake definition test', + lookup_tables: {'bar' => ""} + ) + expect(definition.valid?).to be true + end + end end end