json_schemer 0.1.0 → 0.1.1

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: 0a14b7cec8b7dd7aa1b10acb4e47445fdd66ea218862c1f40f65221e789d0fdb
4
- data.tar.gz: 8d84709159df2cfdafdef42cd9bcc982644b89713857faad3ff563a74f4ef937
3
+ metadata.gz: f44b977f6f07e9dfbb34d58681bc0b22059143bc761364b8c8edb81b5ba7fb16
4
+ data.tar.gz: f606d14d205b33bb4f1c221cb6526e79afee01d965d61883763c8f516fabd69e
5
5
  SHA512:
6
- metadata.gz: '09cad7b2683c64f022ed697239c0083882efd769a292561ce2b3027dc5162831036faa9161572a8d8e9f3248e169acc76658fedfbcd42df5d92df787e5612ad4'
7
- data.tar.gz: 181f8e84068f344a9f662952592eb283a820363dba4e2162af42bcd9dc8313d9d4591bb43faafa9a6a46ebf420a1af27aa17df1fea73d107a59bf22e16d90661
6
+ metadata.gz: 046d14ee062722084b3b7954c488b6e86ba89b5ba112879b53ecf173c3c969d183ec4baa381c2f30eca61f6595fbe199337cff5ecfbb4eb7226d1f662d4b80e9
7
+ data.tar.gz: 684807637dc7510c868fc173716a1846c35368db792bd8fa1a8e2de605d3e58901df668b451567610294bd989ea057a6fb28e02bd59c2bd4d1df0b4f7571d629
@@ -1,27 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- json_schemer (0.1.0)
4
+ json_schemer (0.1.1)
5
5
  ecma-re-validator (~> 0.1.2)
6
6
  hana (~> 1.3.3)
7
- rdf (~> 3.0.1)
8
7
  uri_template (~> 0.7.0)
9
8
 
10
9
  GEM
11
10
  remote: https://rubygems.org/
12
11
  specs:
13
- concurrent-ruby (1.0.5)
14
12
  ecma-re-validator (0.1.2)
15
13
  regexp_parser (~> 0.2)
16
- hamster (3.0.0)
17
- concurrent-ruby (~> 1.0)
18
14
  hana (1.3.3)
19
- link_header (0.0.8)
20
15
  minitest (5.11.1)
21
16
  rake (10.5.0)
22
- rdf (3.0.1)
23
- hamster (~> 3.0)
24
- link_header (~> 0.0, >= 0.0.8)
25
17
  regexp_parser (0.4.9)
26
18
  uri_template (0.7.0)
27
19
 
@@ -24,8 +24,14 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "minitest", "~> 5.0"
26
26
 
27
+ # spec.add_development_dependency "benchmark-ips", "~> 2.7.2"
28
+ # spec.add_development_dependency "jschema", "~> 0.2.1"
29
+ # spec.add_development_dependency "json-schema", "~> 2.8.0"
30
+ # spec.add_development_dependency "json_schema", "~> 0.17.0"
31
+ # spec.add_development_dependency "json_validation", "~> 0.1.0"
32
+ # spec.add_development_dependency "jsonschema", "~> 2.0.2"
33
+
27
34
  spec.add_runtime_dependency "ecma-re-validator", "~> 0.1.2"
28
35
  spec.add_runtime_dependency "hana", "~> 1.3.3"
29
- spec.add_runtime_dependency "rdf", "~> 3.0.1"
30
36
  spec.add_runtime_dependency "uri_template", "~> 0.7.0"
31
37
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "json_schemer/version"
4
+ require "json_schemer/format"
4
5
 
5
6
  require "base64"
6
7
  require "ecma-re-validator"
@@ -8,7 +9,6 @@ require "hana"
8
9
  require "ipaddr"
9
10
  require "json"
10
11
  require 'net/http'
11
- require "rdf"
12
12
  require "time"
13
13
  require "uri"
14
14
  require "uri_template"
@@ -16,13 +16,6 @@ require "uri_template"
16
16
  module JSONSchemer
17
17
  class Schema
18
18
  BOOLEANS = Set[true, false].freeze
