morph 0.4.1 → 0.5.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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +2 -0
  3. data/README.md +72 -40
  4. data/lib/morph.rb +2 -2
  5. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 585be7863cbff5800a5ad22cb60dc73963910c67
4
- data.tar.gz: a264e85fbefdd6f2c58a5f0f88185dd67c9b5656
3
+ metadata.gz: da524dc60329ec656ad28aa17e38231481fefa80
4
+ data.tar.gz: 62c9c6fb10ecff9c410d6fd146c2de2eaa0ccc4b
5
5
  SHA512:
6
- metadata.gz: f3dfcb06309f5f18f315564f3b5da996fcc7b072cdea1455ffd6331b6ce32258665bb04895b13ed7d8c7ff5904f8faeddb86f96fffc39621c73e0e95ec97b5f7
7
- data.tar.gz: 26025ec68ebe064a7bdb11aee7c8ffe967559a7d6331d6c1ee32715a608bcd85f5979382098390e0ebbe3112d441d10118b3a80d28d2de7f067cddaea692d784
6
+ metadata.gz: ea4e19f7beeffd219d1f11b5c0979e214fb55997eff9180994e3a633e7b92d87ca81005554b93352020ae86a28e8c9b576ab158e42696206f8f8cc907404694a
7
+ data.tar.gz: 1d2d29875aa3c306007dd48a807dacb3f8253bca6e84f12e74911e4ac15138fce6614dd4a5b510f543ca76f0e5503486ec567c9fa2bda5c050330db8b3a25e7d
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.5.0. set accessor methods when attribute value is blank, instead of ignoring
2
+
1
3
  v0.4.0. add from_json() and register_listener() methods
2
4
 
3
5
  v0.3.7. don't mix in private methods when Morph is included
data/README.md CHANGED
@@ -4,11 +4,15 @@ Morph allows you to emerge Ruby class definitions from data or by calling assign
4
4
 
5
5
  ## Installing Morph
6
6
 
7
+ ```rb
7
8
  gem install morph
9
+ ```
8
10
 
9
11
  To use Morph:
10
12
 
13
+ ```rb
11
14
  require 'morph'
15
+ ```
12
16
 
13
17
  Tested to work with Ruby 1.8 - 2.3, JRuby 9, and Rubinius 3.
14
18
 
@@ -16,6 +20,7 @@ Tested to work with Ruby 1.8 - 2.3, JRuby 9, and Rubinius 3.
16
20
 
17
21
  Here's an example showing Morph creating classes and objects from JSON:
18
22
 
23
+ ```rb
19
24
  json = '{
20
25
  "id": "3599110793",
21
26
  "type": "PushEvent",
@@ -39,40 +44,34 @@ Here's an example showing Morph creating classes and objects from JSON:
39
44
  event = Morph.from_json json, type, namespace
40
45
 
41
46
  # => <Github::PushEvent @id="3599110793", @type="PushEvent",
42
- @actor=#<Github::Actor:0x007faa0c86b790 @id=3447, @login="robmckinnon",
43
- @url="https://api.github.com/users/robmckinnon">,
44
- @repo=#<Github::Repo:0x007faa0c869198 @id=5092, @name="robmckinnon/morph",
45
- @url="https://api.github.com/repos/robmckinnon/morph">
46
- >
47
+ # @actor=#<Github::Actor:0x007faa0c86b790 @id=3447, @login="robmckinnon",
48
+ # @url="https://api.github.com/users/robmckinnon">,
49
+ # @repo=#<Github::Repo:0x007faa0c869198 @id=5092, @name="robmckinnon/morph",
50
+ # @url="https://api.github.com/repos/robmckinnon/morph">
51
+ # >
47
52
 
48
- event.class
53
+ event.class # => Github::PushEvent
49
54
 
50
- # => Github::PushEvent
55
+ event.class.morph_attributes # => [:id, :type, :actor, :repo]
51
56
 
52
- event.class.morph_attributes
57
+ event.actor.class # => Github::Actor
53
58
 
54
- # => [:id, :type, :actor, :repo]
55
-
56
- event.actor.class
57
-
58
- # => Github::Actor
59
-
60
- event.repo.class
61
-
62
- # => Github::Repo
59
+ event.repo.class # => Github::Repo
60
+ ```
63
61
 
64
62
  If namespace module not provided, new classes are created in Morph module.
65
63
 
64
+ ```rb
66
65
  event = Morph.from_json json, type, namespace
67
66
 
68
- event.class
69
-
70
- # => Morph::PushEvent
67
+ event.class # => Morph::PushEvent
68
+ ```
71
69
 
72
70
  ## Morph creating classes `from_csv`
73
71
 
74
72
  Here's an example showing Morph playing with CSV (comma-separated values):
75
73
 
74
+ ```rb
76
75
  csv = %Q[name,party\nTed Roe,red\nAli Davidson,blue\nSue Smith,green]
77
76
 
78
77
  people = Morph.from_csv(csv, 'person')
@@ -81,14 +80,14 @@ Here's an example showing Morph playing with CSV (comma-separated values):
81
80
  #<Morph::Person @name="Ali Davidson", @party="blue">,
82
81
  #<Morph::Person @name="Sue Smith", @party="green">]
83
82
 
84
- people.last.party
85
-
86
- # => "green"
83
+ people.last.party # => "green"
84
+ ```
87
85
 
88
86
  ## Morph creating classes `from_tsv`
89
87
 
90
88
  Here's example code showing Morph playing with TSV (tab-separated values):
91
89
 
90
+ ```rb
92
91
  tsv = %Q[name\tparty\nTed Roe\tred\nAli Davidson\tblue\nSue Smith\tgreen]
93
92
 
94
93
  people = Morph.from_tsv(tsv, 'person')
@@ -97,14 +96,14 @@ Here's example code showing Morph playing with TSV (tab-separated values):
97
96
  #<Morph::Person @name="Ali Davidson", @party="blue">,
98
97
  #<Morph::Person @name="Sue Smith", @party="green">]
99
98
 
100
- people.last.party
101
-
102
- # => "green"
99
+ people.last.party # => "green"
100
+ ```
103
101
 
104
102
  ## Morph creating classes `from_xml`
105
103
 
106
104
  Here's example code showing Morph playing with XML:
107
105
 
106
+ ```rb
108
107
  xml = %Q[<?xml version="1.0" encoding="UTF-8"?>
109
108
  <councils type="array">
110
109
  <council code='1'>
@@ -120,9 +119,8 @@ Here's example code showing Morph playing with XML:
120
119
  # => [#<Morph::Council @code="1", @name="Aberdeen City Council">,
121
120
  #<Morph::Council @code="2", @name="Allerdale Borough Council">]
122
121
 
123
- councils.first.name
124
-
125
- # => "Aberdeen City Council"
122
+ councils.first.name # => "Aberdeen City Council"
123
+ ```
126
124
 
127
125
  ## Registering a listener to new class / methods via `register_listener`
128
126
 
@@ -131,27 +129,39 @@ created.
131
129
 
132
130
  For example given Morph used as a mixin:
133
131
 
134
- class Project; include Morph; end
132
+ ```rb
133
+ class Project
134
+ include Morph
135
+ end
136
+
135
137
  project = Project.new
138
+ ```
136
139
 
137
140
  Register listener:
138
141
 
142
+ ```rb
139
143
  listener = -> (klass, method) do
140
144
  puts "class: #{klass.to_s} --- method: #{method}"
141
145
  end
146
+
142
147
  Morph.register_listener listener
148
+ ```
143
149
 
144
150
  Callback prints string as new methods are created via assignment calls:
145
151
 
152
+ ```rb
146
153
  project.deadline = "11 11 2075"
147
154
  # class: Project --- method: deadline
148
155
 
149
156
  project.completed = true
150
157
  # class: Project --- method: completed
158
+ ```
151
159
 
152
160
  To unregister a listener use `unregister_listener`:
153
161
 
162
+ ```rb
154
163
  Morph.unregister_listener listener
164
+ ```
155
165
 
156
166
  For an example of Morph's `register_listener` being used to
