jsoning 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab99aea4b1e32c8cb1dd3b9ef9629de18fe57af5
4
- data.tar.gz: c33e1687f59d31bed9ddbf1d299b9ad9b1bc81e5
3
+ metadata.gz: 2edd1def968d6f13f1ba2cc36243718163cd7dcc
4
+ data.tar.gz: 2e18b982c6b0269727b827d782ea72695f904d7f
5
5
  SHA512:
6
- metadata.gz: bf0371b9055dce314f1a4400f192de4dbe1f886761d2accf30816d6256db22a1aae8175d9ea755a5d8327bb88dfce74dd77920c13482d872940a292cd8f508c8
7
- data.tar.gz: 5607608a6b053dfc67bd37952da6e590e56e015ce012fd7701e5702b85becbe651b61f8c203dc8e5f62276782a520cc9de58d1b4dca7190e0f1c379ef2564cc6
6
+ metadata.gz: c2799fd887a3db49f97de68228f5fc4a5634f7b91466a0f119b56b7c3565e10bbb4856d5896c0422bddc5767fcd32284031873ef7dae1d97c5d68faef45b57ab
7
+ data.tar.gz: 5622840a2c4ddf1efa7141fa17c01793aff7bde1468113e407d676a099e08616a14a17b8f0b1f5721aaf60d219e7a283de7716582da50e374d74c6cf0f1d69e3
data/README.md CHANGED
@@ -12,7 +12,7 @@ any Ruby object there is. Kiss good bye to complexity
12
12
  Add this line to your application's Gemfile:
13
13
 
14
14
  ```ruby
15
- gem 'Jsoning'
15
+ gem 'jsoning'
16
16
  ```
17
17
 
18
18
  And then execute:
@@ -187,6 +187,18 @@ The syntax above will return ruby hash object:
187
187
  "degree_detail"=>{"faculty"=>"School of IT", "degree"=>"B.Sc. (Hons) Computer Science"}}
188
188
  ```
189
189
 
190
+ ## Supporting custom data type
191
+
192
+ JSON, by default support data type such as boolean, nil, string, and number. If you have class like
193
+ `MyFancyString` and would tell Jsoning how to interpret and extract value from them, use this syntax:
194
+
195
+ ```ruby
196
+ Jsoning.add_type MyFancyString, processor: { |fancy_string| fancy_string.get_string }
197
+ ```
198
+
199
+ Internally, it is how Jsoning convert date-like data type (`Date`, `DateTime`, `Time`, `ActiveSupport::TimeWithZone`) to
200
+ ISO8601 which can be parsed by compliant JavaScript interpreter in the browser (or somewhere else).
201
+
190
202
  ## Changelog
191
203
 
192
204
  == Version 0.1.0
@@ -195,7 +207,12 @@ The syntax above will return ruby hash object:
195
207
 
196
208
  == Version 0.2.0
197
209
 
198
- 2. Ability to turn object into a hash
210
+ 1. Ability to turn object into a hash
211
+
212
+ == Version 0.3.0
213
+
214
+ 1. Allow user to specify how Jsoning would extract value from a custom data type
215
+ 2. Date, DateTime, Time, ActiveSupport::TimeWithZone now is by default parsed to ISO8601 format.
199
216
 
200
217
  ## License
201
218
 
@@ -50,24 +50,30 @@ class Jsoning::Mapper
50
50
  def deep_parse(object)
51
51
  parsed_data = nil
52
52
 
53
- if object.is_a?(Array)
54
- parsed_data = []
55
- object.each do |each_obj|
56
- parsed_data << deep_parse(each_obj)
57
- end
58
- elsif object.is_a?(Hash)
59
- parsed_data = {}
60
- object.each do |obj_key_name, obj_val|
61
- parsed_data[obj_key_name] = deep_parse(obj_val)
62
- end
63
- elsif object.is_a?(Integer) || object.is_a?(Float) || object.is_a?(String) ||
64
- object.is_a?(TrueClass) || object.is_a?(FalseClass) || object.is_a?(NilClass)
65
- parsed_data = object
53
+ value_extractor = Jsoning::TYPE_EXTENSIONS[object.class.to_s]
54
+ if value_extractor # is defined
55
+ parsed_data = value_extractor.(object)
66
56
  else
67
- protocol = Jsoning.protocol_for!(object.class)
68
- parsed_data = protocol.parse(object)
57
+ if object.is_a?(Array)
58
+ parsed_data = []
59
+ object.each do |each_obj|
60
+ parsed_data << deep_parse(each_obj)
61
+ end
62
+ elsif object.is_a?(Hash)
63
+ parsed_data = {}
64
+ object.each do |obj_key_name, obj_val|
65
+ parsed_data[obj_key_name] = deep_parse(obj_val)
66
+ end
67
+ elsif object.is_a?(Integer) || object.is_a?(Float) || object.is_a?(String) ||
68
+ object.is_a?(TrueClass) || object.is_a?(FalseClass) || object.is_a?(NilClass)
69
+ parsed_data = object
70
+ else
71
+ protocol = Jsoning.protocol_for!(object.class)
72
+ parsed_data = protocol.parse(object)
73
+ end
69
74
  end
70
75
 
76
+
71
77
  parsed_data
72
78
  end
73
79
  end
@@ -1,3 +1,3 @@
1
1
  module Jsoning
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/jsoning.rb CHANGED
@@ -9,6 +9,8 @@ require "json"
9
9
 
10
10
  module Jsoning
11
11
  PROTOCOLS = {}
12
+ # if type is defined here, we will use it to extract its value for the key
13
+ TYPE_EXTENSIONS = {}
12
14
 
13
15
  module_function
14
16
 
@@ -37,10 +39,57 @@ module Jsoning
37
39
  end
38
40
 
39
41
  def generate(object, options = {})
42
+ initialize_type_extensions
40
43
  protocol = protocol_for!(object.class)
41
44
  protocol.generate(object, options)
42
45
  end
43
46
 
47
+ @@type_extension_initialized = false
48
+ def initialize_type_extensions
49
+ @@type_extension_initialized = true if !!@@type_extension_initialized
50
+ return if @@type_extension_initialized
51
+
52
+ begin
53
+ require "time"
54
+ ::Time
55
+ self.add_type Time, processor: proc { |time| time.iso8601 }
56
+ rescue
57
+ end
58
+
59
+ begin
60
+ # try to define value extractor for ActiveSupport::TimeWithZone which is in common use
61
+ # for AR model
62
+ ::ActiveSupport::TimeWithZone
63
+ self.add_type ActiveSupport::TimeWithZone, processor: proc { |time| time.send(:iso8601) }
64
+ rescue
65
+ # nothing, don't add
66
+ end
67
+
68
+ begin
69
+ ::DateTime
70
+ self.add_type DateTime, processor: proc { |date| date.send(:iso8601) }
71
+ rescue => e
72
+ # nothing, don't add
73
+ end
74
+
75
+ begin
76
+ ::Date
77
+ self.add_type Date, processor: proc { |date| date.send(:iso8601) }
78
+ rescue
79
+ # nothing, don't add
80
+ end
81
+ end
82
+
83
+ class << self
84
+ def add_type(klass, options = {})
85
+ processor = options[:processor]
86
+ raise Jsoning::Error, "Pass in processor that is a proc explaining how to extract the value" unless processor.is_a?(Proc)
87
+
88
+ TYPE_EXTENSIONS[klass.to_s] = processor
89
+ nil
90
+ end
91
+ end
92
+
44
93
  def self.[](object)
45
94
  protocol = protocol_for!(object.class)
46
95
  protocol.parse(object)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsoning
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Pahlevi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-01 00:00:00.000000000 Z
11
+ date: 2015-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler