morph 0.3.4 → 0.3.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.
- data/CHANGELOG +2 -0
- data/Manifest +0 -5
- data/README +23 -9
- data/lib/morph.rb +15 -6
- data/morph.gemspec +5 -5
- metadata +5 -10
- data/examples/forger.rb +0 -31
- data/examples/hubbit.rb +0 -32
- data/spec/lib/morph_spec.rb +0 -642
- data/spec/morph_spec_helper.rb +0 -147
- data/spec/spec_helper.rb +0 -3
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
data/README
CHANGED
@@ -1,44 +1,50 @@
|
|
1
|
-
Morph mixin allows you to emerge class definitions via calling assignment methods
|
1
|
+
Morph mixin allows you to emerge Ruby class definitions from data via calling assignment methods.
|
2
2
|
|
3
3
|
|
4
|
+
== Installing Morph
|
5
|
+
|
6
|
+
gem install morph
|
7
|
+
|
8
|
+
To use Morph:
|
9
|
+
|
10
|
+
require 'morph'
|
11
|
+
|
4
12
|
== Morph creating classes +from_csv+
|
5
13
|
|
6
14
|
Here's example code showing Morph playing with CSV (comma-separated values):
|
7
15
|
|
8
|
-
require 'rubygems'; require 'morph'
|
9
|
-
|
10
16
|
csv = %Q[name,party\nTed Roe,red\nAli Davidson,blue\nSue Smith,green]
|
11
17
|
|
12
18
|
people = Morph.from_csv(csv, 'person')
|
19
|
+
|
13
20
|
# => [#<Morph::Person @name="Ted Roe", @party="red">,
|
14
21
|
#<Morph::Person @name="Ali Davidson", @party="blue">,
|
15
22
|
#<Morph::Person @name="Sue Smith", @party="green">]
|
16
23
|
|
17
24
|
people.last.party
|
25
|
+
|
18
26
|
# => "green"
|
19
27
|
|
20
28
|
== Morph creating classes +from_tsv+
|
21
29
|
|
22
30
|
Here's example code showing Morph playing with TSV (tab-separated values):
|
23
31
|
|
24
|
-
require 'rubygems'; require 'morph'
|
25
|
-
|
26
32
|
tsv = %Q[name\tparty\nTed Roe\tred\nAli Davidson\tblue\nSue Smith\tgreen]
|
27
33
|
|
28
34
|
people = Morph.from_tsv(tsv, 'person')
|
35
|
+
|
29
36
|
# => [#<Morph::Person @name="Ted Roe", @party="red">,
|
30
37
|
#<Morph::Person @name="Ali Davidson", @party="blue">,
|
31
38
|
#<Morph::Person @name="Sue Smith", @party="green">]
|
32
39
|
|
33
40
|
people.last.party
|
41
|
+
|
34
42
|
# => "green"
|
35
43
|
|
36
44
|
== Morph creating classes +from_xml+
|
37
45
|
|
38
46
|
Here's example code showing Morph playing with XML:
|
39
47
|
|
40
|
-
require 'rubygems'; require 'morph'
|
41
|
-
|
42
48
|
xml = %Q[<?xml version="1.0" encoding="UTF-8"?>
|
43
49
|
<councils type="array">
|
44
50
|
<council code='1'>
|
@@ -50,18 +56,20 @@ Here's example code showing Morph playing with XML:
|
|
50
56
|
</councils>]
|
51
57
|
|
52
58
|
councils = Morph.from_xml(xml)
|
59
|
+
|
53
60
|
# => [#<Morph::Council @code="1", @name="Aberdeen City Council">,
|
54
61
|
#<Morph::Council @code="2", @name="Allerdale Borough Council">]
|
55
62
|
|
56
63
|
councils.first.name
|
64
|
+
|
57
65
|
# => "Aberdeen City Council"
|
58
66
|
|
59
67
|
== Morph playing with +Nokogiri+
|
60
68
|
|
61
69
|
Here's example code showing Morph playing with Nokogiri in Ruby 1.9.2:
|
62
70
|
|
63
|
-
require '
|
64
|
-
|
71
|
+
require 'morph'; require 'nokogiri'; require 'open-uri'
|
72
|
+
|
65
73
|
|
66
74
|
class Hubbit
|
67
75
|
include Morph # allows class to morph
|
@@ -93,6 +101,7 @@ The model emerges from the data. Let's start by looking up 'why':
|
|
93
101
|
What new methods do we have?
|
94
102
|
|
95
103
|
Hubbit.morph_methods.map {|m| m.to_s}
|
104
|
+
|
96
105
|
#=> ["location", "location=", "member_since", "member_since=", "name", "name="]
|
97
106
|
|
98
107
|
Ah-ha, so we have a name attribute now:
|
@@ -112,6 +121,7 @@ Let's add some of why's projects:
|
|
112
121
|
That why's a productive fellow! Note new accessor methods have been added:
|
113
122
|
|
114
123
|
Hubbit.morph_methods.map {|m| m.to_s}
|
124
|
+
|
115
125
|
#=> ["location", "location=", "member_since", "member_since=", "name", "name=",
|
116
126
|
# "projects", "projects="]
|
117
127
|
|
@@ -123,6 +133,7 @@ Let's do some more morphing:
|
|
123
133
|
Do we have more methods now?
|
124
134
|
|
125
135
|
Hubbit.morph_methods.map {|m| m.to_s}
|
136
|
+
|
126
137
|
#=> ["company", "company=", "email", "email=", "location", "location=",
|
127
138
|
# "member_since", "member_since=", "name", "name=", "projects", "projects=",
|
128
139
|
# "website_blog", "website_blog="]
|
@@ -137,6 +148,7 @@ So, a new company method has appeared:
|
|
137
148
|
Time to generate an Active Record model? Get a sample script line like this:
|
138
149
|
|
139
150
|
Hubbit.script_generate
|
151
|
+
|
140
152
|
#=> "rails destroy model Hubbit;
|
141
153
|
# rails generate model Hubbit company:string email:string location:string
|
142
154
|
# member_since:string name:string projects:string website_blog:string"
|
@@ -144,6 +156,7 @@ Time to generate an Active Record model? Get a sample script line like this:
|
|
144
156
|
or specify the generator:
|
145
157
|
|
146
158
|
Hubbit.script_generate :generator => 'rspec_model'
|
159
|
+
|
147
160
|
#=> "rails destroy rspec_model Hubbit;
|
148
161
|
# rails generate rspec_model Hubbit company:string email:string
|
149
162
|
# location:string member_since:string name:string projects:string
|
@@ -187,6 +200,7 @@ Now an order:
|
|
187
200
|
Want to retrieve all that as a nested hash of values? No problem:
|
188
201
|
|
189
202
|
order.morph_attributes
|
203
|
+
|
190
204
|
# => {:items=>[{:name=>"spinach", :cost=>0.5}], :no=>123}
|
191
205
|
|
192
206
|
|
data/lib/morph.rb
CHANGED
@@ -18,7 +18,7 @@ rescue Exception => e
|
|
18
18
|
end
|
19
19
|
|
20
20
|
module Morph
|
21
|
-
VERSION = "0.3.
|
21
|
+
VERSION = "0.3.5" unless defined? Morph::VERSION
|
22
22
|
|
23
23
|
class << self
|
24
24
|
def generate_migrations object, options={}
|
@@ -183,20 +183,29 @@ module Morph
|
|
183
183
|
|
184
184
|
module ClassMethods
|
185
185
|
|
186
|
-
@@adding_morph_method = Hash.new {|hash,klass| hash[klass] = false }
|
187
|
-
@@morph_methods = Hash.new {|hash,klass| hash[klass] = {} }
|
188
|
-
@@morph_attributes = Hash.new {|hash,klass| hash[klass] = [] }
|
186
|
+
@@adding_morph_method = Hash.new {|hash,klass| hash[klass] = false } unless defined?(@@adding_morph_method)
|
187
|
+
@@morph_methods = Hash.new {|hash,klass| hash[klass] = {} } unless defined?(@@morph_methods)
|
188
|
+
@@morph_attributes = Hash.new {|hash,klass| hash[klass] = [] } unless defined?(@@morph_attributes)
|
189
189
|
|
190
190
|
def morph_attributes
|
191
|
-
|
191
|
+
if superclass.respond_to?(:morph_attributes)
|
192
|
+
@@morph_attributes[self] + superclass.morph_attributes
|
193
|
+
else
|
194
|
+
@@morph_attributes[self] + []
|
195
|
+
end
|
192
196
|
end
|
193
197
|
|
194
198
|
def morph_methods
|
195
|
-
if RUBY_VERSION >= "1.9"
|
199
|
+
methods = if RUBY_VERSION >= "1.9"
|
196
200
|
@@morph_methods[self].keys.sort.map(&:to_sym)
|
197
201
|
else
|
198
202
|
@@morph_methods[self].keys.sort
|
199
203
|
end
|
204
|
+
|
205
|
+
if superclass.respond_to?(:morph_attributes)
|
206
|
+
methods += superclass.morph_methods
|
207
|
+
end
|
208
|
+
methods
|
200
209
|
end
|
201
210
|
|
202
211
|
def adding_morph_method= true_or_false
|
data/morph.gemspec
CHANGED
@@ -2,21 +2,21 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "morph"
|
5
|
-
s.version = "0.3.
|
5
|
+
s.version = "0.3.5"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Rob McKinnon"]
|
9
|
-
s.date = "2012-
|
10
|
-
s.description = "Morph mixin allows you to emerge class definitions via calling assignment methods
|
9
|
+
s.date = "2012-08-31"
|
10
|
+
s.description = "Morph mixin allows you to emerge Ruby class definitions from data via calling assignment methods.\n"
|
11
11
|
s.email = ["rob ~@nospam@~ rubyforge.org"]
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README"]
|
13
|
-
s.files = ["CHANGELOG", "
|
13
|
+
s.files = ["CHANGELOG", "lib/morph.rb", "LICENSE", "README", "Manifest", "morph.gemspec", "Rakefile"]
|
14
14
|
s.homepage = "https://github.com/robmckinnon/morph"
|
15
15
|
s.post_install_message = "Read usage examples at: https://github.com/robmckinnon/morph#readme"
|
16
16
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Morph", "--main", "README", "--inline-source"]
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
s.rubyforge_project = "morph"
|
19
|
-
s.rubygems_version = "1.8.
|
19
|
+
s.rubygems_version = "1.8.24"
|
20
20
|
s.summary = "Morph mixin allows you to emerge class definitions via calling assignment methods."
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
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.3.
|
4
|
+
version: 0.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -59,8 +59,8 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
-
description: ! 'Morph mixin allows you to emerge class definitions
|
63
|
-
|
62
|
+
description: ! 'Morph mixin allows you to emerge Ruby class definitions from data
|
63
|
+
via calling assignment methods.
|
64
64
|
|
65
65
|
'
|
66
66
|
email:
|
@@ -73,14 +73,9 @@ extra_rdoc_files:
|
|
73
73
|
- README
|
74
74
|
files:
|
75
75
|
- CHANGELOG
|
76
|
-
- examples/forger.rb
|
77
|
-
- examples/hubbit.rb
|
78
76
|
- lib/morph.rb
|
79
77
|
- LICENSE
|
80
78
|
- README
|
81
|
-
- spec/lib/morph_spec.rb
|
82
|
-
- spec/morph_spec_helper.rb
|
83
|
-
- spec/spec_helper.rb
|
84
79
|
- Manifest
|
85
80
|
- morph.gemspec
|
86
81
|
- Rakefile
|
@@ -111,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
111
106
|
version: '1.2'
|
112
107
|
requirements: []
|
113
108
|
rubyforge_project: morph
|
114
|
-
rubygems_version: 1.8.
|
109
|
+
rubygems_version: 1.8.24
|
115
110
|
signing_key:
|
116
111
|
specification_version: 3
|
117
112
|
summary: Morph mixin allows you to emerge class definitions via calling assignment
|
data/examples/forger.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'rubygems'; require 'hpricot'; require 'open-uri'; require 'morph'
|
2
|
-
|
3
|
-
# An example of Morph playing with Hpricot
|
4
|
-
class Forger
|
5
|
-
|
6
|
-
include Morph
|
7
|
-
|
8
|
-
def initialize name
|
9
|
-
begin
|
10
|
-
doc = Hpricot open("http://rubyforge.org/users/#{name}")
|
11
|
-
|
12
|
-
table = doc.at('td[text() = "Personal Information"]').parent.parent
|
13
|
-
values = table/'tr/td/strong'
|
14
|
-
|
15
|
-
values.collect do |node|
|
16
|
-
value = node.inner_text.strip
|
17
|
-
label = node.at('../../td[1]').inner_text
|
18
|
-
morph(label, value)
|
19
|
-
end
|
20
|
-
rescue
|
21
|
-
raise "Couldn't find forger with name: #{name}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def Forger name
|
27
|
-
Forger.new name
|
28
|
-
end
|
29
|
-
|
30
|
-
#> why = Forger 'why'
|
31
|
-
|
data/examples/hubbit.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'morph'
|
2
|
-
|
3
|
-
require 'rubygems'; require 'nokogiri'; require 'open-uri'
|
4
|
-
|
5
|
-
# An example of Morph playing with Nokogiri
|
6
|
-
class Hubbit
|
7
|
-
include Morph # allows class to morph
|
8
|
-
|
9
|
-
def initialize name
|
10
|
-
doc = Nokogiri::HTML open("https://github.com/#{name}")
|
11
|
-
|
12
|
-
profile_fields = doc.search('.vcard dt')
|
13
|
-
|
14
|
-
profile_fields.each do |node|
|
15
|
-
label = node.inner_text
|
16
|
-
value = node.next_element.inner_text.strip
|
17
|
-
|
18
|
-
morph(label, value) # morph magic adds accessor methods!
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def member_since_date
|
23
|
-
Date.parse member_since
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def Hubbit name
|
28
|
-
Hubbit.new name
|
29
|
-
end
|
30
|
-
|
31
|
-
# why = Hubbit 'why'
|
32
|
-
# dhh = Hubbit 'dhh'
|
data/spec/lib/morph_spec.rb
DELETED
@@ -1,642 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require File.dirname(__FILE__) + '/../morph_spec_helper'
|
3
|
-
|
4
|
-
describe Morph do
|
5
|
-
include MorphSpecHelperMethods
|
6
|
-
|
7
|
-
describe "when writer method that didn't exist before is called with non-nil value" do
|
8
|
-
before :all do initialize_morph; end
|
9
|
-
after :all do remove_morph_methods; end
|
10
|
-
|
11
|
-
before :each do
|
12
|
-
remove_morph_methods
|
13
|
-
@quack = 'quack'
|
14
|
-
@morph.noise= @quack
|
15
|
-
@attribute = 'noise'
|
16
|
-
@expected_morph_methods_count = 2
|
17
|
-
end
|
18
|
-
|
19
|
-
it_should_behave_like "class with generated accessor methods added"
|
20
|
-
|
21
|
-
it 'should return assigned value when reader method called' do
|
22
|
-
@morph.noise.should == @quack
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should return hash of attributes when morph_attributes called' do
|
26
|
-
@morph.morph_attributes.should == {@attribute.to_sym => @quack}
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should generate rails model generator script line, with given model name' do
|
30
|
-
@morphed_class.script_generate {|model_name| 'SomethingDifferent'}.should == "rails destroy model SomethingDifferent; rails generate model SomethingDifferent noise:string"
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'should generate rails model generator script line' do
|
34
|
-
@morphed_class.script_generate.should == "rails destroy model ExampleMorph; rails generate model ExampleMorph noise:string"
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should generate rails model generator script line' do
|
38
|
-
@morphed_class.script_generate(:generator=>'model').should == "rails destroy model ExampleMorph; rails generate model ExampleMorph noise:string"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "when writer method that didn't exist before is called with nil value" do
|
43
|
-
before :each do
|
44
|
-
remove_morph_methods
|
45
|
-
@morph.noise= nil
|
46
|
-
@attribute = 'noise'
|
47
|
-
end
|
48
|
-
|
49
|
-
it_should_behave_like "class without generated accessor methods added"
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "when different writer method called on two different morph classes" do
|
53
|
-
include MorphSpecHelperMethods
|
54
|
-
|
55
|
-
before :each do
|
56
|
-
initialize_morph
|
57
|
-
initialize_another_morph
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'should have morph_method return appropriate methods for each class' do
|
61
|
-
@morph.every = 'where'
|
62
|
-
@another_morph.no = 'where'
|
63
|
-
|
64
|
-
@morphed_class.morph_methods.size.should == 2
|
65
|
-
@another_morphed_class.morph_methods.size.should == 2
|
66
|
-
|
67
|
-
if RUBY_VERSION >= "1.9"
|
68
|
-
@morphed_class.morph_methods.should == [:every,:every=]
|
69
|
-
@another_morphed_class.morph_methods.should == [:no,:no=]
|
70
|
-
else
|
71
|
-
@morphed_class.morph_methods.should == ['every','every=']
|
72
|
-
@another_morphed_class.morph_methods.should == ['no','no=']
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should call morph_attributes on both objects, when one object has a reference to another' do
|
77
|
-
@morph.every = 'which'
|
78
|
-
@another_morph.way = 'but'
|
79
|
-
@morph.loose = @another_morph
|
80
|
-
|
81
|
-
attributes = @morph.morph_attributes
|
82
|
-
attributes[:every].should == 'which'
|
83
|
-
attributes[:loose].should == {:way => 'but'}
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'should call morph_attributes on both objects, when one object has a reference to array of others' do
|
87
|
-
@morph.every = 'which'
|
88
|
-
@another_morph.way = 'but'
|
89
|
-
@morph.loose = [@another_morph]
|
90
|
-
|
91
|
-
attributes = @morph.morph_attributes
|
92
|
-
attributes[:every].should == 'which'
|
93
|
-
attributes[:loose].should == [{:way => 'but'}]
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'should call morph_attributes on both objects, when one object has a reference to hash of others' do
|
97
|
-
@morph.every = 'which'
|
98
|
-
@another_morph.way = 'but'
|
99
|
-
@morph.loose = { :honky_tonk => @another_morph}
|
100
|
-
|
101
|
-
attributes = @morph.morph_attributes
|
102
|
-
attributes[:every].should == 'which'
|
103
|
-
attributes[:loose].should == { :honky_tonk => {:way => 'but'} }
|
104
|
-
attributes.delete(:every)
|
105
|
-
attributes = @morph.morph_attributes
|
106
|
-
attributes[:every].should == 'which'
|
107
|
-
|
108
|
-
attributes = @morph.class.morph_attributes
|
109
|
-
attributes.should == [:every, :loose]
|
110
|
-
attributes.delete(:every)
|
111
|
-
attributes = @morph.class.morph_attributes
|
112
|
-
attributes.should == [:every, :loose]
|
113
|
-
end
|
114
|
-
|
115
|
-
after :each do
|
116
|
-
remove_morph_methods
|
117
|
-
remove_another_morph_methods
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
describe "when class definition contains methods and morph is included" do
|
122
|
-
include MorphSpecHelperMethods
|
123
|
-
|
124
|
-
after :all do
|
125
|
-
remove_morph_methods
|
126
|
-
@morphed_class.class_eval "remove_method :happy" if @morphed_class
|
127
|
-
end
|
128
|
-
|
129
|
-
it 'should not return methods defined in class in morph_methods list' do
|
130
|
-
initialize_morph "class ExampleMorph\n include Morph\n def happy\n 'happy, joy, joy'\n end\n end"
|
131
|
-
morph_methods.should be_empty
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
describe "when writer method that didn't exist before is called with blank space attribute value" do
|
136
|
-
before :each do
|
137
|
-
remove_morph_methods
|
138
|
-
@morph.noise= ' '
|
139
|
-
@attribute = 'noise'
|
140
|
-
end
|
141
|
-
|
142
|
-
it_should_behave_like "class without generated accessor methods added"
|
143
|
-
end
|
144
|
-
|
145
|
-
describe 'when morph method used to set attribute value' do
|
146
|
-
before :all do initialize_morph; end
|
147
|
-
after :all do remove_morph_methods; end
|
148
|
-
|
149
|
-
before :each do
|
150
|
-
remove_morph_methods
|
151
|
-
@value = '20 Mar 2008'
|
152
|
-
@morph.morph('Reading', @value)
|
153
|
-
@attribute = 'reading'
|
154
|
-
@expected_morph_methods_count = 2
|
155
|
-
end
|
156
|
-
|
157
|
-
it_should_behave_like "class with generated accessor methods added"
|
158
|
-
|
159
|
-
it 'should return assigned value when reader method called' do
|
160
|
-
@morph.reading.should == @value
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
describe 'when morph method used to set an attribute value hash' do
|
165
|
-
before :all do initialize_morph; end
|
166
|
-
after :all do remove_morph_methods; end
|
167
|
-
|
168
|
-
before :each do
|
169
|
-
remove_morph_methods
|
170
|
-
@attributes = [:drink,:sugars,:milk]
|
171
|
-
@morph.morph :drink => 'tea', :sugars => 2, :milk => 'yes please'
|
172
|
-
@expected_morph_methods_count = 6
|
173
|
-
end
|
174
|
-
|
175
|
-
it_should_behave_like "class with generated accessor methods added"
|
176
|
-
|
177
|
-
it 'should return assigned value when reader method called' do
|
178
|
-
@morph.drink.should == 'tea'
|
179
|
-
@morph.sugars.should == 2
|
180
|
-
@morph.milk.should == 'yes please'
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'should generate rails model generator script line' do
|
184
|
-
@morphed_class.script_generate.should == "rails destroy model ExampleMorph; rails generate model ExampleMorph drink:string milk:string sugars:string"
|
185
|
-
end
|
186
|
-
|
187
|
-
it 'should generate rails model generator script line' do
|
188
|
-
@morphed_class.script_generate(:generator=>'model').should == "rails destroy model ExampleMorph; rails generate model ExampleMorph drink:string milk:string sugars:string"
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
=begin
|
193
|
-
describe "when morph method used to set unicode attribute name with a value" do
|
194
|
-
before :all do initialize_morph; end
|
195
|
-
after :all do remove_morph_methods; end
|
196
|
-
|
197
|
-
before :each do
|
198
|
-
$KCODE = "u" unless RUBY_VERSION >= "1.9"
|
199
|
-
remove_morph_methods
|
200
|
-
@age = 19
|
201
|
-
@attribute = "年龄"
|
202
|
-
@morph.morph(@attribute, @age)
|
203
|
-
@expected_morph_methods_count = 2
|
204
|
-
end
|
205
|
-
|
206
|
-
after :all do
|
207
|
-
$KCODE = "NONE" unless RUBY_VERSION >= "1.9"
|
208
|
-
end
|
209
|
-
|
210
|
-
it_should_behave_like "class with generated accessor methods added"
|
211
|
-
|
212
|
-
it 'should return assigned value when reader method called' do
|
213
|
-
@morph.send(@attribute.to_sym) == @age
|
214
|
-
end
|
215
|
-
end
|
216
|
-
describe "when morph method used to set japanese and latin unicode attribute name with a value" do
|
217
|
-
before :all do initialize_morph; end
|
218
|
-
after :all do remove_morph_methods; end
|
219
|
-
|
220
|
-
before :each do
|
221
|
-
$KCODE = "u" unless RUBY_VERSION >= "1.9"
|
222
|
-
remove_morph_methods
|
223
|
-
@age = 19
|
224
|
-
@attribute = "ページビュー_graph"
|
225
|
-
@morph.morph(@attribute, @age)
|
226
|
-
@expected_morph_methods_count = 2
|
227
|
-
end
|
228
|
-
|
229
|
-
after :all do
|
230
|
-
$KCODE = "NONE" unless RUBY_VERSION >= "1.9"
|
231
|
-
end
|
232
|
-
|
233
|
-
it_should_behave_like "class with generated accessor methods added"
|
234
|
-
|
235
|
-
it 'should return assigned value when reader method called' do
|
236
|
-
@morph.send(@attribute.to_sym) == @age
|
237
|
-
end
|
238
|
-
end
|
239
|
-
=end
|
240
|
-
describe 'when morph method used to set blank space attribute value' do
|
241
|
-
before :each do
|
242
|
-
remove_morph_methods
|
243
|
-
@morph.morph('Pizza', ' ')
|
244
|
-
@attribute = 'pizza'
|
245
|
-
end
|
246
|
-
|
247
|
-
it_should_behave_like "class without generated accessor methods added"
|
248
|
-
end
|
249
|
-
|
250
|
-
describe 'when morph method used to set nil attribute value' do
|
251
|
-
before :each do
|
252
|
-
remove_morph_methods
|
253
|
-
@morph.morph('Pizza', nil)
|
254
|
-
@attribute = 'pizza'
|
255
|
-
end
|
256
|
-
|
257
|
-
it_should_behave_like "class without generated accessor methods added"
|
258
|
-
end
|
259
|
-
|
260
|
-
|
261
|
-
describe "when reader method that didn't exist before is called" do
|
262
|
-
|
263
|
-
include MorphSpecHelperMethods
|
264
|
-
|
265
|
-
it 'should raise NoMethodError' do
|
266
|
-
initialize_morph
|
267
|
-
lambda { @morph.noise }.should raise_error(/undefined method `noise'/)
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
describe "when reader method called that didn't exist before is a class method" do
|
272
|
-
|
273
|
-
include MorphSpecHelperMethods
|
274
|
-
|
275
|
-
it 'should raise NoMethodError' do
|
276
|
-
initialize_morph
|
277
|
-
lambda { @morph.name }.should raise_error(/undefined method `name'/)
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
describe "when writer method called matches a class reader method" do
|
282
|
-
|
283
|
-
before :all do initialize_morph; end
|
284
|
-
after :all do remove_morph_methods; end
|
285
|
-
|
286
|
-
before :each do
|
287
|
-
remove_morph_methods
|
288
|
-
@value = 'Morph'
|
289
|
-
@morph.name = @value
|
290
|
-
@attribute = 'name'
|
291
|
-
@expected_morph_methods_count = 2
|
292
|
-
end
|
293
|
-
|
294
|
-
it_should_behave_like "class with generated accessor methods added"
|
295
|
-
|
296
|
-
it 'should return assigned value when reader method called' do
|
297
|
-
@morph.name.should == @value
|
298
|
-
end
|
299
|
-
end
|
300
|
-
|
301
|
-
|
302
|
-
describe "when class= is called" do
|
303
|
-
|
304
|
-
include MorphSpecHelperMethods
|
305
|
-
before :all do initialize_morph; end
|
306
|
-
after :all do remove_morph_methods; end
|
307
|
-
|
308
|
-
it 'should throw exception if non nil object is passed' do
|
309
|
-
lambda { @morph.class = 'Red' }.should raise_error(/cannot create accessor methods/)
|
310
|
-
end
|
311
|
-
|
312
|
-
it 'should throw exception if nil object is passed' do
|
313
|
-
lambda { @morph.class = nil }.should raise_error(/cannot create accessor methods/)
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
describe 'when passing block to morph_method_missing' do
|
318
|
-
|
319
|
-
include MorphSpecHelperMethods
|
320
|
-
before :all do initialize_morph; end
|
321
|
-
after :each do remove_morph_methods; end
|
322
|
-
|
323
|
-
it 'should class_eval the block' do
|
324
|
-
@morph.morph_method_missing(:chunky, 'bacon') do |base, attribute|
|
325
|
-
base.class_eval "def #{attribute}; 'spinach'; end"
|
326
|
-
end
|
327
|
-
@morph.respond_to?(:chunky).should == true
|
328
|
-
@morph.chunky.should == 'spinach'
|
329
|
-
@morphed_class.class_eval "remove_method :chunky"
|
330
|
-
lambda { @morph.chunky }.should raise_error
|
331
|
-
end
|
332
|
-
|
333
|
-
it 'should class_eval the block' do
|
334
|
-
@morph.morph_method_missing :chunky, 'bacon' do |base, attribute|
|
335
|
-
base.class_def(attribute) { 'spinach' }
|
336
|
-
end
|
337
|
-
@morph.respond_to?(:chunky).should == true
|
338
|
-
@morph.chunky.should == 'spinach'
|
339
|
-
@morphed_class.class_eval "remove_method :chunky"
|
340
|
-
lambda { @morph.chunky }.should raise_error
|
341
|
-
end
|
342
|
-
|
343
|
-
end
|
344
|
-
|
345
|
-
describe "when converting label text to morph method name" do
|
346
|
-
|
347
|
-
include MorphSpecHelperMethods
|
348
|
-
|
349
|
-
it 'should covert dash to underscore' do
|
350
|
-
check_convert_to_morph_method_name 'hi-time', 'hi_time'
|
351
|
-
end
|
352
|
-
it 'should upper case to lower case' do
|
353
|
-
check_convert_to_morph_method_name 'CaSe', 'case'
|
354
|
-
end
|
355
|
-
it 'should convert single space to underscorce' do
|
356
|
-
check_convert_to_morph_method_name 'First reading', 'first_reading'
|
357
|
-
end
|
358
|
-
it 'should convert multiple spaces to single underscorce' do
|
359
|
-
check_convert_to_morph_method_name "First reading", 'first_reading'
|
360
|
-
end
|
361
|
-
it 'should convert tabs to single underscorce' do
|
362
|
-
check_convert_to_morph_method_name "First\t\treading", 'first_reading'
|
363
|
-
end
|
364
|
-
it 'should convert new line chars to single underscorce' do
|
365
|
-
check_convert_to_morph_method_name "First\r\nreading", 'first_reading'
|
366
|
-
end
|
367
|
-
it 'should remove leading and trailing whitespace new line chars to single underscorce' do
|
368
|
-
check_convert_to_morph_method_name " \t\r\nFirst reading \t\r\n", 'first_reading'
|
369
|
-
end
|
370
|
-
it 'should remove trailing colon surrounded by whitespace' do
|
371
|
-
check_convert_to_morph_method_name "First reading : ", 'first_reading'
|
372
|
-
end
|
373
|
-
it 'should remove parenthesis' do
|
374
|
-
check_convert_to_morph_method_name 'Nav(GBX)', 'nav_gbx'
|
375
|
-
end
|
376
|
-
it 'should remove *' do
|
377
|
-
check_convert_to_morph_method_name 'Change**', 'change'
|
378
|
-
end
|
379
|
-
it 'should convert % character to the text "percentage"' do
|
380
|
-
check_convert_to_morph_method_name '% Change', 'percentage_change'
|
381
|
-
end
|
382
|
-
it 'should precede leading digit with an underscore character' do
|
383
|
-
check_convert_to_morph_method_name '52w_high', '_52w_high'
|
384
|
-
end
|
385
|
-
it 'should handle unicode name' do
|
386
|
-
check_convert_to_morph_method_name '年龄', '年龄'
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
describe 'creating from hash' do
|
391
|
-
it 'should create classes and object instances with array of hashes' do
|
392
|
-
h = {
|
393
|
-
"CompanyDetails"=> {
|
394
|
-
"SearchItems"=> [
|
395
|
-
{ "CompanyDate"=> '',
|
396
|
-
"CompanyIndexStatus"=> '',
|
397
|
-
"DataSet"=>"LIVE",
|
398
|
-
"CompanyName"=>"CANONGROVE LIMITED",
|
399
|
-
"CompanyNumber"=>"SC244777" },
|
400
|
-
{ "CompanyDate"=>"",
|
401
|
-
"CompanyIndexStatus"=>"",
|
402
|
-
"DataSet"=>"LIVE",
|
403
|
-
"CompanyName"=>"CANONHALL ACCOUNTANCY LTD",
|
404
|
-
"CompanyNumber"=>"05110715" }
|
405
|
-
]
|
406
|
-
}
|
407
|
-
}
|
408
|
-
company_details = Morph.from_hash(h)
|
409
|
-
company_details.search_items.first.class.name.should == 'Morph::SearchItem'
|
410
|
-
company_details.search_items.first.data_set.should == 'LIVE'
|
411
|
-
company_details.search_items.first.company_name.should == 'CANONGROVE LIMITED'
|
412
|
-
end
|
413
|
-
|
414
|
-
it 'should create classes and object instances' do
|
415
|
-
h = {
|
416
|
-
"CompanyDetails"=> {
|
417
|
-
:RegAddress=> {
|
418
|
-
"AddressLine"=>["ST DAVID'S HOUSE", "WEST WING", "WOOD STREET", "CARDIFF CF10 1ES"]},
|
419
|
-
"LastFullMemDate"=>"2002-03-25",
|
420
|
-
"xsi:schemaLocation"=>"xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.xsd",
|
421
|
-
"HasBranchInfo"=>"0",
|
422
|
-
"Mortgages"=> {
|
423
|
-
"NumMortSatisfied"=>"0",
|
424
|
-
"MortgageInd"=>"LT300",
|
425
|
-
"NumMortOutstanding"=>"7",
|
426
|
-
"NumMortPartSatisfied"=>"0",
|
427
|
-
"NumMortCharges"=>"7"},
|
428
|
-
"CompanyCategory"=>"Public Limited Company",
|
429
|
-
"HasAppointments"=>"1",
|
430
|
-
"SICCodes"=> {
|
431
|
-
"SicText"=>"stadiums"},
|
432
|
-
"Returns"=> {
|
433
|
-
"Overdue"=>"NO",
|
434
|
-
"DocumentAvailable"=>"1",
|
435
|
-
"NextDueDate"=>"2003-04-22",
|
436
|
-
"LastMadeUpDate"=>"2002-03-25"
|
437
|
-
},
|
438
|
-
"CountryOfOrigin"=>"United Kingdom",
|
439
|
-
"CompanyStatus"=>"Active",
|
440
|
-
"CompanyName"=>"MILLENNIUM STADIUM PLC",
|
441
|
-
"InLiquidation"=>"0",
|
442
|
-
"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
|
443
|
-
"Accounts"=>{
|
444
|
-
"Overdue"=>"NO",
|
445
|
-
"DocumentAvailable"=>"1",
|
446
|
-
"AccountCategory"=>"FULL",
|
447
|
-
"NextDueDate"=>"2002-11-30",
|
448
|
-
"LastMadeUpDate"=>"2001-04-30",
|
449
|
-
"AccountRefDate"=>"0000-30-04"},
|
450
|
-
"IncorporationDate"=>"1996-03-25",
|
451
|
-
"CompanyNumber"=>"03176906",
|
452
|
-
"xmlns"=>"http://xmlgw.companieshouse.gov.uk/v1-0"
|
453
|
-
}
|
454
|
-
}
|
455
|
-
Object.const_set 'Company', Module.new
|
456
|
-
Company.const_set 'House', Module.new
|
457
|
-
|
458
|
-
company_details = Morph.from_hash(h, Company::House)
|
459
|
-
company_details.class.name.should == 'Company::House::CompanyDetails'
|
460
|
-
morph_methods = company_details.class.morph_methods
|
461
|
-
if RUBY_VERSION >= "1.9"
|
462
|
-
morph_methods.include?(:last_full_mem_date).should be_true
|
463
|
-
morph_methods.include?(:accounts).should be_true
|
464
|
-
morph_methods.delete(:accounts)
|
465
|
-
morph_methods.include?(:accounts).should be_false
|
466
|
-
morph_methods = company_details.class.morph_methods
|
467
|
-
morph_methods.include?(:accounts).should be_true
|
468
|
-
else
|
469
|
-
morph_methods.include?('last_full_mem_date').should be_true
|
470
|
-
morph_methods.include?('accounts').should be_true
|
471
|
-
morph_methods.delete('accounts')
|
472
|
-
morph_methods.include?('accounts').should be_false
|
473
|
-
morph_methods = company_details.class.morph_methods
|
474
|
-
morph_methods.include?('accounts').should be_true
|
475
|
-
end
|
476
|
-
|
477
|
-
company_details.accounts.class.name.should == 'Company::House::Accounts'
|
478
|
-
company_details.accounts.overdue.should == 'NO'
|
479
|
-
company_details.last_full_mem_date.should == "2002-03-25"
|
480
|
-
company_details.sic_codes.sic_text.should == 'stadiums'
|
481
|
-
company_details.reg_address.address_lines.should == ["ST DAVID'S HOUSE", "WEST WING", "WOOD STREET", "CARDIFF CF10 1ES"]
|
482
|
-
|
483
|
-
list = Morph.generate_migrations company_details, :ignore=>['xmlns','xmlns_xsi','xsi_schema_location']
|
484
|
-
list.size.should == 7
|
485
|
-
list[0].should == "./script/generate model company_details company_category:string company_name:string company_number:string company_status:string country_of_origin:string has_appointments:string has_branch_info:string in_liquidation:string incorporation_date:date last_full_mem_date:date"
|
486
|
-
list[1].should == './script/generate model accounts company_details_id:integer account_category:string account_ref_date:date document_available:string last_made_up_date:date next_due_date:date overdue:string'
|
487
|
-
list[2].should == './script/generate model mortgages company_details_id:integer mortgage_ind:string num_mort_charges:string num_mort_outstanding:string num_mort_part_satisfied:string num_mort_satisfied:string'
|
488
|
-
list[3].should == './script/generate model reg_address company_details_id:integer'
|
489
|
-
list[4].should == './script/generate model address_lines reg_address_id:integer'
|
490
|
-
list[5].should == './script/generate model returns company_details_id:integer document_available:string last_made_up_date:date next_due_date:date overdue:string'
|
491
|
-
list[6].should == './script/generate model sic_codes company_details_id:integer sic_text:string'
|
492
|
-
|
493
|
-
yaml = %Q|--- !ruby/object:Company::House::CompanyDetails
|
494
|
-
accounts: !ruby/object:Company::House::Accounts
|
495
|
-
account_category: FULL
|
496
|
-
account_ref_date: "0000-30-04"
|
497
|
-
document_available: "1"
|
498
|
-
last_made_up_date: "2001-04-30"
|
499
|
-
next_due_date: "2002-11-30"
|
500
|
-
overdue: "NO"
|
501
|
-
company_category: Public Limited Company
|
502
|
-
company_name: MILLENNIUM STADIUM PLC
|
503
|
-
company_number: 03176906
|
504
|
-
company_status: Active
|
505
|
-
country_of_origin: United Kingdom
|
506
|
-
has_appointments: "1"
|
507
|
-
has_branch_info: "0"
|
508
|
-
in_liquidation: "0"
|
509
|
-
incorporation_date: "1996-03-25"
|
510
|
-
last_full_mem_date: "2002-03-25"
|
511
|
-
mortgages: !ruby/object:Company::House::Mortgages
|
512
|
-
mortgage_ind: LT300
|
513
|
-
num_mort_charges: "7"
|
514
|
-
num_mort_outstanding: "7"
|
515
|
-
num_mort_part_satisfied: "0"
|
516
|
-
num_mort_satisfied: "0"
|
517
|
-
reg_address: !ruby/object:Company::House::RegAddress
|
518
|
-
address_lines:
|
519
|
-
- ST DAVID'S HOUSE
|
520
|
-
- WEST WING
|
521
|
-
- WOOD STREET
|
522
|
-
- CARDIFF CF10 1ES
|
523
|
-
returns: !ruby/object:Company::House::Returns
|
524
|
-
document_available: "1"
|
525
|
-
last_made_up_date: "2002-03-25"
|
526
|
-
next_due_date: "2003-04-22"
|
527
|
-
overdue: "NO"
|
528
|
-
sic_codes: !ruby/object:Company::House::SICCodes
|
529
|
-
sic_text: stadiums
|
530
|
-
xmlns: http://xmlgw.companieshouse.gov.uk/v1-0
|
531
|
-
xmlns_xsi: http://www.w3.org/2001/XMLSchema-instance
|
532
|
-
xsi_schema_location: xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.xsd|
|
533
|
-
end
|
534
|
-
end
|
535
|
-
|
536
|
-
describe 'creating from xml' do
|
537
|
-
|
538
|
-
def check_councils councils, class_name
|
539
|
-
councils.class.should == Array
|
540
|
-
councils.size.should == 2
|
541
|
-
councils.first.class.name.should == class_name
|
542
|
-
councils.first.name.should == 'Aberdeen City Council'
|
543
|
-
councils.last.name.should == 'Allerdale Borough Council'
|
544
|
-
end
|
545
|
-
|
546
|
-
it 'should create classes and object instances' do
|
547
|
-
councils = Morph.from_xml(xml)
|
548
|
-
check_councils councils, 'Morph::Council'
|
549
|
-
end
|
550
|
-
|
551
|
-
describe 'when module name is supplied' do
|
552
|
-
it 'should create classes and object instances' do
|
553
|
-
Object.const_set 'Ppc', Module.new
|
554
|
-
councils = Morph.from_xml(xml, Ppc)
|
555
|
-
check_councils councils, 'Ppc::Council'
|
556
|
-
end
|
557
|
-
end
|
558
|
-
|
559
|
-
def xml
|
560
|
-
%Q[<?xml version="1.0" encoding="UTF-8"?>
|
561
|
-
<councils type="array">
|
562
|
-
<council code='1'>
|
563
|
-
<name>Aberdeen City Council</name>
|
564
|
-
</council>
|
565
|
-
<council code='2'>
|
566
|
-
<name>Allerdale Borough Council</name>
|
567
|
-
</council>
|
568
|
-
</councils>]
|
569
|
-
end
|
570
|
-
end
|
571
|
-
|
572
|
-
describe 'creating from' do
|
573
|
-
|
574
|
-
def check_councillors councillors, class_name, nil_value=''
|
575
|
-
councillors.class.should == Array
|
576
|
-
councillors.size.should == 2
|
577
|
-
councillor = councillors.first
|
578
|
-
councillor.class.name.should == class_name
|
579
|
-
councillor.name.should == 'Ted Roe'
|
580
|
-
councillor.party.should == 'labour'
|
581
|
-
councillor.councillors.should == 'Councillor for Stretford Ward'
|
582
|
-
councillor.councils.should == 'Trafford Council'
|
583
|
-
councillor.respond_to?(:council_experience).should be_false
|
584
|
-
|
585
|
-
councillor = councillors.last
|
586
|
-
councillor.name.should == 'Ali Davidson'
|
587
|
-
councillor.party.should == 'labour'
|
588
|
-
councillor.councillors.should == nil_value
|
589
|
-
councillor.councils.should == 'Basildon District Council'
|
590
|
-
councillor.respond_to?(:council_experience).should be_false
|
591
|
-
end
|
592
|
-
|
593
|
-
describe 'tsv (tab separated value)' do
|
594
|
-
describe 'when class name is supplied' do
|
595
|
-
it 'should create classes and object instances' do
|
596
|
-
councillors = Morph.from_tsv(tsv, 'Councillor')
|
597
|
-
check_councillors councillors, 'Morph::Councillor'
|
598
|
-
end
|
599
|
-
end
|
600
|
-
|
601
|
-
describe 'when class name and module name is supplied' do
|
602
|
-
it 'should create classes and object instances' do
|
603
|
-
Object.const_set 'Ppc', Module.new unless defined? Ppc
|
604
|
-
councillors = Morph.from_tsv(tsv, 'Councillor', Ppc)
|
605
|
-
check_councillors councillors, 'Ppc::Councillor'
|
606
|
-
end
|
607
|
-
end
|
608
|
-
|
609
|
-
def tsv
|
610
|
-
%Q[name party councillors councils council_experience
|
611
|
-
Ted Roe labour Councillor for Stretford Ward Trafford Council
|
612
|
-
Ali Davidson labour Basildon District Council
|
613
|
-
]
|
614
|
-
end
|
615
|
-
end
|
616
|
-
|
617
|
-
describe 'csv (comma separated value)' do
|
618
|
-
describe 'when class name is supplied' do
|
619
|
-
it 'should create classes and object instances' do
|
620
|
-
councillors = Morph.from_csv(csv, 'Councillor')
|
621
|
-
check_councillors councillors, 'Morph::Councillor', nil
|
622
|
-
end
|
623
|
-
end
|
624
|
-
|
625
|
-
describe 'when class name and module name is supplied' do
|
626
|
-
it 'should create classes and object instances' do
|
627
|
-
Object.const_set 'Ppc', Module.new unless defined? Ppc
|
628
|
-
councillors = Morph.from_csv(csv, 'Councillor', Ppc)
|
629
|
-
check_councillors councillors, 'Ppc::Councillor', nil
|
630
|
-
end
|
631
|
-
end
|
632
|
-
|
633
|
-
def csv
|
634
|
-
%Q[name,party,councillors,councils,council_experience
|
635
|
-
Ted Roe,labour,Councillor for Stretford Ward,Trafford Council,
|
636
|
-
Ali Davidson,labour,,Basildon District Council,
|
637
|
-
]
|
638
|
-
end
|
639
|
-
end
|
640
|
-
end
|
641
|
-
|
642
|
-
end
|
data/spec/morph_spec_helper.rb
DELETED
@@ -1,147 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require File.dirname(__FILE__) + '/../lib/morph'
|
3
|
-
|
4
|
-
module MorphSpecHelperMethods
|
5
|
-
|
6
|
-
def initialize_morph_class code=nil
|
7
|
-
code = 'class ExampleMorph; include Morph; end' unless code
|
8
|
-
eval code
|
9
|
-
@morphed_class = ExampleMorph
|
10
|
-
end
|
11
|
-
|
12
|
-
def initialize_second_morph_class code=nil
|
13
|
-
code = 'class AnotherMorph; include Morph; end' unless code
|
14
|
-
eval code
|
15
|
-
@another_morphed_class = AnotherMorph
|
16
|
-
end
|
17
|
-
|
18
|
-
def initialize_morph code=nil
|
19
|
-
initialize_morph_class code
|
20
|
-
@original_instance_methods = @morphed_class.instance_methods
|
21
|
-
@morph = @morphed_class.new
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize_another_morph
|
25
|
-
initialize_second_morph_class
|
26
|
-
@more_original_instance_methods = @another_morphed_class.instance_methods
|
27
|
-
@another_morph = @another_morphed_class.new
|
28
|
-
end
|
29
|
-
|
30
|
-
def remove_morph_methods
|
31
|
-
@morphed_class.instance_methods.each do |method|
|
32
|
-
begin
|
33
|
-
unless method.to_s[/received_message\?|should_not_receive|rspec_verify|unstub|rspec_reset|should_receive|as_null_object|stub_chain|stub\!|null_object?|stub/]
|
34
|
-
remove_cmd = "remove_method :#{method}"
|
35
|
-
@morphed_class.class_eval remove_cmd unless @original_instance_methods.include?(method)
|
36
|
-
end
|
37
|
-
rescue Exception => e
|
38
|
-
raise e.to_s + '------' + @original_instance_methods.sort.inspect
|
39
|
-
end
|
40
|
-
|
41
|
-
end if @morphed_class
|
42
|
-
end
|
43
|
-
|
44
|
-
def remove_another_morph_methods
|
45
|
-
@another_morphed_class.instance_methods.each do |method|
|
46
|
-
@another_morphed_class.class_eval "remove_method :#{method}" unless @more_original_instance_methods.include?(method)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def instance_methods
|
51
|
-
@morphed_class.instance_methods
|
52
|
-
end
|
53
|
-
|
54
|
-
def morph_methods
|
55
|
-
@morphed_class.morph_methods
|
56
|
-
end
|
57
|
-
|
58
|
-
def check_convert_to_morph_method_name label, method_name
|
59
|
-
code = 'class ExampleMorph; include Morph; def convert_to_morph_method_name label; super; end; end'
|
60
|
-
eval code
|
61
|
-
ExampleMorph.new.convert_to_morph_method_name(label).should == method_name
|
62
|
-
end
|
63
|
-
|
64
|
-
def each_attribute
|
65
|
-
if @attribute
|
66
|
-
yield @attribute
|
67
|
-
elsif @attributes
|
68
|
-
@attributes.each {|a| yield a }
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
shared_examples_for "class with generated accessor methods added" do
|
74
|
-
|
75
|
-
include MorphSpecHelperMethods
|
76
|
-
before :all do initialize_morph; end
|
77
|
-
after :all do remove_morph_methods; end
|
78
|
-
|
79
|
-
it 'should add reader method to class instance_methods list' do
|
80
|
-
if RUBY_VERSION >= "1.9"
|
81
|
-
each_attribute { |a| instance_methods.should include(a.to_s.to_sym) }
|
82
|
-
else
|
83
|
-
each_attribute { |a| instance_methods.should include(a.to_s) }
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
it 'should add writer method to class instance_methods list' do
|
88
|
-
if RUBY_VERSION >= "1.9"
|
89
|
-
each_attribute { |a| instance_methods.should include("#{a}=".to_sym) }
|
90
|
-
else
|
91
|
-
each_attribute { |a| instance_methods.should include("#{a}=") }
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'should add reader method to class morph_methods list' do
|
96
|
-
if RUBY_VERSION >= "1.9"
|
97
|
-
each_attribute { |a| morph_methods.should include(a.to_s.to_sym) }
|
98
|
-
else
|
99
|
-
each_attribute { |a| morph_methods.should include(a.to_s) }
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'should add writer method to class morph_methods list' do
|
104
|
-
if RUBY_VERSION >= "1.9"
|
105
|
-
each_attribute { |a| morph_methods.should include("#{a}=".to_sym) }
|
106
|
-
else
|
107
|
-
each_attribute { |a| morph_methods.should include("#{a}=") }
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'should only have generated accessor methods in morph_methods list' do
|
112
|
-
morph_methods.size.should == @expected_morph_methods_count
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|
116
|
-
|
117
|
-
shared_examples_for "class without generated accessor methods added" do
|
118
|
-
include MorphSpecHelperMethods
|
119
|
-
|
120
|
-
before :all do
|
121
|
-
initialize_morph
|
122
|
-
end
|
123
|
-
|
124
|
-
after :all do
|
125
|
-
remove_morph_methods
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'should not add reader method to class instance_methods list' do
|
129
|
-
instance_methods.should_not include(@attribute)
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'should not add writer method to class instance_methods list' do
|
133
|
-
instance_methods.should_not include("#{@attribute}=")
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'should not add reader method to class morph_methods list' do
|
137
|
-
morph_methods.should_not include(@attribute)
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'should not add writer method to class morph_methods list' do
|
141
|
-
morph_methods.should_not include("#{@attribute}=")
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'should have empty morph_methods list' do
|
145
|
-
morph_methods.size.should == 0
|
146
|
-
end
|
147
|
-
end
|
data/spec/spec_helper.rb
DELETED