ruson 0.0.4 → 0.0.5

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
  SHA256:
3
- metadata.gz: 0c6132810af39688ffccab30196ecc175fe48859d74e7ec8a6ae2c14cf49f6a6
4
- data.tar.gz: dbeeafcc7e6c0b9157ce13012cd3d201d04801376a65e5185f53c9cc84da14e7
3
+ metadata.gz: 78281f5b501061ceef879a28599cba16f306d28af38e975eb05251cb13aaba36
4
+ data.tar.gz: 6c7eaa57a218e4f8efaed0c866a9603d032d3d90ec65ebe38def3ddc876a9759
5
5
  SHA512:
6
- metadata.gz: 4da7ee9f72ff82464aab5c7568e0f474b5969d2c90744af052c655567d18d91ef812bc07e453680dca12b41beef50e3f715a6cc89ae7db61871fc7e45840ce64
7
- data.tar.gz: 0ea692ba85496dacbdf97624b3caec7192ea79a2cae4c645b22f8f40de8a9131868a9d1823b7981e2796a6c7c49e9f9af2f23568f4c20069ae0dc4bd286b47ee
6
+ metadata.gz: 955e3ea5b8423d1ed12a10f344736810b46391df2ed27bcdaef8474425dda5bb1116e3fd7e2fbb61fd8b98066d9f10ae0a8e78a3197e90ac13d1b262640a0428
7
+ data.tar.gz: 5e49ec83553036fe288cab6dda5d6abd021d02b88fc8dfce4934caccd71ef620d1d40f6269e2408b3033d959e44ebcf784ef80287fff533454a12394a0026bad
data/README.md CHANGED
@@ -133,6 +133,81 @@ post = Post.new(json)
133
133
  post.tags.first.name #=> 'Ruby'
134
134
  ```
135
135
 
136
+ ### enum
137
+
138
+ article.json
139
+ ```json
140
+ {
141
+ "title":"Title",
142
+ "status":"draft"
143
+ }
144
+ ```
145
+
146
+ ```ruby
147
+ class Article < Ruson::Base
148
+ field :title
149
+ enum status: { :draft, :published }
150
+ end
151
+
152
+ article = Article.new('article.json')
153
+
154
+ article.status #=> :draft
155
+ article.draft? #=> true
156
+
157
+ article.status = 'published'
158
+ article.status #=> :published
159
+
160
+ article.status = 'undefined'
161
+ #=> undefined is not a valid status (ArgumentError)
162
+ ```
163
+
164
+ ### to_json
165
+
166
+ ```ruby
167
+ class Post < Ruson::Base
168
+ field :title
169
+ field :url
170
+ end
171
+
172
+ json = File.read('post.json')
173
+ post = Post.new(json)
174
+ post.url = 'https://example.com/examples'
175
+
176
+ post.to_json #=> "{\"title\":\"Ruson\",\"url\":\"https://example.com/examples\"}"
177
+ ```
178
+
179
+ ### to_hash
180
+
181
+ ```ruby
182
+ class Post < Ruson::Base
183
+ field :title
184
+ field :url
185
+ end
186
+
187
+ json = File.read('post.json')
188
+ post = Post.new(json)
189
+ post.url = 'https://example.com/examples'
190
+
191
+ post.to_hash #=> {title: "Ruson", url: "https://example.com/examples" }
192
+ ```
193
+
194
+ ### API json parser
195
+
196
+ ```ruby
197
+ class Article < Ruson::Base
198
+ field :title
199
+ field :description
200
+ end
201
+
202
+ conn = Faraday::Connection.new(url: 'https://your.api/articles/1') do |faraday|
203
+ faraday.request :url_encoded
204
+ faraday.adapter Faraday.default_adapter
205
+ end
206
+
207
+ response = conn.get
208
+ article = Article.new(response.body)
209
+ article.title
210
+ ```
136
211
 
137
212
  ## Development
138
213
 
@@ -6,18 +6,40 @@ module Ruson
6
6
  class Base
7
7
  class << self
8
8
  def field(attr, options = {})
9
+ instance_eval("attr_accessor :#{attr.to_s}")
9
10
  add_accessor attr.to_s, options
10
11
  end
11
12
 
12
- def add_accessor(name, options)
13
- instance_eval("attr_accessor :#{name}")
14
- @accessors ||= {}
15
- @accessors.merge!({ name.to_sym => options })
13
+ def enum(attr, values)
14
+ define_enum_methods attr.to_s, values.map(&:to_sym)
15
+ add_accessor attr.to_s
16
16
  end
17
17
 
18
18
  def accessors
19
19
  @accessors
20
20
  end
21
+
22
+ private
23
+
24
+ def define_enum_methods(name, values)
25
+ instance_eval("attr_reader :#{name}")
26
+
27
+ define_method "#{name}=" do |v|
28
+ raise ArgumentError, "#{v} is not a valid #{name}" unless values.include? v.to_sym
29
+ eval "@#{name} = :#{v.to_s}"
30
+ end
31
+
32
+ values.each do |v|
33
+ define_method "#{v}?" do
34
+ eval "@#{name} == :#{v.to_s}"
35
+ end
36
+ end
37
+ end
38
+
39
+ def add_accessor(name, options = {})
40
+ @accessors ||= {}
41
+ @accessors.merge!({ name.to_sym => options })
42
+ end
21
43
  end
22
44
 
23
45
  def initialize(json, root_key: nil)
@@ -31,6 +53,18 @@ module Ruson
31
53
  end
32
54
  end
33
55
 
56
+ def to_hash
57
+ self.class.accessors.keys.inject({}) do |result, key|
58
+ value = send(key)
59
+ result[key.to_sym] = convert_array_to_hash_value(value)
60
+ result
61
+ end
62
+ end
63
+
64
+ def to_json
65
+ to_hash.to_json
66
+ end
67
+
34
68
  private
35
69
 
36
70
  def set_attribute(attr_name, val)
@@ -64,5 +98,22 @@ module Ruson
64
98
  return json if json.class == ActiveSupport::HashWithIndifferentAccess
65
99
  (json.class == Hash ? json : JSON.parse(json)).with_indifferent_access
66
100
  end
101
+
102
+ def ruson_class?(value)
103
+ value.class < Ruson::Base
104
+ end
105
+
106
+ def convert_ruson_to_hash_value(value)
107
+ return value.to_hash if ruson_class?(value)
108
+ value
109
+ end
110
+
111
+ def convert_array_to_hash_value(value)
112
+ if value.instance_of?(Array)
113
+ value.inject([]) { |result, v| result << convert_ruson_to_hash_value(v) }
114
+ else
115
+ convert_ruson_to_hash_value(value)
116
+ end
117
+ end
67
118
  end
68
119
  end
@@ -1,3 +1,3 @@
1
1
  module Ruson
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - klriutsa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-13 00:00:00.000000000 Z
11
+ date: 2019-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler