Skip to content

Commit

Permalink
Simplify Configuration
Browse files Browse the repository at this point in the history
This makes `Configuration` a struct and overrides its `initialize`
method to provide defaults. It simplifies things a bit and allows
passing options during initialization using keyword arguments.
  • Loading branch information
davishmcclurg committed Mar 2, 2024
1 parent 16d008b commit c1507fe
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 77 deletions.
85 changes: 26 additions & 59 deletions lib/json_schemer/configuration.rb
Original file line number Diff line number Diff line change
@@ -1,65 +1,32 @@
# frozen_string_literal: true

module JSONSchemer
class Configuration
module Defaults
BASE_URI = URI('json-schemer://schema').freeze
META_SCHEMA = Draft202012::BASE_URI.to_s.freeze
VOCABULARY = nil
FORMAT = true
FORMATS = {}.freeze
CONTENT_ENCODINGS = {}.freeze
CONTENT_MEDIA_TYPES = {}.freeze
KEYWORDS = {}.freeze
BEFORE_PROPERTY_VALIDATION = [].freeze
AFTER_PROPERTY_VALIDATION = [].freeze
INSERT_PROPERTY_DEFAULTS = false
PROPERTY_DEFAULT_RESOLVER = nil
REF_RESOLVER = proc { |uri| raise UnknownRef, uri.to_s }
REGEXP_RESOLVER = 'ruby'
OUTPUT_FORMAT = 'classic'
RESOLVE_ENUMERATORS = false
ACCESS_MODE = nil
end

attr_accessor(
:base_uri,
:meta_schema,
:vocabulary,
:format,
:formats,
:content_encodings,
:content_media_types,
:keywords,
:before_property_validation,
:after_property_validation,
:insert_property_defaults,
:property_default_resolver,
:ref_resolver,
:regexp_resolver,
:output_format,
:resolve_enumerators,
:access_mode
)

def initialize
@base_uri = Defaults::BASE_URI
@meta_schema = Defaults::META_SCHEMA
@vocabulary = Defaults::VOCABULARY
@format = Defaults::FORMAT
@formats = Defaults::FORMATS
@content_encodings = Defaults::CONTENT_ENCODINGS
@content_media_types = Defaults::CONTENT_MEDIA_TYPES
@keywords = Defaults::KEYWORDS
@before_property_validation = Defaults::BEFORE_PROPERTY_VALIDATION
@after_property_validation = Defaults::AFTER_PROPERTY_VALIDATION
@insert_property_defaults = Defaults::INSERT_PROPERTY_DEFAULTS
@property_default_resolver = Defaults::PROPERTY_DEFAULT_RESOLVER
@ref_resolver = Defaults::REF_RESOLVER
@regexp_resolver = Defaults::REGEXP_RESOLVER
@output_format = Defaults::OUTPUT_FORMAT
@resolve_enumerators = Defaults::RESOLVE_ENUMERATORS
@access_mode = Defaults::ACCESS_MODE
Configuration = Struct.new(
:base_uri, :meta_schema, :vocabulary, :format, :formats, :content_encodings, :content_media_types, :keywords,
:before_property_validation, :after_property_validation, :insert_property_defaults, :property_default_resolver,
:ref_resolver, :regexp_resolver, :output_format, :resolve_enumerators, :access_mode,
keyword_init: true
) do
def initialize(
base_uri: URI('json-schemer://schema'),
meta_schema: Draft202012::BASE_URI.to_s,
vocabulary: nil,
format: true,
formats: {},
content_encodings: {},
content_media_types: {},
keywords: {},
before_property_validation: [],
after_property_validation: [],
insert_property_defaults: false,
property_default_resolver: nil,
ref_resolver: proc { |uri| raise UnknownRef, uri.to_s },
regexp_resolver: 'ruby',
output_format: 'classic',
resolve_enumerators: false,
access_mode: nil
)
super
end
end
end
46 changes: 29 additions & 17 deletions test/configuration_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ def run_configuration_test(option, default: (skip_default = true), test:)

if default.nil?
assert_nil(original)
elsif default.respond_to?(:call)
default.call(original)
elsif !skip_default
assert_equal(default, original)
end
Expand All @@ -29,15 +31,15 @@ def test_configure
def test_base_uri
run_configuration_test(
:base_uri,
default: JSONSchemer::Configuration::Defaults::BASE_URI,
default: URI('json-schemer://schema'),
test: URI('some-other://schema')
)
end

def test_meta_schema
run_configuration_test(
:meta_schema,
default: JSONSchemer::Configuration::Defaults::META_SCHEMA,
default: 'https://json-schema.org/draft/2020-12/schema',
test: JSONSchemer.draft201909
)
end
Expand All @@ -62,23 +64,23 @@ def test_string_meta_schema
def test_vocabulary
run_configuration_test(
:vocabulary,
default: JSONSchemer::Configuration::Defaults::VOCABULARY,
default: nil,
test: { 'json-schemer://draft4' => true }
)
end

def test_format
run_configuration_test(
:format,
default: JSONSchemer::Configuration::Defaults::FORMAT,
default: true,
test: false
)
end

def test_formats
run_configuration_test(
:formats,
default: JSONSchemer::Configuration::Defaults::FORMATS,
default: {},
test: {
'some-format' => lambda { |instance, _format| true }
}
Expand All @@ -88,7 +90,7 @@ def test_formats
def test_content_encodings
run_configuration_test(
:content_encodings,
default: JSONSchemer::Configuration::Defaults::CONTENT_ENCODINGS,
default: {},
test: {
'lowercase' => lambda { |instance| [true, instance&.downcase] }
}
Expand All @@ -98,7 +100,7 @@ def test_content_encodings
def test_content_media_types
run_configuration_test(
:content_media_types,
default: JSONSchemer::Configuration::Defaults::CONTENT_MEDIA_TYPES,
default: {},
test: {
'text/csv' => lambda do |instance|
[true, CSV.parse(instance)]
Expand All @@ -112,7 +114,7 @@ def test_content_media_types
def test_keywords
run_configuration_test(
:keywords,
default: JSONSchemer::Configuration::Defaults::KEYWORDS,
default: {},
test: {
'even' => lambda { |data, curr_schema, _pointer| curr_schema.fetch('even') == data.to_i.even? }
}
Expand All @@ -122,71 +124,75 @@ def test_keywords
def test_before_property_validation
run_configuration_test(
:before_property_validation,
default: JSONSchemer::Configuration::Defaults::BEFORE_PROPERTY_VALIDATION,
default: [],
test: ['something']
)
end

def test_after_property_validation
run_configuration_test(
:after_property_validation,
default: JSONSchemer::Configuration::Defaults::AFTER_PROPERTY_VALIDATION,
default: [],
test: ['something']
)
end

def test_insert_property_defaults
run_configuration_test(
:insert_property_defaults,
default: JSONSchemer::Configuration::Defaults::INSERT_PROPERTY_DEFAULTS,
default: false,
test: true
)
end

def test_property_default_resolver
run_configuration_test(
:property_default_resolver,
default: JSONSchemer::Configuration::Defaults::PROPERTY_DEFAULT_RESOLVER,
default: nil,
test: lambda { |instance, property, results_with_tree_validity| true }
)
end

def test_ref_resolver
run_configuration_test(
:ref_resolver,
default: JSONSchemer::Configuration::Defaults::REF_RESOLVER,
default: lambda do |ref_resolver|
assert_raises(JSONSchemer::UnknownRef) do
ref_resolver.call(URI('example'))
end
end,
test: lambda { |uri| { 'type' => 'string' } }
)
end

def test_regexp_resolver
run_configuration_test(
:regexp_resolver,
default: JSONSchemer::Configuration::Defaults::REGEXP_RESOLVER,
default: 'ruby',
test: 'ecma'
)
end

def test_output_format
run_configuration_test(
:output_format,
default: JSONSchemer::Configuration::Defaults::OUTPUT_FORMAT,
default: 'classic',
test: 'basic'
)
end

def test_resolve_enumerators
run_configuration_test(
:resolve_enumerators,
default: JSONSchemer::Configuration::Defaults::RESOLVE_ENUMERATORS,
default: false,
test: true
)
end

def test_access_mode
run_configuration_test(
:access_mode,
default: JSONSchemer::Configuration::Defaults::ACCESS_MODE,
default: nil,
test: "write"
)
end
Expand All @@ -201,4 +207,10 @@ def test_configuration_option_and_override
assert(JSONSchemer.schema({ 'format' => 'time' }, configuration: configuration, format: true).valid?('08:30:06Z'))
refute(JSONSchemer.schema({ 'format' => 'time' }, configuration: configuration, format: true).valid?('X'))
end

def test_configuration_keyword_init
configuration = JSONSchemer::Configuration.new(:format => false)
refute(JSONSchemer.schema({ 'format' => 'time' }).valid?('X'))
assert(JSONSchemer.schema({ 'format' => 'time' }, configuration: configuration).valid?('X'))
end
end
2 changes: 1 addition & 1 deletion test/json_schemer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ def test_default_meta_schema

def test_draft4_default_id
assert_equal(
JSONSchemer::Configuration::Defaults::BASE_URI,
URI('json-schemer://schema'),
JSONSchemer.schema(true, :meta_schema => JSONSchemer::Draft4::BASE_URI.to_s).base_uri
)
end
Expand Down

0 comments on commit c1507fe

Please sign in to comment.