157
167
  [create a Github API](https://github.com/robmckinnon/hubbit/blob/master/lib/hubbit.rb)
@@ -161,15 +171,19 @@ see the [Hubbit module](https://github.com/robmckinnon/hubbit/blob/master/lib/hu
161
171
 
162
172
  Time to generate an Active Record model? Get a sample script line like this:
163
173
 
174
+ ```rb
164
175
  Morph.script_generate(Project)
165
176
  #=> "rails destroy model Project;
166
177
  # rails generate model Project completed:string deadline:string
178
+ ```
167
179
 
168
180
  or specify the generator:
169
181
 
170
- Morph.script_generate(Hubbit, :generator => 'rspec_model')
182
+ ```rb
183
+ Morph.script_generate(Project, :generator => 'rspec_model')
171
184
  #=> "rails destroy rspec_model Project;
172
185
  # rails generate rspec_model Project completed:string deadline:string
186
+ ```
173
187
 
174
188
  You'll have to edit this as it currently sets all data types to be string, and
175
189
  doesn't understand associations.
@@ -177,40 +191,58 @@ doesn't understand associations.
177
191
 
178
192
  ## Morph setting hash of attributes via `morph`
179
193
 
180
- class Order; include Morph; end
194
+ ```rb
195
+ class Order
196
+ include Morph
197
+ end
198
+
181
199
  order = Order.new
200
+ ```
182
201
 
183
202
  How about adding a hash of attribute values?
184
203
 
204
+ ```rb
185
205
  order.morph :drink => 'tea', :spoons_of_sugar => 2, :milk => 'prefer soya thanks'
206
+ ```
186
207
 
187
208
  Looks like we got 'em:
188
209
 
189
- order.drink # => "tea"
210
+ ```rb
211
+ order.drink # => "tea"
190
212
  order.spoons_of_sugar # => 2
191
- order.milk # => "prefer soya thanks"
192
-
213
+ order.milk # => "prefer soya thanks"
214
+ ```
193
215
 
194
216
  ## Morph obtaining hash of attributes via `morph_attributes`
195
217
 
196
218
  Create an item:
197
219
 
198
- class Item; include Morph; end
220
+ ```rb
221
+ class Item
222
+ include Morph
223
+ end
224
+
199
225
  item = Item.new
200
226
  item.morph :name => 'spinach', :cost => 0.50
227
+ ```
201
228
 
202
229
  Now an order:
203
230
 
204
- class Order; include Morph; end
231
+ ```rb
232
+ class Order
233
+ include Morph
234
+ end
235
+
205
236
  order = Order.new
206
237
  order.no = 123
207
238
  order.items = [item]
239
+ ```
208
240
 
209
241
  Want to retrieve all that as a nested hash of values? No problem:
210
242
 
211
- order.morph_attributes
212
-
213
- # => {:items=>[{:name=>"spinach", :cost=>0.5}], :no=>123}
243
+ ```rb
244
+ order.morph_attributes # => {:items=>[{:name=>"spinach", :cost=>0.5}], :no=>123}
245
+ ```
214
246
 
215
247
 
216
248
  ## Last bits
data/lib/morph.rb CHANGED
@@ -111,7 +111,7 @@ module Chas
111
111
  end
112
112
 
113
113
  def self.argument_provided? args
114
- args.size > 0 && !args[0].nil? && !(args[0].is_a?(String) && args[0].strip.size == 0)
114
+ args.size > 0
115
115
  end
116
116
 
117
117
  def self.convert_to_morph_class_name label
@@ -132,7 +132,7 @@ module Chas
132
132
  end
133
133
 
134
134
  module Morph
135
- VERSION = '0.4.1' unless defined? Morph::VERSION
135
+ VERSION = '0.5.0' unless defined? Morph::VERSION
136
136
 
137
137
  class << self
138
138
  def classes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob McKinnon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-08 00:00:00.000000000 Z
11
+ date: 2016-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -71,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
71
  version: '0'
72
72
  requirements: []
73
73
  rubyforge_project:
74
- rubygems_version: 2.5.2
74
+ rubygems_version: 2.6.4
75
75
  signing_key:
76
76
  specification_version: 4
77
77
  summary: Morph allows you to emerge Ruby class definitions from data or by calling