motion-addressbook 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/lib/motion-addressbook/version.rb +1 -1
- data/motion/address_book/multi_value.rb +94 -20
- data/motion/address_book/person.rb +39 -53
- data/spec/address_book/multi_value_spec.rb +105 -46
- data/spec/address_book/person_spec.rb +68 -66
- data/spec/helpers/hacks.rb +3 -0
- data/spec/helpers/person_helpers.rb +2 -3
- metadata +6 -4
data/Gemfile.lock
CHANGED
@@ -1,30 +1,98 @@
|
|
1
1
|
module AddressBook
|
2
2
|
class MultiValue
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :attributes, :ab_multi_values
|
4
4
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
5
|
+
def self.attribute_map
|
6
|
+
{ :mobile => KABPersonPhoneMobileLabel ,
|
7
|
+
:iphone => KABPersonPhoneIPhoneLabel ,
|
8
|
+
:main => KABPersonPhoneMainLabel ,
|
9
|
+
:home_fax => KABPersonPhoneHomeFAXLabel,
|
10
|
+
:work_fax => KABPersonPhoneWorkFAXLabel,
|
11
|
+
:pager => KABPersonPhonePagerLabel ,
|
12
|
+
:work => KABWorkLabel ,
|
13
|
+
:home => KABHomeLabel ,
|
14
|
+
:other => KABOtherLabel
|
15
|
+
}
|
16
|
+
end
|
17
|
+
def attribute_map
|
18
|
+
self.class.attribute_map
|
19
|
+
end
|
20
|
+
|
21
|
+
def alex
|
22
|
+
ABMultiValueGetIdentifierAtIndex @ab_multi_values, 0
|
8
23
|
end
|
9
24
|
|
10
|
-
def
|
11
|
-
|
12
|
-
if
|
13
|
-
|
25
|
+
def initialize(attributes={}, existing_ab_multi_values=nil)
|
26
|
+
@attributes = {}
|
27
|
+
if existing_ab_multi_values
|
28
|
+
@ab_multi_values = ABMultiValueCreateMutableCopy(existing_ab_multi_values)
|
29
|
+
load_attributes_from_ab
|
30
|
+
else
|
31
|
+
@ab_multi_values = ABMultiValueCreateMutable(KABMultiStringPropertyType)
|
32
|
+
end
|
33
|
+
attributes.each do |attribute, value|
|
34
|
+
send("#{attribute}=", value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def method_missing(name, *args)
|
39
|
+
if attribute_name = getter?(name)
|
40
|
+
get(attribute_name)
|
41
|
+
elsif attribute_name = setter?(name)
|
42
|
+
set(attribute_name, args.first)
|
43
|
+
else
|
44
|
+
super
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.is_attribute?(attribute_name)
|
49
|
+
return false if attribute_name.nil?
|
50
|
+
attribute_map.include?(attribute_name.to_sym) || [:email, :phone_number].include?( attribute_name.to_sym)
|
51
|
+
end
|
52
|
+
|
53
|
+
def getter?(method_name)
|
54
|
+
if self.class.is_attribute? method_name
|
55
|
+
method_name
|
56
|
+
else
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
def setter?(method_name)
|
61
|
+
method_name.to_s =~ /^(\w*)=$/
|
62
|
+
if self.class.is_attribute? $1
|
63
|
+
$1
|
14
64
|
else
|
15
|
-
|
16
|
-
ABMultiValueReplaceValueAtIndex(@ab_multi_values, value, index_for(ab_label))
|
65
|
+
nil
|
17
66
|
end
|
18
67
|
end
|
19
68
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
69
|
+
def get(attribute_name)
|
70
|
+
attributes[attribute_name.to_sym] ||= get_field(attribute_map[attribute_name])
|
71
|
+
end
|
72
|
+
|
73
|
+
def set(attribute_name, value)
|
74
|
+
set_field(attribute_map[attribute_name.to_sym], value)
|
75
|
+
attributes[attribute_name.to_sym] = value
|
76
|
+
end
|
77
|
+
|
78
|
+
def set_field(ab_label, value)
|
79
|
+
if blank?(ab_label)
|
80
|
+
ABMultiValueAddValueAndLabel(@ab_multi_values, value, ab_label, nil) unless value.nil?
|
81
|
+
else
|
82
|
+
ABMultiValueReplaceValueAtIndex(@ab_multi_values, value, 0)
|
23
83
|
end
|
24
84
|
end
|
25
85
|
|
86
|
+
def get_field(ab_label)
|
87
|
+
puts
|
88
|
+
puts [__FILE__, __LINE__, ab_label].inspect
|
89
|
+
index = ABMultiValueGetIndexForIdentifier(@ab_multi_values, ab_label)
|
90
|
+
puts [__FILE__, __LINE__, index].inspect
|
91
|
+
ABMultiValueCopyValueAtIndex(@ab_multi_values, index)
|
92
|
+
end
|
93
|
+
|
26
94
|
def values
|
27
|
-
|
95
|
+
attributes.values
|
28
96
|
end
|
29
97
|
|
30
98
|
def include? value
|
@@ -32,14 +100,20 @@ module AddressBook
|
|
32
100
|
values.include? value
|
33
101
|
end
|
34
102
|
|
35
|
-
|
36
|
-
|
37
|
-
index_for(ab_label) == -1
|
103
|
+
def size
|
104
|
+
ABMultiValueGetCount(@ab_multi_values)
|
38
105
|
end
|
39
106
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
107
|
+
def load_attributes_from_ab
|
108
|
+
(0...size).to_a.each do |i|
|
109
|
+
label = ABMultiValueCopyLabelAtIndex(@ab_multi_values, i)
|
110
|
+
@attributes[attribute_map.invert[label]] = ABMultiValueCopyValueAtIndex(@ab_multi_values, i)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
def blank?(ab_label)
|
116
|
+
attributes[ab_label].nil?
|
43
117
|
end
|
44
118
|
|
45
119
|
end
|
@@ -2,12 +2,12 @@ module AddressBook
|
|
2
2
|
class Person
|
3
3
|
attr_reader :attributes, :error, :ab_person
|
4
4
|
|
5
|
-
def initialize(attributes={},
|
5
|
+
def initialize(attributes={}, existing_ab_person = nil)
|
6
6
|
@attributes = attributes
|
7
|
-
if
|
7
|
+
if existing_ab_person.nil?
|
8
8
|
@new_record = true
|
9
9
|
else
|
10
|
-
@ab_person =
|
10
|
+
@ab_person = existing_ab_person
|
11
11
|
load_ab_person
|
12
12
|
@new_record = false
|
13
13
|
end
|
@@ -175,7 +175,38 @@ module AddressBook
|
|
175
175
|
@attributes[:phone_number] ||= phone_number_values.first
|
176
176
|
end
|
177
177
|
|
178
|
-
|
178
|
+
def ab_person
|
179
|
+
if @ab_person.nil?
|
180
|
+
@ab_person = ABPersonCreate()
|
181
|
+
load_ab_person
|
182
|
+
end
|
183
|
+
@ab_person
|
184
|
+
end
|
185
|
+
|
186
|
+
def find_or_new
|
187
|
+
if new_record?
|
188
|
+
new_ab_person
|
189
|
+
else
|
190
|
+
existing_record
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def new_record?
|
195
|
+
!!@new_record
|
196
|
+
end
|
197
|
+
def exists?
|
198
|
+
!new_record?
|
199
|
+
end
|
200
|
+
def inspect
|
201
|
+
# ensure all attributes loaded
|
202
|
+
attribute_map.keys.each do |attribute|
|
203
|
+
self.send(attribute)
|
204
|
+
end
|
205
|
+
|
206
|
+
super
|
207
|
+
end
|
208
|
+
|
209
|
+
private
|
179
210
|
|
180
211
|
def load_ab_person
|
181
212
|
set_field(KABPersonFirstNameProperty, attributes[:first_name ]) unless attributes[:first_name ].nil?
|
@@ -183,8 +214,8 @@ module AddressBook
|
|
183
214
|
set_field(KABPersonJobTitleProperty, attributes[:job_title ]) unless attributes[:job_title ].nil?
|
184
215
|
set_field(KABPersonDepartmentProperty, attributes[:department ]) unless attributes[:department ].nil?
|
185
216
|
set_field(KABPersonOrganizationProperty, attributes[:organization]) unless attributes[:organization].nil?
|
186
|
-
set_multi_field(KABPersonPhoneProperty,
|
187
|
-
set_multi_field(KABPersonEmailProperty,
|
217
|
+
set_multi_field(KABPersonPhoneProperty, :mobile => attributes[:mobile_phone], :work => attributes[:office_phone])
|
218
|
+
set_multi_field(KABPersonEmailProperty, :work => attributes[:email])
|
188
219
|
end
|
189
220
|
|
190
221
|
def set_field(field, value)
|
@@ -195,38 +226,11 @@ module AddressBook
|
|
195
226
|
end
|
196
227
|
|
197
228
|
def set_multi_field(field, values)
|
198
|
-
multi_field = MultiValue.new(ABRecordCopyValue(ab_person, field))
|
199
|
-
multi_field.set_many(values)
|
229
|
+
multi_field = MultiValue.new(values, ABRecordCopyValue(ab_person, field))
|
200
230
|
ABRecordSetValue(ab_person, field, multi_field.ab_multi_values, error )
|
201
231
|
end
|
202
232
|
def get_multi_field(field)
|
203
|
-
MultiValue.new(ABRecordCopyValue(ab_person, field))
|
204
|
-
end
|
205
|
-
|
206
|
-
def ab_person
|
207
|
-
if @ab_person.nil?
|
208
|
-
@ab_person = new_ab_person
|
209
|
-
load_ab_person
|
210
|
-
end
|
211
|
-
@ab_person
|
212
|
-
end
|
213
|
-
|
214
|
-
def find_or_new
|
215
|
-
if new_record?
|
216
|
-
new_ab_person
|
217
|
-
else
|
218
|
-
existing_record
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
def new_ab_person
|
223
|
-
ab_person = ABPersonCreate()
|
224
|
-
# ABAddressBookAddRecord(address_book, ab_person, error )
|
225
|
-
ab_person
|
226
|
-
end
|
227
|
-
|
228
|
-
def new_record?
|
229
|
-
!!@new_record
|
233
|
+
MultiValue.new({}, ABRecordCopyValue(ab_person, field))
|
230
234
|
end
|
231
235
|
|
232
236
|
def existing_records
|
@@ -237,12 +241,6 @@ module AddressBook
|
|
237
241
|
end
|
238
242
|
end
|
239
243
|
|
240
|
-
def exists?
|
241
|
-
!new_record?
|
242
|
-
end
|
243
|
-
# def new_record?
|
244
|
-
# existing_record.nil?
|
245
|
-
# end
|
246
244
|
def existing_record
|
247
245
|
# what if there are more than one match? email should be unique but ...
|
248
246
|
existing_records.first
|
@@ -252,17 +250,5 @@ module AddressBook
|
|
252
250
|
@address_book ||= ABAddressBookCreate()
|
253
251
|
end
|
254
252
|
|
255
|
-
def inspect
|
256
|
-
# ensure all attributes loaded
|
257
|
-
attribute_map.keys.each do |attribute|
|
258
|
-
self.send(attribute)
|
259
|
-
end
|
260
|
-
|
261
|
-
super
|
262
|
-
end
|
263
|
-
|
264
|
-
# def define_some_constants
|
265
|
-
# [KABWorkLabel, KABOtherLabel, KABHomeLabel]
|
266
|
-
# end
|
267
253
|
end
|
268
254
|
end
|
@@ -1,66 +1,125 @@
|
|
1
1
|
describe AddressBook::MultiValue do
|
2
|
-
describe 'new
|
3
|
-
|
4
|
-
|
2
|
+
describe 'properties on a new multivalue' do
|
3
|
+
describe 'initializing with values' do
|
4
|
+
before do
|
5
|
+
@attributes = { :mobile => '123-456-7890', :iphone => '222-333-4444', :main => '555-1212',
|
6
|
+
:home_fax => '1-617-555-8000', :work_fax => '1-212-555-0000', :pager => '99-9999-9999',
|
7
|
+
:work => 'alex@work.com', :home => 'alex@home.com', :other => 'alex@other.com'}
|
8
|
+
@multi_value = AddressBook::MultiValue.new @attributes
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should be able to get each of the single value fields' do
|
12
|
+
@multi_value.mobile.should.equal @attributes[:mobile ]
|
13
|
+
@multi_value.iphone.should.equal @attributes[:iphone ]
|
14
|
+
@multi_value.main.should.equal @attributes[:main ]
|
15
|
+
@multi_value.home_fax.should.equal @attributes[:home_fax]
|
16
|
+
@multi_value.work_fax.should.equal @attributes[:work_fax]
|
17
|
+
@multi_value.pager.should.equal @attributes[:pager ]
|
18
|
+
@multi_value.work.should.equal @attributes[:work ]
|
19
|
+
@multi_value.home.should.equal @attributes[:home ]
|
20
|
+
@multi_value.other.should.equal @attributes[:other ]
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should give all the values in a list' do
|
24
|
+
@multi_value.values.should == ["123-456-7890", "222-333-4444", "555-1212", "1-617-555-8000", "1-212-555-0000", "99-9999-9999", "alex@work.com", "alex@home.com", "alex@other.com"]
|
25
|
+
end
|
5
26
|
end
|
6
27
|
|
7
|
-
describe 'setting
|
8
|
-
before
|
9
|
-
|
10
|
-
@multi_value.values.should == ['alex@work.com']
|
11
|
-
end
|
12
|
-
it 'should know if the value exists' do
|
13
|
-
@multi_value.include?('alex@work.com').should.be.true
|
28
|
+
describe 'setting each field' do
|
29
|
+
before do
|
30
|
+
@multi_value = AddressBook::MultiValue.new
|
14
31
|
end
|
15
32
|
|
16
|
-
it 'should
|
17
|
-
@multi_value.
|
33
|
+
it 'should be able to set the first name' do
|
34
|
+
@multi_value.mobile = '123456789'
|
35
|
+
@multi_value.mobile.should.equal '123456789'
|
18
36
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
it 'gives access to the values' do
|
23
|
-
@multi_value.values.should == ['alex@work.com', 'alex@home.com']
|
37
|
+
it 'should be able to set the iphone' do
|
38
|
+
@multi_value.iphone = '123456789'
|
39
|
+
@multi_value.iphone.should.equal '123456789'
|
24
40
|
end
|
25
|
-
it 'should
|
26
|
-
@multi_value.
|
27
|
-
@multi_value.
|
41
|
+
it 'should be able to set the main' do
|
42
|
+
@multi_value.main = '123456789'
|
43
|
+
@multi_value.main.should.equal '123456789'
|
28
44
|
end
|
29
|
-
|
30
|
-
|
31
|
-
@multi_value.
|
45
|
+
it 'should be able to set the home fax' do
|
46
|
+
@multi_value.home_fax = '123456789'
|
47
|
+
@multi_value.home_fax.should.equal '123456789'
|
48
|
+
end
|
49
|
+
it 'should be able to set the work fax' do
|
50
|
+
@multi_value.work_fax = '123456789'
|
51
|
+
@multi_value.work_fax.should.equal '123456789'
|
52
|
+
end
|
53
|
+
it 'should be able to set the pager' do
|
54
|
+
@multi_value.pager = '123456789'
|
55
|
+
@multi_value.pager.should.equal '123456789'
|
56
|
+
end
|
57
|
+
it 'should be able to set the work' do
|
58
|
+
@multi_value.work = 'a@work.com'
|
59
|
+
@multi_value.work.should.equal 'a@work.com'
|
60
|
+
end
|
61
|
+
it 'should be able to set the home' do
|
62
|
+
@multi_value.home = 'a@home.com'
|
63
|
+
@multi_value.home.should.equal 'a@home.com'
|
64
|
+
end
|
65
|
+
it 'should be able to set the other' do
|
66
|
+
@multi_value.other = 'a@other.com'
|
67
|
+
@multi_value.other.should.equal 'a@other.com'
|
32
68
|
end
|
33
69
|
end
|
34
70
|
end
|
35
|
-
|
36
|
-
describe 'existing
|
71
|
+
|
72
|
+
describe 'an existing multivalue' do
|
37
73
|
before do
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
@multi_value = AddressBook::MultiValue.new old_multi_value.ab_multi_values
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should have the value' do
|
45
|
-
@multi_value.values.should == ['alex@work.com']
|
74
|
+
@first_multi_value = AddressBook::MultiValue.new :mobile => '123-456-7890', :iphone => '99-8888888-7777777-66'
|
75
|
+
@multi_value = AddressBook::MultiValue.new({:mobile => '987654321', :home_fax => '777-6666-4444'}, @first_multi_value.ab_multi_values)
|
46
76
|
end
|
47
77
|
|
48
|
-
it 'should
|
49
|
-
@multi_value.
|
50
|
-
|
51
|
-
@multi_value.
|
78
|
+
it 'should ' do
|
79
|
+
@multi_value.mobile.should == '987654321'
|
80
|
+
@multi_value.iphone.should == '99-8888888-7777777-66'
|
81
|
+
@multi_value.home_fax.should == '777-6666-4444'
|
52
82
|
end
|
83
|
+
end
|
53
84
|
|
54
|
-
|
55
|
-
|
56
|
-
|
85
|
+
describe 'method missing magic' do
|
86
|
+
before do
|
87
|
+
@multi_value = AddressBook::MultiValue.new
|
88
|
+
end
|
89
|
+
describe 'getters' do
|
90
|
+
it 'should have a getter for each attribute' do
|
91
|
+
@multi_value.getter?('mobile' ).should.be truthy
|
92
|
+
@multi_value.getter?('iphone' ).should.be truthy
|
93
|
+
@multi_value.getter?('main' ).should.be truthy
|
94
|
+
@multi_value.getter?('home_fax').should.be truthy
|
95
|
+
@multi_value.getter?('work_fax').should.be truthy
|
96
|
+
@multi_value.getter?('pager' ).should.be truthy
|
97
|
+
@multi_value.getter?('work' ).should.be truthy
|
98
|
+
@multi_value.getter?('home' ).should.be truthy
|
99
|
+
@multi_value.getter?('other' ).should.be truthy
|
57
100
|
end
|
58
|
-
|
59
|
-
|
60
|
-
@multi_value.
|
61
|
-
@multi_value.values.should == ['alex@work.com', 'alex@home.com']
|
101
|
+
it 'should know what is not a getter' do
|
102
|
+
@multi_value.getter?('nonesense').should.be falsey
|
103
|
+
@multi_value.getter?('mobile=' ).should.be falsey
|
62
104
|
end
|
63
|
-
|
64
105
|
end
|
65
|
-
|
106
|
+
describe 'setters' do
|
107
|
+
it 'should have a setter for each attribute' do
|
108
|
+
@multi_value.setter?('mobile=' ).should.be truthy
|
109
|
+
@multi_value.setter?('iphone=' ).should.be truthy
|
110
|
+
@multi_value.setter?('main=' ).should.be truthy
|
111
|
+
@multi_value.setter?('home_fax=').should.be truthy
|
112
|
+
@multi_value.setter?('work_fax=').should.be truthy
|
113
|
+
@multi_value.setter?('pager=' ).should.be truthy
|
114
|
+
@multi_value.setter?('work=' ).should.be truthy
|
115
|
+
@multi_value.setter?('home=' ).should.be truthy
|
116
|
+
@multi_value.setter?('other=' ).should.be truthy
|
117
|
+
end
|
118
|
+
it 'should know what is not a setter' do
|
119
|
+
@multi_value.setter?('nonesense=').should.be falsey
|
120
|
+
@multi_value.setter?('mobile' ).should.be falsey
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
66
125
|
end
|
@@ -1,49 +1,31 @@
|
|
1
|
-
def unique_email
|
2
|
-
"alex_#{Time.now.to_i}@example.com"
|
3
|
-
end
|
4
1
|
describe AddressBook::Person do
|
5
2
|
|
6
|
-
describe '.all' do
|
7
|
-
before do
|
8
|
-
@person = AddressBook::Person.create({:first_name => 'Alex', :last_name=>'Rothenberg'})
|
9
|
-
end
|
10
|
-
it 'should have the person we created' do
|
11
|
-
all_names = AddressBook::Person.all.map do |person|
|
12
|
-
[person.first_name, person.last_name]
|
13
|
-
end
|
14
|
-
all_names.should.include? ['Alex', 'Rothenberg']
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'should get bigger when we create another' do
|
18
|
-
initial_people_count = AddressBook::Person.all.size
|
19
|
-
@person = AddressBook::Person.create({:first_name => 'Alex2', :last_name=>'Rothenberg2'})
|
20
|
-
AddressBook::Person.all.size.should == (initial_people_count + 1)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
3
|
describe 'ways of creating and finding people' do
|
25
4
|
describe 'new' do
|
26
5
|
before do
|
27
|
-
@alex = AddressBook::Person.new(:first_name => 'Alex', :last_name => 'Testy', :email => '
|
6
|
+
@alex = AddressBook::Person.new(:first_name => 'Alex', :last_name => 'Testy', :email => 'alex_testy@example.com')
|
28
7
|
end
|
29
8
|
it 'should create but not save in the address book' do
|
30
9
|
@alex.should.be.new_record
|
31
10
|
@alex.first_name.should == 'Alex'
|
32
11
|
@alex.last_name.should == 'Testy'
|
33
|
-
@alex.email_values.should == ['
|
12
|
+
@alex.email_values.should == ['alex_testy@example.com']
|
34
13
|
end
|
35
14
|
end
|
36
|
-
|
15
|
+
|
37
16
|
describe 'existing' do
|
38
17
|
before do
|
39
|
-
|
18
|
+
@email = unique_email
|
19
|
+
@alex = AddressBook::Person.create(:first_name => 'Alex', :last_name => 'Testy', :email => @email)
|
40
20
|
end
|
41
21
|
describe '.find_by_all_email' do
|
42
22
|
it 'should find matches' do
|
43
|
-
alexes = AddressBook::Person.find_all_by_email
|
23
|
+
alexes = AddressBook::Person.find_all_by_email @email
|
44
24
|
alexes.should.not.be.empty
|
45
25
|
alexes.each do |alex|
|
46
|
-
alex.email.should ==
|
26
|
+
alex.email.should == @email
|
27
|
+
alex.first_name.should == 'Alex'
|
28
|
+
alex.last_name.should == 'Testy'
|
47
29
|
end
|
48
30
|
end
|
49
31
|
it 'should give empty list when nothing matches' do
|
@@ -53,8 +35,10 @@ describe AddressBook::Person do
|
|
53
35
|
end
|
54
36
|
describe '.find_by_email' do
|
55
37
|
it 'should find match' do
|
56
|
-
alex = AddressBook::Person.find_by_email
|
57
|
-
alex.email.should ==
|
38
|
+
alex = AddressBook::Person.find_by_email @email
|
39
|
+
alex.email.should == @email
|
40
|
+
alex.first_name.should == 'Alex'
|
41
|
+
alex.last_name.should == 'Testy'
|
58
42
|
end
|
59
43
|
it 'should give empty list when nothing matches' do
|
60
44
|
alexes = AddressBook::Person.find_by_email unique_email
|
@@ -63,10 +47,12 @@ describe AddressBook::Person do
|
|
63
47
|
end
|
64
48
|
describe '.where' do
|
65
49
|
it 'should find matches' do
|
66
|
-
alexes = AddressBook::Person.where(:email =>
|
50
|
+
alexes = AddressBook::Person.where(:email => @email)
|
67
51
|
alexes.should.not.be.empty
|
68
52
|
alexes.each do |alex|
|
69
|
-
alex.email.should ==
|
53
|
+
alex.email.should == @email
|
54
|
+
alex.first_name.should == 'Alex'
|
55
|
+
alex.last_name.should == 'Testy'
|
70
56
|
end
|
71
57
|
end
|
72
58
|
it 'should give empty list when nothing matches' do
|
@@ -74,27 +60,43 @@ describe AddressBook::Person do
|
|
74
60
|
alexes.should == []
|
75
61
|
end
|
76
62
|
end
|
63
|
+
|
64
|
+
describe '.all' do
|
65
|
+
it 'should have the person we created' do
|
66
|
+
all_names = AddressBook::Person.all.map do |person|
|
67
|
+
[person.first_name, person.last_name]
|
68
|
+
end
|
69
|
+
all_names.should.include? [@alex.first_name, @alex.last_name]
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should get bigger when we create another' do
|
73
|
+
initial_people_count = AddressBook::Person.all.size
|
74
|
+
@person = AddressBook::Person.create({:first_name => 'Alex2', :last_name=>'Rothenberg2'})
|
75
|
+
AddressBook::Person.all.size.should == (initial_people_count + 1)
|
76
|
+
end
|
77
|
+
end
|
77
78
|
end
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
80
|
+
describe '.find_or_new_by_XXX - new or existing' do
|
81
|
+
before do
|
82
|
+
@email = unique_email
|
83
|
+
AddressBook::Person.create(:first_name => 'Alex', :last_name => 'Testy', :email => @email)
|
84
|
+
end
|
85
|
+
it 'should find an existing person' do
|
86
|
+
alex = AddressBook::Person.find_or_new_by_email(@email)
|
87
|
+
alex.should.not.be.new_record
|
88
|
+
alex.email.should == @email
|
89
|
+
alex.first_name.should == 'Alex'
|
90
|
+
alex.last_name.should == 'Testy'
|
91
|
+
end
|
92
|
+
it 'should return new person when no match found' do
|
93
|
+
never_before_used_email = unique_email
|
94
|
+
alex = AddressBook::Person.find_or_new_by_email(never_before_used_email)
|
95
|
+
alex.should.be.new_record
|
96
|
+
alex.email.should == never_before_used_email
|
97
|
+
alex.first_name.should == nil
|
98
|
+
end
|
99
|
+
end
|
98
100
|
end
|
99
101
|
|
100
102
|
describe 'save' do
|
@@ -105,17 +107,17 @@ describe AddressBook::Person do
|
|
105
107
|
:email => unique_email
|
106
108
|
}
|
107
109
|
end
|
108
|
-
|
110
|
+
|
109
111
|
describe 'a new person' do
|
110
112
|
before do
|
111
113
|
@ab_person = AddressBook::Person.new(@attributes)
|
112
114
|
end
|
113
|
-
|
115
|
+
|
114
116
|
it 'should not be existing' do
|
115
117
|
@ab_person.should.be.new_record
|
116
118
|
@ab_person.should.not.be.exists
|
117
119
|
end
|
118
|
-
|
120
|
+
|
119
121
|
it 'should be able to get each of the single value fields' do
|
120
122
|
@ab_person.first_name.should.equal @attributes[:first_name ]
|
121
123
|
@ab_person.last_name.should.equal @attributes[:last_name ]
|
@@ -123,7 +125,7 @@ describe AddressBook::Person do
|
|
123
125
|
@ab_person.department.should.equal @attributes[:department ]
|
124
126
|
@ab_person.organization.should.equal @attributes[:organization]
|
125
127
|
end
|
126
|
-
|
128
|
+
|
127
129
|
describe 'setting each field' do
|
128
130
|
it 'should be able to set the first name' do
|
129
131
|
@ab_person.first_name = 'new first name'
|
@@ -145,7 +147,7 @@ describe AddressBook::Person do
|
|
145
147
|
@ab_person.organization = 'new organization'
|
146
148
|
@ab_person.organization.should.equal 'new organization'
|
147
149
|
end
|
148
|
-
|
150
|
+
|
149
151
|
it 'should be able to set the phot' do
|
150
152
|
image = CIImage.emptyImage
|
151
153
|
data = UIImagePNGRepresentation(UIImage.imageWithCIImage image)
|
@@ -153,11 +155,11 @@ describe AddressBook::Person do
|
|
153
155
|
UIImagePNGRepresentation(@ab_person.photo).should.equal data
|
154
156
|
end
|
155
157
|
end
|
156
|
-
|
158
|
+
|
157
159
|
it 'should be able to get the phone numbers' do
|
158
160
|
@ab_person.phone_number_values.should.equal [@attributes[:mobile_phone], @attributes[:office_phone] ]
|
159
161
|
end
|
160
|
-
|
162
|
+
|
161
163
|
it 'should be able to get the emails' do
|
162
164
|
@ab_person.email_values.should.equal [@attributes[:email] ]
|
163
165
|
end
|
@@ -171,22 +173,23 @@ describe AddressBook::Person do
|
|
171
173
|
end
|
172
174
|
end
|
173
175
|
end
|
174
|
-
|
176
|
+
|
175
177
|
describe 'updating an existing person' do
|
176
178
|
before do
|
177
179
|
AddressBook::Person.new(@attributes).save
|
178
180
|
@attributes[:job_title ] = 'i got promoted'
|
179
181
|
@attributes[:office_phone] = '111 222 3333'
|
180
|
-
|
182
|
+
@attributes[:department ] = nil
|
181
183
|
@ab_person = AddressBook::Person.find_or_new_by_email(@attributes[:email])
|
182
184
|
end
|
183
|
-
|
185
|
+
|
184
186
|
it 'should know it is not new' do
|
185
187
|
@ab_person.should.not.be.new_record
|
186
188
|
@ab_person.should.be.exists
|
189
|
+
@ab_person.first_name.should == 'Alex'
|
187
190
|
@ab_person.department.should == 'Development'
|
188
191
|
end
|
189
|
-
|
192
|
+
|
190
193
|
describe 'updating' do
|
191
194
|
it 'should be able to get each of the single value fields' do
|
192
195
|
@ab_person.save
|
@@ -196,11 +199,11 @@ describe AddressBook::Person do
|
|
196
199
|
AddressBook::Person.find_by_email(@ab_person.email).first_name.should == 'New First Name'
|
197
200
|
end
|
198
201
|
end
|
199
|
-
|
202
|
+
|
200
203
|
end
|
201
|
-
|
204
|
+
|
202
205
|
end
|
203
|
-
|
206
|
+
|
204
207
|
describe 'method missing magic' do
|
205
208
|
before do
|
206
209
|
@person = AddressBook::Person.new
|
@@ -265,6 +268,5 @@ describe AddressBook::Person do
|
|
265
268
|
AddressBook::Person.first_finder?('find_all_by_email').should.be falsey
|
266
269
|
end
|
267
270
|
end
|
268
|
-
end
|
269
|
-
|
271
|
+
end
|
270
272
|
end
|
@@ -0,0 +1,3 @@
|
|
1
|
+
# The value of these constants is undefined until one of the following functions has been called: ABAddressBookCreate, ABPersonCreate, ABGroupCreate.
|
2
|
+
# see https://developer.apple.com/library/ios/#documentation/AddressBook/Reference/ABPersonRef_iPhoneOS/Reference/reference.html and search for "Discussion"
|
3
|
+
ABAddressBookCreate()
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-addressbook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
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-08-
|
12
|
+
date: 2012-08-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bubble-wrap
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- spec/address_book/multi_value_spec.rb
|
81
81
|
- spec/address_book/person_spec.rb
|
82
82
|
- spec/helpers/bacon_matchers.rb
|
83
|
+
- spec/helpers/hacks.rb
|
83
84
|
- spec/helpers/person_helpers.rb
|
84
85
|
homepage: ''
|
85
86
|
licenses: []
|
@@ -95,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
96
|
version: '0'
|
96
97
|
segments:
|
97
98
|
- 0
|
98
|
-
hash:
|
99
|
+
hash: 2733254916178873065
|
99
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
101
|
none: false
|
101
102
|
requirements:
|
@@ -104,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
105
|
version: '0'
|
105
106
|
segments:
|
106
107
|
- 0
|
107
|
-
hash:
|
108
|
+
hash: 2733254916178873065
|
108
109
|
requirements: []
|
109
110
|
rubyforge_project:
|
110
111
|
rubygems_version: 1.8.24
|
@@ -115,4 +116,5 @@ test_files:
|
|
115
116
|
- spec/address_book/multi_value_spec.rb
|
116
117
|
- spec/address_book/person_spec.rb
|
117
118
|
- spec/helpers/bacon_matchers.rb
|
119
|
+
- spec/helpers/hacks.rb
|
118
120
|
- spec/helpers/person_helpers.rb
|