19
- # this is no good
20
- EMAIL_REGEX = /\A[^@\s]+@([\p{L}\d-]+\.)+[\p{L}\d\-]{2,}\z/i.freeze
21
- LABEL_REGEX_STRING = '\p{L}([\p{L}\p{N}\-]*[\p{L}\p{N}])?'
22
- HOSTNAME_REGEX = /\A(#{LABEL_REGEX_STRING}\.)*#{LABEL_REGEX_STRING}\z/i.freeze
23
- JSON_POINTER_REGEX_STRING = '(\/([^~\/]|~[01])*)*'
24
- JSON_POINTER_REGEX = /\A#{JSON_POINTER_REGEX_STRING}\z/.freeze
25
- RELATIVE_JSON_POINTER_REGEX = /\A(0|[1-9]\d*)(#|#{JSON_POINTER_REGEX_STRING})?\z/.freeze
26
19
 
27
20
  def initialize(schema)
28
21
  @root = schema
@@ -215,7 +208,7 @@ module JSONSchemer
215
208
 
216
209
  yield error(data, schema, pointer, 'maxLength') if max_length && data.size > max_length
217
210
  yield error(data, schema, pointer, 'minLength') if min_length && data.size < min_length
218
- yield error(data, schema, pointer, 'pattern') if pattern && !Regexp.new(pattern).match?(data)
211
+ yield error(data, schema, pointer, 'pattern') if pattern && Regexp.new(pattern) !~ data
219
212
 
220
213
  validate_string_format(data, schema, pointer, format, &Proc.new) if format
221
214
 
@@ -252,9 +245,9 @@ module JSONSchemer
252
245
  when 'time'
253
246
  valid_date_time?("2001-02-03T#{data}")
254
247
  when 'email'
255
- data.ascii_only? && EMAIL_REGEX.match?(data)
248
+ data.ascii_only? && valid_email?(data)
256
249
  when 'idn-email'
257
- EMAIL_REGEX.match?(data)
250
+ valid_email?(data)
258
251
  when 'hostname'
259
252
  data.ascii_only? && valid_hostname?(data)
260
253
  when 'idn-hostname'
@@ -264,19 +257,19 @@ module JSONSchemer
264
257
  when 'ipv6'
265
258
  valid_ip?(data, :v6)
266
259
  when 'uri'
267
- data.ascii_only? && RDF::URI::IRI.match?(data)
260
+ data.ascii_only? && valid_iri?(data)
268
261
  when 'uri-reference'
269
- data.ascii_only? && (RDF::URI::IRI.match?(data) || RDF::URI::IRELATIVE_REF.match?(data))
262
+ data.ascii_only? && (valid_iri?(data) || valid_iri_reference?(data))
270
263
  when 'iri'
271
- RDF::URI::IRI.match?(data)
264
+ valid_iri?(data)
272
265
  when 'iri-reference'
273
- RDF::URI::IRI.match?(data) || RDF::URI::IRELATIVE_REF.match?(data)
266
+ valid_iri?(data) || valid_iri_reference?(data)
274
267
  when 'uri-template'
275
268
  valid_uri_template?(data)
276
269
  when 'json-pointer'
277
270
  valid_json_pointer?(data)
278
271
  when 'relative-json-pointer'
279
- RELATIVE_JSON_POINTER_REGEX.match?(data)
272
+ valid_relative_json_pointer?(data)
280
273
  when 'regex'
281
274
  EcmaReValidator.valid?(data)
282
275
  end
@@ -361,7 +354,7 @@ module JSONSchemer
361
354
  [Regexp.new(pattern), property_schema]
362
355
  end
363
356
  regex_pattern_properties.each do |regex, property_schema|
364
- if regex.match?(key)
357
+ if regex =~ key
365
358
  validate(value, property_schema, "#{pointer}/#{key}", parent_uri, &block)
366
359
  matched_key = true
367
360
  end
@@ -398,8 +391,12 @@ module JSONSchemer
398
391
  false
399
392
  end
400
393
 
394
+ def valid_email?(data)
395
+ !!(Format::EMAIL_REGEX =~ data)
396
+ end
397
+
401
398
  def valid_hostname?(data)
402
- HOSTNAME_REGEX.match?(data) && data.split('.').all? { |label| label.size <= 63 }
399
+ !!(Format::HOSTNAME_REGEX =~ data && data.split('.').all? { |label| label.size <= 63 })
403
400
  end
404
401
 
405
402
  def valid_ip?(data, type)
@@ -409,6 +406,14 @@ module JSONSchemer
409
406
  false
410
407
  end
411
408
 
409
+ def valid_iri?(data)
410
+ !!(Format::IRI =~ data)
411
+ end
412
+
413
+ def valid_iri_reference?(data)
414
+ !!(Format::IRELATIVE_REF =~ data)
415
+ end
416
+
412
417
  def valid_uri_template?(data)
413
418
  URITemplate.new(data)
414
419
  true
@@ -417,7 +422,11 @@ module JSONSchemer
417
422
  end
418
423
 
419
424
  def valid_json_pointer?(data)
420
- JSON_POINTER_REGEX.match?(data)
425
+ !!(Format::JSON_POINTER_REGEX =~ data)
426
+ end
427
+
428
+ def valid_relative_json_pointer?(data)
429
+ !!(Format::RELATIVE_JSON_POINTER_REGEX =~ data)
421
430
  end
422
431
 
423
432
  def join_uri(a, b)
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JSONSchemer::Format
4
+ # this is no good
5
+ EMAIL_REGEX = /\A[^@\s]+@([\p{L}\d-]+\.)+[\p{L}\d\-]{2,}\z/i.freeze
6
+ LABEL_REGEX_STRING = '\p{L}([\p{L}\p{N}\-]*[\p{L}\p{N}])?'
7
+ HOSTNAME_REGEX = /\A(#{LABEL_REGEX_STRING}\.)*#{LABEL_REGEX_STRING}\z/i.freeze
8
+ JSON_POINTER_REGEX_STRING = '(\/([^~\/]|~[01])*)*'
9
+ JSON_POINTER_REGEX = /\A#{JSON_POINTER_REGEX_STRING}\z/.freeze
10
+ RELATIVE_JSON_POINTER_REGEX = /\A(0|[1-9]\d*)(#|#{JSON_POINTER_REGEX_STRING})?\z/.freeze
11
+
12
+ # https://github.com/ruby-rdf/rdf
13
+
14
+ # IRI components
15
+ UCSCHAR = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
16
+ [\\u00A0-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFEF]|
17
+ [\\u{10000}-\\u{1FFFD}]|[\\u{20000}-\\u{2FFFD}]|[\\u{30000}-\\u{3FFFD}]|
18
+ [\\u{40000}-\\u{4FFFD}]|[\\u{50000}-\\u{5FFFD}]|[\\u{60000}-\\u{6FFFD}]|
19
+ [\\u{70000}-\\u{7FFFD}]|[\\u{80000}-\\u{8FFFD}]|[\\u{90000}-\\u{9FFFD}]|
20
+ [\\u{A0000}-\\u{AFFFD}]|[\\u{B0000}-\\u{BFFFD}]|[\\u{C0000}-\\u{CFFFD}]|
21
+ [\\u{D0000}-\\u{DFFFD}]|[\\u{E1000}-\\u{EFFFD}]
22
+ EOS
23
+ IPRIVATE = Regexp.compile("[\\uE000-\\uF8FF]|[\\u{F0000}-\\u{FFFFD}]|[\\u100000-\\u10FFFD]").freeze
24
+ SCHEME = Regexp.compile("[A-Za-z](?:[A-Za-z0-9+-\.])*").freeze
25
+ PORT = Regexp.compile("[0-9]*").freeze
26
+ IP_LITERAL = Regexp.compile("\\[[0-9A-Fa-f:\\.]*\\]").freeze # Simplified, no IPvFuture
27
+ PCT_ENCODED = Regexp.compile("%[0-9A-Fa-f][0-9A-Fa-f]").freeze
28
+ GEN_DELIMS = Regexp.compile("[:/\\?\\#\\[\\]@]").freeze
29
+ SUB_DELIMS = Regexp.compile("[!\\$&'\\(\\)\\*\\+,;=]").freeze
30
+ RESERVED = Regexp.compile("(?:#{GEN_DELIMS}|#{SUB_DELIMS})").freeze
31
+ UNRESERVED = Regexp.compile("[A-Za-z0-9\._~-]").freeze
32
+
33
+ IUNRESERVED = Regexp.compile("[A-Za-z0-9\._~-]|#{UCSCHAR}").freeze
34
+
35
+ IPCHAR = Regexp.compile("(?:#{IUNRESERVED}|#{PCT_ENCODED}|#{SUB_DELIMS}|:|@)").freeze
36
+
37
+ IQUERY = Regexp.compile("(?:#{IPCHAR}|#{IPRIVATE}|/|\\?)*").freeze
38
+
39
+ IFRAGMENT = Regexp.compile("(?:#{IPCHAR}|/|\\?)*").freeze.freeze
40
+
41
+ ISEGMENT = Regexp.compile("(?:#{IPCHAR})*").freeze
42
+ ISEGMENT_NZ = Regexp.compile("(?:#{IPCHAR})+").freeze
43
+ ISEGMENT_NZ_NC = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS})|@)+").freeze
44
+
45
+ IPATH_ABEMPTY = Regexp.compile("(?:/#{ISEGMENT})*").freeze
46
+ IPATH_ABSOLUTE = Regexp.compile("/(?:(?:#{ISEGMENT_NZ})(/#{ISEGMENT})*)?").freeze
47
+ IPATH_NOSCHEME = Regexp.compile("(?:#{ISEGMENT_NZ_NC})(?:/#{ISEGMENT})*").freeze
48
+ IPATH_ROOTLESS = Regexp.compile("(?:#{ISEGMENT_NZ})(?:/#{ISEGMENT})*").freeze
49
+ IPATH_EMPTY = Regexp.compile("").freeze
50
+
51
+ IREG_NAME = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS}))*").freeze
52
+ IHOST = Regexp.compile("(?:#{IP_LITERAL})|(?:#{IREG_NAME})").freeze
53
+ IUSERINFO = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS})|:)*").freeze
54
+ IAUTHORITY = Regexp.compile("(?:#{IUSERINFO}@)?#{IHOST}(?::#{PORT})?").freeze
55
+
56
+ IRELATIVE_PART = Regexp.compile("(?:(?://#{IAUTHORITY}(?:#{IPATH_ABEMPTY}))|(?:#{IPATH_ABSOLUTE})|(?:#{IPATH_NOSCHEME})|(?:#{IPATH_EMPTY}))").freeze
57
+ IRELATIVE_REF = Regexp.compile("^#{IRELATIVE_PART}(?:\\?#{IQUERY})?(?:\\##{IFRAGMENT})?$").freeze
58
+
59
+ IHIER_PART = Regexp.compile("(?:(?://#{IAUTHORITY}#{IPATH_ABEMPTY})|(?:#{IPATH_ABSOLUTE})|(?:#{IPATH_ROOTLESS})|(?:#{IPATH_EMPTY}))").freeze
60
+ IRI = Regexp.compile("^#{SCHEME}:(?:#{IHIER_PART})(?:\\?#{IQUERY})?(?:\\##{IFRAGMENT})?$").freeze
61
+ end
@@ -1,3 +1,3 @@
1
1
  module JSONSchemer
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  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.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Harsha
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-23 00:00:00.000000000 Z
11
+ date: 2018-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 1.3.3
83
- - !ruby/object:Gem::Dependency
84
- name: rdf
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: 3.0.1
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: 3.0.1
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: uri_template
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -127,6 +113,7 @@ files:
127
113
  - bin/setup
128
114
  - json_schemer.gemspec
129
115
  - lib/json_schemer.rb
116
+ - lib/json_schemer/format.rb
130
117
  - lib/json_schemer/version.rb
131
118
  homepage: https://github.com/davishmcclurg/json_schemer
132
119
  licenses: