vpim 0.695 → 13.11.11

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.
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
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'vpim/date'
@@ -38,16 +39,16 @@ class TestVpimDate < Test::Unit::TestCase
38
39
 
39
40
  def test_bywday
40
41
 
41
- # 2004
42
- #
43
- # January February March
42
+ # 2004
43
+ #
44
+ # January February March
44
45
  # S M Tu W Th F S S M Tu W Th F S S M Tu W Th F S
45
46
  # 1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 6
46
47
  # 4 5 6 7 8 9 10 8 9 10 11 12 13 14 7 8 9 10 11 12 13
47
48
  # 11 12 13 14 15 16 17 15 16 17 18 19 20 21 14 15 16 17 18 19 20
48
49
  # 18 19 20 21 22 23 24 22 23 24 25 26 27 28 21 22 23 24 25 26 27
49
50
  # 25 26 27 28 29 30 31 29 28 29 30 31
50
- #
51
+ #
51
52
  do_bywday([2004, 1, 4, 1], [2004, 1, 1])
52
53
  do_bywday([2004, 1, 4, 2], [2004, 1, 8])
53
54
  do_bywday([2004, 1, 4, -1], [2004, 1, 29])
@@ -74,7 +75,7 @@ class TestVpimDate < Test::Unit::TestCase
74
75
  do_bywday([2004,-12, "th", -2], [2004, 1, 22])
75
76
  do_bywday([2004,-12, "th", -5], [2004, 1, 1])
76
77
 
77
- # October November December
78
+ # October November December
78
79
  # S M Tu W Th F S S M Tu W Th F S S M Tu W Th F S
79
80
  # 1 2 1 2 3 4 5 6 1 2 3 4
80
81
  # 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'vpim/duration'
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'test/unit'
@@ -15,7 +16,7 @@ class TestField < Test::Unit::TestCase
15
16
  assert_equal("+\\+\n+\n+,+;+a+b+c+", dec)
16
17
  enc_out = Vpim.encode_text(dec)
17
18
  should_be = "+\\\\+\\n+\\n+\\,+\\;+a+b+c+"
18
- # Note a, b, and c are allowed to be escaped, but shouldn't be and
19
+ # Note a, b, and c are allowed to be escaped, but shouldn't be and
19
20
  # aren't in output
20
21
  #puts("<#{dec}> => <#{enc_out}>")
21
22
  assert_equal(should_be, enc_out)
@@ -134,7 +135,7 @@ class TestField < Test::Unit::TestCase
134
135
  assert_equal('Z.B', f.group)
135
136
 
136
137
  f.value = 'some text'
137
-
138
+
138
139
  assert_equal('some text', f.value)
139
140
  assert_equal('some text', f.value_raw)
140
141
 
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'vpim/icalendar'
@@ -170,7 +171,7 @@ ___
170
171
  # Hal was encoding raw strings, here's how to do it with the API.
171
172
 
172
173
  cal = Icalendar.create
173
-
174
+
174
175
  start = Time.now
175
176
 
