json_schemer 0.2.21 → 0.2.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed760df49bc348a5011d6baf6416462f0069b31a8c1ef99550913d30a8a8a41e
4
- data.tar.gz: c271118e1a2f8c26de0aace952e10340642536b44cd3b88f91ea22aa11c9bd0a
3
+ metadata.gz: bc9ff5876e71054ee601dc4464c99560e86557796ef792e36512e1f08725a065
4
+ data.tar.gz: 5ee26787348f3aecb1a591c38c7bccc7aaf4166fd14d1299999d426ecaa15893
5
5
  SHA512:
6
- metadata.gz: 737e7a7888a61e8f2807e0307c8a96653943a7b88d27bb2fa4666a806f514f89274643b96a0dd48eb4eb940cfd0fd76d9254827360f2a53808263b66e25fc932
7
- data.tar.gz: 522393b56be1b0ad983785b2b4ffe2268b11649336a151934260800b099f4160850c85dec19a44ace008cfbf5c6a208f7c53b8e04bf939ab86c8bdd75d6b873e
6
+ metadata.gz: 9b5dc77e4a136d9dd7ab774e530880188c3125647535707d67b9b09e615e538bfe826249fd53644d3dc452e8387667bc74a3e24ec21f847145bc4b92de15371d
7
+ data.tar.gz: 160ead197e1f0a61090e936a526e4753156b185e4049db6d5ca7efb9c8bbf4430ebd9a0eff952299fc5bdb0b93a063745d9be3e919bee80ce93c05864a9655b7
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- json_schemer (0.2.21)
4
+ json_schemer (0.2.22)
5
5
  ecma-re-validator (~> 0.3)
6
6
  hana (~> 1.3)
7
7
  regexp_parser (~> 2.0)
data/README.md CHANGED
@@ -110,7 +110,14 @@ JSONSchemer.schema(
110
110
  # 'net/http'/proc/lambda/respond_to?(:call)
111
111
  # 'net/http': proc { |uri| JSON.parse(Net::HTTP.get(uri)) }
112
112
  # default: proc { |uri| raise UnknownRef, uri.to_s }
113
- ref_resolver: 'net/http'
113
+ ref_resolver: 'net/http',
114
+
115
+ # use different method to match regexes
116
+ # 'ecma'/'ruby'/proc/lambda/respond_to?(:call)
117
+ # default: 'ecma'
118
+ regexp_resolver: proc do |pattern|
119
+ RE2::Regexp.new(pattern)
120
+ end
114
121
  )
