Skip to content

Commit 9559f11

Browse files
committed
vCard 4.0 implementation
New Files: - vobject/vcard40.py - Complete vCard 4.0 (RFC 6350) implementation - test_files/vcard40_simple.vcf - Basic vCard 4.0 test file - test_files/vcard40_full.vcf - Full vCard 4.0 with all properties - test_files/vcard40_group.vcf - vCard 4.0 with KIND=group and MEMBER - test_files/vcard40_org.vcf - vCard 4.0 for organization - test_files/vcard40_location.vcf - vCard 4.0 for location - test_files/vcard40_multilang.vcf - Multilingual vCard 4.0 with ALTID Modified Files: - vobject/__init__.py - Added version parameter to vCard(version='3.0') - tests.py - Updated behavior registry test for new behaviors - test_files/more_tests.txt - Added dual-version doctest tests New vCard 4.0 Properties Implemented - KIND - individual/group/org/location - GENDER - sex and gender identity - ANNIVERSARY - marriage date - LANG - language preferences with PREF - IMPP - instant messaging URIs - RELATED - relationships with TYPE - MEMBER - group members (only for KIND=group) - CLIENTPIDMAP - sync mapping - XML - extended XML data - SOURCE - vCard source URI Usage: ```python import vobject v3 = vobject.vCard() v4 = vobject.vCard('4.0') v4.add('fn').value = 'John Doe' v4.add('kind').value = 'individual' v4.add('gender').value = 'M' parsed = vobject.readOne(vcard_string) # Works for both 3.0 and 4.0 ```
1 parent 8ebd737 commit 9559f11

File tree

11 files changed

+991
-3
lines changed

11 files changed

+991
-3
lines changed

test_files/more_tests.txt

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,129 @@ u'\xe9'
8383
>>> vcs = vobject.readOne(vcs, allowQP = True)
8484
>>> vcs.serialize()
8585
'BEGIN:VCALENDAR\r\nVERSION:1.0\r\nPRODID:-//OpenSync//NONSGML OpenSync vformat 0.3//EN\r\nBEGIN:VEVENT\r\nUID:20080406T152030Z-7822\r\nDESCRIPTION:foo \xc3\xa5\\nbar \xc3\xa4\\nbaz \xc3\xb6\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n'
86+
87+
vCard Version Selection
88+
.......................
89+
90+
Creating vCard with version parameter:
91+
>>> v3 = vobject.vCard() # Default is 3.0
92+
>>> v3.behavior.versionString
93+
'3.0'
94+
>>> v3_explicit = vobject.vCard('3.0')
95+
>>> v3_explicit.behavior.versionString
96+
'3.0'
97+
>>> v4 = vobject.vCard('4.0')
98+
>>> v4.behavior.versionString
99+
'4.0'
100+
101+
Invalid version raises error:
102+
>>> try:
103+
... vobject.vCard('2.0')
104+
... except ValueError as e:
105+
... print("ValueError raised")
106+
ValueError raised
107+
108+
vCard 4.0 Creation
109+
..................
110+
111+
Create a basic vCard 4.0:
112+
>>> v4 = vobject.vCard('4.0')
113+
>>> v4.add('fn').value = 'John Doe'
114+
>>> v4.add('n').value = vobject.vcard.Name('Doe', 'John')
115+
>>> 'VERSION:4.0' in v4.serialize()
116+
True
117+
>>> 'FN:John Doe' in v4.serialize()
118+
True
119+
120+
vCard 4.0 New Properties
121+
........................
122+
123+
KIND property:
124+
>>> v4 = vobject.vCard('4.0')
125+
>>> v4.add('fn').value = 'Test Group'
126+
>>> v4.add('kind').value = 'group'
127+
>>> 'KIND:group' in v4.serialize()
128+
True
129+
130+
GENDER property:
131+
>>> v4 = vobject.vCard('4.0')
132+
>>> v4.add('fn').value = 'Jane Doe'
133+
>>> v4.add('gender').value = 'F'
134+
>>> 'GENDER:F' in v4.serialize()
135+
True
136+
137+
IMPP property:
138+
>>> v4 = vobject.vCard('4.0')
139+
>>> v4.add('fn').value = 'Test User'
140+
>>> v4.add('impp').value = 'xmpp:user@jabber.example.com'
141+
>>> 'IMPP:xmpp:user@jabber.example.com' in v4.serialize()
142+
True
143+
144+
LANG property:
145+
>>> v4 = vobject.vCard('4.0')
146+
>>> v4.add('fn').value = 'Multilingual Person'
147+
>>> lang = v4.add('lang')
148+
>>> lang.value = 'en'
149+
>>> lang.params['PREF'] = ['1']
150+
>>> 'LANG' in v4.serialize()
151+
True
152+
153+
Reading vCard 4.0 Files
154+
.......................
155+
156+
Read a simple vCard 4.0:
157+
>>> f = get_stream("vcard40_simple.vcf")
158+
>>> v4 = vobject.readOne(f)
159+
>>> v4.version.value
160+
'4.0'
161+
>>> v4.fn.value
162+
'John Doe'
163+
164+
Read a vCard 4.0 with KIND=group:
165+
>>> f = get_stream("vcard40_group.vcf")
166+
>>> v4_group = vobject.readOne(f)
167+
>>> v4_group.kind.value
168+
'group'
169+
>>> len(v4_group.member_list)
170+
3
171+
172+
Read a vCard 4.0 with all properties:
173+
>>> f = get_stream("vcard40_full.vcf")
174+
>>> v4_full = vobject.readOne(f)
175+
>>> v4_full.version.value
176+
'4.0'
177+
>>> v4_full.kind.value
178+
'individual'
179+
>>> v4_full.gender.value
180+
'M'
181+
>>> v4_full.anniversary.value
182+
'20100612'
183+
184+
Dual Version Compatibility
185+
..........................
186+
187+
readOne auto-detects version from VERSION property:
188+
>>> vcard3_str = '''BEGIN:VCARD
189+
... VERSION:3.0
190+
... FN:Test 3.0
191+
... N:Test;3.0;;;
192+
... END:VCARD'''
193+
>>> v3 = vobject.readOne(vcard3_str)
194+
>>> v3.version.value
195+
'3.0'
196+
197+
>>> vcard4_str = '''BEGIN:VCARD
198+
... VERSION:4.0
199+
... FN:Test 4.0
200+
... N:Test;4.0;;;
201+
... KIND:individual
202+
... END:VCARD'''
203+
>>> v4 = vobject.readOne(vcard4_str)
204+
>>> v4.version.value
205+
'4.0'
206+
207+
Both versions serialize correctly:
208+
>>> '3.0' in v3.version.serialize()
209+
True
210+
>>> '4.0' in v4.version.serialize()
211+
True

