vpim 0.695 → 13.11.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/{README → README.rdoc} +2 -13
  3. data/lib/vpim.rb +1 -0
  4. data/lib/vpim/address.rb +3 -2
  5. data/lib/vpim/agent/atomize.rb +4 -0
  6. data/lib/vpim/agent/base.rb +74 -0
  7. data/lib/vpim/agent/calendars.rb +1 -0
  8. data/lib/vpim/agent/handler.rb +27 -0
  9. data/lib/vpim/agent/ics.rb +162 -0
  10. data/lib/vpim/attachment.rb +1 -0
  11. data/lib/vpim/date.rb +3 -2
  12. data/lib/vpim/dirinfo.rb +5 -4
  13. data/lib/vpim/duration.rb +1 -0
  14. data/lib/vpim/enumerator.rb +1 -0
  15. data/lib/vpim/field.rb +3 -2
  16. data/lib/vpim/icalendar.rb +9 -5
  17. data/lib/vpim/maker/vcard.rb +1 -0
  18. data/lib/vpim/property/base.rb +1 -0
  19. data/lib/vpim/property/common.rb +1 -0
  20. data/lib/vpim/property/location.rb +10 -0
  21. data/lib/vpim/property/priority.rb +2 -1
  22. data/lib/vpim/property/recurrence.rb +1 -0
  23. data/lib/vpim/property/resources.rb +1 -2
  24. data/lib/vpim/repo.rb +2 -1
  25. data/lib/vpim/rfc2425.rb +32 -24
  26. data/lib/vpim/rrule.rb +9 -8
  27. data/lib/vpim/time.rb +1 -0
  28. data/lib/vpim/vcard.rb +13 -11
  29. data/lib/vpim/version.rb +2 -2
  30. data/lib/vpim/vevent.rb +3 -1
  31. data/lib/vpim/view.rb +3 -2
  32. data/lib/vpim/vjournal.rb +1 -0
  33. data/lib/vpim/vpim.rb +2 -1
  34. data/lib/vpim/vtodo.rb +1 -0
  35. data/samples/agent.ru +10 -0
  36. data/test/test_all.rb +2 -0
  37. data/test/test_date.rb +6 -5
  38. data/test/test_dur.rb +1 -0
  39. data/test/test_field.rb +3 -2
  40. data/test/test_ical.rb +12 -2
  41. data/test/test_misc.rb +13 -0
  42. data/test/test_repo.rb +22 -2
  43. data/test/test_rrule.rb +1 -0
  44. data/test/test_vcard.rb +53 -1
  45. metadata +36 -46
  46. data/lib/vpim/agent/app.rb +0 -194
  47. data/lib/vpim/agent/main.rb +0 -327
  48. data/lib/vpim/agent/scraps.rb +0 -292
  49. data/test/test_agent_app.rb +0 -74
  50. data/test/test_agent_atomize.rb +0 -84
  51. data/test/test_agent_calendars.rb +0 -128
  52. data/test/test_view.rb +0 -79
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -30,15 +31,18 @@ module Vpim
30
31
  #
31
32
  # The iCalendar format is specified by a series of IETF documents:
32
33
  #
33
- # - link:rfc2445.txt: Internet Calendaring and Scheduling Core Object Specification
34
- # - link:rfc2446.txt: iCalendar Transport-Independent Interoperability Protocol
35
- # (iTIP) Scheduling Events, BusyTime, To-dos and Journal Entries
36
- # - link:rfc2447.txt: iCalendar Message-Based Interoperability Protocol
34
+ # - RFC2445[http://www.ietf.org/rfc/rfc2445.txt]: Internet Calendaring and
35
+ # Scheduling Core Object Specification
36
+ # - RFC2446[http://www.ietf.org/rfc/rfc2446.txt]: iCalendar
37
+ # Transport-Independent Interoperability Protocol (iTIP) Scheduling Events,
38
+ # BusyTime, To-dos and Journal Entries
39
+ # - RFC2447[http://www.ietf.org/rfc/rfc2447.txt]: iCalendar Message-Based
40
+ # Interoperability Protocol
37
41
  #
38
42
  # = iCalendar and vCalendar
39
43
  #
40
44
  # iCalendar files have VERSION:2.0 and vCalendar have VERSION:1.0. iCalendar
41
- # (RFC 2445) is based on vCalendar, but but is not very compatible. While
45
+ # (RFC 2445) is based on vCalendar, but is not very compatible. While
42
46
  # much appears to be similar, the recurrence rule syntax is completely
43
47
  # different.
44
48
  #
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -29,9 +30,18 @@ module Vpim
29
30
  end
