strong_json 0.9.0 → 1.0.0

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.
data/spec/object_spec.rb CHANGED
@@ -3,93 +3,158 @@ require "strong_json"
3
3
  describe StrongJSON::Type::Object do
4
4
  describe "#coerce" do
5
5
  it "accepts value" do
6
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric),
7
- b: StrongJSON::Type::Base.new(:string))
6
+ type = StrongJSON::Type::Object.new(
7
+ {
8
+ a: StrongJSON::Type::Base.new(:numeric),
9
+ b: StrongJSON::Type::Base.new(:string)
10
+ },
11
+ ignored_attributes: nil,
12
+ prohibited_attributes: Set.new
13
+ )
8
14
 
9
15
  expect(type.coerce(a: 123, b: "test")).to eq(a: 123, b: "test")
10
16
  end
11
17
 
12
18
  it "rejects unspecified fields" do
13
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric))
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
+ }
31
+ end
14
32
 
15
- expect { type.coerce(a:123, b:true) }.to raise_error(StrongJSON::Type::UnexpectedFieldError)
33
+ it "rejects objects with missing fields" do
34
+ type = StrongJSON::Type::Object.new(
35
+ {
36
+ a: StrongJSON::Type::Base.new(:numeric)
37
+ },
38
+ ignored_attributes: nil,
39
+ prohibited_attributes: Set.new
40
+ )
41
+
42
+ expect{ type.coerce(b: "test") }.to raise_error(StrongJSON::Type::UnexpectedAttributeError) {|e|
43
+ expect(e.path.to_s).to eq("$")
44
+ expect(e.attribute).to eq(:b)
45
+ }
16
46
  end
17
47
 
18
- describe "ignored" do
19
- it "ignores field with any value" do
20
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric), b: StrongJSON::Type::Base.new(:ignored))
21
- expect(type.coerce(a: 123, b: true)).to eq(a: 123)
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
22
67
  end
23
68
 
24
- it "accepts if it does not contains the field" do
25
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric), b: StrongJSON::Type::Base.new(:ignored))
26
- expect(type.coerce(a: 123)).to eq(a: 123)
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
+ }
79
+
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
27
85
  end
28
- end
29
86
 
30
- it "rejects objects with missing fields" do
31
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric))
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
+ )
96
+ }
97
+
98
+ it "ignores field with any value" do
99
+ expect(type.coerce(a: 123, b: true)).to eq(a: 123)
100
+ end
101
+ end
102
+ end
32
103
 
33
- expect{ type.coerce(b: "test") }.to raise_error(StrongJSON::Type::UnexpectedFieldError)
104
+ describe "prohibited_attributes" do
105
+ let(:type) {
106
+ StrongJSON::Type::Object.new(
107
+ {
108
+ a: StrongJSON::Type::Base.new(:numeric)
109
+ },
110
+ ignored_attributes: :any,
111
+ prohibited_attributes: Set.new([:x])
112
+ )
113
+ }
114
+
115
+ it "raises error if the attribute is given" do
116
+ expect {
117
+ type.coerce(a:123, b:true, x: [])
118
+ }.to raise_error(StrongJSON::Type::UnexpectedAttributeError)
119
+ end
34
120
  end
35
121
  end
36
122
 
37
123
  describe "optional" do
124
+ let(:type) {
125
+ StrongJSON::Type::Object.new(
126
+ {
127
+ a: StrongJSON::Type::Optional.new(StrongJSON::Type::Base.new(:numeric))
128
+ },
129
+ ignored_attributes: nil,
130
+ prohibited_attributes: Set.new
131
+ )
132
+ }
133
+
38
134
  it "accepts missing field if optional" do
39
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Optional.new(StrongJSON::Type::Base.new(:numeric)))
40
- expect(type.coerce({})).to eq({})
135
+ expect(type.coerce({})).to eq(a: nil)
41
136
  end
42
137
 
43
138
  it "preserves if present" do
44
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Optional.new(StrongJSON::Type::Base.new(:numeric)))
45
139
  expect(type.coerce({ a: "-123" })).to eq({ a: "-123" })
46
140
  end
47
141
 
48
142
  it "preserves nil if present" do
49
- type = StrongJSON::Type::Object.new(a: StrongJSON::Type::Optional.new(StrongJSON::Type::Base.new(:numeric)))
50
143
  expect(type.coerce({ a: nil })).to eq({ a: nil })
51
144
  end
52
145
  end
53
146
 
54
- describe "#merge" do
55
- let (:type) { StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric)) }
56
-
57
- it "adds field" do
58
- ty2 = type.merge(b: StrongJSON::Type::Base.new(:string))
59
-
60
- expect(ty2.coerce(a: 123, b: "test")).to eq(a: 123, b: "test")
61
- end
62
-
63
- it "overrides field" do
64
- ty2 = type.merge(a: StrongJSON::Type::Base.new(:prohibited))
65
-
66
- expect{ ty2.coerce(a: 123) }.to raise_error(StrongJSON::Type::Error)
67
- end
68
-
69
- it "adds field via object" do
70
- ty2 = type.merge(StrongJSON::Type::Object.new(b: StrongJSON::Type::Base.new(:string)))
71
-
72
- expect(ty2.coerce(a: 123, b: "test")).to eq(a: 123, b: "test")
73
- end
74
-
75
- it "overrides field via object" do
76
- ty2 = type.merge(StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:prohibited)))
77
-
78
- expect{ ty2.coerce(a: 123) }.to raise_error(StrongJSON::Type::Error)
79
- end
80
- end
81
-
82
- describe "#except" do
83
- let (:type) { StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric), b: StrongJSON::Type::Base.new(:string)) }
84
-
85
- it "return object which ignores given fields but preserve others" do
86
- ty2 = type.except(:a)
87
- expect(ty2.coerce(b: "test")).to eq({ b: "test" })
88
- end
89
- end
90
-
91
147
  describe "=~" do
92
- let (:type) { StrongJSON::Type::Object.new(a: StrongJSON::Type::Base.new(:numeric), b: StrongJSON::Type::Base.new(:string)) }
148
+ let (:type) {
149
+ StrongJSON::Type::Object.new(
150
+ {
151
+ a: StrongJSON::Type::Base.new(:numeric),
152
+ b: StrongJSON::Type::Base.new(:string)
153
+ },
154
+ ignored_attributes: nil,
155
+ prohibited_attributes: Set.new
156
+ )
157
+ }
93
158
 
94
159
  it "returns true for valid object" do
95
160
  expect(type =~ { a: 3, b: "foo" }).to be_truthy
@@ -13,7 +13,10 @@ describe StrongJSON::Type::Optional, "#coerce" do
13
13
  end
14
14
 
15
15
  it "rejects string" do
16
- expect { type.coerce("a") }.to raise_error(StrongJSON::Type::Error)
16
+ expect { type.coerce("a") }.to raise_error(StrongJSON::Type::TypeError) {|e|
17
+ expect(e.path.to_s).to eq("$")
18
+ expect(e.type).to be_a(StrongJSON::Type::Base)
19
+ }
17
20
  end
18
21
  end
19
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strong_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-19 00:00:00.000000000 Z
11
+ date: 2019-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,6 +84,7 @@ files:
84
84
  - example/example.rb
85
85
  - example/example.rbi
86
86
  - lib/strong_json.rb
87
+ - lib/strong_json/error_reporter.rb
87
88
  - lib/strong_json/type.rb
88
89
  - lib/strong_json/types.rb
89
90
  - lib/strong_json/version.rb