morph 0.2.0 → 0.2.1

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.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ v0.2.1. better accomodation of unicode method names
2
+
3
+ v0.2.0. added script_generate method; fixed bug occurring when two morph classes exist
4
+
1
5
  v0.1.5. added morph_attributes instance method
2
6
 
3
7
  v0.1.4. can now pass code block to customize the dynamically added methods
data/Manifest CHANGED
@@ -5,5 +5,6 @@ lib/morph.rb
5
5
  LICENSE
6
6
  README
7
7
  spec/morph_spec.rb
8
+ spec/morph_spec_helper.rb
8
9
  spec/spec.opts
9
10
  Manifest
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+ require 'lib/morph'
4
+
5
+ begin
6
+ require 'echoe'
7
+
8
+ Echoe.new("morph", Morph::VERSION) do |m|
9
+ m.author = ["Rob McKinnon"]
10
+ m.email = ["rob ~@nospam@~ rubyforge.org"]
11
+ m.description = File.readlines("README").first
12
+ m.rubyforge_name = "morph"
13
+ m.rdoc_options << '--inline-source'
14
+ m.rdoc_pattern = ["README", "CHANGELOG", "LICENSE"]
15
+ end
16
+
17
+ rescue LoadError
18
+ puts "You need to install the echoe gem to perform meta operations on this gem"
19
+ end
20
+
21
+ desc "Open an irb session preloaded with this library"
22
+ task :console do
23
+ sh "irb -rubygems -r ./lib/morph.rb"
24
+ end
data/lib/morph.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Morph
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
 
4
4
  def self.included(base)
5
5
  base.extend ClassMethods
@@ -111,26 +111,25 @@ module Morph
111
111
  end
112
112
  end
113
113
 
114
- protected
115
-
116
- def morph_method_missing symbol, *args
117
- attribute = symbol.to_s.chomp '='
118
-
119
- if Object.instance_methods.include?(attribute)
120
- raise "'#{attribute}' is an instance_method on Object, cannot create accessor methods for '#{attribute}'"
121
- elsif argument_provided? args
122
- base = self.class
123
- base.adding_morph_method = true
124
-
125
- if block_given?
126
- yield base, attribute
127
- else
128
- base.class_eval "attr_accessor :#{attribute}"
129
- send(symbol, *args)
130
- end
131
- base.adding_morph_method = false
114
+ def morph_method_missing symbol, *args
115
+ attribute = symbol.to_s.chomp '='
116
+
117
+ if Object.instance_methods.include?(attribute)
118
+ raise "'#{attribute}' is an instance_method on Object, cannot create accessor methods for '#{attribute}'"
119
+ elsif argument_provided? args
120
+ base = self.class
121
+ base.adding_morph_method = true
122
+
123
+ if block_given?
124
+ yield base, attribute
125
+ else
126
+ # base.class_eval "attr_accessor :#{attribute}"
127
+ base.class_eval "def #{attribute}; @#{attribute}; end; def #{attribute}=(value); @#{attribute} = value; end"
128
+ send(symbol, *args)
132
129
  end
130
+ base.adding_morph_method = false
133
131
  end
132
+ end
134
133
 
135
134
  private
136
135
 
@@ -143,6 +142,5 @@ module Morph
143
142
  name = '_'+name if name =~ /^\d/
144
143
  name
145
144
  end
146
-
147
145
  end
148
146
  end
data/morph.gemspec CHANGED
@@ -1,53 +1,83 @@
1
1
 
2
- # Gem::Specification for Morph-0.2.0
2
+ # Gem::Specification for Morph-0.2.1
3
3
  # Originally generated by Echoe
4
4
 
5
- Gem::Specification.new do |s|
6
- s.name = %q{morph}
7
- s.version = "0.2.0"
5
+ --- !ruby/object:Gem::Specification
6
+ name: morph
7
+ version: !ruby/object:Gem::Version
8
+ version: 0.2.1
9
+ platform: ruby
10
+ authors:
11
+ - Rob McKinnon
12
+ autorequire:
13
+ bindir: bin
8
14
 
9
- s.specification_version = 2 if s.respond_to? :specification_version=
15
+ date: 2008-08-05 00:00:00 +01:00
16
+ default_executable:
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: echoe
20
+ type: :development
21
+ version_requirement:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: "0"
27
+ version:
28
+ description: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
29
+ email:
30
+ - rob ~@nospam@~ rubyforge.org
31
+ executables: []
10
32
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.authors = ["Rob McKinnon"]
13
- s.date = %q{2008-05-01}
14
- s.description = %q{Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.}
15
- s.email = ["rob ~@nospam@~ rubyforge.org"]
16
- s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README"]
17
- s.files = ["CHANGELOG", "examples/forger.rb", "examples/hubbit.rb", "lib/morph.rb", "LICENSE", "README", "spec/morph_spec.rb", "spec/spec.opts", "Manifest", "morph.gemspec"]
18
- s.has_rdoc = true
19
- s.homepage = %q{}
20
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Morph", "--main", "README", "--inline-source"]
21
- s.require_paths = ["lib"]
22
- s.rubyforge_project = %q{morph}
23
- s.rubygems_version = %q{1.1.0}
24
- s.summary = %q{Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.}
25
- end
33
+ extensions: []
26
34
 
