From 225f6fede2919cac94c9165144a9a1975a64eb77 Mon Sep 17 00:00:00 2001 From: Marten Veldthuis <marten@veldthuis.com> Date: Thu, 4 Mar 2021 16:25:52 +0100 Subject: [PATCH] Fix that lookup tables were not available to DefinitionValidator --- lib/quby/compiler/dsl.rb | 6 +++--- lib/quby/compiler/dsl/questionnaire_builder.rb | 2 +- lib/quby/compiler/entities/definition.rb | 5 +++-- lib/quby/compiler/instance.rb | 2 +- lib/quby/compiler/services/definition_validator.rb | 2 +- spec/quby/compiler/dsl/helpers_spec.rb | 3 ++- spec/quby/compiler/dsl/questionnaire_builder_spec.rb | 3 ++- .../compiler/services/definition_validator_spec.rb | 12 ++++++++++++ 8 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/quby/compiler/dsl.rb b/lib/quby/compiler/dsl.rb index d1177be..2199843 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 69bd27a..f18c8f0 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 a096071..f02adde 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 bd1b9fd..5f724c9 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 d3a39e6..6785a6b 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 cc507e6..32b553e 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 1501149..03bbc36 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 59f9ac2..65309bc 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 -- GitLab