pigeon_hole 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pigeon_hole/typed_json.rb +37 -3
- data/spec/integration_spec.rb +29 -7
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db9906ed606ccac55cd7fb125ae9f45b2e1fdf54
|
4
|
+
data.tar.gz: de9b3d71ada0a7b4407f2e28713ca0f5ab83891a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e22126d272cccf8bd411c9ef191fd78474ba310d53b71b4282aad0d5db90659ef6b1e60b75dfe4531d5b59b351762a1a23fd7a556843b8f262142de2136f6ce8
|
7
|
+
data.tar.gz: 1c9fe90d9b7a2b8018f4e54f67d7adf6fc9abe89043f16b3527dc7c6cb2b6fa67dcaed8ab749e61cac713e6482ded01ba0e505934ce806ead998d76bbdff01d6
|
@@ -1,6 +1,30 @@
|
|
1
1
|
module PigeonHole
|
2
2
|
class TypedJSON
|
3
3
|
class UnsupportedType < ArgumentError
|
4
|
+
attr_reader :key
|
5
|
+
attr_reader :klass
|
6
|
+
|
7
|
+
def initialize(key, klass)
|
8
|
+
@key = key
|
9
|
+
@klass = klass
|
10
|
+
|
11
|
+
super("Serialization of #{klass} is not supported - key=#{key}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_key_context(parent_key)
|
15
|
+
add_context(parent_key)
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_index_context(index)
|
19
|
+
add_context("[#{index}]")
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def add_context(context)
|
25
|
+
combined_key = [context, key].compact.join(".").sub(".[", "[")
|
26
|
+
self.class.new(combined_key, klass)
|
27
|
+
end
|
4
28
|
end
|
5
29
|
|
6
30
|
BASIC_TYPES = [
|
@@ -71,15 +95,25 @@ module PigeonHole
|
|
71
95
|
hash = {}
|
72
96
|
|
73
97
|
value.each do |k, v|
|
74
|
-
|
98
|
+
begin
|
99
|
+
hash[k] = serialize_value(v)
|
100
|
+
rescue UnsupportedType => e
|
101
|
+
raise e.add_key_context(k)
|
102
|
+
end
|
75
103
|
end
|
76
104
|
|
77
105
|
hash
|
78
106
|
when Array
|
79
|
-
value.map
|
107
|
+
value.each_with_index.map do |av, i|
|
108
|
+
begin
|
109
|
+
serialize_value(av)
|
110
|
+
rescue UnsupportedType => e
|
111
|
+
raise e.add_index_context(i)
|
112
|
+
end
|
113
|
+
end
|
80
114
|
else
|
81
115
|
unless serializer = SERIALIZERS[value.class]
|
82
|
-
raise UnsupportedType.new(value.class)
|
116
|
+
raise UnsupportedType.new(nil, value.class)
|
83
117
|
end
|
84
118
|
|
85
119
|
serializer.serialize(value)
|
data/spec/integration_spec.rb
CHANGED
@@ -100,15 +100,37 @@ end
|
|
100
100
|
describe "serializing custom type" do
|
101
101
|
CustomType = Struct.new(:name)
|
102
102
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
103
|
+
context "in a hash" do
|
104
|
+
let(:input) do
|
105
|
+
{
|
106
|
+
"nested" => {
|
107
|
+
"custom" => CustomType.new("hello"),
|
108
|
+
}
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
subject { PigeonHole.generate(input) }
|
113
|
+
|
114
|
+
it "raises an unsupported type error" do
|
115
|
+
expect { subject }.to raise_error(PigeonHole::TypedJSON::UnsupportedType, "Serialization of CustomType is not supported - key=nested.custom")
|
116
|
+
end
|
107
117
|
end
|
108
118
|
|
109
|
-
|
119
|
+
context "in an array" do
|
120
|
+
let(:input) do
|
121
|
+
{
|
122
|
+
"nested" => [
|
123
|
+
"string",
|
124
|
+
1337,
|
125
|
+
CustomType.new("hello"),
|
126
|
+
]
|
127
|
+
}
|
128
|
+
end
|
129
|
+
|
130
|
+
subject { PigeonHole.generate(input) }
|
110
131
|
|
111
|
-
|
112
|
-
|
132
|
+
it "raises an unsupported type error" do
|
133
|
+
expect { subject }.to raise_error(PigeonHole::TypedJSON::UnsupportedType, "Serialization of CustomType is not supported - key=nested[2]")
|
134
|
+
end
|
113
135
|
end
|
114
136
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pigeon_hole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Binns
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -43,10 +43,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
43
|
version: '0'
|
44
44
|
requirements: []
|
45
45
|
rubyforge_project:
|
46
|
-
rubygems_version: 2.
|
46
|
+
rubygems_version: 2.6.6
|
47
47
|
signing_key:
|
48
48
|
specification_version: 4
|
49
49
|
summary: Opt-in typed serialization for complex JSON types
|
50
50
|
test_files:
|
51
51
|
- spec/integration_spec.rb
|
52
52
|
- spec/spec_helper.rb
|
53
|
+
has_rdoc:
|