176
177
  event = Icalendar::Vevent.create(start,
@@ -329,7 +330,7 @@ __
329
330
  assert_equal(1, vc.events.to_a.size)
330
331
  assert_equal(1, vc.todos.to_a.size)
331
332
  assert_equal(1, vc.journals.to_a.size)
332
-
333
+
333
334
  vc.to_s # Shouldn't raise...
334
335
  # TODO - encode isn't round-tripping, unknown components are lost, which is
335
336
  # not good.
@@ -421,6 +422,15 @@ __
421
422
  assert_equal(cal.events.last.location, nil)
422
423
  end
423
424
 
425
+ def test_set_location
426
+ vc = Icalendar.create2 do |vc|
427
+ vc.add_event do |m|
428
+ m.location("bien located")
429
+ end
430
+ end
431
+ assert_match(/LOCATION:bien located/, vc.to_s)
432
+ end
433
+
424
434
 
425
435
  def test_event_maker_w_rrule
426
436
  vc = Icalendar.create2 do |vc|
@@ -0,0 +1,13 @@
1
+ # -*- encoding : utf-8 -*-
2
+ #!/usr/bin/env ruby
3
+
4
+ require 'test/unit'
5
+ require 'vpim/version'
6
+
7
+ class TestVpimMisc < Test::Unit::TestCase
8
+
9
+ def test_version
10
+ assert_match(/\d+.\d+.\d+/, Vpim.version)
11
+ end
12
+
13
+ end
@@ -1,7 +1,8 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'vpim/repo'
4
- require 'test/common'
5
+ require File.expand_path('../common', __FILE__)
5
6
 
6
7
  class TestRepo < Test::Unit::TestCase
7
8
  Apple3 = Vpim::Repo::Apple3
@@ -50,7 +51,7 @@ class TestRepo < Test::Unit::TestCase
50
51
  _test_each(repo, 1)
51
52
  end
52
53
 
53
- def test_uri
54
+ def test_uri_http
54
55
  caldata = open('test/calendars/weather.calendar/Events/1205042405-0-0.ics').read
55
56
 
56
57
  server = data_on_port(caldata, 9876)
@@ -68,6 +69,25 @@ class TestRepo < Test::Unit::TestCase
68
69
  end
69
70
  end
70
71
 
72
+ def test_uri_webcal
73
+ caldata = open('test/calendars/weather.calendar/Events/1205042405-0-0.ics').read
74
+
75
+ server = data_on_port(caldata, 9876)
76
+ begin
77
+ c = Uri::Calendar.new("webcal://localhost:9876")
78
+ assert_equal(caldata, c.encode)
79
+
80
+ repo = Uri.new("webcal://localhost:9876")
81
+
82
+ assert_equal(1, repo.count)
83
+
84
+ _test_each(repo, 1)
85
+ ensure
86
+ server.kill
87
+ end
88
+ end
89
+
90
+
71
91
  def test_uri_invalid
72
92
  assert_raises(ArgumentError) do
73
93
  Uri.new("url")
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  ENV['TZ'] = 'EST5EDT'
@@ -1,3 +1,4 @@
1
+ # -*- encoding : utf-8 -*-
1
2
  #!/usr/bin/env ruby
2
3
 
3
4
  require 'vpim/vcard'
@@ -690,7 +691,14 @@ END:VCARD
690
691
  assert_equal('', card.name.given)
691
692
  assert_equal('', card.name.fullname)
692
693
 
693
- assert_raises(TypeError) do
694
+ # As of Ruby 1.9, modifying a frozen object raises a RuntimeError instead of
695
+ # a TypeError.
696
+ if RUBY_VERSION >= "1.9"
697
+ expected_error = RuntimeError
698
+ else
699
+ expected_error = TypeError
700
+ end
701
+ assert_raises(expected_error) do
694
702
  card.name.given = 'given'
695
703
  end
696
704
 
@@ -718,6 +726,28 @@ END:VCARD
718
726
  assert_equal('well given', card.name.fullname)
719
727
  end
720
728
 
729
+ def test_add_tel
730
+ phones = ["1", "2", "3"]
731
+ card = Vpim::Vcard::Maker.make2 do |maker|
732
+ maker.add_name do |name|
733
+ name.given = "self.first_name"
734
+ name.family = "self.last_name"
735
+ end
736
+ phones.each do |phone|
737
+ maker.add_tel(phone) do |tel|
738
+ tel.location = 'home'
739
+ tel.preferred = true
740
+ end
741
+ end
742
+ end
743
+ card = Vpim::Vcard.decode(card.encode).first
744
+ # pp card
745
+ card.telephones.each do |phone|
746
+ assert_equal(phone, phones.delete(phone))
747
+ end
748
+ assert_equal(0, phones.size)
749
+ end
750
+
721
751
  def test_add_note
722
752
  note = "hi\' \ \"\",,;; \n \n field"
723
753
 
@@ -896,6 +926,28 @@ __
896
926
 
897
927
  end
898
928
 
929
+ def test_quoted_printable
930
+ c = <<'__'
931
+ BEGIN:VCARD
932
+ VERSION:2.1
933
+ N:Quinn;Charles
934
+ FN:Charles Quinn
935
+ NOTE;ENCODING=QUOTED-PRINTABLE: =0D=0Acbq+highgroove@example.com <mailto:cbq+highgroove@example.com>=0D=0A555-555-2=
936
+ 500 - Office=0D=0A555-555-2502 - Fax
937
+ TEL;WORK;VOICE:555 555 2500
938
+ TEL;WORK;FAX:555 555 2502
939
+ EMAIL;PREF;INTERNET:cbq+highgroove@example.com
940
+ REV:20100210T201157Z
941
+ END:VCARD
942
+ __
943
+ card = Vpim::Vcard.decode(c).first
944
+ assert_equal("Quinn", card.name.family)
945
+ assert_equal(
946
+ "=0D=0Acbq+highgroove@example.com <mailto:cbq+highgroove@example.com>=0D=0A555-555-2=500 - Office=0D=0A555-555-2502 - Fax",
947
+ card.note
948
+ )
949
+ end
950
+
899
951
  def _test_gmail_vcard_export
900
952
  # GOOGLE BUG - Whitespace before the LABEL field values is a broken
901
953
  # line continuation.
metadata CHANGED
@@ -1,37 +1,35 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: vpim
3
- version: !ruby/object:Gem::Version
4
- version: "0.695"
3
+ version: !ruby/object:Gem::Version
4
+ version: 13.11.11
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Sam Roberts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
-
12
- date: 2009-03-01 00:00:00 -08:00
13
- default_executable:
11
+ date: 2013-11-11 00:00:00.000000000 Z
14
12
  dependencies: []
15
-
16
- description: This is a pure-ruby library for decoding and encoding vCard and iCalendar data ("personal information") called vPim.
13
+ description: |
14
+ This is a pure-ruby library for decoding and encoding vCard and iCalendar data
15
+ ("personal information") called vPim.
17
16
  email: vieuxtech@gmail.com
18
- executables:
17
+ executables:
19
18
  - reminder
20
19
  - rrule
21
20
  extensions: []
22
-
23
- extra_rdoc_files:
24
- - README
21
+ extra_rdoc_files:
22
+ - README.rdoc
25
23
  - CHANGES
26
24
  - COPYING
27
25
  - samples/README.mutt
28
- files:
26
+ files:
29
27
  - lib/vpim/address.rb
30
- - lib/vpim/agent/app.rb
31
28
  - lib/vpim/agent/atomize.rb
29
+ - lib/vpim/agent/base.rb
32
30
  - lib/vpim/agent/calendars.rb
33
- - lib/vpim/agent/main.rb
34
- - lib/vpim/agent/scraps.rb
31
+ - lib/vpim/agent/handler.rb
32
+ - lib/vpim/agent/ics.rb
35
33
  - lib/vpim/attachment.rb
36
34
  - lib/vpim/date.rb
37
35
  - lib/vpim/dirinfo.rb
@@ -60,7 +58,9 @@ files:
60
58
  - lib/vpim.rb
61
59
  - bin/reminder
62
60
  - bin/rrule
61
+ - samples/README.mutt
63
62
  - samples/ab-query.rb
63
+ - samples/agent.ru
64
64
  - samples/cmd-itip.rb
65
65
  - samples/ex_cpvcard.rb
66
66
  - samples/ex_get_vcard_photo.rb
@@ -71,7 +71,6 @@ files:
71
71
  - samples/ics-to-rss.rb
72
72
  - samples/mutt-aliases-to-vcf.rb
73
73
  - samples/osx-wrappers.rb
74
- - samples/README.mutt
75
74
  - samples/reminder.rb
76
75
  - samples/rrule.rb
77
76
  - samples/tabbed-file-to-vcf.rb
@@ -79,57 +78,48 @@ files:
79
78
  - samples/vcf-lines.rb
80
79
  - samples/vcf-to-ics.rb
81
80
  - samples/vcf-to-mutt.rb
82
- - test/test_agent_app.rb
83
- - test/test_agent_atomize.rb
84
- - test/test_agent_calendars.rb
85
81
  - test/test_all.rb
86
82
  - test/test_date.rb
87
83
  - test/test_dur.rb
88
84
  - test/test_field.rb
89
85
  - test/test_ical.rb
86
+ - test/test_misc.rb
90
87
  - test/test_repo.rb
91
88
  - test/test_rrule.rb
92
89
  - test/test_vcard.rb
93
- - test/test_view.rb
94
90
  - COPYING
95
- - README
91
+ - README.rdoc
96
92
  - CHANGES
97
- has_rdoc: true
98
93
  homepage: http://vpim.rubyforge.org
94
+ licenses: []
95
+ metadata: {}
99
96
  post_install_message:
100
97
  rdoc_options: []
101
-
102
- require_paths:
98
+ require_paths:
103
99
  - lib
104
- required_ruby_version: !ruby/object:Gem::Requirement
105
- requirements:
106
- - - ">="
107
- - !ruby/object:Gem::Version
108
- version: "0"
109
- version:
110
- required_rubygems_version: !ruby/object:Gem::Requirement
111
- requirements:
112
- - - ">="
113
- - !ruby/object:Gem::Version
114
- version: "0"
115
- version:
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
116
110
  requirements: []
117
-
118
111
  rubyforge_project: vpim
119
- rubygems_version: 1.3.1
112
+ rubygems_version: 2.0.3
120
113
  signing_key:
121
- specification_version: 2
114
+ specification_version: 4
122
115
  summary: iCalendar and vCard support for ruby
123
- test_files:
124
- - test/test_agent_app.rb
125
- - test/test_agent_atomize.rb
126
- - test/test_agent_calendars.rb
116
+ test_files:
127
117
  - test/test_all.rb
128
118
  - test/test_date.rb
129
119
  - test/test_dur.rb
130
120
  - test/test_field.rb
131
121
  - test/test_ical.rb
122
+ - test/test_misc.rb
132
123
  - test/test_repo.rb
133
124
  - test/test_rrule.rb
134
125
  - test/test_vcard.rb
135
- - test/test_view.rb
@@ -1,194 +0,0 @@
1
- =begin
2
- Copyright (C) 2009 Sam Roberts
3
-
4
- This library is free software; you can redistribute it and/or modify it
5
- under the same terms as the ruby language itself, see the file COPYING for
6
- details.
7
- =end
8
-
9
- require 'sinatra'
10
- require 'vpim/agent/atomize'
11
- require 'vpim/repo'
12
- require 'vpim/view'
13
-
14
- require 'cgi'
15
-
16
- configure do
17
- server = Sinatra::Application.server
18
- set :server, Proc.new {
19
- if ENV.include?("PHP_FCGI_CHILDREN")
20
- break "fastcgi" # Must NOT be the correct class name!
21
- elsif ENV.include?("REQUEST_METHOD")
22
- break "cgi" # Must NOT be the correct class name!
23
- else
24
- # Fall back on whatever it was going to be.
25
- server
26
- end
27
- }
28
- end
29
-
30
- # I could wrap the Repo/Calendar/Atomize in a small class that would memoize
31
- # ical data and atom output. Maybe even do an HTTP head for fast detection of
32
- # change? Does a calendar have updated information? Can we memoize atom when
33
- # ics doesn't change?
34
-
35
- module Vpim
36
- module Agent
37
- module App
38
- def self.atomize(caluri, feeduri)
39
- repo = Vpim::Repo::Uri.new(caluri)
40
- cal = repo.find{true}
41
- cal = View.week(cal)
42
- feed = Agent::Atomize.calendar(cal, feeduri, caluri, cal.name)
43
- return feed.to_xml, Agent::Atomize::MIME
44
- end
45
- end
46
- end
47
- end
48
-
49
- get '/ics' do
50
- from = env['QUERY_STRING']
51
-
52
- url = URI.parse(request.url)
53
- url.query = nil
54
- url_base = url.to_s
55
- url_atom = nil
56
-
57
- @url_ics = from # ics from here
58
- @url_atom = nil
59
-
60
- if not from.empty?
61
- # Error out if we can't atomize the feed
62
- Vpim::Agent::App.atomize(from, "http://example.com")
63
-
64
- url = URI.parse(request.url)
65
- url.path << "/atom"
66
- url_atom = url.to_s
67
- end
68
-
69
- @url_base = url_base # clean input form
70
- @url_atom = url_atom # atomized ics from here
71
-
72
- haml :"ics.haml"
73
- end
74
-
75
- post '/ics' do
76
- from = params[:url]
77
- url = URI.parse(request.url)
78
- url.query = from
79
- redirect url.to_s
80
- end
81
-
82
- # When we support other forms..
83
- #get '/ics/:form' do
84
- # form = params[:form]
85
- get '/ics/atom' do
86
- from = env['QUERY_STRING']
87
- port = env["SERVER_PORT"].to_i
88
- here = request.url
89
-
90
- if from.empty?
91
- url = URI.parse(here)
92
- url.path.sub(/atom$/, "")
93
- redirect here.to_s
94
- end
95
-
96
- xml, xmltype = Vpim::Agent::App.atomize(from, here)
97
-
98
- content_type xmltype
99
- body xml
100
- end
101
-
102
- get '/ics/style.css' do
103
- content_type 'text/css'
104
- sass :"ics.sass"
105
- end
106
-
107
- error do
108
- @url_error = CGI.escapeHTML(env['sinatra.error'].inspect)
109
- haml :"ics.haml"
110
- end
111
-
112
- use_in_file_templates!
113
-
114
- # FIXME - hard-coded :action paths below, bad!
115
-
116
- __END__
117
- @@ics.sass
118
- body
119
- :background-color gray
120
- :font-size medium
121
- a
122
- :color black
123
- :font-style italic
124
- a:hover
125
- :color darkred
126
-
127
- #header
128
- :border-bottom 3px solid darkred
129
- #title
130
- :color black
131
- :font-size large
132
-
133
- .text
134
- :width 80%
135
- -#:color yellow
136
-
137
- #submit
138
- :margin-top 30px
139
- :margin-left 5%
140
- #form
141
- :padding
142
- :top 10px
143
- :bottom 10px
144
- :left 10px
145
- :right 10px
146
- :text-align left
147
- #url
148
- :width 80%
149
- #button
150
- :font-weight bold
151
- :text-align center
152
-
153
- #subscribe
154
- :margin-left 5%
155
- -#.feed
156
- -# :margin-left 10%
157
-
158
- #footer
159
- :border-top 3px solid darkred
160
- :margin-top 20px
161
- @@ics.haml
162
- %html
163
- %head
164
- %title Subscribe to calendar feeds as atom feeds
165
- %link{:href => '/ics/style.css', :media => 'screen', :type => 'text/css'}
166
- %body
167
- #header
168
- %span#title Subscribe to calendar feeds as atom feeds
169
- #submit
170
- .text Calendar feeds are great, but sometimes all you want is an atom feed of what's coming up in the next week.
171
- .text Paste the URL of the calendar below, submit it, and subscribe.
172
- %form#form{:method => 'POST', :action => '/ics'}
173
- %input#url{:name => 'url', :value => params[:url]}
174
- %input#button{:type => 'submit', :value => 'Submit'}
175
- - if @url_atom
176
- #subscribe
177
- .text
178
- Subscribe to
179
- %a{:href => @url_ics}= @url_ics
180
- as:
181
- %ul.feed
182
- %a{:href => @url_atom}= @url_atom
183
- (atom feed)
184
- - if @url_error
185
- #error.text
186
- #preamble Sorry, trying to access:
187
- #source= @url_ics
188
- #transition resulted in:
189
- #destination= @url_error
190
- #footer
191
- .text
192
- :textile
193
- Coming from the "Octet Cloud":http://octetcloud.com/ using "vPim":http://vpim.rubyforge.org/, piloted by cloud monkey "Sam Roberts":mailto:vieuxtech@gmail.com
194
-