morph 0.2.9 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -0
- data/Rakefile +0 -1
- data/lib/morph.rb +31 -11
- data/morph.gemspec +7 -7
- data/spec/lib/morph_spec.rb +39 -25
- data/spec/morph_spec_helper.rb +21 -4
- metadata +16 -9
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
data/lib/morph.rb
CHANGED
@@ -1,20 +1,31 @@
|
|
1
|
-
|
1
|
+
if RUBY_VERSION >= "1.9"
|
2
|
+
require 'csv'
|
3
|
+
else
|
4
|
+
begin
|
5
|
+
require 'fastercsv'
|
6
|
+
rescue LoadError
|
7
|
+
puts "\nYou need to install the fastercsv gem to use Morph.from_csv with Ruby 1.8"
|
8
|
+
puts " sudo gem install fastercsv\n"
|
9
|
+
end
|
10
|
+
end
|
2
11
|
begin
|
12
|
+
# require 'active_support'
|
3
13
|
require 'active_support/core_ext/object/blank'
|
4
14
|
require 'active_support/inflector'
|
5
15
|
require 'active_support/core_ext/string/inflections'
|
6
|
-
require 'active_support/core_ext/xml_mini'
|
7
16
|
require 'active_support/core_ext/hash/conversions'
|
8
17
|
rescue Exception => e
|
9
18
|
begin
|
19
|
+
puts e.to_s
|
10
20
|
require 'active_support'
|
11
21
|
rescue Exception => e
|
22
|
+
puts e.to_s
|
12
23
|
require 'activesupport'
|
13
24
|
end
|
14
25
|
end
|
15
26
|
|
16
27
|
module Morph
|
17
|
-
VERSION = "0.
|
28
|
+
VERSION = "0.3.0"
|
18
29
|
|
19
30
|
class << self
|
20
31
|
def generate_migrations object, options={}
|
@@ -27,13 +38,14 @@ module Morph
|
|
27
38
|
|
28
39
|
def from_csv csv, class_name, namespace=Morph
|
29
40
|
objects = []
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
41
|
+
csv_utility = (RUBY_VERSION >= "1.9") ? CSV : FasterCSV
|
42
|
+
csv_utility.parse(csv, { :headers => true }) do |row|
|
43
|
+
object = object_from_name class_name, namespace
|
44
|
+
row.each do |key, value|
|
45
|
+
object.morph(key, value)
|
46
|
+
end
|
47
|
+
objects << object
|
34
48
|
end
|
35
|
-
objects << object
|
36
|
-
end
|
37
49
|
objects
|
38
50
|
end
|
39
51
|
|
@@ -90,6 +102,7 @@ module Morph
|
|
90
102
|
migration = "./script/generate model #{name}#{options[:belongs_to_id]}"
|
91
103
|
options[:belongs_to_id] = ''
|
92
104
|
migrations << migration
|
105
|
+
attributes = [attributes] if attributes.is_a?(String)
|
93
106
|
attributes.to_a.sort{|a,b| a[0].to_s <=> b[0].to_s}.each do |attribute, value|
|
94
107
|
case value
|
95
108
|
when String
|
@@ -174,7 +187,11 @@ module Morph
|
|
174
187
|
end
|
175
188
|
|
176
189
|
def morph_methods
|
177
|
-
|
190
|
+
if RUBY_VERSION >= "1.9"
|
191
|
+
@@morph_methods[self].keys.sort.map(&:to_sym)
|
192
|
+
else
|
193
|
+
@@morph_methods[self].keys.sort
|
194
|
+
end
|
178
195
|
end
|
179
196
|
|
180
197
|
def adding_morph_method= true_or_false
|
@@ -217,7 +234,7 @@ module Morph
|
|
217
234
|
if @@morph_methods[self].has_key? symbol.to_s
|
218
235
|
@@morph_methods[self].delete symbol.to_s
|
219
236
|
is_writer = symbol.to_s =~ /=$/
|
220
|
-
@@morph_attributes[self].delete(symbol) unless is_writer
|
237
|
+
@@morph_attributes[self].delete(symbol) unless is_writer
|
221
238
|
end
|
222
239
|
end
|
223
240
|
|
@@ -282,6 +299,9 @@ module Morph
|
|
282
299
|
|
283
300
|
def morph_method_missing symbol, *args
|
284
301
|
attribute = symbol.to_s.chomp '='
|
302
|
+
if RUBY_VERSION >= "1.9"
|
303
|
+
attribute = attribute.to_sym
|
304
|
+
end
|
285
305
|
|
286
306
|
if Object.instance_methods.include?(attribute)
|
287
307
|
raise "'#{attribute}' is an instance_method on Object, cannot create accessor methods for '#{attribute}'"
|
data/morph.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{morph}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.3.0"
|
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 = %q{2010-
|
9
|
+
s.date = %q{2010-10-18}
|
10
10
|
s.description = %q{Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
|
11
11
|
}
|
12
12
|
s.email = ["rob ~@nospam@~ rubyforge.org"]
|
@@ -16,19 +16,19 @@ Gem::Specification.new do |s|
|
|
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 = %q{morph}
|
19
|
-
s.rubygems_version = %q{1.3.
|
19
|
+
s.rubygems_version = %q{1.3.7}
|
20
20
|
s.summary = %q{Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.}
|
21
21
|
|
22
22
|
if s.respond_to? :specification_version then
|
23
23
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
24
|
s.specification_version = 3
|
25
25
|
|
26
|
-
if Gem::Version.new(Gem::
|
27
|
-
s.add_runtime_dependency(%q<
|
26
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 2.0.2"])
|
28
28
|
else
|
29
|
-
s.add_dependency(%q<
|
29
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
30
30
|
end
|
31
31
|
else
|
32
|
-
s.add_dependency(%q<
|
32
|
+
s.add_dependency(%q<activesupport>, [">= 2.0.2"])
|
33
33
|
end
|
34
34
|
end
|
data/spec/lib/morph_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require File.dirname(__FILE__) + '/../../lib/morph'
|
2
3
|
require File.dirname(__FILE__) + '/../morph_spec_helper'
|
3
4
|
|
@@ -59,8 +60,13 @@ describe Morph do
|
|
59
60
|
@morphed_class.morph_methods.size.should == 2
|
60
61
|
@another_morphed_class.morph_methods.size.should == 2
|
61
62
|
|
62
|
-
|
63
|
-
|
63
|
+
if RUBY_VERSION >= "1.9"
|
64
|
+
@morphed_class.morph_methods.should == [:every,:every=]
|
65
|
+
@another_morphed_class.morph_methods.should == [:no,:no=]
|
66
|
+
else
|
67
|
+
@morphed_class.morph_methods.should == ['every','every=']
|
68
|
+
@another_morphed_class.morph_methods.should == ['no','no=']
|
69
|
+
end
|
64
70
|
end
|
65
71
|
|
66
72
|
it 'should call morph_attributes on both objects, when one object has a reference to another' do
|
@@ -94,7 +100,7 @@ describe Morph do
|
|
94
100
|
attributes.delete(:every)
|
95
101
|
attributes = @morph.morph_attributes
|
96
102
|
attributes[:every].should == 'which'
|
97
|
-
|
103
|
+
|
98
104
|
attributes = @morph.class.morph_attributes
|
99
105
|
attributes.should == [:every, :loose]
|
100
106
|
attributes.delete(:every)
|
@@ -176,7 +182,7 @@ describe Morph do
|
|
176
182
|
|
177
183
|
describe "when morph method used to set unicode attribute name with a value" do
|
178
184
|
before :each do
|
179
|
-
$KCODE = "u"
|
185
|
+
$KCODE = "u" unless RUBY_VERSION >= "1.9"
|
180
186
|
remove_morph_methods
|
181
187
|
@age = 19
|
182
188
|
@attribute = "年龄"
|
@@ -185,7 +191,7 @@ describe Morph do
|
|
185
191
|
end
|
186
192
|
|
187
193
|
after :all do
|
188
|
-
$KCODE = "NONE"
|
194
|
+
$KCODE = "NONE" unless RUBY_VERSION >= "1.9"
|
189
195
|
end
|
190
196
|
|
191
197
|
it_should_behave_like "class with generated accessor methods added"
|
@@ -197,7 +203,7 @@ describe Morph do
|
|
197
203
|
|
198
204
|
describe "when morph method used to set japanese and latin unicode attribute name with a value" do
|
199
205
|
before :each do
|
200
|
-
$KCODE = "u"
|
206
|
+
$KCODE = "u" unless RUBY_VERSION >= "1.9"
|
201
207
|
remove_morph_methods
|
202
208
|
@age = 19
|
203
209
|
@attribute = "ページビュー_graph"
|
@@ -206,7 +212,7 @@ describe Morph do
|
|
206
212
|
end
|
207
213
|
|
208
214
|
after :all do
|
209
|
-
$KCODE = "NONE"
|
215
|
+
$KCODE = "NONE" unless RUBY_VERSION >= "1.9"
|
210
216
|
end
|
211
217
|
|
212
218
|
it_should_behave_like "class with generated accessor methods added"
|
@@ -434,14 +440,22 @@ describe Morph do
|
|
434
440
|
company_details = Morph.from_hash(h, Company::House)
|
435
441
|
company_details.class.name.should == 'Company::House::CompanyDetails'
|
436
442
|
morph_methods = company_details.class.morph_methods
|
437
|
-
|
438
|
-
|
443
|
+
if RUBY_VERSION >= "1.9"
|
444
|
+
morph_methods.include?(:last_full_mem_date).should be_true
|
445
|
+
morph_methods.include?(:accounts).should be_true
|
446
|
+
morph_methods.delete(:accounts)
|
447
|
+
morph_methods.include?(:accounts).should be_false
|
448
|
+
morph_methods = company_details.class.morph_methods
|
449
|
+
morph_methods.include?(:accounts).should be_true
|
450
|
+
else
|
451
|
+
morph_methods.include?('last_full_mem_date').should be_true
|
452
|
+
morph_methods.include?('accounts').should be_true
|
453
|
+
morph_methods.delete('accounts')
|
454
|
+
morph_methods.include?('accounts').should be_false
|
455
|
+
morph_methods = company_details.class.morph_methods
|
456
|
+
morph_methods.include?('accounts').should be_true
|
457
|
+
end
|
439
458
|
|
440
|
-
morph_methods.delete('accounts')
|
441
|
-
morph_methods.include?('accounts').should be_false
|
442
|
-
morph_methods = company_details.class.morph_methods
|
443
|
-
morph_methods.include?('accounts').should be_true
|
444
|
-
|
445
459
|
company_details.accounts.class.name.should == 'Company::House::Accounts'
|
446
460
|
company_details.accounts.overdue.should == 'NO'
|
447
461
|
company_details.last_full_mem_date.should == "2002-03-25"
|
@@ -500,9 +514,9 @@ xmlns_xsi: http://www.w3.org/2001/XMLSchema-instance
|
|
500
514
|
xsi_schema_location: xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.xsd|
|
501
515
|
end
|
502
516
|
end
|
503
|
-
|
517
|
+
|
504
518
|
describe 'creating from xml' do
|
505
|
-
|
519
|
+
|
506
520
|
def check_councils councils, class_name
|
507
521
|
councils.class.should == Array
|
508
522
|
councils.size.should == 2
|
@@ -515,7 +529,7 @@ xsi_schema_location: xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.x
|
|
515
529
|
councils = Morph.from_xml(xml)
|
516
530
|
check_councils councils, 'Morph::Council'
|
517
531
|
end
|
518
|
-
|
532
|
+
|
519
533
|
describe 'when module name is supplied' do
|
520
534
|
it 'should create classes and object instances' do
|
521
535
|
Object.const_set 'Ppc', Module.new
|
@@ -537,8 +551,8 @@ xsi_schema_location: xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.x
|
|
537
551
|
end
|
538
552
|
end
|
539
553
|
|
540
|
-
describe 'creating from' do
|
541
|
-
|
554
|
+
describe 'creating from' do
|
555
|
+
|
542
556
|
def check_councillors councillors, class_name, nil_value=''
|
543
557
|
councillors.class.should == Array
|
544
558
|
councillors.size.should == 2
|
@@ -565,7 +579,7 @@ xsi_schema_location: xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.x
|
|
565
579
|
check_councillors councillors, 'Morph::Councillor'
|
566
580
|
end
|
567
581
|
end
|
568
|
-
|
582
|
+
|
569
583
|
describe 'when class name and module name is supplied' do
|
570
584
|
it 'should create classes and object instances' do
|
571
585
|
Object.const_set 'Ppc', Module.new
|
@@ -576,20 +590,20 @@ xsi_schema_location: xmlgwdev.companieshouse.gov.uk/v1-0/schema/CompanyDetails.x
|
|
576
590
|
|
577
591
|
def tsv
|
578
592
|
%Q[name party councillors councils council_experience
|
579
|
-
Ted Roe labour Councillor for Stretford Ward Trafford Council
|
580
|
-
Ali Davidson labour Basildon District Council
|
593
|
+
Ted Roe labour Councillor for Stretford Ward Trafford Council
|
594
|
+
Ali Davidson labour Basildon District Council
|
581
595
|
]
|
582
596
|
end
|
583
597
|
end
|
584
598
|
|
585
|
-
describe 'csv (comma separated value)' do
|
599
|
+
describe 'csv (comma separated value)' do
|
586
600
|
describe 'when class name is supplied' do
|
587
601
|
it 'should create classes and object instances' do
|
588
602
|
councillors = Morph.from_csv(csv, 'Councillor')
|
589
603
|
check_councillors councillors, 'Morph::Councillor', nil
|
590
604
|
end
|
591
605
|
end
|
592
|
-
|
606
|
+
|
593
607
|
describe 'when class name and module name is supplied' do
|
594
608
|
it 'should create classes and object instances' do
|
595
609
|
Object.const_set 'Ppc', Module.new
|
@@ -597,7 +611,7 @@ Ali Davidson labour Basildon District Council
|
|
597
611
|
check_councillors councillors, 'Ppc::Councillor', nil
|
598
612
|
end
|
599
613
|
end
|
600
|
-
|
614
|
+
|
601
615
|
def csv
|
602
616
|
%Q[name,party,councillors,councils,council_experience
|
603
617
|
Ted Roe,labour,Councillor for Stretford Ward,Trafford Council,
|
data/spec/morph_spec_helper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require File.dirname(__FILE__) + '/../lib/morph'
|
2
3
|
|
3
4
|
module MorphSpecHelperMethods
|
@@ -68,19 +69,35 @@ describe "class with generated accessor methods added", :shared => true do
|
|
68
69
|
after :all do remove_morph_methods; end
|
69
70
|
|
70
71
|
it 'should add reader method to class instance_methods list' do
|
71
|
-
|
72
|
+
if RUBY_VERSION >= "1.9"
|
73
|
+
each_attribute { |a| instance_methods.should include(a.to_s.to_sym) }
|
74
|
+
else
|
75
|
+
each_attribute { |a| instance_methods.should include(a.to_s) }
|
76
|
+
end
|
72
77
|
end
|
73
78
|
|
74
79
|
it 'should add writer method to class instance_methods list' do
|
75
|
-
|
80
|
+
if RUBY_VERSION >= "1.9"
|
81
|
+
each_attribute { |a| instance_methods.should include("#{a}=".to_sym) }
|
82
|
+
else
|
83
|
+
each_attribute { |a| instance_methods.should include("#{a}=") }
|
84
|
+
end
|
76
85
|
end
|
77
86
|
|
78
87
|
it 'should add reader method to class morph_methods list' do
|
79
|
-
|
88
|
+
if RUBY_VERSION >= "1.9"
|
89
|
+
each_attribute { |a| morph_methods.should include(a.to_s.to_sym) }
|
90
|
+
else
|
91
|
+
each_attribute { |a| morph_methods.should include(a.to_s) }
|
92
|
+
end
|
80
93
|
end
|
81
94
|
|
82
95
|
it 'should add writer method to class morph_methods list' do
|
83
|
-
|
96
|
+
if RUBY_VERSION >= "1.9"
|
97
|
+
each_attribute { |a| morph_methods.should include("#{a}=".to_sym) }
|
98
|
+
else
|
99
|
+
each_attribute { |a| morph_methods.should include("#{a}=") }
|
100
|
+
end
|
84
101
|
end
|
85
102
|
|
86
103
|
it 'should only have generated accessor methods in morph_methods list' do
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: morph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Rob McKinnon
|
@@ -14,21 +15,23 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-
|
18
|
+
date: 2010-10-18 00:00:00 +01:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
22
|
+
name: activesupport
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 11
|
27
30
|
segments:
|
28
|
-
-
|
29
|
-
- 5
|
31
|
+
- 2
|
30
32
|
- 0
|
31
|
-
|
33
|
+
- 2
|
34
|
+
version: 2.0.2
|
32
35
|
type: :runtime
|
33
36
|
version_requirements: *id001
|
34
37
|
description: |
|
@@ -73,16 +76,20 @@ rdoc_options:
|
|
73
76
|
require_paths:
|
74
77
|
- lib
|
75
78
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
76
80
|
requirements:
|
77
81
|
- - ">="
|
78
82
|
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
79
84
|
segments:
|
80
85
|
- 0
|
81
86
|
version: "0"
|
82
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
83
89
|
requirements:
|
84
90
|
- - ">="
|
85
91
|
- !ruby/object:Gem::Version
|
92
|
+
hash: 11
|
86
93
|
segments:
|
87
94
|
- 1
|
88
95
|
- 2
|
@@ -90,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
97
|
requirements: []
|
91
98
|
|
92
99
|
rubyforge_project: morph
|
93
|
-
rubygems_version: 1.3.
|
100
|
+
rubygems_version: 1.3.7
|
94
101
|
signing_key:
|
95
102
|
specification_version: 3
|
96
103
|
summary: Morph allows you to emerge class definitions via calling assignment methods; mix with Hpricot for screen scrapping fun.
|