Skip to content

Commit 5e9cb7b

Browse files
Merge pull request #118 from davishmcclurg/ruby-regexp-resolver
Add named regexp resolvers
2 parents 0de8f1e + 890b549 commit 5e9cb7b

3 files changed

Lines changed: 24 additions & 4 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ JSONSchemer.schema(
113113
ref_resolver: 'net/http',
114114

115115
# use different method to match regexes
116-
# Proc/lambda/respond_to?(:call)
116+
# 'ecma'/'ruby'/proc/lambda/respond_to?(:call)
117+
# default: 'ecma'
117118
regexp_resolver: proc do |pattern|
118119
RE2::Regexp.new(pattern)
119120
end

lib/json_schemer/schema/base.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def merge(
3030
:eol => '\z'
3131
}.freeze
3232

33-
DEFAULT_REGEXP_RESOLVER = proc do |pattern|
33+
ECMA_262_REGEXP_RESOLVER = proc do |pattern|
3434
Regexp.new(
3535
Regexp::Scanner.scan(pattern).map do |type, token, text|
3636
type == :anchor ? RUBY_REGEX_ANCHORS_TO_ECMA_262.fetch(token, text) : text
@@ -53,7 +53,7 @@ def initialize(
5353
formats: nil,
5454
keywords: nil,
5555
ref_resolver: DEFAULT_REF_RESOLVER,
56-
regexp_resolver: CachedResolver.new(&DEFAULT_REGEXP_RESOLVER)
56+
regexp_resolver: 'ecma'
5757
)
5858
raise InvalidSymbolKey, 'schemas must use string keys' if schema.is_a?(Hash) && !schema.empty? && !schema.first.first.is_a?(String)
5959
@root = schema
@@ -64,7 +64,14 @@ def initialize(
6464
@formats = formats
6565
@keywords = keywords
6666
@ref_resolver = ref_resolver == 'net/http' ? CachedResolver.new(&NET_HTTP_REF_RESOLVER) : ref_resolver
67-
@regexp_resolver = regexp_resolver
67+
@regexp_resolver = case regexp_resolver
68+
when 'ecma'
69+
CachedResolver.new(&ECMA_262_REGEXP_RESOLVER)
70+
when 'ruby'
71+
CachedResolver.new(&Regexp.method(:new))
72+
else
73+
regexp_resolver
74+
end
6875
end
6976

7077
def valid?(data)

test/json_schemer_test.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,18 @@ def initialize(*args)
933933
assert_equal(1, new_regexp_class.counts)
934934
end
935935

936+
def test_it_allows_named_regexp_resolvers
937+
schema = JSONSchemer.schema({ 'pattern' => '^test$' })
938+
assert(schema.valid?("test"))
939+
refute(schema.valid?("\ntest\n"))
940+
schema = JSONSchemer.schema({ 'pattern' => '^test$' }, :regexp_resolver => 'ecma')
941+
assert(schema.valid?("test"))
942+
refute(schema.valid?("\ntest\n"))
943+
schema = JSONSchemer.schema({ 'pattern' => '^test$' }, :regexp_resolver => 'ruby')
944+
assert(schema.valid?("test"))
945+
assert(schema.valid?("\ntest\n"))
946+
end
947+
936948
def test_it_raises_for_invalid_regexp_resolution
937949
schema = JSONSchemer.schema(
938950
{ 'pattern' => 'whatever' },

0 commit comments

Comments
 (0)