35
+ extra_rdoc_files:
36
+ - CHANGELOG
37
+ - LICENSE
38
+ - README
39
+ files:
40
+ - CHANGELOG
41
+ - examples/forger.rb
42
+ - examples/hubbit.rb
43
+ - lib/morph.rb
44
+ - LICENSE
45
+ - README
46
+ - spec/morph_spec.rb
47
+ - spec/morph_spec_helper.rb
48
+ - spec/spec.opts
49
+ - Manifest
50
+ - morph.gemspec
51
+ - Rakefile
52
+ has_rdoc: true
53
+ homepage: ""
54
+ post_install_message:
55
+ rdoc_options:
56
+ - --line-numbers
57
+ - --inline-source
58
+ - --title
59
+ - Morph
60
+ - --main
61
+ - README
62
+ - --inline-source
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "="
74
+ - !ruby/object:Gem::Version
75
+ version: "1.2"
76
+ version:
77
+ requirements: []
27
78
 
28
- # # Original Rakefile source (requires the Echoe gem):
29
- #
30
- # require 'rubygems'
31
- # require 'spec'
32
- # require 'lib/morph'
33
- #
34
- # begin
35
- # require 'echoe'
36
- #
37
- # Echoe.new("morph", Morph::VERSION) do |m|
38
- # m.author = ["Rob McKinnon"]
39
- # m.email = ["rob ~@nospam@~ rubyforge.org"]
40
- # m.description = File.readlines("README").first
41
- # m.rubyforge_name = "morph"
42
- # m.rdoc_options << '--inline-source'
43
- # m.rdoc_pattern = ["README", "CHANGELOG", "LICENSE"]
44
- # end
45
- #
46
- # rescue LoadError
47
- # puts "You need to install the echoe gem to perform meta operations on this gem"
48
- # end
49
- #
50
- # desc "Open an irb session preloaded with this library"
51
- # task :console do
52
- # sh "irb -rubygems -r ./lib/morph.rb"
53
- # end
79
+ rubyforge_project: morph
80
+ rubygems_version: 1.2.0
81
+ specification_version: 2
82
+ summary: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
83
+ test_files: []
data/spec/morph_spec.rb CHANGED
@@ -1,330 +1,353 @@
1
1
  require File.dirname(__FILE__) + '/../lib/morph'
2
2
  require File.dirname(__FILE__) + '/morph_spec_helper'
3
3
 
4
- describe Morph, "when writer method that didn't exist before is called with non-nil value" do
5
- before :each do
6
- remove_morph_methods
7
- @quack = 'quack'
8
- @morph.noise= @quack
9
- @attribute = 'noise'
10
- @expected_morph_methods_count = 2
11
- end
4
+ describe Morph do
5
+ describe "when writer method that didn't exist before is called with non-nil value" do
6
+ before :each do
7
+ remove_morph_methods
8
+ @quack = 'quack'
9
+ @morph.noise= @quack
10
+ @attribute = 'noise'
11
+ @expected_morph_methods_count = 2
12
+ end
12
13
 
13
- it_should_behave_like "class with generated accessor methods added"
14
+ it_should_behave_like "class with generated accessor methods added"
14
15
 
15
- it 'should return assigned value when reader method called' do
16
- @morph.noise.should == @quack
17
- end
16
+ it 'should return assigned value when reader method called' do
17
+ @morph.noise.should == @quack
18
+ end
18
19
 
19
- it 'should return hash of attributes when morph_attributes called' do
20
- @morph.morph_attributes.should == {@attribute.to_sym => @quack}
21
- end
20
+ it 'should return hash of attributes when morph_attributes called' do
21
+ @morph.morph_attributes.should == {@attribute.to_sym => @quack}
22
+ end
22
23
 
23
- it 'should generate rails model generator script line, with given model name' do
24
- @morphed_class.script_generate {|model_name| 'SomethingDifferent'}.should == "ruby script/destroy rspec_model SomethingDifferent; ruby script/generate rspec_model SomethingDifferent noise:string"
25
- end
24
+ it 'should generate rails model generator script line, with given model name' do
25
+ @morphed_class.script_generate {|model_name| 'SomethingDifferent'}.should == "ruby script/destroy rspec_model SomethingDifferent; ruby script/generate rspec_model SomethingDifferent noise:string"
26
+ end
26
27
 
27
- it 'should generate rails model generator script line' do
28
- @morphed_class.script_generate.should == "ruby script/destroy rspec_model ExampleMorph; ruby script/generate rspec_model ExampleMorph noise:string"
29
- end
28
+ it 'should generate rails model generator script line' do
29
+ @morphed_class.script_generate.should == "ruby script/destroy rspec_model ExampleMorph; ruby script/generate rspec_model ExampleMorph noise:string"
30
+ end
30
31
 
31
- it 'should generate rails model generator script line' do
32
- @morphed_class.script_generate(:generator=>'model').should == "ruby script/destroy model ExampleMorph; ruby script/generate model ExampleMorph noise:string"
32
+ it 'should generate rails model generator script line' do
33
+ @morphed_class.script_generate(:generator=>'model').should == "ruby script/destroy model ExampleMorph; ruby script/generate model ExampleMorph noise:string"
34
+ end
33
35
  end
34
- end
35
36
 
36
- describe Morph, "when writer method that didn't exist before is called with nil value" do
37
- before :each do
38
- remove_morph_methods
39
- @morph.noise= nil
40
- @attribute = 'noise'
37
+ describe "when writer method that didn't exist before is called with nil value" do
38
+ before :each do
39
+ remove_morph_methods
40
+ @morph.noise= nil
41
+ @attribute = 'noise'
42
+ end
43
+
44
+ it_should_behave_like "class without generated accessor methods added"
41
45
  end
42
46
 
43
- it_should_behave_like "class without generated accessor methods added"
44
- end
47
+ describe "when different writer method called on two different morph classes" do
48
+ include MorphSpecHelperMethods
45
49
 
46
- describe Morph, "when different writer method called on two different morph classes" do
47
- include MorphSpecHelperMethods
50
+ before :each do
51
+ initialize_morph
52
+ initialize_another_morph
53
+ end
48
54
 
49
- before :each do
50
- initialize_morph
51
- initialize_another_morph
52
- end
55
+ it 'should have morph_method return appropriate methods for each class' do
56
+ @morph.every = 'where'
57
+ @another_morph.no = 'where'
53
58
 
54
- it 'should have morph_method return appropriate methods for each class' do
55
- @morph.every = 'where'
56
- @another_morph.no = 'where'
59
+ @morphed_class.morph_methods.size.should == 2
60
+ @another_morphed_class.morph_methods.size.should == 2
57
61
 
58
- @morphed_class.morph_methods.size.should == 2
59
- @another_morphed_class.morph_methods.size.should == 2
62
+ @morphed_class.morph_methods.should == ['every','every=']
63
+ @another_morphed_class.morph_methods.should == ['no','no=']
64
+ end
60
65
 
61
- @morphed_class.morph_methods.should == ['every','every=']
62
- @another_morphed_class.morph_methods.should == ['no','no=']
63
- end
66
+ it 'should call morph_attributes on both objects, when one object has a reference to another' do
67
+ @morph.every = 'which'
68
+ @another_morph.way = 'but'
69
+ @morph.loose = @another_morph
64
70
 
65
- it 'should call morph_attributes on both objects, when one object has a reference to another' do
66
- @morph.every = 'which'
67
- @another_morph.way = 'but'
68
- @morph.loose = @another_morph
71
+ attributes = @morph.morph_attributes
72
+ attributes[:every].should == 'which'
73
+ attributes[:loose].should == {:way => 'but'}
74
+ end
69
75
 
70
- attributes = @morph.morph_attributes
71
- attributes[:every].should == 'which'
72
- attributes[:loose].should == {:way => 'but'}
73
- end
76
+ it 'should call morph_attributes on both objects, when one object has a reference to array of others' do
77
+ @morph.every = 'which'
78
+ @another_morph.way = 'but'
79
+ @morph.loose = [@another_morph]
74
80
 
75
- it 'should call morph_attributes on both objects, when one object has a reference to array of others' do
76
- @morph.every = 'which'
77
- @another_morph.way = 'but'
78
- @morph.loose = [@another_morph]
81
+ attributes = @morph.morph_attributes
82
+ attributes[:every].should == 'which'
83
+ attributes[:loose].should == [{:way => 'but'}]
84
+ end
79
85
 
80
- attributes = @morph.morph_attributes
81
- attributes[:every].should == 'which'
82
- attributes[:loose].should == [{:way => 'but'}]
83
- end
86
+ it 'should call morph_attributes on both objects, when one object has a reference to hash of others' do
87
+ @morph.every = 'which'
88
+ @another_morph.way = 'but'
89
+ @morph.loose = { :honky_tonk => @another_morph}
84
90
 
85
- it 'should call morph_attributes on both objects, when one object has a reference to hash of others' do
86
- @morph.every = 'which'
87
- @another_morph.way = 'but'
88
- @morph.loose = { :honky_tonk => @another_morph}
91
+ attributes = @morph.morph_attributes
92
+ attributes[:every].should == 'which'
93
+ attributes[:loose].should == { :honky_tonk => {:way => 'but'} }
94
+ end
89
95
 
90
- attributes = @morph.morph_attributes
91
- attributes[:every].should == 'which'
92
- attributes[:loose].should == { :honky_tonk => {:way => 'but'} }
96
+ after :each do
97
+ remove_morph_methods
98
+ remove_another_morph_methods
99
+ end
93
100
  end
94
101
 
95
- after :each do
96
- remove_morph_methods
97
- remove_another_morph_methods
98
- end
99
- end
102
+ describe "when class definition contains methods and morph is included" do
103
+ include MorphSpecHelperMethods
100
104
 
101
- describe Morph, "when class definition contains methods and morph is included" do
102
- include MorphSpecHelperMethods
105
+ after :all do
106
+ remove_morph_methods
107
+ @morphed_class.class_eval "remove_method :happy"
108
+ end
103
109
 
104
- after :all do
105
- remove_morph_methods
106
- @morphed_class.class_eval "remove_method :happy"
110
+ it 'should not return methods defined in class in morph_methods list' do
111
+ initialize_morph "class ExampleMorph\n include Morph\n def happy\n 'happy, joy, joy'\n end\n end"
112
+ morph_methods.should be_empty
113
+ end
107
114
  end
108
115
 
109
- it 'should not return methods defined in class in morph_methods list' do
110
- initialize_morph "class ExampleMorph\n include Morph\n def happy\n 'happy, joy, joy'\n end\n end"
111
- morph_methods.should be_empty
112
- end
113
- end
116
+ describe "when writer method that didn't exist before is called with blank space attribute value" do
117
+ before :each do
118
+ remove_morph_methods
119
+ @morph.noise= ' '
120
+ @attribute = 'noise'
121
+ end
114
122
 
115
- describe Morph, "when writer method that didn't exist before is called with blank space attribute value" do
116
- before :each do
117
- remove_morph_methods
118
- @morph.noise= ' '
119
- @attribute = 'noise'
123
+ it_should_behave_like "class without generated accessor methods added"
120
124
  end
121
125
 
122
- it_should_behave_like "class without generated accessor methods added"
123
- end
126
+ describe 'when morph method used to set attribute value' do
124
127
 
125
- describe Morph, 'when morph method used to set attribute value' do
128
+ before :each do
129
+ remove_morph_methods
130
+ @value = '20 Mar 2008'
131
+ @morph.morph('Reading', @value)
132
+ @attribute = 'reading'
133
+ @expected_morph_methods_count = 2
134
+ end
135
+
136
+ it_should_behave_like "class with generated accessor methods added"
126
137
 
127
- before :each do
128
- remove_morph_methods
129
- @value = '20 Mar 2008'
130
- @morph.morph('Reading', @value)
131
- @attribute = 'reading'
132
- @expected_morph_methods_count = 2
138
+ it 'should return assigned value when reader method called' do
139
+ @morph.reading.should == @value
140
+ end
133
141
  end
134
142
 
135
- it_should_behave_like "class with generated accessor methods added"
143
+ describe 'when morph method used to set an attribute value hash' do
144
+ before :each do
145
+ remove_morph_methods
146
+ @attributes = [:drink,:sugars,:milk]
147
+ @morph.morph :drink => 'tea', :sugars => 2, :milk => 'yes please'
148
+ @expected_morph_methods_count = 6
149
+ end
136
150
 
137
- it 'should return assigned value when reader method called' do
138
- @morph.reading.should == @value
139
- end
140
- end
151
+ it_should_behave_like "class with generated accessor methods added"
141
152
 
142
- describe Morph, 'when morph method used to set an attribute value hash' do
143
- before :each do
144
- remove_morph_methods
145
- @attributes = [:drink,:sugars,:milk]
146
- @morph.morph :drink => 'tea', :sugars => 2, :milk => 'yes please'
147
- @expected_morph_methods_count = 6
148
- end
153
+ it 'should return assigned value when reader method called' do
154
+ @morph.drink.should == 'tea'
155
+ @morph.sugars.should == 2
156
+ @morph.milk.should == 'yes please'
157
+ end
149
158
 
150
- it_should_behave_like "class with generated accessor methods added"
159
+ it 'should generate rails model generator script line' do
160
+ @morphed_class.script_generate.should == "ruby script/destroy rspec_model ExampleMorph; ruby script/generate rspec_model ExampleMorph drink:string milk:string sugars:string"
161
+ end
151
162
 
