json-schema 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/json-schema/validator.rb +72 -114
  2. metadata +4 -4
@@ -5,18 +5,21 @@ require 'bigdecimal'
5
5
 
6
6
  module JSON
7
7
 
8
- class ValidationError < Exception
9
- attr_reader :fragments, :schema
10
-
11
- def initialize(message, fragments, schema)
12
- @fragments = fragments
13
- @schema = schema
14
- super(message)
15
- end
16
- end
17
-
18
- class Validator
8
+ class ValidationError < Exception
9
+ attr_reader :fragments, :schema
19
10
 
11
+ def initialize(message, fragments, schema)
12
+ @fragments = fragments
13
+ @schema = schema
14
+ super(message)
15
+ end
16
+ end
17
+
18
+ class Validator
19
+
20
+ @@schemas = {}
21
+ @@cache_schemas = false
22
+
20
23
  ValidationMethods = [
21
24
  "type",
22
25
  "disallow",
@@ -42,10 +45,9 @@ module JSON
42
45
 
43
46
 
44
47
  def initialize(schema_data, data)
45
- @schemas = {}
46
48
  @base_schema = initialize_schema(schema_data)
47
49
  @data = initialize_data(data)
48
- @schemas[@base_schema.uri.to_s] = @base_schema
50
+ Validator.add_schema(@base_schema)
49
51
 
50
52
  build_schemas(@base_schema)
51
53
  end
@@ -55,8 +57,10 @@ module JSON
55
57
  def validate()
56
58
  begin
57
59
  validate_schema(@base_schema, @data, [])
60
+ Validator.clear_cache
58
61
  return true
59
62
  rescue ValidationError
63
+ Validator.clear_cache
60
64
  return false
61
65
  end
62
66
  end
@@ -66,7 +70,13 @@ module JSON
66
70
  # a ValidationError will be raised with links to the specific location that the first error
67
71
  # occurred during validation
68
72
  def validate2()
69
- validate_schema(@base_schema, @data, [])
73
+ begin
74
+ validate_schema(@base_schema, @data, [])
75
+ Validator.clear_cache
76
+ rescue ValidationError
77
+ Validator.clear_cache
78
+ raise $!
79
+ end
70
80
  nil
71
81
  end
72
82
 
@@ -453,7 +463,7 @@ module JSON
453
463
 
454
464
  # Grab the parent schema from the schema list
455
465
  schema_key = temp_uri.to_s.split("#")[0]
456
- ref_schema = @schemas[schema_key]
466
+ ref_schema = Validator.schemas[schema_key]
457
467
 
458
468
  if ref_schema
459
469
  # Perform fragment resolution to retrieve the appropriate level for the schema
@@ -495,10 +505,10 @@ module JSON
495
505
  uri.fragment = nil
496
506
  end
497
507
 
498
- if @schemas[uri.to_s].nil?
508
+ if Validator.schemas[uri.to_s].nil?
499
509
  begin
500
510
  schema = JSON::Schema.new(JSON.parse(open(uri.to_s).read), uri)
501
- @schemas[uri.to_s] = schema
511
+ Validator.add_schema(schema)
502
512
  build_schemas(schema)
503
513
  rescue JSON::ParserError
504
514
  # Don't rescue this error, we want JSON formatting issues to bubble up
@@ -513,69 +523,26 @@ module JSON
513
523
 
514
524
  # Build all schemas with IDs, mapping out the namespace
515
525
  def build_schemas(parent_schema)
516
- if parent_schema.schema["type"] && parent_schema.schema["type"].is_a?(Array) # If we're dealing with a Union type, there might be schemas a-brewin'
517
- parent_schema.schema["type"].each_with_index do |type,i|
518
- if type.is_a?(Hash)
519
- if type['$ref']
520
- load_ref_schema(parent_schema, type['$ref'])
521
- else
522
- schema_uri = parent_schema.uri.clone
523
- schema = JSON::Schema.new(type,schema_uri)
524
- if type['id']
525
- @schemas[schema.uri.to_s] = schema
526
- end
527
- build_schemas(schema)
528
- end
529
- end
530
- end
531
- end
532
526
 
533
- if parent_schema.schema["disallow"] && parent_schema.schema["disallow"].is_a?(Array) # If we're dealing with a Union type, there might be schemas a-brewin'
534
- parent_schema.schema["disallow"].each_with_index do |type,i|
535
- if type.is_a?(Hash)
536
- if type['$ref']
537
- load_ref_schema(parent_schema, type['$ref'])
538
- else
539
- type['id']
540
- schema_uri = parent_schema.uri.clone
541
- schema = JSON::Schema.new(type,schema_uri)
542
- if type['id']
543
- @schemas[schema.uri.to_s] = schema
544
- end
545
- build_schemas(schema)
527
+ # Check for schemas in union types
528
+ ["type", "disallow"].each do |key|
529
+ if parent_schema.schema[key] && parent_schema.schema[key].is_a?(Array)
530
+ parent_schema.schema[key].each_with_index do |type,i|
531
+ if type.is_a?(Hash)
532
+ handle_schema(parent_schema, type)
546
533
  end
547
534
  end
548
535
  end
549
536
  end
550
537
 
538
+ # All properties are schemas
551
539
  if parent_schema.schema["properties"]
552
540
  parent_schema.schema["properties"].each do |k,v|
553
- if v['$ref']
554
- load_ref_schema(parent_schema, v['$ref'])
555
- else
556
- schema_uri = parent_schema.uri.clone
557
- schema = JSON::Schema.new(v,schema_uri)
558
- if v['id']
559
- @schemas[schema.uri.to_s] = schema
560
- end
561
- build_schemas(schema)
562
- end
563
- end
564
- end
565
-
566
- if parent_schema.schema["additionalProperties"].is_a?(Hash)
567
- if parent_schema.schema["additionalProperties"]["$ref"]
568
- load_ref_schema(parent_schema, parent_schema.schema["additionalProperties"]["$ref"])
569
- else
570
- schema_uri = parent_schema.uri.clone
571
- schema = JSON::Schema.new(parent_schema.schema["additionalProperties"],schema_uri)
572
- if parent_schema.schema["additionalProperties"]['id']
573
- @schemas[schema.uri.to_s] = schema
574
- end
575
- build_schemas(schema)
541
+ handle_schema(parent_schema, v)
576
542
  end
577
543
  end
578
544
 
545
+ # Items are always schemas
579
546
  if parent_schema.schema["items"]
580
547
  items = parent_schema.schema["items"].clone
581
548
  single = false
@@ -584,57 +551,31 @@ module JSON
584
551
  single = true
585
552
  end
586
553
  items.each_with_index do |item,i|
587
- if item['$ref']
588
- load_ref_schema(parent_schema, item['$ref'])
589
- else
590
- schema_uri = parent_schema.uri.clone
591
- schema = JSON::Schema.new(item,schema_uri)
592
- if item['id']
593
- @schemas[schema.uri.to_s] = schema
594
- end
595
- build_schemas(schema)
596
- end
554
+ handle_schema(parent_schema, item)
597
555
  end
598
556
  end
599
557
 
600
- if parent_schema.schema["additionalItems"].is_a?(Hash)
601
- if parent_schema.schema["additionalItems"]['$ref']
602
- load_ref_schema(parent_schema, parent_schema.schema["additionalItems"]['$ref'])
603
- else
604
- schema_uri = parent_schema.uri.clone
605
- schema = JSON::Schema.new(parent_schema.schema["additionalItems"],schema_uri)
606
- if parent_schema.schema["additionalItems"]['id']
607
- @schemas[schema.uri.to_s] = schema
608
- end
609
- build_schemas(schema)
558
+ # Each of these might be schemas
559
+ ["additionalProperties", "additionalItems", "dependencies", "extends"].each do |key|
560
+ if parent_schema.schema[key].is_a?(Hash)
561
+ handle_schema(parent_schema, parent_schema.schema[key])
610
562
  end
611
563
  end
612
564
 
613
- if parent_schema.schema["dependencies"].is_a?(Hash)
614
- if parent_schema.schema["dependencies"]["$ref"]
615
- load_ref_schema(parent_schema, parent_schema.schema["dependencies"]['$ref'])
616
- else
617
- schema_uri = parent_schema.uri.clone
618
- schema = JSON::Schema.new(parent_schema.schema["dependencies"],schema_uri)
619
- if parent_schema.schema["dependencies"]['id']
620
- @schemas[schema.uri.to_s] = schema
621
- end
622
- build_schemas(schema)
623
- end
624
- end
625
-
626
- if parent_schema.schema["extends"].is_a?(Hash)
627
- if parent_schema.schema["extends"]['$ref']
628
- load_ref_schema(parent_schema, parent_schema.schema["extends"]['$ref'])
629
- else
630
- schema_uri = parent_schema.uri.clone
631
- schema = JSON::Schema.new(parent_schema.schema["extends"],schema_uri)
632
- if parent_schema.schema["extends"]['id']
633
- @schemas[schema.uri.to_s] = schema
634
- end
635
- build_schemas(schema)
636
- end
637
- end
565
+ end
566
+
567
+ # Either load a reference schema or create a new schema
568
+ def handle_schema(parent_schema, obj)
569
+ if obj['$ref']
570
+ load_ref_schema(parent_schema, obj['$ref'])
571
+ else
572
+ schema_uri = parent_schema.uri.clone
573
+ schema = JSON::Schema.new(obj,schema_uri)
574
+ if obj['id']
575
+ Validator.add_schema(schema)
576
+ end
577
+ build_schemas(schema)
578
+ end
638
579
  end
639
580
 
640
581
 
@@ -648,6 +589,23 @@ module JSON
648
589
  validator = JSON::Validator.new(schema, data)
649
590
  validator.validate2
650
591
  end
592
+
593
+ def clear_cache
594
+ @@schemas = {} if @@cache_schemas == false
595
+ end
596
+
597
+ def schemas
598
+ @@schemas
599
+ end
600
+
601
+ def add_schema(schema)
602
+ @@schemas[schema.uri.to_s] = schema if @@schemas[schema.uri.to_s].nil?
603
+ end
604
+
605
+ def cache_schemas=(val)
606
+ @@cache_schemas = val == true ? true : false
607
+ end
608
+
651
609
  end
652
610
 
653
611
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-schema
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 5
10
- version: 0.1.5
9
+ - 6
10
+ version: 0.1.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kenny Hoxworth
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-01 00:00:00 -05:00
18
+ date: 2010-12-02 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency