jsoning 0.2.0 → 0.3.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.
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