152
- it 'should return assigned value when reader method called' do
153
- @morph.drink.should == 'tea'
154
- @morph.sugars.should == 2
155
- @morph.milk.should == 'yes please'
163
+ it 'should generate rails model generator script line' do
164
+ @morphed_class.script_generate(:generator=>'model').should == "ruby script/destroy model ExampleMorph; ruby script/generate model ExampleMorph drink:string milk:string sugars:string"
165
+ end
156
166
  end
157
167
 
158
- it 'should generate rails model generator script line' do
159
- @morphed_class.script_generate.should == "ruby script/destroy rspec_model ExampleMorph; ruby script/generate rspec_model ExampleMorph drink:string milk:string sugars:string"
160
- end
168
+ describe "when morph method used to set unicode attribute name with a value" do
169
+ before :each do
170
+ $KCODE = "u"
171
+ remove_morph_methods
172
+ @age = 19
173
+ @attribute = "年龄"
174
+ @morph.morph(@attribute, @age)
175
+ @expected_morph_methods_count = 2
176
+ end
161
177
 
162
- it 'should generate rails model generator script line' do
163
- @morphed_class.script_generate(:generator=>'model').should == "ruby script/destroy model ExampleMorph; ruby script/generate model ExampleMorph drink:string milk:string sugars:string"
164
- end
165
- end
178
+ after :all do
179
+ $KCODE = "NONE"
180
+ end
166
181
 
167
- describe Morph, "when morph method used to set unicode attribute name with a value" do
168
- before :each do
169
- $KCODE = "u"
170
- remove_morph_methods
171
- @age = 19
172
- @attribute = "年龄"
173
- @morph.morph(@attribute, @age)
174
- @expected_morph_methods_count = 2
175
- end
182
+ it_should_behave_like "class with generated accessor methods added"
176
183
 
177
- after :all do
178
- $KCODE = "NONE"
184
+ it 'should return assigned value when reader method called' do
185
+ @morph.send(@attribute.to_sym) == @age
186
+ end
179
187
  end
180
188
 
181
- it_should_behave_like "class with generated accessor methods added"
189
+ describe "when morph method used to set japanese and latin unicode attribute name with a value" do
190
+ before :each do
191
+ $KCODE = "u"
192
+ remove_morph_methods
193
+ @age = 19
194
+ @attribute = "ページビュー_graph"
195
+ @morph.morph(@attribute, @age)
196
+ @expected_morph_methods_count = 2
197
+ end
182
198
 
183
- it 'should return assigned value when reader method called' do
184
- @morph.send(@attribute.to_sym) == @age
185
- end
186
- end
199
+ after :all do
200
+ $KCODE = "NONE"
201
+ end
202
+
203
+ it_should_behave_like "class with generated accessor methods added"
187
204
 
188
- describe Morph, 'when morph method used to set blank space attribute value' do
189
- before :each do
190
- remove_morph_methods
191
- @morph.morph('Pizza', ' ')
192
- @attribute = 'pizza'
205
+ it 'should return assigned value when reader method called' do
206
+ @morph.send(@attribute.to_sym) == @age
207
+ end
193
208
  end
194
209
 
195
- it_should_behave_like "class without generated accessor methods added"
196
- end
210
+ describe 'when morph method used to set blank space attribute value' do
211
+ before :each do
212
+ remove_morph_methods
213
+ @morph.morph('Pizza', ' ')
214
+ @attribute = 'pizza'
215
+ end
197
216
 
198
- describe Morph, 'when morph method used to set nil attribute value' do
199
- before :each do
200
- remove_morph_methods
201
- @morph.morph('Pizza', nil)
202
- @attribute = 'pizza'
217
+ it_should_behave_like "class without generated accessor methods added"
203
218
  end
204
219
 
205
- it_should_behave_like "class without generated accessor methods added"
206
- end
220
+ describe 'when morph method used to set nil attribute value' do
221
+ before :each do
222
+ remove_morph_methods
223
+ @morph.morph('Pizza', nil)
224
+ @attribute = 'pizza'
225
+ end
226
+
227
+ it_should_behave_like "class without generated accessor methods added"
228
+ end
207
229
 
208
230
 
209
- describe Morph, "when reader method that didn't exist before is called" do
231
+ describe "when reader method that didn't exist before is called" do
210
232
 
211
- include MorphSpecHelperMethods
233
+ include MorphSpecHelperMethods
212
234
 
