jm81-dm-address 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
data/dm-address.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{dm-address}
5
- s.version = "0.2.0"
5
+ s.version = "0.3.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Jared Morgan"]
9
- s.date = %q{2009-07-22}
9
+ s.date = %q{2009-07-28}
10
10
  s.email = %q{jmorgan@morgancreative.net}
11
11
  s.extra_rdoc_files = [
12
12
  "LICENSE",
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  "dm-address.gemspec",
23
23
  "lib/dm-address.rb",
24
24
  "lib/dm-address/phone_number.rb",
25
+ "lib/dm-address/polymorphic.rb",
25
26
  "lib/dm-address/us.rb",
26
27
  "lib/dm-address/zip_code.rb",
27
28
  "lib/dm-types/phone_number.rb",
@@ -29,6 +30,7 @@ Gem::Specification.new do |s|
29
30
  "lib/dm-validations/formats/phone_number.rb",
30
31
  "lib/dm-validations/formats/zip_code.rb",
31
32
  "spec/dm-address/phone_number_spec.rb",
33
+ "spec/dm-address/polymorphic_spec.rb",
32
34
  "spec/dm-address/us_spec.rb",
33
35
  "spec/dm-address/zip_code_spec.rb",
34
36
  "spec/dm-address_spec.rb",
@@ -43,6 +45,7 @@ Gem::Specification.new do |s|
43
45
  s.summary = %q{TODO}
44
46
  s.test_files = [
45
47
  "spec/dm-address/phone_number_spec.rb",
48
+ "spec/dm-address/polymorphic_spec.rb",
46
49
  "spec/dm-address/us_spec.rb",
47
50
  "spec/dm-address/zip_code_spec.rb",
48
51
  "spec/dm-address_spec.rb",
data/lib/dm-address.rb CHANGED
@@ -3,7 +3,7 @@ require 'dm-types'
3
3
  require 'dm-validations'
4
4
 
5
5
  # Require dm-address files
6
- %w{ phone_number zip_code us }.each do |file|
6
+ %w{ phone_number zip_code polymorphic us }.each do |file|
7
7
  require File.dirname(__FILE__) + '/dm-address/' + file
8
8
  end
9
9
 
@@ -0,0 +1,41 @@
1
+ module DataMapper
2
+ module Address
3
+ # Add fields to an Address class (such as one that includes Address::US)
4
+ # to allow for roughly polymorphic associations, belonging to other classes.
5
+ # (See http://pastie.org/214893). Including this module adds two properties:
6
+ # +addressable_class+ and +addressable_id+, and one method, +addressable+,
7
+ # for accessing the parent record.
8
+ #
9
+ # To use (in Address class):
10
+ #
11
+ # include DataMapper::Address::Polymorphic
12
+ #
13
+ # In parent class, something along the lines of:
14
+ #
15
+ # has n, :addresses, :class_name => 'Address',
16
+ # :child_key => [:addressable_id],
17
+ # Address.addressable_class => 'ParentModel'
18
+ module Polymorphic
19
+ class << self
20
+ # Add :addressable_class and :addressable_id properties
21
+ def included(klass)
22
+ klass.__send__(:property, :addressable_class, String)
23
+ klass.__send__(:property, :addressable_id, Integer)
24
+ end
25
+ end # class << self
26
+
27
+
28
+ # Return the addressable (that is, parent) record.
29
+ def addressable
30
+ parent_class_name = attribute_get(:addressable_class)
31
+ # Remove a trailing method reference
32
+ parent_split = parent_class_name.to_s.split('#')
33
+ parent_class_name = parent_split[0..-2].join('#') if parent_split.length > 1
34
+ return nil if parent_class_name.blank?
35
+ parent_class = Object.full_const_get(parent_class_name)
36
+ parent_class.get(attribute_get(:addressable_id))
37
+ end
38
+
39
+ end # module Polymorphic
40
+ end # module Address
41
+ end # module DataMapper
data/lib/dm-address/us.rb CHANGED
@@ -45,6 +45,10 @@ module DataMapper
45
45
  self.property(*args)
46
46
  end
47
47
  end
48
+
49
+ if options[:polymorphic]
50
+ include(DataMapper::Address::Polymorphic)
51
+ end
48
52
  end
49
53
  end # module ClassMethods
50
54
 
@@ -0,0 +1,99 @@
1
+ require File.join( File.dirname(__FILE__), '..', "spec_helper" )
2
+
3
+ DataMapper.setup(:default, 'sqlite3::memory:')
4
+ require 'dm-timestamps' # Only needed to make #created_at and #updated_at auto-update
5
+
6
+ module DataMapper::Address::Spec
7
+ class Polymorphed
8
+ include DataMapper::Resource
9
+ include DataMapper::Address::Polymorphic
10
+ property :id, Serial
11
+ property :street, String
12
+ end
13
+
14
+ class Person
15
+ include DataMapper::Resource
16
+
17
+ property :id, Serial
18
+ has n, :addresses, :class_name => 'DataMapper::Address::Spec::Polymorphed',
19
+ :child_key => [:addressable_id],
20
+ DataMapper::Address::Spec::Polymorphed.addressable_class =>
21
+ 'DataMapper::Address::Spec::Person'
22
+
23
+ property :name, String
24
+ end
25
+
26
+ Polymorphed.auto_migrate!
27
+ Person.auto_migrate!
28
+ end
29
+
30
+ describe DataMapper::Address::Polymorphic do
31
+ before(:each) do
32
+ @parent_class = DataMapper::Address::Spec::Person
33
+ @parent_class.all.destroy!
34
+ @parent = @parent_class.create(:name => 'Jane Doe')
35
+
36
+ @klass = DataMapper::Address::Spec::Polymorphed
37
+ @klass.all.destroy!
38
+ @address = @klass.create(:street => '123 Lane Ave.',
39
+ :addressable_class => 'DataMapper::Address::Spec::Person',
40
+ :addressable_id => @parent.id
41
+ )
42
+ end
43
+
44
+ it 'should be valid' do
45
+ # Sanity check only
46
+ @parent.should be_valid
47
+ @address.should be_valid
48
+ end
49
+
50
+ describe '#addressable' do
51
+ it 'should return the parent' do
52
+ @address.addressable.should == @parent
53
+ end
54
+
55
+ it 'should error if the class is unknown' do
56
+ @address.addressable_class = 'DataMapper::Address::Spec::NoClass'
57
+ lambda { @address.addressable }.should raise_error(NameError)
58
+ end
59
+
60
+ it 'should be nil if the id does not return a record' do
61
+ @address.addressable_id = 0
62
+ @address.addressable.should be_nil
63
+ end
64
+
65
+ it 'should remove a method identifier when determining class name' do
66
+ @address.addressable_class = 'DataMapper::Address::Spec::Person#address'
67
+ @address.addressable.should == @parent
68
+ end
69
+ end
70
+
71
+ describe 'parent#addresses' do
72
+ it 'should retrieve all addresses for this class/id' do
73
+ address2 = @klass.create(:street => '123 Lane Ave.',
74
+ :addressable_class => 'DataMapper::Address::Spec::Person',
75
+ :addressable_id => @parent.id
76
+ )
77
+
78
+ @parent.addresses.should == [@address, address2]
79
+ end
80
+
81
+ it 'should not retrieve addresses for other classes' do
82
+ address2 = @klass.create(:street => '123 Lane Ave.',
83
+ :addressable_class => 'DataMapper::Address::Spec::NoClass',
84
+ :addressable_id => @parent.id
85
+ )
86
+
87
+ @parent.addresses.should == [@address]
88
+ end
89
+
90
+ it 'should not retrieve addresses for other id' do
91
+ address2 = @klass.create(:street => '123 Lane Ave.',
92
+ :addressable_class => 'DataMapper::Address::Spec::Person',
93
+ :addressable_id => 0
94
+ )
95
+
96
+ @parent.addresses.should == [@address]
97
+ end
98
+ end
99
+ end
@@ -221,4 +221,24 @@ describe DataMapper::Address::US do
221
221
  @address.updated_at.should be_kind_of(DateTime)
222
222
  end
223
223
  end
224
+
225
+ describe '#address_properties' do
226
+ describe ':polymorphic option' do
227
+ it 'should include Polymorphic module if true' do
228
+ klass = Class.new
229
+ klass.__send__(:include, DataMapper::Resource)
230
+ klass.__send__(:include, DataMapper::Address::US)
231
+ klass.address_properties(:polymorphic => true)
232
+ klass.properties.has_property?(:addressable_class).should be_true
233
+ end
234
+
235
+ it 'should not include Polymorphic module if nil' do
236
+ klass = Class.new
237
+ klass.__send__(:include, DataMapper::Resource)
238
+ klass.__send__(:include, DataMapper::Address::US)
239
+ klass.address_properties
240
+ klass.properties.has_property?(:addressable_class).should be_false
241
+ end
242
+ end
243
+ end
224
244
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jm81-dm-address
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jared Morgan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-22 00:00:00 -07:00
12
+ date: 2009-07-28 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -71,6 +71,7 @@ files:
71
71
  - dm-address.gemspec
72
72
  - lib/dm-address.rb
73
73
  - lib/dm-address/phone_number.rb
74
+ - lib/dm-address/polymorphic.rb
74
75
  - lib/dm-address/us.rb
75
76
  - lib/dm-address/zip_code.rb
76
77
  - lib/dm-types/phone_number.rb
@@ -78,6 +79,7 @@ files:
78
79
  - lib/dm-validations/formats/phone_number.rb
79
80
  - lib/dm-validations/formats/zip_code.rb
80
81
  - spec/dm-address/phone_number_spec.rb
82
+ - spec/dm-address/polymorphic_spec.rb
81
83
  - spec/dm-address/us_spec.rb
82
84
  - spec/dm-address/zip_code_spec.rb
83
85
  - spec/dm-address_spec.rb
@@ -86,6 +88,7 @@ files:
86
88
  - spec/spec_helper.rb
87
89
  has_rdoc: false
88
90
  homepage: http://github.com/jm81/dm-address
91
+ licenses:
89
92
  post_install_message:
90
93
  rdoc_options:
91
94
  - --charset=UTF-8
@@ -106,12 +109,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
109
  requirements: []
107
110
 
108
111
  rubyforge_project:
109
- rubygems_version: 1.2.0
112
+ rubygems_version: 1.3.5
110
113
  signing_key:
111
114
  specification_version: 3
112
115
  summary: TODO
113
116
  test_files:
114
117
  - spec/dm-address/phone_number_spec.rb
118
+ - spec/dm-address/polymorphic_spec.rb
115
119
  - spec/dm-address/us_spec.rb
116
120
  - spec/dm-address/zip_code_spec.rb
117
121
  - spec/dm-address_spec.rb