30
31
  prop
31
32
  end
33
+ end
34
+ end
32
35
 
36
+ # add a location property to (v)events. This is specified in the RFC 2445
37
+ module Set
38
+ module Location
39
+ def location(value)
40
+ set_text 'LOCATION', value
41
+ end
33
42
  end
34
43
  end
44
+
35
45
  end
36
46
  end
37
47
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -23,7 +24,7 @@ module Vpim
23
24
  # comparison operators?
24
25
  def priority
25
26
  p = @properties.detect { |f| f.name? 'PRIORITY' }
26
-
27
+
27
28
  if !p
28
29
  p = 0
29
30
  else
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -20,5 +21,3 @@ module Vpim
20
21
  end
21
22
  end
22
23
  end
23
-
24
-
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -188,7 +189,7 @@ module Vpim
188
189
  uri
189
190
  else
190
191
  begin
191
- URI.parse(uri)
192
+ URI.parse(uri.sub(/^webcal:/, "http:"))
192
193
  rescue URI::InvalidURIError => e
193
194
  raise ArgumentError, "Invalid URI for #{uri.inspect} - #{e.to_s}"
194
195
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -21,13 +22,13 @@ module Vpim
21
22
 
22
23
  # <"> <Any character except CTLs, DQUOTE> <">
23
24
  QSTR = '"([^"]*)"'
24
-
25
+
25
26
  # *<Any character except CTLs, DQUOTE, ";", ":", ",">
26
27
  PTEXT = '([^";:,]+)'
27
-
28
+
28
29
  # param-value = ptext / quoted-string
29
30
  PVALUE = "(?:#{QSTR}|#{PTEXT})"
30
-
31
+
31
32
  # param = name "=" param-value *("," param-value)
32
33
  # Note: v2.1 allows a type or encoding param-value to appear without the type=
33
34
  # or the encoding=. This is hideous, but we try and support it, if there
@@ -76,29 +77,36 @@ module Vpim
76
77
  # This also supports the (invalid) encoding convention of allowing empty
77
78
  # lines to be inserted for readability - it does this by dropping zero-length
78
79
  # lines.
79
- def Vpim.unfold(card) #:nodoc:
80
- unfolded = []
81
-
82
- card.each do |line|
83
- line.chomp!
84
- # If it's a continuation line, add it to the last.
85
- # If it's an empty line, drop it from the input.
86
- if( line =~ /^[ \t]/ )
87
- unfolded[-1] << line[1, line.size-1]
88
- elsif( line =~ /^$/ )
89
- else
90
- unfolded << line
91
- end
80
+ #
81
+ # Also supports an the QUOTED-PRINTABLE soft line-break as described here:
82
+ # http://en.wikipedia.org/wiki/Quoted-printable
83
+ #
84
+ def Vpim.unfold(card) # :nodoc:
85
+ unfolded = []
86
+ # Ruby 1.9's String can no longer be iterated with #each, so the following
87
+ # code, which used to work with String, or Array, or File, or anything else
88
+ # which produced lines when iterated, now just works with String. Sucky.
89
+ card.each_line do |line|
90
+ line.chomp!
91
+ # If it's a continuation line, add it to the last.
92
+ # If it's an empty line, drop it from the input.
93
+ if( line =~ /^[ \t]/ )
94
+ unfolded[-1] << line[1, line.size-1]
95
+ elsif (unfolded.last && unfolded.last =~ /;ENCODING=QUOTED-PRINTABLE:.*?=$/)
96
+ unfolded.last << line
97
+ elsif( line =~ /^$/ )
98
+ else
99
+ unfolded << line
92
100
  end
93
-
94
- unfolded
101
+ end
102
+ unfolded
95
103
  end
96
104
 
97
105
  # Convert a +sep+-seperated list of values into an array of values.
98
106
  def Vpim.decode_list(value, sep = ',') # :nodoc:
99
107
  list = []
100
-
101
- value.each(sep) do |item|
108
+
109
+ value.each_line(sep) do |item|
102
110
  item.chomp!(sep)
103
111
  list << yield(item)
104
112
  end
@@ -245,14 +253,14 @@ module Vpim
245
253
  # FIXME - I think this should trim leading and trailing space
246
254
  v.gsub(/\\(.)/) do
247
255
  case $1
248
- when 'n', 'N'
256
+ when 'n', 'N'
249
257
  "\n"
250
258
  else
251
259
  $1
252
260
  end
253
261
  end
254
262
  end
255
-
263
+
256
264
  def Vpim.encode_text(v) #:nodoc:
257
265
  v.to_str.gsub(/([\\,;\n])/) { $1 == "\n" ? "\\n" : "\\"+$1 }
258
266
  end
@@ -286,7 +294,7 @@ module Vpim
286
294
  when %r{\A#{Bnf::SAFECHAR}*\z}
287
295
  value
288
296
  else
289
- raise Vpim::Unencodable, "paramtext #{value.inspect}"
297
+ raise Vpim::Unencodeable, "paramtext #{value.inspect}"
290
298
  end
291
299
  end
292
300
 
@@ -297,7 +305,7 @@ module Vpim
297
305
  when %r{\A#{Bnf::QSAFECHAR}*\z}
298
306
  '"' + value + '"'
299
307
  else
300
- raise Vpim::Unencodable, "param-value #{value.inspect}"
308
+ raise Vpim::Unencodeable, "param-value #{value.inspect}"
301
309
  end
302
310
  end
303
311
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -65,20 +66,20 @@ module Vpim
65
66
 
66
67
  # Freq is mandatory, but must occur only once.
67
68
  @freq = nil
68
-
69
+
69
70
  # Both Until and Count must not occur, neither is OK.
70
71
  @until = nil
71
72
  @count = nil
72
-
73
+
73
74
  # Interval is optional, but defaults to 1.
74
75
  @interval = 1
75
76
 
76
77
  # WKST defines what day a week begins on, the default is monday.
77
78
  @wkst = 'MO'
78
-
79
+
79
80
  # Recurrence can modified by these.
80
81
  @by = {}
81
-
82
+
82
83
  if @rrule
83
84
  @rrule.scan(/([^;=]+)=([^;=]+)/) do |key,value|
84
85
  key.upcase!
@@ -256,10 +257,10 @@ module Vpim
256
257
  end
257
258
 
258
259
  # TODO - BYHOUR, BYMINUTE, BYSECOND
259
-
260
- hour = [@dtstart.hour] if !hour
261
- min = [@dtstart.min] if !min
262
- sec = [@dtstart.sec] if !sec
260
+
261
+ hour = [@dtstart.hour] if !hour
262
+ min = [@dtstart.min] if !min
263
+ sec = [@dtstart.sec] if !sec
263
264
 
264
265
  # debug days
265
266
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : binary -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -17,8 +18,8 @@ module Vpim
17
18
  # A vCard, a specialization of a directory info object.
18
19
  #
19
20
  # The vCard format is specified by:
20
- # - RFC2426: vCard MIME Directory Profile (vCard 3.0)
21
- # - RFC2425: A MIME Content-Type for Directory Information
21
+ # - RFC2426[http://www.ietf.org/rfc/rfc2426.txt]: vCard MIME Directory Profile (vCard 3.0)
22
+ # - RFC2425[http://www.ietf.org/rfc/rfc2425.txt]: A MIME Content-Type for Directory Information
22
23
  #
23
24
  # This implements vCard 3.0, but it is also capable of working with vCard 2.1
24
25
  # if used with care.
@@ -26,7 +27,7 @@ module Vpim
26
27
  # All line values can be accessed with Vcard#value, Vcard#values, or even by
27
28
  # iterating through Vcard#lines. Line types that don't have specific support
28
29
  # and non-standard line types ("X-MY-SPECIAL", for example) will be returned
29
- # as a String, with any base64 or quoted-printable encoding removed.
30
+ # as a String, with any base64 or quoted-printable encoding removed.
30
31
  #
31
32
  # Specific support exists to return more useful values for the standard vCard
32
33
  # types, where appropriate.
@@ -41,13 +42,10 @@ module Vpim
41
42
  # lines, and both the singular and plural forms will eventually be
42
43
  # implemented.
43
44
  #
44
- # If there is sufficient demand, specific support for vCard 2.1 could be
45
- # implemented.
46
- #
47
45
  # For more information see:
48
- # - link:rfc2426.txt: vCard MIME Directory Profile (vCard 3.0)
49
- # - link:rfc2425.txt: A MIME Content-Type for Directory Information
50
- # - http://www.imc.org/pdi/pdiproddev.html: vCard 2.1 Specifications
46
+ # - RFC2426[http://www.ietf.org/rfc/rfc2426.txt]: vCard MIME Directory Profile (vCard 3.0)
47
+ # - RFC2425[http://www.ietf.org/rfc/rfc2425.txt]: A MIME Content-Type for Directory Information
48
+ # - vCard2.1[http://www.imc.org/pdi/pdiproddev.html]: vCard 2.1 Specifications
51
49
  #
52
50
  # vCards are usually transmitted in files with <code>.vcf</code>
53
51
  # extensions.
@@ -275,7 +273,7 @@ module Vpim
275
273
  end
276
274
 
277
275
  # Represents the value of a TEL field.
278
- #
276
+ #
279
277
  # The value is supposed to be a "X.500 Telephone Number" according to RFC
280
278
  # 2426, but that standard is not freely available. Otherwise, anything that
281
279
  # looks like a phone number should be OK.
@@ -672,6 +670,8 @@ module Vpim
672
670
  raise ArgumentError, "Vcard.decode cannot be called with a #{card.type}"
673
671
  end
674
672
 
673
+ string.force_encoding "BINARY"
674
+
675
675
  case string
676
676
  when /^\xEF\xBB\xBF/
677
677
  string = string.sub("\xEF\xBB\xBF", '')
@@ -689,6 +689,8 @@ module Vpim
689
689
  string = string.unpack('v*').pack('U*')
690
690
  end
691
691
 
692
+ string.force_encoding "utf-8"
693
+
692
694
  entities = Vpim.expand(Vpim.decode(string))
693
695
 
694
696
  # Since all vCards must have a begin/end, the top-level should consist
@@ -1384,7 +1386,7 @@ module Vpim
1384
1386
  # Copy the fields from +card+ into self using #add_field. If a block is
1385
1387
  # provided, each Field from +card+ is yielded. The block should return a
1386
1388
  # Field to add, or nil. The Field doesn't have to be the one yielded,
1387
- # allowing the field to be copied and modified (see Field#copy) before adding, or
1389
+ # allowing the field to be copied and modified (see Field#copy) before adding, or
1388
1390
  # not added at all if the block yields nil.
1389
1391
  #
1390
1392
  # The vCard fields BEGIN and END aren't copied, and VERSION, N, and FN are copied
@@ -7,9 +7,9 @@
7
7
  =end
8
8
 
9
9
  module Vpim
10
- PRODID = '-//Ensemble Independent//vPim 0.695//EN'
10
+ PRODID = '-//Octet Cloud//vPim 13.11.11//EN'
11
11
 
12
- VERSION = '0.695'
12
+ VERSION = '13.11.11'
13
13
 
14
14
  # Return the API version as a string.
15
15
  def Vpim.version
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -103,7 +104,7 @@ module Vpim
103
104
 
104
105
  # put invitee in as field[1]
105
106
  fields << invitee.encode('ATTENDEE') if i == 1
106
-
107
+
107
108
  fields << f unless f.name? 'ATTENDEE'
108
109
  end
109
110
 
@@ -135,6 +136,7 @@ module Vpim
135
136
  class Maker
136
137
  include Vpim::Icalendar::Set::Util #:nodoc:
137
138
  include Vpim::Icalendar::Set::Common
139
+ include Vpim::Icalendar::Set::Location
138
140
 
139
141
  # The event that changes are being made to.
140
142
  attr_reader :event
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -10,7 +11,7 @@ require "enumerator"
10
11
 
11
12
  module Vpim
12
13
  module View
13
-
14
+
14
15
  SECSPERDAY = 24 * 60 * 60
15
16
 
16
17
  # View only events occuring in the next week.
@@ -50,7 +51,7 @@ module Vpim
50
51
  end
51
52
  __
52
53
  =begin
53
- block = lambda do |dountil|
54
+ block = lambda do |dountil|
54
55
  unless block_given?
55
56
  return Enumerable::Enumerator.new(self, :occurrences, dountil)
56
57
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -21,7 +22,7 @@ module Vpim
21
22
  # If its unsupported, its likely because I didn't anticipate it being useful
22
23
  # to support this, and it likely it could be supported on request.
23
24
  class UnsupportedError < StandardError; end
24
-
25
+
25
26
  # Exception used to indicate that encoding failed, probably because the
26
27
  # object would not result in validly encoded data. The message should
27
28
  # describe what is unsupported.
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  =begin
2
3
  Copyright (C) 2008 Sam Roberts
3
4
 
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # Run as "rackup agent.ru", default rackup arguments follow:
3
+ #\ -p 4567
4
+
5
+ require "vpim/agent/ics"
6
+
7
+ use Rack::Reloader, 0
8
+
9
+ run Vpim::Agent::Ics
10
+
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'pp'
@@ -5,6 +6,7 @@ require 'pp'
5
6
  $-w = true
6
7
 
7
8
  $:.unshift File.dirname(__FILE__) + "/../lib"
9
+ $:.unshift File.dirname(__FILE__) + "/.."
8
10
 
9
11
 
10
12
  #pp [__LINE__, $:, $"]