strong_json 1.0.1 → 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,26 +8,11 @@ describe StrongJSON::Type::Object do
8
8
  a: StrongJSON::Type::Base.new(:numeric),
9
9
  b: StrongJSON::Type::Base.new(:string)
10
10
  },
11
- ignored_attributes: nil,
12
- prohibited_attributes: Set.new
11
+ on_unknown: :reject,
12
+ exceptions: Set.new
13
13
  )
14
14
 
15
- expect(type.coerce(a: 123, b: "test")).to eq(a: 123, b: "test")
16
- end
17
-
18
- it "rejects unspecified fields" do
19
- type = StrongJSON::Type::Object.new(
20
- {
21
- a: StrongJSON::Type::Base.new(:numeric)
22
- },
23
- ignored_attributes: nil,
24
- prohibited_attributes: Set.new
25
- )
26
-
27
- expect { type.coerce(a:123, b:true) }.to raise_error(StrongJSON::Type::UnexpectedAttributeError) {|e|
28
- expect(e.path.to_s).to eq("$")
29
- expect(e.attribute).to eq(:b)
30
- }
15
+ expect(type.coerce({ a: 123, b: "test" })).to eq(a: 123, b: "test")
31
16
  end
32
17
 
33
18
  it "rejects objects with missing fields" do
@@ -35,87 +20,61 @@ describe StrongJSON::Type::Object do
35
20
  {
36
21
  a: StrongJSON::Type::Base.new(:numeric)
37
22
  },
38
- ignored_attributes: nil,
39
- prohibited_attributes: Set.new
23
+ on_unknown: :reject,
24
+ exceptions: Set.new
40
25
  )
41
26
 
42
- expect{ type.coerce(b: "test") }.to raise_error(StrongJSON::Type::UnexpectedAttributeError) {|e|
27
+ expect{ type.coerce({ a: 123, b: "test" }) }.to raise_error(StrongJSON::Type::UnexpectedAttributeError) {|e|
43
28
  expect(e.path.to_s).to eq("$")
44
29
  expect(e.attribute).to eq(:b)
45
30
  }
46
31
  end
47
32
 
48
- describe "ignored_attributes" do
49
- context "when ignored_attributes are given as Set" do
50
- let(:type) {
51
- StrongJSON::Type::Object.new(
52
- {
53
- a: StrongJSON::Type::Base.new(:numeric)
54
- },
55
- ignored_attributes: Set.new([:b]),
56
- prohibited_attributes: Set.new
57
- )
58
- }
59
-
60
- it "ignores field with any value" do
61
- expect(type.coerce(a: 123, b: true)).to eq(a: 123)
62
- end
63
-
64
- it "accepts if it does not contains the field" do
65
- expect(type.coerce(a: 123)).to eq(a: 123)
66
- end
67
- end
68
-
69
- context "when ignored_attributes is nil" do
70
- let(:type) {
71
- StrongJSON::Type::Object.new(
72
- {
73
- a: StrongJSON::Type::Base.new(:numeric)
74
- },
75
- ignored_attributes: nil,
76
- prohibited_attributes: Set.new
77
- )
78
- }
33
+ context "when on_unknown is :ignore" do
34
+ let(:type) {
35
+ StrongJSON::Type::Object.new(
36
+ {
37
+ a: StrongJSON::Type::Base.new(:numeric)
38
+ },
39
+ on_unknown: :ignore,
40
+ exceptions: Set[:x]
41
+ )
42
+ }
79
43
 
80
- it "ignores field with any value" do
81
- expect {
82
- type.coerce(a: 123, b: true)
83
- }.to raise_error(StrongJSON::Type::UnexpectedAttributeError)
84
- end
44
+ it "ignores field with any value" do
45
+ expect(type.coerce({ a: 123, b: true })).to eq(a: 123)
85
46
  end
86
47
 
87
- context "when ignored_attributes is :any" do
88
- let(:type) {
89
- StrongJSON::Type::Object.new(
90
- {
91
- a: StrongJSON::Type::Base.new(:numeric)
92
- },
93
- ignored_attributes: :any,
94
- prohibited_attributes: Set.new
95
- )
48
+ it "raises error on attributes listed in exceptions" do
49
+ expect {
50
+ type.coerce({ a: 123, x: false })
51
+ }.to raise_error(StrongJSON::Type::UnexpectedAttributeError) {|error|
52
+ expect(error.attribute).to eq(:x)
96
53
  }
97
-
98
- it "ignores field with any value" do
99
- expect(type.coerce(a: 123, b: true)).to eq(a: 123)
100
- end
101
54
  end
102
55
  end
103
56
 
104
- describe "prohibited_attributes" do
57
+ context "when on_unknown is :reject" do
105
58
  let(:type) {
106
59
  StrongJSON::Type::Object.new(
107
60
  {
108
61
  a: StrongJSON::Type::Base.new(:numeric)
109
62
  },
110
- ignored_attributes: :any,
111
- prohibited_attributes: Set.new([:x])
63
+ on_unknown: :reject,
64
+ exceptions: Set[:c]
112
65
  )
113
66
  }
114
67
 
115
- it "raises error if the attribute is given" do
68
+ it "raises with unknown attribute" do
116
69
  expect {
117
- type.coerce(a:123, b:true, x: [])
118
- }.to raise_error(StrongJSON::Type::UnexpectedAttributeError)
70
+ type.coerce({ a: 123, b: true })
71
+ }.to raise_error(StrongJSON::Type::UnexpectedAttributeError) {|error|
72
+ expect(error.attribute).to eq(:b)
73
+ }
74
+ end
75
+
76
+ it "ignores attributes listed in exceptions" do
77
+ expect(type.coerce({ a: 123, c: false })).to eq(a:123)
119
78
  end
120
79
  end
121
80
  end
@@ -126,8 +85,8 @@ describe StrongJSON::Type::Object do
126
85
  {
127
86
  a: StrongJSON::Type::Optional.new(StrongJSON::Type::Base.new(:numeric))
128
87
  },
129
- ignored_attributes: nil,
130
- prohibited_attributes: Set.new
88
+ on_unknown: :reject,
89
+ exceptions: Set[]
131
90
  )
