diff --git a/lib/squib/sprues/sprue.rb b/lib/squib/sprues/sprue.rb index 3e907b6..c60f9d9 100644 --- a/lib/squib/sprues/sprue.rb +++ b/lib/squib/sprues/sprue.rb @@ -4,6 +4,7 @@ require_relative '../args/color_validator' require_relative '../args/unit_conversion' require_relative 'crop_line' require_relative 'crop_line_dash' +require_relative 'sprue_schema' module Squib class Sprue @@ -31,7 +32,7 @@ module Squib attr_reader :dpi def initialize(template_hash, dpi) - ClassyHash.validate(template_hash, SCHEMA) + ClassyHash.validate(template_hash, Sprues::SCHEMA) @template_hash = template_hash @dpi = dpi @crop_line_default = @template_hash['crop_line'].select do |k, _| @@ -132,54 +133,6 @@ module Squib private - # Template file schema - UNIT_REGEX = /^(\d*[.])?\d+(in|cm|mm)$/ - ROTATE_REGEX = /^(\d*[.])?\d+(deg|rad)?$/ - SCHEMA = { - 'sheet_width' => UNIT_REGEX, - 'sheet_height' => UNIT_REGEX, - 'card_width' => UNIT_REGEX, - 'card_height' => UNIT_REGEX, - 'position_reference' => ClassyHash::G.enum(:topleft, :center), - 'rotate' => [ - :optional, Numeric, - ClassyHash::G.enum(:clockwise, :counterclockwise, :turnaround), - ROTATE_REGEX - ], - 'crop_line' => { - 'style' => [ - ClassyHash::G.enum(:solid, :dotted, :dashed), - Sprues::CropLineDash::VALIDATION_REGEX - ], - 'width' => UNIT_REGEX, - 'color' => [String, Symbol], - 'overlay' => ClassyHash::G.enum( - :on_margin, :overlay_on_cards, :beneath_cards - ), - 'lines' => [[{ - 'type' => ClassyHash::G.enum(:horizontal, :vertical), - 'position' => UNIT_REGEX, - 'style' => [ - :optional, ClassyHash::G.enum(:solid, :dotted, :dashed) - ], - 'width' => [:optional, UNIT_REGEX], - 'color' => [:optional, String, Symbol], - 'overlay_on_cards' => [:optional, TrueClass] - }]] - }, - 'cards' => [[{ - 'x' => UNIT_REGEX, - 'y' => UNIT_REGEX, - # NOTE: Don't think that we should specify rotation on a per card - # basis, but just included here for now - 'rotate' => [ - :optional, Numeric, - ClassyHash::G.enum(:clockwise, :counterclockwise, :turnaround), - ROTATE_REGEX - ] - }]] - }.freeze - # Return path for built-in sheet templates def self.builtin(file) "#{File.dirname(__FILE__)}/../builtin/sprues/#{file}" diff --git a/lib/squib/sprues/sprue_schema.rb b/lib/squib/sprues/sprue_schema.rb new file mode 100644 index 0000000..ddff0c7 --- /dev/null +++ b/lib/squib/sprues/sprue_schema.rb @@ -0,0 +1,50 @@ +module Squib + module Sprues + UNIT_REGEX = /^(\d*[.])?\d+(in|cm|mm)$/ + ROTATE_REGEX = /^(\d*[.])?\d+(deg|rad)?$/ + SCHEMA = { + 'sheet_width' => UNIT_REGEX, + 'sheet_height' => UNIT_REGEX, + 'card_width' => UNIT_REGEX, + 'card_height' => UNIT_REGEX, + 'position_reference' => ClassyHash::G.enum(:topleft, :center), + 'rotate' => [ + :optional, Numeric, + ClassyHash::G.enum(:clockwise, :counterclockwise, :turnaround), + ROTATE_REGEX + ], + 'crop_line' => { + 'style' => [ + ClassyHash::G.enum(:solid, :dotted, :dashed), + Sprues::CropLineDash::VALIDATION_REGEX + ], + 'width' => UNIT_REGEX, + 'color' => [String, Symbol], + 'overlay' => ClassyHash::G.enum( + :on_margin, :overlay_on_cards, :beneath_cards + ), + 'lines' => [[{ + 'type' => ClassyHash::G.enum(:horizontal, :vertical), + 'position' => UNIT_REGEX, + 'style' => [ + :optional, ClassyHash::G.enum(:solid, :dotted, :dashed) + ], + 'width' => [:optional, UNIT_REGEX], + 'color' => [:optional, String, Symbol], + 'overlay_on_cards' => [:optional, TrueClass] + }]] + }, + 'cards' => [[{ + 'x' => UNIT_REGEX, + 'y' => UNIT_REGEX, + # NOTE: Don't think that we should specify rotation on a per card + # basis, but just included here for now + 'rotate' => [ + :optional, Numeric, + ClassyHash::G.enum(:clockwise, :counterclockwise, :turnaround), + ROTATE_REGEX + ] + }]] + }.freeze + end +end diff --git a/spec/sprue_spec.rb b/spec/sprue_spec.rb index 377705a..065be8a 100644 --- a/spec/sprue_spec.rb +++ b/spec/sprue_spec.rb @@ -148,7 +148,7 @@ describe Squib::Sprue do expect do Squib::Sprue.load(sprue_file('fail_no_sheet_width.yml'), 100) end.to raise_error( - RuntimeError, + ClassyHash::SchemaViolationError, '"sheet_width" is not a String matching /^(\d*[.])?\d+(in|cm|mm)$/' ) end @@ -157,7 +157,7 @@ describe Squib::Sprue do expect do Squib::Sprue.load(sprue_file('fail_no_sheet_height.yml'), 100) end.to raise_error( - RuntimeError, + ClassyHash::SchemaViolationError, '"sheet_height" is not a String matching /^(\d*[.])?\d+(in|cm|mm)$/' ) end @@ -166,7 +166,7 @@ describe Squib::Sprue do expect do Squib::Sprue.load(sprue_file('fail_no_card_width.yml'), 100) end.to raise_error( - RuntimeError, + ClassyHash::SchemaViolationError, '"card_width" is not a String matching /^(\d*[.])?\d+(in|cm|mm)$/' ) end @@ -175,7 +175,7 @@ describe Squib::Sprue do expect do Squib::Sprue.load(sprue_file('fail_no_card_height.yml'), 100) end.to raise_error( - RuntimeError, + ClassyHash::SchemaViolationError, '"card_height" is not a String matching /^(\d*[.])?\d+(in|cm|mm)$/' ) end diff --git a/squib.gemspec b/squib.gemspec index c29ac9c..f08b266 100644 --- a/squib.gemspec +++ b/squib.gemspec @@ -30,7 +30,7 @@ Gem::Specification.new do |spec| spec.require_paths = ['lib'] spec.add_runtime_dependency 'cairo', '1.15.9' - spec.add_runtime_dependency 'classy_hash', '0.1.5' + spec.add_runtime_dependency 'classy_hash', '0.2.0' spec.add_runtime_dependency 'gio2', '3.1.8' spec.add_runtime_dependency 'gobject-introspection', '3.1.8' spec.add_runtime_dependency 'highline', '1.7.8'