jsoning 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -5
- data/lib/jsoning.rb +5 -5
- data/lib/jsoning/dsl/for_dsl.rb +30 -0
- data/lib/jsoning/foundations/mapper.rb +25 -13
- data/lib/jsoning/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd577237f0bce4d654d6b0294a0d30ec12b3f060
|
4
|
+
data.tar.gz: 42951f8a06781a5565b61d417730dbb44411c06e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 132eeb81dbe3fb5e5e33045d1c83fa00bb27cb0facfb3509ba9b0613a71af42fb55b52f61e0d2ecd0af8e3c5fe73b6dc25248dcc08986e940f1531129eebe246
|
7
|
+
data.tar.gz: 64eb70554da8b32ad0066e9993c2dbcd634b1826716c3fe77dee45b802477352df6532e4c330c8a95bd9233069e78a1f56b8fc64df88947774de7bab381b33a4
|
data/README.md
CHANGED
@@ -292,13 +292,21 @@ expect(Jsoning.generate(book, hash: true, version: :v1)).to eq({"name"=>"Harry P
|
|
292
292
|
expect(Jsoning.generate(book, hash: true, version: :v2)).to eq({"book_name"=>"Harry Potter"})
|
293
293
|
```
|
294
294
|
|
295
|
-
|
295
|
+
Notice that we can use `inherits` to save ourself from writing keys that have been defined somewhere when
|
296
|
+
we do versioning:
|
296
297
|
|
297
298
|
```ruby
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
299
|
+
Jsoning.for(My::User) do
|
300
|
+
version :v2 do
|
301
|
+
inherits :name, :age, :gender, :taken_degree, :books
|
302
|
+
key :upcase_name, from: :name, value: proc { |name| name.upcase }
|
303
|
+
end
|
304
|
+
|
305
|
+
version :v3 do
|
306
|
+
inherits :name, :age, :gender, :taken_degree, :books
|
307
|
+
inherits :upcase_name, from: :v2
|
308
|
+
end
|
309
|
+
end
|
302
310
|
```
|
303
311
|
|
304
312
|
If for when generating object, the requested versioning is undefined, the default version will be used.
|
@@ -337,6 +345,10 @@ If for when generating object, the requested versioning is undefined, the defaul
|
|
337
345
|
|
338
346
|
1. Add value post-processor
|
339
347
|
|
348
|
+
== Version 0.8.0
|
349
|
+
|
350
|
+
1. Add `inherits` allowing versioned result to inherits key from default namespace
|
351
|
+
|
340
352
|
## License
|
341
353
|
|
342
354
|
The gem is proudly available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/lib/jsoning.rb
CHANGED
@@ -16,7 +16,7 @@ module Jsoning
|
|
16
16
|
module_function
|
17
17
|
|
18
18
|
# returns a protocol, or create one if none exists
|
19
|
-
def
|
19
|
+
def protocol_for_or_create(klass)
|
20
20
|
protocol = PROTOCOLS[klass.to_s]
|
21
21
|
if protocol.nil?
|
22
22
|
protocol = Jsoning::Protocol.new(klass)
|
@@ -39,7 +39,7 @@ module Jsoning
|
|
39
39
|
|
40
40
|
# define the protocol
|
41
41
|
def for(klass, &block)
|
42
|
-
Jsoning::ForDsl.new(
|
42
|
+
Jsoning::ForDsl.new(protocol_for_or_create(klass)).instance_eval(&block)
|
43
43
|
end
|
44
44
|
|
45
45
|
# generate the json document
|
@@ -91,7 +91,7 @@ module Jsoning
|
|
91
91
|
|
92
92
|
begin
|
93
93
|
::Time
|
94
|
-
self.add_type Time, processor: proc { |time| time.strftime("%FT%T%z") }
|
94
|
+
self.add_type ::Time, processor: proc { |time| time.strftime("%FT%T%z") }
|
95
95
|
rescue
|
96
96
|
end
|
97
97
|
|
@@ -106,14 +106,14 @@ module Jsoning
|
|
106
106
|
|
107
107
|
begin
|
108
108
|
::DateTime
|
109
|
-
self.add_type DateTime, processor: proc { |date| date.strftime("%FT%T%z") }
|
109
|
+
self.add_type ::DateTime, processor: proc { |date| date.strftime("%FT%T%z") }
|
110
110
|
rescue => e
|
111
111
|
# nothing, don't add
|
112
112
|
end
|
113
113
|
|
114
114
|
begin
|
115
115
|
::Date
|
116
|
-
self.add_type Date, processor: proc { |date| date.strftime("%FT%T%z") }
|
116
|
+
self.add_type ::Date, processor: proc { |date| date.strftime("%FT%T%z") }
|
117
117
|
rescue
|
118
118
|
# nothing, don't add
|
119
119
|
end
|
data/lib/jsoning/dsl/for_dsl.rb
CHANGED
@@ -7,6 +7,35 @@ class Jsoning::ForDsl
|
|
7
7
|
@protocol = protocol
|
8
8
|
end
|
9
9
|
|
10
|
+
# inherits can happen inside version block
|
11
|
+
# it allows version to inherit specific key from parents
|
12
|
+
def inherits(*args)
|
13
|
+
fail 'Must be inside version block' unless current_version_object
|
14
|
+
all_keys = []
|
15
|
+
options = {}
|
16
|
+
|
17
|
+
args.each do |arg|
|
18
|
+
if arg.is_a?(String) || arg.is_a?(Symbol)
|
19
|
+
all_keys << arg
|
20
|
+
elsif arg.is_a?(Hash)
|
21
|
+
options = arg
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
current_version = self.current_version_object
|
26
|
+
if options[:from] || options['from']
|
27
|
+
parent_version = current_version.protocol.get_version(options[:from] || options['from'])
|
28
|
+
else
|
29
|
+
parent_version = current_version.protocol.get_version(:default)
|
30
|
+
end
|
31
|
+
|
32
|
+
all_keys.each do |key_name|
|
33
|
+
mapper = parent_version.mapper_for(key_name)
|
34
|
+
current_version.add_mapper(mapper)
|
35
|
+
end
|
36
|
+
all_keys
|
37
|
+
end
|
38
|
+
|
10
39
|
# specify the version under which key will be executed
|
11
40
|
def version(version_name)
|
12
41
|
@@mutex.synchronize do
|
@@ -20,6 +49,7 @@ class Jsoning::ForDsl
|
|
20
49
|
|
21
50
|
self.current_version_object = version
|
22
51
|
yield
|
52
|
+
self.current_version_object = nil
|
23
53
|
end
|
24
54
|
end
|
25
55
|
|
@@ -39,7 +39,7 @@ class Jsoning::Mapper
|
|
39
39
|
|
40
40
|
if object.respond_to?(parallel_variable)
|
41
41
|
parallel_val = object.send(parallel_variable)
|
42
|
-
target_value =
|
42
|
+
target_value = parallel_val
|
43
43
|
end
|
44
44
|
|
45
45
|
if target_value.nil?
|
@@ -49,22 +49,23 @@ class Jsoning::Mapper
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
extracted_value = deep_parse(target_value, requested_version_name)
|
53
|
-
|
54
52
|
# apply extractor to extracted value, if processor is defined
|
55
53
|
if value_processor
|
56
|
-
|
54
|
+
target_value = deep_parse(target_value, requested_version_name, false)
|
55
|
+
target_value = value_processor.(target_value)
|
56
|
+
else
|
57
|
+
target_value = deep_parse(target_value, requested_version_name, true)
|
57
58
|
end
|
58
59
|
|
59
|
-
target_hash[name] =
|
60
|
+
target_hash[name] = target_value
|
60
61
|
end
|
61
62
|
|
62
63
|
def default_value(version_name = self.version.version_name)
|
63
64
|
if @default_value
|
64
65
|
if @default_value.is_a?(Proc)
|
65
|
-
return deep_parse(@default_value.(), version_name)
|
66
|
+
return deep_parse(@default_value.(), version_name, true)
|
66
67
|
else
|
67
|
-
return deep_parse(@default_value, version_name)
|
68
|
+
return deep_parse(@default_value, version_name, true)
|
68
69
|
end
|
69
70
|
else
|
70
71
|
nil
|
@@ -72,29 +73,40 @@ class Jsoning::Mapper
|
|
72
73
|
end
|
73
74
|
|
74
75
|
private
|
75
|
-
def deep_parse(object, version_name)
|
76
|
+
def deep_parse(object, version_name, run_value_extractor)
|
76
77
|
parsed_data = nil
|
77
78
|
|
78
79
|
value_extractor = Jsoning::TYPE_EXTENSIONS[object.class.to_s]
|
79
|
-
if value_extractor # is defined
|
80
|
+
if value_extractor && run_value_extractor # is defined
|
80
81
|
parsed_data = value_extractor.(object)
|
81
82
|
else
|
82
83
|
if object.is_a?(Array)
|
83
84
|
parsed_data = []
|
84
85
|
object.each do |each_obj|
|
85
|
-
parsed_data << deep_parse(each_obj, version_name)
|
86
|
+
parsed_data << deep_parse(each_obj, version_name, run_value_extractor)
|
86
87
|
end
|
87
88
|
elsif object.is_a?(Hash)
|
88
89
|
parsed_data = {}
|
89
90
|
object.each do |obj_key_name, obj_val|
|
90
|
-
parsed_data[obj_key_name] = deep_parse(obj_val, version_name)
|
91
|
+
parsed_data[obj_key_name] = deep_parse(obj_val, version_name, run_value_extractor)
|
91
92
|
end
|
92
93
|
elsif object.is_a?(Integer) || object.is_a?(Float) || object.is_a?(String) ||
|
93
94
|
object.is_a?(TrueClass) || object.is_a?(FalseClass) || object.is_a?(NilClass)
|
94
95
|
parsed_data = object
|
95
96
|
else
|
96
|
-
|
97
|
-
|
97
|
+
if run_value_extractor
|
98
|
+
protocol = Jsoning.protocol_for!(object.class)
|
99
|
+
parsed_data = protocol.retrieve_values_from(object, {version: version_name})
|
100
|
+
else
|
101
|
+
# if value extractor is false, don't raise error if protocol is undefined.
|
102
|
+
# value processor is exactly way for user to customly extract data in-line
|
103
|
+
protocol = Jsoning::PROTOCOLS[object.class]
|
104
|
+
if protocol
|
105
|
+
parsed_data = protocol.retrieve_values_from(object, {version: version_name})
|
106
|
+
else
|
107
|
+
parsed_data = object
|
108
|
+
end
|
109
|
+
end
|
98
110
|
end
|
99
111
|
end
|
100
112
|
|
data/lib/jsoning/version.rb
CHANGED