132
91
  }
133
92
 
@@ -151,8 +110,8 @@ describe StrongJSON::Type::Object do
151
110
  a: StrongJSON::Type::Base.new(:numeric),
152
111
  b: StrongJSON::Type::Base.new(:string)
153
112
  },
154
- ignored_attributes: nil,
155
- prohibited_attributes: Set.new
113
+ on_unknown: :reject,
114
+ exceptions: Set[]
156
115
  )
157
116
  }
158
117
 
@@ -164,4 +123,73 @@ describe StrongJSON::Type::Object do
164
123
  expect(type =~ {}).to be_falsey
165
124
  end
166
125
  end
126
+
127
+ describe "#ignore" do
128
+ let (:type) {
129
+ StrongJSON::Type::Object.new(
130
+ { a: StrongJSON::Type::Base.new(:numeric) },
131
+ on_unknown: :reject,
132
+ exceptions: Set[]
133
+ )
134
+ }
135
+
136
+ context "if no argument is given" do
137
+ it "ignores all unknown attributes" do
138
+ updated_type = type.ignore()
139
+ expect(updated_type.on_unknown).to eq(:ignore)
140
+ expect(updated_type.exceptions).to eq(Set[])
141
+ end
142
+ end
143
+
144
+
145
+ context "if list of Symbol is given" do
146
+ it "ignores specified attributes but raises unknowns" do
147
+ updated_type = type.ignore(:x, :y)
148
+ expect(updated_type.on_unknown).to eq(:reject)
149
+ expect(updated_type.exceptions).to eq(Set[:x, :y])
150
+ end
151
+ end
152
+
153
+ context "if except keyword is specified" do
154
+ it "raises unknowns but ignores specified attributes" do
155
+ updated_type = type.ignore(except: Set[:x, :y])
156
+ expect(updated_type.on_unknown).to eq(:ignore)
157
+ expect(updated_type.exceptions).to eq(Set[:x, :y])
158
+ end
159
+ end
160
+ end
161
+
162
+ describe "#reject" do
163
+ let (:type) {
164
+ StrongJSON::Type::Object.new(
165
+ { a: StrongJSON::Type::Base.new(:numeric) },
166
+ on_unknown: :reject,
167
+ exceptions: Set[]
168
+ )
169
+ }
170
+
171
+ context "if no argument is given" do
172
+ it "raises on any unknown attribute" do
173
+ updated_type = type.reject()
174
+ expect(updated_type.on_unknown).to eq(:reject)
175
+ expect(updated_type.exceptions).to eq(Set[])
176
+ end
177
+ end
178
+
179
+ context "if list of Symbol is given" do
180
+ it "raises unknowns but ignores specified attributes" do
181
+ updated_type = type.reject(:x, :y)
182
+ expect(updated_type.on_unknown).to eq(:ignore)
183
+ expect(updated_type.exceptions).to eq(Set[:x, :y])
184
+ end
185
+ end
186
+
187
+ context "if except keyword is specified" do
188
+ it "ignores specified attributes but raises unknowns" do
189
+ updated_type = type.reject(except: Set[:x, :y])
190
+ expect(updated_type.on_unknown).to eq(:reject)
191
+ expect(updated_type.exceptions).to eq(Set[:x, :y])
192
+ end
193
+ end
194
+ end
167
195
  end