213
- it 'should raise NoMethodError' do
214
- initialize_morph
215
- lambda { @morph.noise }.should raise_error(/undefined method `noise'/)
235
+ it 'should raise NoMethodError' do
236
+ initialize_morph
237
+ lambda { @morph.noise }.should raise_error(/undefined method `noise'/)
238
+ end
216
239
  end
217
- end
218
240
 
219
- describe Morph, "when reader method called that didn't exist before is a class method" do
241
+ describe "when reader method called that didn't exist before is a class method" do
220
242
 
221
- include MorphSpecHelperMethods
243
+ include MorphSpecHelperMethods
222
244
 
223
- it 'should raise NoMethodError' do
224
- initialize_morph
225
- lambda { @morph.name }.should raise_error(/undefined method `name'/)
245
+ it 'should raise NoMethodError' do
246
+ initialize_morph
247
+ lambda { @morph.name }.should raise_error(/undefined method `name'/)
248
+ end
226
249
  end
227
- end
228
250
 
229
- describe Morph, "when writer method called matches a class reader method" do
251
+ describe "when writer method called matches a class reader method" do
230
252
 
231
- before :each do
232
- remove_morph_methods
233
- @value = 'Morph'
234
- @morph.name = @value
235
- @attribute = 'name'
236
- @expected_morph_methods_count = 2
237
- end
253
+ before :each do
254
+ remove_morph_methods
255
+ @value = 'Morph'
256
+ @morph.name = @value
257
+ @attribute = 'name'
258
+ @expected_morph_methods_count = 2
259
+ end
238
260
 
239
- it_should_behave_like "class with generated accessor methods added"
261
+ it_should_behave_like "class with generated accessor methods added"
240
262
 
241
- it 'should return assigned value when reader method called' do
242
- @morph.name.should == @value
263
+ it 'should return assigned value when reader method called' do
264
+ @morph.name.should == @value
265
+ end
243
266
  end
244
- end
245
267
 
246
268
 
247
- describe Morph, "when class= is called" do
269
+ describe "when class= is called" do
248
270
 
249
- include MorphSpecHelperMethods
250
- before :all do initialize_morph; end
251
- after :all do remove_morph_methods; end
271
+ include MorphSpecHelperMethods
272
+ before :all do initialize_morph; end
273
+ after :all do remove_morph_methods; end
252
274
 
253
- it 'should throw exception if non nil object is passed' do
254
- lambda { @morph.class = 'Red' }.should raise_error(/cannot create accessor methods/)
255
- end
275
+ it 'should throw exception if non nil object is passed' do
276
+ lambda { @morph.class = 'Red' }.should raise_error(/cannot create accessor methods/)
277
+ end
256
278
 
257
- it 'should throw exception if nil object is passed' do
258
- lambda { @morph.class = nil }.should raise_error(/cannot create accessor methods/)
279
+ it 'should throw exception if nil object is passed' do
280
+ lambda { @morph.class = nil }.should raise_error(/cannot create accessor methods/)
281
+ end
259
282
  end
260
- end
261
283
 
262
- describe Morph, 'when passing block to morph_method_missing' do
284
+ describe 'when passing block to morph_method_missing' do
263
285
 
264
- include MorphSpecHelperMethods
265
- before :all do initialize_morph; end
266
- after :each do remove_morph_methods; end
286
+ include MorphSpecHelperMethods
287
+ before :all do initialize_morph; end
288
+ after :each do remove_morph_methods; end
267
289
 
268
- it 'should class_eval the block' do
269
- @morph.morph_method_missing(:chunky, 'bacon') do |base, attribute|
270
- base.class_eval "def #{attribute}; 'spinach'; end"
290
+ it 'should class_eval the block' do
291
+ @morph.morph_method_missing(:chunky, 'bacon') do |base, attribute|
292
+ base.class_eval "def #{attribute}; 'spinach'; end"
293
+ end
294
+ @morph.respond_to?(:chunky).should == true
295
+ @morph.chunky.should == 'spinach'
296
+ @morphed_class.class_eval "remove_method :chunky"
297
+ lambda { @morph.chunky }.should raise_error
271
298
  end
272
- @morph.respond_to?(:chunky).should == true
273
- @morph.chunky.should == 'spinach'
274
- @morphed_class.class_eval "remove_method :chunky"
275
- lambda { @morph.chunky }.should raise_error
276
- end
277
299
 
278
- it 'should class_eval the block' do
279
- @morph.morph_method_missing :chunky, 'bacon' do |base, attribute|
280
- base.class_def(attribute) { 'spinach' }
300
+ it 'should class_eval the block' do
301
+ @morph.morph_method_missing :chunky, 'bacon' do |base, attribute|
302
+ base.class_def(attribute) { 'spinach' }
303
+ end
304
+ @morph.respond_to?(:chunky).should == true
305
+ @morph.chunky.should == 'spinach'
306
+ @morphed_class.class_eval "remove_method :chunky"
307
+ lambda { @morph.chunky }.should raise_error
281
308
  end
282
- @morph.respond_to?(:chunky).should == true
283
- @morph.chunky.should == 'spinach'
284
- @morphed_class.class_eval "remove_method :chunky"
285
- lambda { @morph.chunky }.should raise_error
286
- end
287
309
 
288
- end
310
+ end
289
311
 
290
- describe Morph, "when converting label text to morph method name" do
312
+ describe "when converting label text to morph method name" do
291
313
 
292
- include MorphSpecHelperMethods
314
+ include MorphSpecHelperMethods
293
315
 
294
- it 'should upper case to lower case' do
295
- check_convert_to_morph_method_name 'CaSe', 'case'
296
- end
297
- it 'should convert single space to underscorce' do
298
- check_convert_to_morph_method_name 'First reading', 'first_reading'
299
- end
300
- it 'should convert multiple spaces to single underscorce' do
301
- check_convert_to_morph_method_name "First reading", 'first_reading'
302
- end
303
- it 'should convert tabs to single underscorce' do
304
- check_convert_to_morph_method_name "First\t\treading", 'first_reading'
305
- end
306
- it 'should convert new line chars to single underscorce' do
307
- check_convert_to_morph_method_name "First\r\nreading", 'first_reading'
308
- end
309
- it 'should remove leading and trailing whitespace new line chars to single underscorce' do
310
- check_convert_to_morph_method_name " \t\r\nFirst reading \t\r\n", 'first_reading'
311
- end
312
- it 'should remove trailing colon surrounded by whitespace' do
313
- check_convert_to_morph_method_name "First reading : ", 'first_reading'
314
- end
315
- it 'should remove parenthesis' do
316
- check_convert_to_morph_method_name 'Nav(GBX)', 'nav_gbx'
317
- end
318
- it 'should remove *' do
319
- check_convert_to_morph_method_name 'Change**', 'change'
320
- end
321
- it 'should convert % character to the text "percentage"' do
322
- check_convert_to_morph_method_name '% Change', 'percentage_change'
323
- end
324
- it 'should precede leading digit with an underscore character' do
325
- check_convert_to_morph_method_name '52w_high', '_52w_high'
326
- end
327
- it 'should handle unicode name' do
328
- check_convert_to_morph_method_name '年龄', '年龄'
316
+ it 'should upper case to lower case' do
317
+ check_convert_to_morph_method_name 'CaSe', 'case'
318
+ end
319
+ it 'should convert single space to underscorce' do
320
+ check_convert_to_morph_method_name 'First reading', 'first_reading'
321
+ end
322
+ it 'should convert multiple spaces to single underscorce' do
323
+ check_convert_to_morph_method_name "First reading", 'first_reading'
324
+ end
325
+ it 'should convert tabs to single underscorce' do
326
+ check_convert_to_morph_method_name "First\t\treading", 'first_reading'
327
+ end
328
+ it 'should convert new line chars to single underscorce' do
329
+ check_convert_to_morph_method_name "First\r\nreading", 'first_reading'
330
+ end
331
+ it 'should remove leading and trailing whitespace new line chars to single underscorce' do
332
+ check_convert_to_morph_method_name " \t\r\nFirst reading \t\r\n", 'first_reading'
333
+ end
334
+ it 'should remove trailing colon surrounded by whitespace' do
335
+ check_convert_to_morph_method_name "First reading : ", 'first_reading'
336
+ end
337
+ it 'should remove parenthesis' do
338
+ check_convert_to_morph_method_name 'Nav(GBX)', 'nav_gbx'
339
+ end
340
+ it 'should remove *' do
341
+ check_convert_to_morph_method_name 'Change**', 'change'
342
+ end
343
+ it 'should convert % character to the text "percentage"' do
344
+ check_convert_to_morph_method_name '% Change', 'percentage_change'
345
+ end
346
+ it 'should precede leading digit with an underscore character' do
347
+ check_convert_to_morph_method_name '52w_high', '_52w_high'
348
+ end
349
+ it 'should handle unicode name' do
350
+ check_convert_to_morph_method_name '年龄', '年龄'
351
+ end
329
352
  end
330
353
  end
@@ -0,0 +1,122 @@
1
+ require File.dirname(__FILE__) + '/../lib/morph'
2
+
3
+ module MorphSpecHelperMethods
4
+
5
+ def initialize_morph_class code=nil
6
+ code = 'class ExampleMorph; include Morph; end' unless code
7
+ eval code
8
+ @morphed_class = ExampleMorph
9
+ end
10
+
11
+ def initialize_second_morph_class code=nil
12
+ code = 'class AnotherMorph; include Morph; end' unless code
13
+ eval code
14
+ @another_morphed_class = AnotherMorph
15
+ end
16
+
17
+ def initialize_morph code=nil
18
+ initialize_morph_class code
19
+ @original_instance_methods = @morphed_class.instance_methods
20
+ @morph = @morphed_class.new
21
+ end
22
+
23
+ def initialize_another_morph
24
+ initialize_second_morph_class
25
+ @more_original_instance_methods = @another_morphed_class.instance_methods
26
+ @another_morph = @another_morphed_class.new
27
+ end
28
+
29
+ def remove_morph_methods
30
+ @morphed_class.instance_methods.each do |method|
31
+ @morphed_class.class_eval "remove_method :#{method}" unless @original_instance_methods.include?(method)
32
+ end
33
+ end
34
+
35
+ def remove_another_morph_methods
36
+ @another_morphed_class.instance_methods.each do |method|
37
+ @another_morphed_class.class_eval "remove_method :#{method}" unless @more_original_instance_methods.include?(method)
38
+ end
39
+ end
40
+
41
+ def instance_methods
42
+ @morphed_class.instance_methods
43
+ end
44
+
45
+ def morph_methods
46
+ @morphed_class.morph_methods
47
+ end
48
+
49
+ def check_convert_to_morph_method_name label, method_name
50
+ code = 'class ExampleMorph; include Morph; def convert_to_morph_method_name label; super; end; end'
51
+ eval code
52
+ ExampleMorph.new.convert_to_morph_method_name(label).should == method_name
53
+ end
54
+
55
+ def each_attribute
56
+ if @attribute
57
+ yield @attribute
58
+ elsif @attributes
59
+ @attributes.each {|a| yield a }
60
+ end
61
+ end
62
+ end
63
+
64
+ describe "class with generated accessor methods added", :shared => true do
65
+
66
+ include MorphSpecHelperMethods
67
+ before :all do initialize_morph; end
68
+ after :all do remove_morph_methods; end
69
+
70
+ it 'should add reader method to class instance_methods list' do
71
+ each_attribute { |a| instance_methods.should include(a.to_s) }
72
+ end
73
+
74
+ it 'should add writer method to class instance_methods list' do
75
+ each_attribute { |a| instance_methods.should include("#{a}=") }
76
+ end
77
+
78
+ it 'should add reader method to class morph_methods list' do
79
+ each_attribute { |a| morph_methods.should include(a.to_s) }
80
+ end
81
+
82
+ it 'should add writer method to class morph_methods list' do
83
+ each_attribute { |a| morph_methods.should include("#{a}=") }
84
+ end
85
+
86
+ it 'should only have generated accessor methods in morph_methods list' do
87
+ morph_methods.size.should == @expected_morph_methods_count
88
+ end
89
+
90
+ end
91
+
92
+ describe "class without generated accessor methods added", :shared => true do
93
+ include MorphSpecHelperMethods
94
+
95
+ before :all do
96
+ initialize_morph
97
+ end
98
+
99
+ after :all do
100
+ remove_morph_methods
101
+ end
102
+
103
+ it 'should not add reader method to class instance_methods list' do
104
+ instance_methods.should_not include(@attribute)
105
+ end
106
+
107
+ it 'should not add writer method to class instance_methods list' do
108
+ instance_methods.should_not include("#{@attribute}=")
109
+ end
110
+
111
+ it 'should not add reader method to class morph_methods list' do
112
+ morph_methods.should_not include(@attribute)
113
+ end
114
+
115
+ it 'should not add writer method to class morph_methods list' do
116
+ morph_methods.should_not include("#{@attribute}=")
117
+ end
118
+
119
+ it 'should have empty morph_methods list' do
120
+ morph_methods.size.should == 0
121
+ end
122
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob McKinnon
@@ -9,10 +9,19 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-01 00:00:00 +01:00
12
+ date: 2008-08-05 00:00:00 +01:00
13
13
  default_executable:
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: echoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
16
25
  description: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
17
26
  email:
18
27
  - rob ~@nospam@~ rubyforge.org
@@ -32,9 +41,11 @@ files:
32
41
  - LICENSE
33
42
  - README
34
43
  - spec/morph_spec.rb
44
+ - spec/morph_spec_helper.rb
35
45
  - spec/spec.opts
36
46
  - Manifest
37
47
  - morph.gemspec
48
+ - Rakefile
38
49
  has_rdoc: true
39
50
  homepage: ""
40
51
  post_install_message:
@@ -56,14 +67,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
67
  version:
57
68
  required_rubygems_version: !ruby/object:Gem::Requirement
58
69
  requirements:
59
- - - ">="
70
+ - - "="
60
71
  - !ruby/object:Gem::Version
61
- version: "0"
72
+ version: "1.2"
62
73
  version:
63
74
  requirements: []
64
75
 
65
76
  rubyforge_project: morph
66
- rubygems_version: 1.1.0
77
+ rubygems_version: 1.2.0
67
78
  signing_key:
68
79
  specification_version: 2
69
80
  summary: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.