115
122
  ```
116
123
 
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ module JSONSchemer
3
+ class CachedResolver
4
+ def initialize(&resolver)
5
+ @resolver = resolver
6
+ @cache = {}
7
+ end
8
+
9
+ def call(*args)
10
+ @cache[args] = @resolver.call(*args) unless @cache.key?(args)
11
+ @cache[args]
12
+ end
13
+ end
14
+
15
+ class CachedRefResolver < CachedResolver; end
16
+ end
@@ -30,6 +30,14 @@ module JSONSchemer
30
30
  :eol => '\z'
31
31
  }.freeze
32
32
 
33
+ ECMA_262_REGEXP_RESOLVER = proc do |pattern|
34
+ Regexp.new(
35
+ Regexp::Scanner.scan(pattern).map do |type, token, text|
36
+ type == :anchor ? RUBY_REGEX_ANCHORS_TO_ECMA_262.fetch(token, text) : text
37
+ end.join
38
+ )
39
+ end
40
+
33
41
  INSERT_DEFAULT_PROPERTY = proc do |data, property, property_schema, _parent|
34
42
  if !data.key?(property) && property_schema.is_a?(Hash) && property_schema.key?('default')
35
43
  data[property] = property_schema.fetch('default').clone
@@ -44,7 +52,8 @@ module JSONSchemer
44
52
  after_property_validation: nil,
45
53
  formats: nil,
46
54
  keywords: nil,
47
- ref_resolver: DEFAULT_REF_RESOLVER
55
+ ref_resolver: DEFAULT_REF_RESOLVER,
56
+ regexp_resolver: 'ecma'
48
57
  )
49
58
  raise InvalidSymbolKey, 'schemas must use string keys' if schema.is_a?(Hash) && !schema.empty? && !schema.first.first.is_a?(String)
50
59
  @root = schema
@@ -54,7 +63,15 @@ module JSONSchemer
54
63
  @after_property_validation = [*after_property_validation]
55
64
  @formats = formats
56
65
  @keywords = keywords
57
- @ref_resolver = ref_resolver == 'net/http' ? CachedRefResolver.new(&NET_HTTP_REF_RESOLVER) : ref_resolver
66
+ @ref_resolver = ref_resolver == 'net/http' ? CachedResolver.new(&NET_HTTP_REF_RESOLVER) : ref_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
58
75
  end
59
76
 
60
77
  def valid?(data)
@@ -204,7 +221,7 @@ module JSONSchemer
204
221
 
205
222
  private
206
223
 
207
- attr_reader :root, :formats, :keywords, :ref_resolver
224
+ attr_reader :root, :formats, :keywords, :ref_resolver, :regexp_resolver
208
225
 
209
226
  def id_keyword
210
227
  ID_KEYWORD
@@ -228,7 +245,8 @@ module JSONSchemer
228
245
  format: format?,
229
246
  formats: formats,
230
247
  keywords: keywords,
231
- ref_resolver: ref_resolver
248
+ ref_resolver: ref_resolver,
249
+ regexp_resolver: regexp_resolver
232
250
  )
233
251
  end
234
252
 
@@ -398,7 +416,7 @@ module JSONSchemer
398
416
 
399
417
  yield error(instance, 'maxLength') if max_length && data.size > max_length
400
418
  yield error(instance, 'minLength') if min_length && data.size < min_length
401
- yield error(instance, 'pattern') if pattern && ecma_262_regex(pattern) !~ data
419
+ yield error(instance, 'pattern') if pattern && resolve_regexp(pattern) !~ data
402
420
  yield error(instance, 'format') if format? && spec_format?(format) && !valid_spec_format?(data, format)
403
421
 
404
422
  if content_encoding || content_media_type
@@ -551,7 +569,7 @@ module JSONSchemer
551
569
 
552
570
  if pattern_properties
553
571
  regex_pattern_properties ||= pattern_properties.map do |pattern, property_schema|
554
- [pattern, ecma_262_regex(pattern), property_schema]
572
+ [pattern, resolve_regexp(pattern), property_schema]
555
573
  end
556
574
  regex_pattern_properties.each do |pattern, regex, property_schema|
557
575
  if regex.match?(key)
@@ -596,15 +614,6 @@ module JSONSchemer
596
614
  nil
597
615
  end
598
616
 
599
- def ecma_262_regex(pattern)
600
- @ecma_262_regex ||= {}
601
- @ecma_262_regex[pattern] ||= Regexp.new(
602
- Regexp::Scanner.scan(pattern).map do |type, token, text|
603
- type == :anchor ? RUBY_REGEX_ANCHORS_TO_ECMA_262.fetch(token, text) : text
604
- end.join
605
- )
606
- end
607
-
608
617
  def join_uri(a, b)
609
618
  b = URI.parse(b) if b
610
619
  if a && b && a.relative? && b.relative?
@@ -652,6 +661,10 @@ module JSONSchemer
652
661
  def resolve_ref(uri)
653
662
  ref_resolver.call(uri) || raise(InvalidRefResolution, uri.to_s)
654
663
  end
664
+
665
+ def resolve_regexp(pattern)
666
+ regexp_resolver.call(pattern) || raise(InvalidRegexpResolution, pattern)
667
+ end
655
668
  end
656
669
  end
657
670
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module JSONSchemer
3
- VERSION = '0.2.21'
3
+ VERSION = '0.2.22'
4
4
  end
data/lib/json_schemer.rb CHANGED
@@ -17,7 +17,7 @@ require 'uri_template'
17
17
  require 'json_schemer/version'
18
18
  require 'json_schemer/format'
19
19
  require 'json_schemer/errors'
20
- require 'json_schemer/cached_ref_resolver'
20
+ require 'json_schemer/cached_resolver'
21
21
  require 'json_schemer/schema/base'
22
22
  require 'json_schemer/schema/draft4'
23
23
  require 'json_schemer/schema/draft6'
@@ -27,6 +27,7 @@ module JSONSchemer
27
27
  class UnsupportedMetaSchema < StandardError; end
28
28
  class UnknownRef < StandardError; end
29
29
  class InvalidRefResolution < StandardError; end
30
+ class InvalidRegexpResolution < StandardError; end
30
31
  class InvalidFileURI < StandardError; end
31
32
  class InvalidSymbolKey < StandardError; end
32
33
 
@@ -59,7 +60,7 @@ module JSONSchemer
59
60
  if options.key?(:ref_resolver)
60
61
  schema = FILE_URI_REF_RESOLVER.call(uri)
61
62
  else
62
- ref_resolver = CachedRefResolver.new(&FILE_URI_REF_RESOLVER)
63
+ ref_resolver = CachedResolver.new(&FILE_URI_REF_RESOLVER)
63
64
  schema = ref_resolver.call(uri)
64
65
  options[:ref_resolver] = ref_resolver
65
66
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schemer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.21
4
+ version: 0.2.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Harsha
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-05 00:00:00.000000000 Z
11
+ date: 2022-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -129,7 +129,7 @@ files:
129
129
  - exe/json_schemer
130
130
  - json_schemer.gemspec
131
131
  - lib/json_schemer.rb
132
- - lib/json_schemer/cached_ref_resolver.rb
132
+ - lib/json_schemer/cached_resolver.rb
133
133
  - lib/json_schemer/errors.rb
134
134
  - lib/json_schemer/format.rb
135
135
  - lib/json_schemer/schema/base.rb
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
- module JSONSchemer
3
- class CachedRefResolver
4
- def initialize(&ref_resolver)
5
- @ref_resolver = ref_resolver
6
- @cache = {}
7
- end
8
-
9
- def call(uri)
10
- @cache[uri] = @ref_resolver.call(uri) unless @cache.key?(uri)
11
- @cache[uri]
12
- end
13
- end
14
- end