jm81-dm-address 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
6
+ .project
7
+ .loadpath
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jared Morgan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,7 @@
1
+ = dm-address
2
+
3
+ Description goes here.
4
+
5
+ == Copyright
6
+
7
+ Copyright (c) 2009 Jared Morgan. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,52 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "dm-address"
8
+ gem.summary = %Q{TODO}
9
+ gem.email = "jmorgan@morgancreative.net"
10
+ gem.homepage = "http://github.com/jm81/dm-address"
11
+ gem.authors = ["Jared Morgan"]
12
+ gem.add_dependency('extlib')
13
+ gem.add_dependency('dm-core')
14
+ gem.add_dependency('dm-types')
15
+ gem.add_dependency('dm-validations')
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
+ end
22
+
23
+ require 'spec/rake/spectask'
24
+ Spec::Rake::SpecTask.new(:spec) do |spec|
25
+ spec.libs << 'lib' << 'spec'
26
+ spec.spec_files = FileList['spec/**/*_spec.rb']
27
+ end
28
+
29
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
30
+ spec.libs << 'lib' << 'spec'
31
+ spec.pattern = 'spec/**/*_spec.rb'
32
+ spec.rcov = true
33
+ end
34
+
35
+
36
+ task :default => :spec
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ if File.exist?('VERSION.yml')
41
+ config = YAML.load(File.read('VERSION.yml'))
42
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
43
+ else
44
+ version = ""
45
+ end
46
+
47
+ rdoc.rdoc_dir = 'rdoc'
48
+ rdoc.title = "dm-address #{version}"
49
+ rdoc.rdoc_files.include('README*')
50
+ rdoc.rdoc_files.include('lib/**/*.rb')
51
+ end
52
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,26 @@
1
+ module DataMapper
2
+ module Address
3
+ class PhoneNumber < String
4
+ DEFAULT_FORMAT = '(%A) %P-%S'
5
+
6
+ # Remove all non-digits from given phone number
7
+ def initialize(s)
8
+ super((s || '').gsub(/\D+/, ''))
9
+ end
10
+
11
+ alias base to_s
12
+
13
+ # %A is area code, %P is prefix, %S is last 4 digits (suffix)
14
+ # Default is "(%A) %P-%S" -> (###) ###-####
15
+ def to_s(format = nil)
16
+ unless format
17
+ format = DataMapper::Address.config[:phone_format] || DEFAULT_FORMAT
18
+ end
19
+ return '' if base.nil? || base.empty?
20
+ format.gsub(/\%A/, base[0..2]).
21
+ gsub(/\%P/, base[3..5]).
22
+ gsub(/\%S/, base[6..9])
23
+ end
24
+ end # class PhoneNumber
25
+ end # module Address
26
+ end # module DataMapper
@@ -0,0 +1,73 @@
1
+ module DataMapper
2
+ module Address
3
+ # Include in a DataMapper::Resource model to add fields and methods for
4
+ # a US-style address.
5
+ module US
6
+ DEFAULT_REQUIRED_FIELDS = [
7
+ :street, :city, :state, :postal_code, :country
8
+ ]
9
+
10
+ class << self
11
+ def included(klass)
12
+ klass.extend(ClassMethods)
13
+ end
14
+ end # class << self
15
+
16
+ module ClassMethods
17
+
18
+ # Setup properties. Already added properties are not overriden.
19
+ # options:
20
+ # - +prefix+: Add a prefix to field names
21
+ # - +required_fields+: Override DataMapper::Address.config[:us_required_fields]
22
+ def address_properties(options = {})
23
+ reqs = options[:required_fields] ||
24
+ DataMapper::Address.config[:us_required_fields] ||
25
+ DEFAULT_REQUIRED_FIELDS
26
+
27
+ [
28
+ [:id, DataMapper::Types::Serial],
29
+ [:name, String, {:length => 100}],
30
+ [:company, String, {:length => 100}],
31
+ [:street, String, {:length => 100}],
32
+ [:street_2, String],
33
+ [:city, String, {:length => 100}],
34
+ [:state, String, {:length => 2}],
35
+ [:postal_code, DataMapper::Types::ZipCode, {
36
+ :format => Proc.new { |zc| zc.nil? || zc.length == 5 || zc.length == 9 },
37
+ :messages => { :format => "Postal code should be 5 digits or 9 digits (ZIP+4)" }}],
38
+ [:country, String, {:nullable => false, :length => 50, :default => 'USA'}],
39
+ [:phone, DataMapper::Types::PhoneNumber, {
40
+ :format => Proc.new { |ph| ph.blank? || ph.length == 10 },
41
+ :messages => { :format => "Phone number should be 10 digits (include area code)" }}],
42
+ [:created_at, DateTime],
43
+ [:updated_at, DateTime]
44
+ ].each do |args|
45
+ unless self.properties.has_property?(args[0])
46
+ args[0] = "#{options[:prefix]}#{args[0]}" if options[:prefix]
47
+ args[2] ||= {}
48
+ args[2][:nullable] = !reqs.include?(args[0])
49
+ self.property(*args)
50
+ end
51
+ end
52
+ end
53
+ end # module ClassMethods
54
+
55
+ # Nicely formatted address block (optionally includes country and phone)
56
+ def block(newline = "\n",
57
+ include_country = DataMapper::Address.config[:include_country],
58
+ include_phone = DataMapper::Address.config[:include_phone])
59
+
60
+ fields = []
61
+ %w{ name company street street_2 }.each do |fld|
62
+ value = attribute_get(fld)
63
+ fields << value unless value.blank?
64
+ end
65
+ fields << "#{self.city}, #{self.state} #{self.postal_code.to_s}"
66
+ fields << self.country if include_country
67
+ fields << self.phone.to_s if include_phone && !self.phone.blank?
68
+ fields.join(newline)
69
+ end
70
+
71
+ end # module US
72
+ end # module Address
73
+ end # module DataMapper
@@ -0,0 +1,19 @@
1
+ module DataMapper
2
+ module Address
3
+ class ZipCode < String
4
+ # Remove all non-digits from given phone number
5
+ def initialize(s)
6
+ super((s || '').gsub(/\D+/, ''))
7
+ end
8
+
9
+ alias base to_s
10
+
11
+ # ZipCode formatted as #####-#### or #####
12
+ def to_s(format = nil)
13
+ return '' if base.nil? || base.empty?
14
+ return base if base.length == 5
15
+ "#{base[0..4]}-#{base[5..8]}"
16
+ end
17
+ end # class ZipCode
18
+ end # module Address
19
+ end # module DataMapper
data/lib/dm-address.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'dm-core'
2
+ require 'dm-types'
3
+ require 'dm-validations'
4
+
5
+ # Require dm-address files
6
+ %w{ phone_number zip_code us }.each do |file|
7
+ require File.dirname(__FILE__) + '/dm-address/' + file
8
+ end
9
+
10
+ module DataMapper
11
+ module Address
12
+ DEFAULTS = {
13
+ :phone_format => PhoneNumber::DEFAULT_FORMAT.dup,
14
+ :include_country => false,
15
+ :include_phone => false,
16
+ :us_required_fields => US::DEFAULT_REQUIRED_FIELDS.dup
17
+ }
18
+
19
+ class << self
20
+ # Address::config method returns Hash that can be edited.
21
+ def config
22
+ @config ||= DEFAULTS.dup
23
+ end
24
+ end
25
+ end # module Address
26
+ end # module DataMapper
27
+
28
+ if defined?(Merb::Plugins)
29
+ # Make config accessible through Merb's Merb::Plugins.config hash
30
+ Merb::Plugins.config[:dm_address] = DataMapper::Address.config
31
+ end
32
+
33
+ # Require dm-types files
34
+ %w{ phone_number zip_code }.each do |file|
35
+ require File.dirname(__FILE__) + '/dm-types/' + file
36
+ end
37
+
@@ -0,0 +1,28 @@
1
+ module DataMapper
2
+ module Types
3
+ class PhoneNumber < DataMapper::Type
4
+ primitive String
5
+
6
+ def self.load(value, property)
7
+ if value.nil?
8
+ nil
9
+ elsif value.is_a?(String)
10
+ DataMapper::Address::PhoneNumber.new(value)
11
+ else
12
+ raise ArgumentError.new("+value+ must be nil or a String")
13
+ end
14
+ end
15
+
16
+ def self.dump(value, property)
17
+ return nil if value.nil?
18
+ value.base
19
+ end
20
+
21
+ def self.typecast(value, property)
22
+ value.kind_of?(DataMapper::Address::PhoneNumber) ?
23
+ value :
24
+ load(value, property)
25
+ end
26
+ end # class PhoneNumber
27
+ end # module Types
28
+ end # module DataMapper
@@ -0,0 +1,28 @@
1
+ module DataMapper
2
+ module Types
3
+ class ZipCode < DataMapper::Type
4
+ primitive String
5
+
6
+ def self.load(value, property)
7
+ if value.nil?
8
+ nil
9
+ elsif value.is_a?(String)
10
+ DataMapper::Address::ZipCode.new(value)
11
+ else
12
+ raise ArgumentError.new("+value+ must be nil or a String")
13
+ end
14
+ end
15
+
16
+ def self.dump(value, property)
17
+ return nil if value.nil?
18
+ value.base
19
+ end
20
+
21
+ def self.typecast(value, property)
22
+ value.kind_of?(DataMapper::Address::ZipCode) ?
23
+ value :
24
+ load(value, property)
25
+ end
26
+ end # class ZipCode
27
+ end # module Types
28
+ end # module DataMapper
@@ -0,0 +1,39 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe DataMapper::Address::PhoneNumber do
4
+ before(:all) do
5
+ @klass = DataMapper::Address::PhoneNumber
6
+ end
7
+
8
+ describe '.new' do
9
+ it 'should strip out non-digits' do
10
+ @klass.new('405-555-5555').should == '4055555555'
11
+ @klass.new('(405) 555.5556').should == '4055555556'
12
+ end
13
+ end
14
+
15
+ describe '#base' do
16
+ it 'should not be formatted (digits only)' do
17
+ @klass.new('405-555-5555').base.should == '4055555555'
18
+ @klass.new('(405) 555.5556').base.should == '4055555556'
19
+ end
20
+ end
21
+
22
+ describe '#to_s' do
23
+ it 'should return empty String if #phone is blank' do
24
+ @klass.new('').to_s.should == ''
25
+ @klass.new(nil).to_s.should == ''
26
+ end
27
+
28
+ it 'should format as (###) ###-#### by default' do
29
+ @klass.new('1234567899').to_s.should == '(123) 456-7899'
30
+ end
31
+
32
+ it 'should format based on argument' do
33
+ @klass.new('1234567899').to_s('(%A)%P-%S').
34
+ should == '(123)456-7899'
35
+ @klass.new('1234567899').to_s('%A.%P.%S').
36
+ should == '123.456.7899'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,224 @@
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 US
8
+ include DataMapper::Resource
9
+ include DataMapper::Address::US
10
+ address_properties
11
+ end
12
+
13
+ US.auto_migrate!
14
+ end
15
+
16
+ describe DataMapper::Address::US do
17
+ before(:each) do
18
+ @klass = DataMapper::Address::Spec::US
19
+
20
+ @attrs = {
21
+ :name => 'Jane Doe',
22
+ :company => 'Widgets, Inc.',
23
+ :street => '123 Lane Ave.',
24
+ :street_2 => 'Suite A',
25
+ :city => 'Nowhere',
26
+ :state => 'OK',
27
+ :postal_code => '123456789',
28
+ :country => 'USA',
29
+ :phone => '1235556789'
30
+ }
31
+
32
+ @address = @klass.new(@attrs)
33
+ end
34
+
35
+ def should_validate(field, *values)
36
+ values.each do |v|
37
+ @address.__send__("#{field}=", v)
38
+ @address.should be_valid
39
+ end
40
+ end
41
+
42
+ def should_not_validate(field, *values)
43
+ values.each do |v|
44
+ @address.__send__("#{field}=", v)
45
+ @address.should_not be_valid
46
+ end
47
+ end
48
+
49
+ it 'should be valid' do
50
+ @address.should be_valid
51
+ end
52
+
53
+ describe '#name' do
54
+ it 'should note be required' do
55
+ should_validate(:name, '', nil)
56
+ end
57
+ end
58
+
59
+ describe '#street' do
60
+ it 'should be required' do
61
+ should_not_validate(:street, '', nil)
62
+ end
63
+ end
64
+
65
+ describe '#city' do
66
+ it 'should be required' do
67
+ should_not_validate(:city, '', nil)
68
+ end
69
+ end
70
+
71
+ describe '#state' do
72
+ it 'should be required' do
73
+ should_not_validate(:state, '', nil)
74
+ end
75
+ end
76
+
77
+ describe '#postal_code' do
78
+ it 'should be required' do
79
+ should_not_validate(:postal_code, '', nil)
80
+ end
81
+
82
+ it 'should be 5 or 9 characters' do
83
+ should_not_validate(:postal_code, '1234', '123456', '12345678', '1234567890')
84
+ should_not_validate(:postal_code, '12345-678') # would be valid if dashes weren't stripped
85
+ should_validate(:postal_code, '12345', '123456789', '12345-6789')
86
+ end
87
+ end
88
+
89
+ describe '#postal_code=' do
90
+ it 'should strip out non-digits' do
91
+ @address.postal_code = '12345-6789'
92
+ @address.postal_code.should == '123456789'
93
+ @address.postal_code = '(12345 -67s80z'
94
+ @address.postal_code.should == '123456780'
95
+ end
96
+ end
97
+
98
+ describe '#postal_code.to_s' do
99
+ it 'should return empty String if #postal_code is blank' do
100
+ @address.postal_code = ''
101
+ @address.postal_code.to_s.should == ''
102
+ end
103
+
104
+ it 'should format 5-digit code as #####' do
105
+ @address.postal_code = '12345'
106
+ @address.postal_code.to_s.should == '12345'
107
+ end
108
+
109
+ it 'should format 9-digit code as #####-####' do
110
+ @address.postal_code = '123456789'
111
+ @address.postal_code.to_s.should == '12345-6789'
112
+ end
113
+ end
114
+
115
+ describe '#country' do
116
+ it 'should be required' do
117
+ should_not_validate(:country, '', nil)
118
+ end
119
+
120
+ it 'should default to USA' do
121
+ @klass.new.country.should == 'USA'
122
+ end
123
+ end
124
+
125
+ describe '#phone' do
126
+ it 'should not be required' do
127
+ should_validate(:phone, '', nil)
128
+ end
129
+
130
+ it 'should be 10 characters' do
131
+ should_not_validate(:phone, '123456789', '12345678900')
132
+ should_not_validate(:phone, '123-456-89')
133
+ should_validate(:phone, '1234567890')
134
+ end
135
+ end
136
+
137
+ describe '#phone=' do
138
+ it 'should strip out non-digits' do
139
+ @address.phone = '405-555-5555'
140
+ @address.phone.should == '4055555555'
141
+ @address.phone = '(405) 555.5556'
142
+ @address.phone.should == '4055555556'
143
+ end
144
+ end
145
+
146
+ describe '#phone.to_s' do
147
+ it 'should return empty String if #phone is blank' do
148
+ @address.phone = ''
149
+ @address.phone.to_s.should == ''
150
+ end
151
+
152
+ it 'should format as (###) ###-####' do
153
+ @address.phone = '1234567899'
154
+ @address.phone.to_s.should == '(123) 456-7899'
155
+ end
156
+ end
157
+
158
+ describe '#block' do
159
+ @attrs = {
160
+ :name => 'Jane Doe',
161
+ :company => 'Widgets, Inc.',
162
+ :street => '123 Lane Ave.',
163
+ :street_2 => 'Suite A',
164
+ :city => 'Nowhere',
165
+ :state => 'OK',
166
+ :postal_code => '12345-6789',
167
+ :country => 'USA',
168
+ :phone => '123-555-6789'
169
+ }
170
+
171
+ it 'should return nicely formatted block' do
172
+ @address.block.should ==
173
+ "Jane Doe\nWidgets, Inc.\n123 Lane Ave.\nSuite A\n" +
174
+ "Nowhere, OK 12345-6789"
175
+ end
176
+
177
+ it 'should include optional #company (due to blank)' do
178
+ @address.company = ''
179
+ @address.block.should ==
180
+ "Jane Doe\n123 Lane Ave.\nSuite A\n" +
181
+ "Nowhere, OK 12345-6789"
182
+ end
183
+
184
+ it 'should include optional #street_2 (due to blank)' do
185
+ @address.street_2 = ''
186
+ @address.block.should ==
187
+ "Jane Doe\nWidgets, Inc.\n123 Lane Ave.\n" +
188
+ "Nowhere, OK 12345-6789"
189
+ end
190
+
191
+ it 'should optionally leave out #phone (due to blank)' do
192
+ @address.phone = ''
193
+ @address.block("\n", false, true).should ==
194
+ "Jane Doe\nWidgets, Inc.\n123 Lane Ave.\nSuite A\n" +
195
+ "Nowhere, OK 12345-6789"
196
+ end
197
+
198
+ it 'should optionally add #country (due to argument)' do
199
+ @address.block("\n", true, false).should ==
200
+ "Jane Doe\nWidgets, Inc.\n123 Lane Ave.\nSuite A\n" +
201
+ "Nowhere, OK 12345-6789\nUSA"
202
+ end
203
+
204
+ it 'should optionally add #phone (due to argument)' do
205
+ @address.block("\n", false, true).should ==
206
+ "Jane Doe\nWidgets, Inc.\n123 Lane Ave.\nSuite A\n" +
207
+ "Nowhere, OK 12345-6789\n(123) 555-6789"
208
+ end
209
+
210
+ it 'should accept alternate newline' do
211
+ @address.block("<br />\n", false, false).should ==
212
+ "Jane Doe<br />\nWidgets, Inc.<br />\n123 Lane Ave.<br />\nSuite A<br />\n" +
213
+ "Nowhere, OK 12345-6789"
214
+ end
215
+ end
216
+
217
+ describe '#created_at and #updated_at' do
218
+ it 'should record timestamps' do
219
+ @address.save
220
+ @address.created_at.should be_kind_of(DateTime)
221
+ @address.updated_at.should be_kind_of(DateTime)
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe DataMapper::Address::ZipCode do
4
+ before(:all) do
5
+ @klass = DataMapper::Address::ZipCode
6
+ end
7
+
8
+ describe '.new' do
9
+ it 'should strip out non-digits' do
10
+ @klass.new('12345-6789').should == '123456789'
11
+ @klass.new('(12345 -67s80z').should == '123456780'
12
+ end
13
+ end
14
+
15
+ describe '#base' do
16
+ it 'should not be formatted (digits only)' do
17
+ @klass.new('12345-6789').base.should == '123456789'
18
+ @klass.new('(12345 -67s80z').base.should == '123456780'
19
+ end
20
+ end
21
+
22
+ describe '#to_s' do
23
+ it 'should return empty String if #phone is blank' do
24
+ @klass.new('').to_s.should == ''
25
+ @klass.new(nil).to_s.should == ''
26
+ end
27
+
28
+ it 'should format 5-digit code as #####' do
29
+ @klass.new('12345').to_s.should == '12345'
30
+ end
31
+
32
+ it 'should format based on argument' do
33
+ @klass.new('123456789').to_s.should == '12345-6789'
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe DataMapper::Address do
4
+ describe ".config" do
5
+ before(:each) do
6
+ # Force to default state
7
+ DataMapper::Address.instance_variable_set(:@config, nil)
8
+ end
9
+
10
+ after(:all) do
11
+ # Force to default state for other specs
12
+ DataMapper::Address.instance_variable_set(:@config, nil)
13
+ end
14
+
15
+ it 'should initialize with DEFAULTS' do
16
+ DataMapper::Address.config.should == DataMapper::Address::DEFAULTS
17
+ end
18
+
19
+ it 'should be writable' do
20
+ DataMapper::Address.config[:example] = 1
21
+ DataMapper::Address.instance_variable_get(:@config)[:example].should == 1
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe DataMapper::Types::PhoneNumber do
4
+
5
+ before(:each) do
6
+ @klass = DataMapper::Types::PhoneNumber
7
+ @phone_str = "(405) 555-1234"
8
+ @phone_dump = "4055551234"
9
+ @phone = DataMapper::Address::PhoneNumber.new(@phone_str)
10
+ end
11
+
12
+ describe ".dump" do
13
+ it "should return the Phone Number as a digits-only string" do
14
+ @klass.dump(@phone, :property).should == @phone_dump
15
+ end
16
+
17
+ it "should return nil if the string is nil" do
18
+ @klass.dump(nil, :property).should be_nil
19
+ end
20
+
21
+ it "should return an empty String if the Phone Number is empty" do
22
+ @klass.dump(DataMapper::Address::PhoneNumber.new(''), :property).should == ""
23
+ end
24
+ end
25
+
26
+ describe ".load" do
27
+ it "should return the string as PhoneNumber" do
28
+ @klass.load(@phone_str, :property).should == @phone
29
+ end
30
+
31
+ it "should return nil if given nil" do
32
+ @klass.load(nil, :property).should be_nil
33
+ end
34
+
35
+ it "should return an empty Phone Number if given an empty string" do
36
+ @klass.load("", :property).should == DataMapper::Address::PhoneNumber.new('')
37
+ end
38
+
39
+ it 'should raise an ArgumentError if given something else' do
40
+ lambda {
41
+ @klass.load([], :property)
42
+ }.should raise_error(ArgumentError, '+value+ must be nil or a String')
43
+ end
44
+ end
45
+
46
+ describe '.typecast' do
47
+ it 'should do nothing if an PhoneNumber is provided' do
48
+ @klass.typecast(@phone, :property).should == @phone
49
+ end
50
+
51
+ it 'should defer to .load if a string is provided' do
52
+ @klass.should_receive(:load).with(@phone_str, :property)
53
+ @klass.typecast(@phone_str, :property)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,56 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe DataMapper::Types::ZipCode do
4
+
5
+ before(:each) do
6
+ @klass = DataMapper::Types::ZipCode
7
+ @zip_str = "12345-6789"
8
+ @zip_dump = "123456789"
9
+ @zip = DataMapper::Address::ZipCode.new(@zip_str)
10
+ end
11
+
12
+ describe ".dump" do
13
+ it "should return the Zip Number as a digits-only string" do
14
+ @klass.dump(@zip, :property).should == @zip_dump
15
+ end
16
+
17
+ it "should return nil if the string is nil" do
18
+ @klass.dump(nil, :property).should be_nil
19
+ end
20
+
21
+ it "should return an empty String if the Zip Number is empty" do
22
+ @klass.dump(DataMapper::Address::ZipCode.new(''), :property).should == ""
23
+ end
24
+ end
25
+
26
+ describe ".load" do
27
+ it "should return the string as ZipCode" do
28
+ @klass.load(@zip_str, :property).should == @zip
29
+ end
30
+
31
+ it "should return nil if given nil" do
32
+ @klass.load(nil, :property).should be_nil
33
+ end
34
+
35
+ it "should return an empty Zip Code if given an empty string" do
36
+ @klass.load("", :property).should == DataMapper::Address::ZipCode.new('')
37
+ end
38
+
39
+ it 'should raise an ArgumentError if given something else' do
40
+ lambda {
41
+ @klass.load([], :property)
42
+ }.should raise_error(ArgumentError, '+value+ must be nil or a String')
43
+ end
44
+ end
45
+
46
+ describe '.typecast' do
47
+ it 'should do nothing if an ZipCode is provided' do
48
+ @klass.typecast(@zip, :property).should == @zip
49
+ end
50
+
51
+ it 'should defer to .load if a string is provided' do
52
+ @klass.should_receive(:load).with(@zip_str, :property)
53
+ @klass.typecast(@zip_str, :property)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec'
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'dm-address'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jm81-dm-address
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jared Morgan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-07-17 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: extlib
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: dm-core
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: dm-types
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: dm-validations
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ description:
56
+ email: jmorgan@morgancreative.net
57
+ executables: []
58
+
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - LICENSE
63
+ - README.rdoc
64
+ files:
65
+ - .document
66
+ - .gitignore
67
+ - LICENSE
68
+ - README.rdoc
69
+ - Rakefile
70
+ - VERSION
71
+ - lib/dm-address.rb
72
+ - lib/dm-address/phone_number.rb
73
+ - lib/dm-address/us.rb
74
+ - lib/dm-address/zip_code.rb
75
+ - lib/dm-types/phone_number.rb
76
+ - lib/dm-types/zip_code.rb
77
+ - spec/dm-address/phone_number_spec.rb
78
+ - spec/dm-address/us_spec.rb
79
+ - spec/dm-address/zip_code_spec.rb
80
+ - spec/dm-address_spec.rb
81
+ - spec/dm-types/phone_number_spec.rb
82
+ - spec/dm-types/zip_code_spec.rb
83
+ - spec/spec_helper.rb
84
+ has_rdoc: false
85
+ homepage: http://github.com/jm81/dm-address
86
+ post_install_message:
87
+ rdoc_options:
88
+ - --charset=UTF-8
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: "0"
96
+ version:
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: "0"
102
+ version:
103
+ requirements: []
104
+
105
+ rubyforge_project:
106
+ rubygems_version: 1.2.0
107
+ signing_key:
108
+ specification_version: 3
109
+ summary: TODO
110
+ test_files:
111
+ - spec/dm-address/phone_number_spec.rb
112
+ - spec/dm-address/us_spec.rb
113
+ - spec/dm-address/zip_code_spec.rb
114
+ - spec/dm-address_spec.rb
115
+ - spec/dm-types/phone_number_spec.rb
116
+ - spec/dm-types/zip_code_spec.rb
117
+ - spec/spec_helper.rb