@@ -18,9 +18,4 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
  spec.metadata = { "steep_types" => "sig" }
21
-
22
- spec.add_development_dependency "bundler", ">= 1.6"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec", "~> 3.0"
25
- spec.add_development_dependency "steep", "~> 0.10"
26
21
  end
metadata CHANGED
@@ -1,71 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strong_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-28 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '1.6'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '1.6'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '10.0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '10.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '3.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '3.0'
55
- - !ruby/object:Gem::Dependency
56
- name: steep
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.10'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.10'
11
+ date: 2020-10-09 00:00:00.000000000 Z
12
+ dependencies: []
69
13
  description: Type check JSON objects
70
14
  email:
71
15
  - matsumoto@soutaro.com
@@ -73,6 +17,7 @@ executables: []
73
17
  extensions: []
74
18
  extra_rdoc_files: []
75
19
  files:
20
+ - ".github/workflows/ruby.yml"
76
21
  - ".gitignore"
77
22
  - ".ruby-version"
78
23
  - ".travis.yml"
@@ -81,20 +26,25 @@ files:
81
26
  - LICENSE.txt
82
27
  - README.md
83
28
  - Rakefile
84
- - example/example.rb
85
- - example/example.rbi
29
+ - Steepfile
30
+ - example/Steepfile
31
+ - example/lib/example.rb
32
+ - example/sig/example.rbs
86
33
  - lib/strong_json.rb
87
34
  - lib/strong_json/error_reporter.rb
88
35
  - lib/strong_json/type.rb
89
36
  - lib/strong_json/types.rb
90
37
  - lib/strong_json/version.rb
91
- - sig/strong_json.rbi
92
- - sig/type.rbi
38
+ - pp.rb
39
+ - sig/polyfill.rbs
40
+ - sig/strong_json.rbs
41
+ - sig/type.rbs
93
42
  - spec/array_spec.rb
94
43
  - spec/basetype_spec.rb
95
44
  - spec/case_subsumption_operator_spec.rb
96
45
  - spec/enum_spec.rb
97
46
  - spec/error_spec.rb
47
+ - spec/hash_spec.rb
98
48
  - spec/json_spec.rb
99
49
  - spec/literal_spec.rb
100
50
  - spec/object_spec.rb
@@ -105,7 +55,7 @@ licenses:
105
55
  - MIT
106
56
  metadata:
107
57
  steep_types: sig
108
- post_install_message:
58
+ post_install_message:
109
59
  rdoc_options: []
110
60
  require_paths:
111
61
  - lib
@@ -120,9 +70,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
70
  - !ruby/object:Gem::Version
121
71
  version: '0'
122
72
  requirements: []
123
- rubyforge_project:
124
- rubygems_version: 2.7.6
125
- signing_key:
73
+ rubygems_version: 3.0.8
74
+ signing_key:
126
75
  specification_version: 4
127
76
  summary: Type check JSON objects
128
77
  test_files:
@@ -131,6 +80,7 @@ test_files:
131
80
  - spec/case_subsumption_operator_spec.rb
132
81
  - spec/enum_spec.rb
133
82
  - spec/error_spec.rb
83
+ - spec/hash_spec.rb
134
84
  - spec/json_spec.rb
135
85
  - spec/literal_spec.rb
136
86
  - spec/object_spec.rb
@@ -1,11 +0,0 @@
1
- type address = { address: String, country: Symbol? }
2
- type email = { email: String }
3
-
4
- class AddressSchema < StrongJSON
5
- def address: -> StrongJSON::Type::Object<address>
6
- def email: -> StrongJSON::Type::Object<email>
7
- def contact: -> StrongJSON::Type::Object<email | address>
8
- def person: -> StrongJSON::Type::Object<{ name: String, contacts: Array<email | address> }>
9
- end
10
-
11
- Schema: AddressSchema
@@ -1,64 +0,0 @@
1
- class StrongJSON
2
- def initialize: { (self) -> void } -> any
3
- def let: (Symbol, ty) -> void
4
- include StrongJSON::Types
5
- end
6
-
7
- StrongJSON::VERSION: String
8
-
9
- class StandardError
10
- def initialize: (String) -> any
11
- end
12
-
13
- interface StrongJSON::_Schema<'type>
14
- def coerce: (any, ?path: Type::ErrorPath) -> 'type
15
- def =~: (any) -> bool
16
- def to_s: -> String
17
- def is_a?: (any) -> bool
18
- def alias: -> Symbol?
19
- def with_alias: (Symbol) -> self
20
- def ==: (any) -> bool
21
- def yield_self: <'a> () { (self) -> 'a } -> 'a
22
- end
23
-
24
- type StrongJSON::ty = _Schema<any>
25
-
26
- module StrongJSON::Types
27
- def object: <'x> (Hash<Symbol, ty>) -> Type::Object<'x>
28
- | () -> Type::Object<{}>
29
- def object?: <'x> (Hash<Symbol, ty>) -> Type::Optional<'x>
30
- | () -> Type::Optional<{}>
31
- def any: () -> Type::Base<any>
32
- def any?: () -> Type::Optional<any>
33
- def optional: <'x> (_Schema<'x>) -> Type::Optional<'x>
34
- | () -> Type::Optional<any>
35
- def string: () -> Type::Base<String>
36
- def string?: () -> Type::Optional<String>
37
- def number: () -> Type::Base<Numeric>
38
- def number?: () -> Type::Optional<Numeric>
39
- def numeric: () -> Type::Base<Numeric>
40
- def numeric?: () -> Type::Optional<Numeric>
41
- def boolean: () -> Type::Base<bool>
42
- def boolean?: () -> Type::Optional<bool>
43
- def symbol: () -> Type::Base<Symbol>
44
- def symbol?: () -> Type::Optional<Symbol>
45
- def array: <'x> (_Schema<'x>) -> Type::Array<'x>
46
- | () -> Type::Array<any>
47
- def array?: <'x> (_Schema<'x>) -> Type::Optional<::Array<'x>>
48
- def literal: <'x> ('x) -> Type::Literal<'x>
49
- def literal?: <'x> ('x) -> Type::Optional<'x>
50
- def enum: <'x> (*_Schema<any>, ?detector: Type::detector?) -> Type::Enum<'x>
51
- def enum?: <'x> (*_Schema<any>, ?detector: Type::detector?) -> Type::Optional<'x>
52
- end
53
-
54
- class StrongJSON::ErrorReporter
55
- attr_reader path: Type::ErrorPath
56
- @string: String
57
- def initialize: (path: Type::ErrorPath) -> any
58
- def format: -> void
59
- def (private) format_trace: (path: Type::ErrorPath, ?index: Integer) -> void
60
- def (private) format_aliases: (path: Type::ErrorPath, where: ::Array<String>) -> ::Array<String>
61
- def (private) format_single_alias: (Symbol, ty) -> String
62
- def (private) pretty: (ty, any, ?expand_alias: bool) -> void
63
- def pretty_str: (ty, ?expand_alias: bool) -> ::String
64
- end