vcard 0.2.1 → 0.2.2
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/lib/vcard.rb +12 -17
- data/lib/vcard/bnf.rb +22 -18
- data/lib/vcard/field.rb +33 -40
- data/lib/vcard/vcard.rb +21 -30
- data/lib/vcard/version.rb +1 -1
- data/test/field_test.rb +5 -4
- data/test/vcard_test.rb +20 -15
- metadata +4 -4
data/lib/vcard.rb
CHANGED
@@ -54,7 +54,7 @@ module Vcard
|
|
54
54
|
|
55
55
|
# Convert a RFC 2425 date into an array of [year, month, day].
|
56
56
|
def self.decode_date(v) # :nodoc:
|
57
|
-
|
57
|
+
if !(v =~ Bnf::DATE)
|
58
58
|
raise ::Vcard::InvalidEncodingError, "date not valid (#{v})"
|
59
59
|
end
|
60
60
|
[$1.to_i, $2.to_i, $3.to_i]
|
@@ -85,7 +85,7 @@ module Vcard
|
|
85
85
|
|
86
86
|
# Convert a RFC 2425 time into an array of [hour,min,sec,secfrac,timezone]
|
87
87
|
def self.decode_time(v) # :nodoc:
|
88
|
-
|
88
|
+
if !(match = Bnf::TIME.match(v))
|
89
89
|
raise ::Vcard::InvalidEncodingError, "time '#{v}' not valid"
|
90
90
|
end
|
91
91
|
hour, min, sec, secfrac, tz = match.to_a[1..5]
|
@@ -94,13 +94,11 @@ module Vcard
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def self.array_datetime_to_time(dtarray) #:nodoc:
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
raise ::Vcard::InvalidEncodingError, "#{tz} #{e} (#{dtarray.join(', ')})"
|
103
|
-
end
|
97
|
+
# We get [ year, month, day, hour, min, sec, usec, tz ]
|
98
|
+
tz = (dtarray.pop == "Z") ? :gm : :local
|
99
|
+
Time.send(tz, *dtarray)
|
100
|
+
rescue ArgumentError => e
|
101
|
+
raise ::Vcard::InvalidEncodingError, "#{tz} #{e} (#{dtarray.join(', ')})"
|
104
102
|
end
|
105
103
|
|
106
104
|
# Convert a RFC 2425 time into an array of Time objects.
|
@@ -110,7 +108,7 @@ module Vcard
|
|
110
108
|
|
111
109
|
# Convert a RFC 2425 date-time into an array of [year,mon,day,hour,min,sec,secfrac,timezone]
|
112
110
|
def self.decode_date_time(v) # :nodoc:
|
113
|
-
|
111
|
+
if !(match = Bnf::DATE_TIME.match(v))
|
114
112
|
raise ::Vcard::InvalidEncodingError, "date-time '#{v}' not valid"
|
115
113
|
end
|
116
114
|
year, month, day, hour, min, sec, secfrac, tz = match.to_a[1..8]
|
@@ -137,7 +135,7 @@ module Vcard
|
|
137
135
|
|
138
136
|
# Convert an RFC2425 INTEGER value into an Integer
|
139
137
|
def self.decode_integer(v) # :nodoc:
|
140
|
-
|
138
|
+
if !(v =~ Bnf::INTEGER)
|
141
139
|
raise ::Vcard::InvalidEncodingError, "integer not valid (#{v})"
|
142
140
|
end
|
143
141
|
v.to_i
|
@@ -227,8 +225,7 @@ module Vcard
|
|
227
225
|
# paramtext = *SAFE-CHAR
|
228
226
|
# quoted-string = DQUOTE *QSAFE-CHAR DQUOTE
|
229
227
|
def self.encode_paramtext(value)
|
230
|
-
|
231
|
-
when %r{\A#{Bnf::SAFECHAR}*\z}
|
228
|
+
if value =~ Bnf::ALL_SAFECHARS
|
232
229
|
value
|
233
230
|
else
|
234
231
|
raise ::Vcard::Unencodable, "paramtext #{value.inspect}"
|
@@ -236,17 +233,15 @@ module Vcard
|
|
236
233
|
end
|
237
234
|
|
238
235
|
def self.encode_paramvalue(value)
|
239
|
-
|
240
|
-
when %r{\A#{Bnf::SAFECHAR}*\z}
|
236
|
+
if value =~ Bnf::ALL_SAFECHARS
|
241
237
|
value
|
242
|
-
|
238
|
+
elsif value =~ Bnf::ALL_QSAFECHARS
|
243
239
|
'"' + value + '"'
|
244
240
|
else
|
245
241
|
raise ::Vcard::Unencodable, "param-value #{value.inspect}"
|
246
242
|
end
|
247
243
|
end
|
248
244
|
|
249
|
-
|
250
245
|
# Unfold the lines in +card+, then return an array of one Field object per
|
251
246
|
# line.
|
252
247
|
def self.decode(card) #:nodoc:
|
data/lib/vcard/bnf.rb
CHANGED
@@ -5,43 +5,41 @@
|
|
5
5
|
# VPIM-LICENSE.txt for details.
|
6
6
|
|
7
7
|
module Vcard
|
8
|
-
# Contains regular
|
8
|
+
# Contains regular expressions for the EBNF of RFC 2425.
|
9
9
|
module Bnf #:nodoc:
|
10
10
|
|
11
11
|
# 1*(ALPHA / DIGIT / "-")
|
12
|
-
# Note:
|
13
|
-
# Note:
|
14
|
-
# Note:
|
15
|
-
|
16
|
-
NAME = "[-a-z0-9_/][-a-z0-9_/ ]*"
|
12
|
+
# Note: "_" allowed because produced by Notes (X-LOTUS-CHILD_UID:)
|
13
|
+
# Note: "/" allowed because produced by KAddressBook (X-messaging/xmpp-All:)
|
14
|
+
# Note: " " allowed because produced by highrisehq.com (X-GOOGLE TALK:)
|
15
|
+
NAME = /[\w\/-][ \w\/-]*/
|
17
16
|
|
18
17
|
# <"> <Any character except CTLs, DQUOTE> <">
|
19
|
-
QSTR =
|
18
|
+
QSTR = /"([^"]*)"/
|
20
19
|
|
21
20
|
# *<Any character except CTLs, DQUOTE, ";", ":", ",">
|
22
|
-
PTEXT =
|
21
|
+
PTEXT = /([^";:,]+)/
|
23
22
|
|
24
23
|
# param-value = ptext / quoted-string
|
25
|
-
PVALUE =
|
24
|
+
PVALUE = /(?:#{QSTR}|#{PTEXT})/
|
26
25
|
|
27
26
|
# param = name "=" param-value *("," param-value)
|
28
27
|
# Note: v2.1 allows a type or encoding param-value to appear without the type=
|
29
28
|
# or the encoding=. This is hideous, but we try and support it, if there
|
30
29
|
# is no "=", then $2 will be "", and we will treat it as a v2.1 param.
|
31
|
-
PARAM =
|
30
|
+
PARAM = /;(#{NAME})(=?)((?:#{PVALUE})?(?:,#{PVALUE})*)/
|
32
31
|
|
33
32
|
# V3.0: contentline = [group "."] name *(";" param) ":" value
|
34
33
|
# V2.1: contentline = *( group "." ) name *(";" param) ":" value
|
35
|
-
#
|
36
34
|
# We accept the V2.1 syntax for backwards compatibility.
|
37
|
-
|
38
|
-
LINE = "^((?:#{NAME}\\.)*)?(#{NAME})((?:#{PARAM})*):(.*)$"
|
35
|
+
LINE = /\A((?:#{NAME}\.)*)?(#{NAME})((?:#{PARAM})*):(.*)\z/
|
39
36
|
|
40
37
|
# date = date-fullyear ["-"] date-month ["-"] date-mday
|
41
38
|
# date-fullyear = 4 DIGIT
|
42
39
|
# date-month = 2 DIGIT
|
43
40
|
# date-mday = 2 DIGIT
|
44
|
-
|
41
|
+
DATE_PARTIAL = /(\d\d\d\d)-?(\d\d)-?(\d\d)/
|
42
|
+
DATE = /\A\s*#{DATE_PARTIAL}\s*\z/
|
45
43
|
|
46
44
|
# time = time-hour [":"] time-minute [":"] time-second [time-secfrac] [time-zone]
|
47
45
|
# time-hour = 2 DIGIT
|
@@ -50,17 +48,23 @@ module Vcard
|
|
50
48
|
# time-secfrac = "," 1*DIGIT
|
51
49
|
# time-zone = "Z" / time-numzone
|
52
50
|
# time-numzone = sign time-hour [":"] time-minute
|
53
|
-
|
51
|
+
TIME_PARTIAL = /(\d\d):?(\d\d):?(\d\d)(\.\d+)?(Z|[-+]\d\d:?\d\d)?/
|
52
|
+
TIME = /\A\s*#{TIME_PARTIAL}\s*\z/
|
53
|
+
|
54
|
+
# date-time = date "T" time
|
55
|
+
DATE_TIME = /\A\s*#{DATE_PARTIAL}T#{TIME_PARTIAL}\s*\z/
|
54
56
|
|
55
57
|
# integer = (["+"] / "-") 1*DIGIT
|
56
|
-
INTEGER =
|
58
|
+
INTEGER = /\A\s*[-+]?\d+\s*\z/
|
57
59
|
|
58
60
|
# QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-US-ASCII
|
59
61
|
# ; Any character except CTLs and DQUOTE
|
60
|
-
QSAFECHAR =
|
62
|
+
QSAFECHAR = /[ \t\x21\x23-\x7e\x80-\xff]/
|
63
|
+
ALL_QSAFECHARS = /\A#{QSAFECHAR}*\z/
|
61
64
|
|
62
65
|
# SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E / NON-US-ASCII
|
63
66
|
# ; Any character except CTLs, DQUOTE, ";", ":", ","
|
64
|
-
SAFECHAR =
|
67
|
+
SAFECHAR = /[ \t\x21\x23-\x2b\x2d-\x39\x3c-\x7e\x80-\xff]/
|
68
|
+
ALL_SAFECHARS = /\A#{SAFECHAR}*\z/
|
65
69
|
end
|
66
70
|
end
|
data/lib/vcard/field.rb
CHANGED
@@ -100,7 +100,7 @@ module Vcard
|
|
100
100
|
|
101
101
|
# Decode a field.
|
102
102
|
def Field.decode0(atline) # :nodoc:
|
103
|
-
|
103
|
+
if !(atline =~ Bnf::LINE)
|
104
104
|
raise ::Vcard::InvalidEncodingError, atline
|
105
105
|
end
|
106
106
|
|
@@ -126,7 +126,7 @@ module Vcard
|
|
126
126
|
if paramslist.size > 1
|
127
127
|
|
128
128
|
# v3.0 and v2.1 params
|
129
|
-
paramslist.scan(
|
129
|
+
paramslist.scan( Bnf::PARAM ) do
|
130
130
|
|
131
131
|
# param names are case-insensitive, and multi-valued
|
132
132
|
name = $1.upcase
|
@@ -156,7 +156,7 @@ module Vcard
|
|
156
156
|
atparams[name] = []
|
157
157
|
end
|
158
158
|
|
159
|
-
params.scan(
|
159
|
+
params.scan( Bnf::PVALUE ) do
|
160
160
|
atparams[name] << ($1 || $2)
|
161
161
|
end
|
162
162
|
end
|
@@ -407,7 +407,7 @@ module Vcard
|
|
407
407
|
v = param("VALUE")
|
408
408
|
if v
|
409
409
|
if v.size > 1
|
410
|
-
raise InvalidEncodingError, "multi-valued param 'VALUE' (#{values})"
|
410
|
+
raise ::Vcard::InvalidEncodingError, "multi-valued param 'VALUE' (#{values})"
|
411
411
|
end
|
412
412
|
v = v.first.downcase
|
413
413
|
end
|
@@ -427,27 +427,25 @@ module Vcard
|
|
427
427
|
# saying what the year is that breaks, so they at least know that
|
428
428
|
# its ridiculous! I think I need my own DateTime variant.
|
429
429
|
def to_time
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
if(d.pop == "Z")
|
435
|
-
Time.gm(*d)
|
436
|
-
else
|
437
|
-
Time.local(*d)
|
438
|
-
end
|
439
|
-
rescue ArgumentError => e
|
440
|
-
raise ::Vcard::InvalidEncodingError, "Time.gm(#{d.join(', ')}) failed with #{e.message}"
|
441
|
-
end
|
442
|
-
end
|
443
|
-
rescue ::Vcard::InvalidEncodingError
|
444
|
-
::Vcard.decode_date_list(value).collect do |d|
|
445
|
-
# We get [ year, month, day ]
|
446
|
-
begin
|
430
|
+
::Vcard.decode_date_time_list(value).collect do |d|
|
431
|
+
# We get [ year, month, day, hour, min, sec, usec, tz ]
|
432
|
+
begin
|
433
|
+
if(d.pop == "Z")
|
447
434
|
Time.gm(*d)
|
448
|
-
|
449
|
-
|
435
|
+
else
|
436
|
+
Time.local(*d)
|
450
437
|
end
|
438
|
+
rescue ArgumentError => e
|
439
|
+
raise ::Vcard::InvalidEncodingError, "Time.gm(#{d.join(', ')}) failed with #{e.message}"
|
440
|
+
end
|
441
|
+
end
|
442
|
+
rescue ::Vcard::InvalidEncodingError
|
443
|
+
::Vcard.decode_date_list(value).collect do |d|
|
444
|
+
# We get [ year, month, day ]
|
445
|
+
begin
|
446
|
+
Time.gm(*d)
|
447
|
+
rescue ArgumentError => e
|
448
|
+
raise ::Vcard::InvalidEncodingError, "Time.gm(#{d.join(', ')}) failed with #{e.message}"
|
451
449
|
end
|
452
450
|
end
|
453
451
|
end
|
@@ -460,16 +458,14 @@ module Vcard
|
|
460
458
|
# decoding is tried first as a DATE-TIME, then as a DATE, if neither
|
461
459
|
# works an InvalidEncodingError will be raised.
|
462
460
|
def to_date
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
Date.new(*d)
|
472
|
-
end
|
461
|
+
::Vcard.decode_date_time_list(value).collect do |d|
|
462
|
+
# We get [ year, month, day, hour, min, sec, usec, tz ]
|
463
|
+
Date.new(d[0], d[1], d[2])
|
464
|
+
end
|
465
|
+
rescue ::Vcard::InvalidEncodingError
|
466
|
+
::Vcard.decode_date_list(value).collect do |d|
|
467
|
+
# We get [ year, month, day ]
|
468
|
+
Date.new(*d)
|
473
469
|
end
|
474
470
|
end
|
475
471
|
|
@@ -591,14 +587,11 @@ module Vcard
|
|
591
587
|
# new fields, not old fields.
|
592
588
|
def mutate(g, n, p, v) #:nodoc:
|
593
589
|
line = Field.encode0(g, n, p, v)
|
594
|
-
|
595
|
-
|
596
|
-
@group, @name, @params, @value = Field.decode0(line)
|
597
|
-
@line = line
|
598
|
-
rescue ::Vcard::InvalidEncodingError => e
|
599
|
-
raise ArgumentError, e.to_s
|
600
|
-
end
|
590
|
+
@group, @name, @params, @value = Field.decode0(line)
|
591
|
+
@line = line
|
601
592
|
self
|
593
|
+
rescue ::Vcard::InvalidEncodingError => e
|
594
|
+
raise ArgumentError, e.to_s
|
602
595
|
end
|
603
596
|
|
604
597
|
private :mutate
|
data/lib/vcard/vcard.rb
CHANGED
@@ -440,23 +440,18 @@ module Vcard
|
|
440
440
|
end
|
441
441
|
|
442
442
|
def decode_bday(field) #:nodoc:
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
end
|
456
|
-
Line.new( field.group, field.name, Date.new(y, m, d) )
|
457
|
-
else
|
458
|
-
raise
|
459
|
-
end
|
443
|
+
decode_date_or_datetime(field)
|
444
|
+
rescue ::Vcard::InvalidEncodingError
|
445
|
+
# Hack around BDAY dates hat are correct in the month and day, but have
|
446
|
+
# some kind of garbage in the year.
|
447
|
+
if field.value =~ /^\s*(\d+)-(\d+)-(\d+)\s*$/
|
448
|
+
y = $1.to_i
|
449
|
+
y = Time.now.year if y < 1900
|
450
|
+
m = $2.to_i
|
451
|
+
d = $3.to_i
|
452
|
+
Line.new( field.group, field.name, Date.new(y, m, d) )
|
453
|
+
else
|
454
|
+
raise
|
460
455
|
end
|
461
456
|
end
|
462
457
|
|
@@ -570,11 +565,9 @@ module Vcard
|
|
570
565
|
|
571
566
|
# Return line for a field
|
572
567
|
def f2l(field) #:nodoc:
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
# Skip invalidly encoded fields.
|
577
|
-
end
|
568
|
+
Line.decode(@@decode, self, field)
|
569
|
+
rescue ::Vcard::InvalidEncodingError
|
570
|
+
# Skip invalidly encoded fields.
|
578
571
|
end
|
579
572
|
|
580
573
|
# With no block, returns an Array of Line. If +name+ is specified, the
|
@@ -1034,7 +1027,7 @@ module Vcard
|
|
1034
1027
|
def make # :nodoc:
|
1035
1028
|
yield self
|
1036
1029
|
unless @card["N"]
|
1037
|
-
raise Unencodeable, "N field is mandatory"
|
1030
|
+
raise ::Vcard::Unencodeable, "N field is mandatory"
|
1038
1031
|
end
|
1039
1032
|
fn = @card.field("FN")
|
1040
1033
|
if fn && fn.value.strip.length == 0
|
@@ -1377,14 +1370,12 @@ module Vcard
|
|
1377
1370
|
|
1378
1371
|
# Delete +line+ if block yields true.
|
1379
1372
|
def delete_if #:yield: line
|
1380
|
-
|
1381
|
-
|
1382
|
-
yield line
|
1383
|
-
end
|
1384
|
-
rescue NoMethodError
|
1385
|
-
# FIXME - this is a hideous hack, allowing a DirectoryInfo to
|
1386
|
-
# be passed instead of a Vcard, and for it to almost work. Yuck.
|
1373
|
+
@card.delete_if do |line|
|
1374
|
+
yield line
|
1387
1375
|
end
|
1376
|
+
rescue NoMethodError
|
1377
|
+
# FIXME - this is a hideous hack, allowing a DirectoryInfo to
|
1378
|
+
# be passed instead of a Vcard, and for it to almost work. Yuck.
|
1388
1379
|
end
|
1389
1380
|
|
1390
1381
|
end
|
data/lib/vcard/version.rb
CHANGED
data/test/field_test.rb
CHANGED
@@ -75,16 +75,17 @@ class FieldTest < Test::Unit::TestCase
|
|
75
75
|
assert_equal("name;encoding=B:dmFsdWU=", line = Field.encode0(nil, "name", { "encoding"=>:b64 }, "value"))
|
76
76
|
assert_equal([ nil, "NAME", { "ENCODING"=>["B"]}, ["value"].pack("m").chomp ], Field.decode0(line))
|
77
77
|
|
78
|
-
|
79
|
-
assert_equal
|
78
|
+
line = Field.encode0("group", "name", {}, "value")
|
79
|
+
assert_equal "group.name:value", line
|
80
|
+
assert_equal [ "GROUP", "NAME", {}, "value"], Field.decode0(line)
|
80
81
|
end
|
81
82
|
|
82
|
-
def
|
83
|
+
def test_invalid_fields
|
83
84
|
[
|
84
85
|
"g.:",
|
85
86
|
":v",
|
86
87
|
].each do |line|
|
87
|
-
assert_raises(Vcard::InvalidEncodingError) { Field.decode0(line) }
|
88
|
+
assert_raises(::Vcard::InvalidEncodingError) { Field.decode0(line) }
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
data/test/vcard_test.rb
CHANGED
@@ -24,7 +24,7 @@ class VcardTest < Test::Unit::TestCase
|
|
24
24
|
card = nil
|
25
25
|
assert_nothing_thrown { card = Vcard::Vcard.decode(vcard(:ex2)).first }
|
26
26
|
assert_equal(vcard(:ex2), card.encode(0))
|
27
|
-
assert_raises(InvalidEncodingError) { card.version }
|
27
|
+
assert_raises(::Vcard::InvalidEncodingError) { card.version }
|
28
28
|
|
29
29
|
assert_equal("Bj=F8rn Jensen", card.name.fullname)
|
30
30
|
assert_equal("Jensen", card.name.family)
|
@@ -169,40 +169,41 @@ EOF
|
|
169
169
|
|
170
170
|
def test_bad
|
171
171
|
# FIXME: this should THROW, it's badly encoded!
|
172
|
-
assert_raises(InvalidEncodingError) do
|
172
|
+
assert_raises(::Vcard::InvalidEncodingError) do
|
173
173
|
Vcard::Vcard.decode("BEGIN:VCARD\nVERSION:3.0\nKEYencoding=b:this could be \nmy certificate\n\nEND:VCARD\n")
|
174
174
|
end
|
175
175
|
end
|
176
176
|
|
177
177
|
def test_create
|
178
178
|
card = Vcard::Vcard.create
|
179
|
-
|
180
179
|
key = Vcard::DirectoryInfo.decode("key;type=x509;encoding=B:dGhpcyBjb3VsZCBiZSAKbXkgY2VydGlmaWNhdGUK\n")['key']
|
181
|
-
|
182
180
|
card << Vcard::DirectoryInfo::Field.create('key', key, 'encoding' => :b64)
|
183
|
-
|
184
181
|
assert_equal(key, card['key'])
|
185
182
|
end
|
186
183
|
|
187
|
-
def
|
188
|
-
|
189
|
-
assert_equal [2002, 4, 22],
|
190
|
-
assert_equal [2002, 4, 22],
|
191
|
-
|
184
|
+
def test_decode_date
|
185
|
+
assert_equal [2002, 4, 22], Vcard.decode_date(" 20020422 ")
|
186
|
+
assert_equal [2002, 4, 22], Vcard.decode_date(" 2002-04-22 ")
|
187
|
+
assert_equal [2002, 4, 22], Vcard.decode_date(" 2002-04-22 \n")
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_decode_date_list
|
192
191
|
assert_equal [[2002, 4, 22]], Vcard.decode_date_list(" 2002-04-22 ")
|
193
192
|
assert_equal [[2002, 4, 22],[2002, 4, 22]], Vcard.decode_date_list(" 2002-04-22, 2002-04-22,")
|
194
193
|
assert_equal [[2002, 4, 22],[2002, 4, 22]], Vcard.decode_date_list(" 2002-04-22,,, , ,2002-04-22, , \n")
|
195
194
|
assert_equal [], Vcard.decode_date_list(" , , ")
|
195
|
+
end
|
196
196
|
|
197
|
-
|
197
|
+
def test_decode_time
|
198
198
|
assert_equal [4, 53, 22, 0, nil], Vcard.decode_time(" 04:53:22 \n")
|
199
199
|
assert_equal [4, 53, 22, 0.10, nil], Vcard.decode_time(" 04:53:22.10 \n")
|
200
200
|
assert_equal [4, 53, 22, 0.10, "Z"], Vcard.decode_time(" 04:53:22.10Z \n")
|
201
201
|
assert_equal [4, 53, 22, 0, "Z"], Vcard.decode_time(" 045322Z \n")
|
202
202
|
assert_equal [4, 53, 22, 0, "+0530"], Vcard.decode_time(" 04:5322+0530 \n")
|
203
203
|
assert_equal [4, 53, 22, 0.10, "Z"], Vcard.decode_time(" 045322.10Z \n")
|
204
|
+
end
|
204
205
|
|
205
|
-
|
206
|
+
def test_decode_date_time
|
206
207
|
assert_equal [2002, 4, 22, 4, 53, 22, 0, nil], Vcard.decode_date_time("20020422T04:53:22 \n")
|
207
208
|
assert_equal [2002, 4, 22, 4, 53, 22, 0.10, nil], Vcard.decode_date_time(" 2002-04-22T04:53:22.10 \n")
|
208
209
|
assert_equal [2002, 4, 22, 4, 53, 22, 0.10, "Z"], Vcard.decode_date_time(" 20020422T04:53:22.10Z \n")
|
@@ -210,9 +211,13 @@ EOF
|
|
210
211
|
assert_equal [2002, 4, 22, 4, 53, 22, 0, "+0530"], Vcard.decode_date_time(" 20020422T04:5322+0530 \n")
|
211
212
|
assert_equal [2002, 4, 22, 4, 53, 22, 0.10, "Z"], Vcard.decode_date_time(" 20020422T045322.10Z \n")
|
212
213
|
assert_equal [2003, 3, 25, 3, 20, 35, 0, "Z"], Vcard.decode_date_time("20030325T032035Z")
|
214
|
+
end
|
213
215
|
|
214
|
-
|
216
|
+
def test_decode_text
|
215
217
|
assert_equal "aa,\n\n,\\,\\a;;b", Vcard.decode_text('aa,\\n\\n,\\\\\,\\\\a\;\;b')
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_decode_text_list
|
216
221
|
assert_equal ['', "1\n2,3", "bbb", '', "zz", ''], Vcard.decode_text_list(',1\\n2\\,3,bbb,,zz,')
|
217
222
|
end
|
218
223
|
|
@@ -301,11 +306,11 @@ EOF
|
|
301
306
|
def test_modify_name
|
302
307
|
card = Vcard.decode("begin:vcard\nend:vcard\n").first
|
303
308
|
|
304
|
-
assert_raises(InvalidEncodingError) do
|
309
|
+
assert_raises(::Vcard::InvalidEncodingError) do
|
305
310
|
card.name
|
306
311
|
end
|
307
312
|
|
308
|
-
assert_raises(Unencodeable) do
|
313
|
+
assert_raises(::Vcard::Unencodeable) do
|
309
314
|
Vcard::Maker.make2(card) {}
|
310
315
|
end
|
311
316
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vcard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
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-12-
|
12
|
+
date: 2012-12-17 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Vcard extracted from Vpim
|
15
15
|
email:
|
@@ -78,7 +78,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
78
|
version: '0'
|
79
79
|
segments:
|
80
80
|
- 0
|
81
|
-
hash:
|
81
|
+
hash: 376442794917458825
|
82
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
@@ -87,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
87
|
version: '0'
|
88
88
|
segments:
|
89
89
|
- 0
|
90
|
-
hash:
|
90
|
+
hash: 376442794917458825
|
91
91
|
requirements: []
|
92
92
|
rubyforge_project:
|
93
93
|
rubygems_version: 1.8.24
|