test_files/vcard40_full.vcf

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
BEGIN:VCARD
2+
VERSION:4.0
3+
KIND:individual
4+
FN:Dr. John Q. Public\, III
5+
FN;LANGUAGE=jp:John Q. Public
6+
N:Public;John;Quinlan;Dr.;III
7+
NICKNAME:Johnny,JQP
8+
PHOTO:http://www.example.com/pub/photos/jqpublic.gif
9+
BDAY:19850415
10+
ANNIVERSARY:20100612
11+
GENDER:M
12+
ADR;TYPE=work:;;123 Main Street;Any Town;CA;91921-1234;U.S.A.
13+
ADR;TYPE=home;PREF=1:;;456 Oak Lane;Somewhere;NY;10001;U.S.A.
14+
TEL;VALUE=uri;TYPE=voice;PREF=1:tel:+1-555-555-5555
15+
TEL;VALUE=uri;TYPE=cell:tel:+1-555-123-4567
16+
EMAIL;TYPE=work:john.public@example.com
17+
EMAIL;TYPE=home;PREF=1:johnny@personal.example.org
18+
IMPP;PREF=1:xmpp:john@jabber.example.com
19+
IMPP:sip:john@voip.example.com
20+
LANG;PREF=1:en
21+
LANG;PREF=2:fr
22+
TZ:America/New_York
23+
GEO:geo:37.386013,-122.082932
24+
TITLE:CEO
25+
ROLE:Executive
26+
LOGO:http://www.example.com/pub/logos/company.png
27+
ORG:Example Corp.;North Division;Marketing
28+
RELATED;TYPE=spouse:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
29+
CATEGORIES:BUSINESS,NETWORKING
30+
NOTE:This is a note about John.\nHe likes vCards.
31+
REV:20231215T120000Z
32+
SOUND:http://www.example.com/pub/sounds/jqpublic.ogg
33+
UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
34+
URL:http://www.example.com/~jqpublic
35+
KEY:http://www.example.com/keys/jqpublic.pgp
36+
FBURL:http://www.example.com/busy/jqpublic
37+
CALADRURI:mailto:jqpublic@example.com
38+
CALURI:http://cal.example.com/jqpublic
39+
END:VCARD

test_files/vcard40_group.vcf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
BEGIN:VCARD
2+
VERSION:4.0
3+
KIND:group
4+
FN:The Doe Family
5+
UID:urn:uuid:group-doe-family
6+
MEMBER:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
7+
MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
8+
MEMBER:mailto:kid@example.com
9+
END:VCARD

test_files/vcard40_location.vcf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
BEGIN:VCARD
2+
VERSION:4.0
3+
KIND:location
4+
FN:Empire State Building
5+
ADR:;;350 Fifth Avenue;New York;NY;10118;U.S.A.
6+
GEO:geo:40.748817,-73.985428
7+
TEL;VALUE=uri:tel:+1-212-736-3100
8+
URL:http://www.esbnyc.com
9+
END:VCARD

test_files/vcard40_multilang.vcf

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
BEGIN:VCARD
2+
VERSION:4.0
3+
FN;ALTID=1;LANGUAGE=en:Yamada Taro
4+
FN;ALTID=1;LANGUAGE=ja:山田太郎
5+
N;ALTID=1;LANGUAGE=en:Yamada;Taro;;;
6+
N;ALTID=1;LANGUAGE=ja;SORT-AS="yamada,taro":山田;太郎;;;
7+
UID:urn:uuid:multilang-vcard-example
8+
END:VCARD

test_files/vcard40_org.vcf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
BEGIN:VCARD
2+
VERSION:4.0
3+
KIND:org
4+
FN:ABC Marketing
5+
ORG:ABC\, Inc.;North American Division;Marketing
6+
TEL;VALUE=uri:tel:+1-555-000-0000
7+
EMAIL:marketing@abc.example.com
8+
ADR:;;456 Corporate Way;Business City;NY;10001;U.S.A.
9+
URL:http://www.abc.example.com/marketing
10+
END:VCARD

test_files/vcard40_simple.vcf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
BEGIN:VCARD
2+
VERSION:4.0
3+
FN:John Doe
4+
N:Doe;John;;;
5+
UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
6+
END:VCARD

0 commit comments

Comments
 (0)