ical2gcal 0.2.3 → 0.3.0
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/Gemfile +2 -1
- data/README.rdoc +10 -10
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/ical2gcal.gemspec +16 -11
- data/lib/google.rb +81 -0
- data/lib/ical2gcal.rb +13 -11
- metadata +67 -41
- data/lib/google_calendar.rb +0 -110
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -5,28 +5,28 @@ sync ics(es) to google calendar
|
|
5
5
|
== Benefits
|
6
6
|
|
7
7
|
* Solve the PROBLEM that Android's calendar program cannot reference webcal !
|
8
|
-
* Complete sync calendar from .ics to google calendar ( also deleting )
|
8
|
+
* Complete sync calendar from .ics to google calendar ( also deleting events )
|
9
9
|
|
10
10
|
== Requirements
|
11
11
|
|
12
12
|
* PC :-)
|
13
13
|
* Ruby ( tested with CRuby 1.8.7 )
|
14
|
-
*
|
15
|
-
*
|
16
|
-
*
|
17
|
-
*
|
14
|
+
* ri_cal http://ri-cal.rubyforge.org/
|
15
|
+
* gcalapi http://gcalapi.rubyforge.org/
|
16
|
+
* simple-rss http://simple-rss.rubyforge.org/
|
17
|
+
* pit http://coderepos.org/share/browser/lang/ruby/pit
|
18
18
|
|
19
19
|
== How to use
|
20
20
|
|
21
|
-
1. Install Ruby
|
22
|
-
2.
|
21
|
+
1. Install Ruby
|
22
|
+
2. `gem install ical2gcal`
|
23
23
|
3. Setup Your Google account info using Pit
|
24
24
|
4. Prepare calendar that you like to import to
|
25
|
-
5.
|
25
|
+
5. type `ical2gcal --help`
|
26
26
|
|
27
27
|
== How to config pit
|
28
28
|
|
29
|
-
1. SET ENVIRONMENT VARIABLE
|
29
|
+
1. SET ENVIRONMENT VARIABLE *EDITOR*
|
30
30
|
2. type
|
31
31
|
|
32
32
|
pit set google
|
@@ -35,7 +35,7 @@ ex)
|
|
35
35
|
|
36
36
|
username: `google account'
|
37
37
|
password: PASSWORD
|
38
|
-
calendar:
|
38
|
+
calendar: ( optional below )
|
39
39
|
name: `calendar name above'
|
40
40
|
|
41
41
|
== Contributing to ical2gcal
|
data/Rakefile
CHANGED
@@ -26,7 +26,8 @@ Jeweler::Tasks.new do |gem|
|
|
26
26
|
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
27
27
|
|
28
28
|
gem.add_runtime_dependency 'ri_cal'
|
29
|
-
gem.add_runtime_dependency '
|
29
|
+
gem.add_runtime_dependency 'gcalapi'
|
30
|
+
gem.add_runtime_dependency 'simple-rss'
|
30
31
|
gem.add_runtime_dependency 'pit'
|
31
32
|
|
32
33
|
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/ical2gcal.gemspec
CHANGED
@@ -5,12 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ical2gcal}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["wtnabe"]
|
12
|
-
s.date = %q{2011-04-
|
13
|
-
s.default_executable = %q{ical2gcal}
|
12
|
+
s.date = %q{2011-04-30}
|
14
13
|
s.description = %q{You can sync local and remote ics file(s) to google calendar}
|
15
14
|
s.email = %q{wtnabe@gmail.com}
|
16
15
|
s.executables = ["ical2gcal"]
|
@@ -28,7 +27,7 @@ Gem::Specification.new do |s|
|
|
28
27
|
"VERSION",
|
29
28
|
"bin/ical2gcal",
|
30
29
|
"ical2gcal.gemspec",
|
31
|
-
"lib/
|
30
|
+
"lib/google.rb",
|
32
31
|
"lib/ical2gcal.rb",
|
33
32
|
"lib/ics.rb",
|
34
33
|
"lib/ics/events.rb",
|
@@ -42,7 +41,7 @@ Gem::Specification.new do |s|
|
|
42
41
|
s.homepage = %q{http://github.com/wtnabe/ical2gcal}
|
43
42
|
s.licenses = ["two-clause BSD"]
|
44
43
|
s.require_paths = ["lib"]
|
45
|
-
s.rubygems_version = %q{1.
|
44
|
+
s.rubygems_version = %q{1.7.2}
|
46
45
|
s.summary = %q{sync ics(es) to google calendar}
|
47
46
|
s.test_files = [
|
48
47
|
"spec/ics/events_spec.rb",
|
@@ -55,37 +54,43 @@ Gem::Specification.new do |s|
|
|
55
54
|
|
56
55
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
56
|
s.add_runtime_dependency(%q<ri_cal>, [">= 0"])
|
58
|
-
s.add_runtime_dependency(%q<
|
57
|
+
s.add_runtime_dependency(%q<gcalapi>, [">= 0"])
|
58
|
+
s.add_runtime_dependency(%q<simple-rss>, [">= 0"])
|
59
59
|
s.add_runtime_dependency(%q<pit>, [">= 0"])
|
60
60
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
61
61
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
62
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
63
63
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
64
64
|
s.add_runtime_dependency(%q<ri_cal>, [">= 0"])
|
65
|
-
s.add_runtime_dependency(%q<
|
65
|
+
s.add_runtime_dependency(%q<gcalapi>, [">= 0"])
|
66
|
+
s.add_runtime_dependency(%q<simple-rss>, [">= 0"])
|
66
67
|
s.add_runtime_dependency(%q<pit>, [">= 0"])
|
67
68
|
else
|
68
69
|
s.add_dependency(%q<ri_cal>, [">= 0"])
|
69
|
-
s.add_dependency(%q<
|
70
|
+
s.add_dependency(%q<gcalapi>, [">= 0"])
|
71
|
+
s.add_dependency(%q<simple-rss>, [">= 0"])
|
70
72
|
s.add_dependency(%q<pit>, [">= 0"])
|
71
73
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
72
74
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
73
75
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
74
76
|
s.add_dependency(%q<rcov>, [">= 0"])
|
75
77
|
s.add_dependency(%q<ri_cal>, [">= 0"])
|
76
|
-
s.add_dependency(%q<
|
78
|
+
s.add_dependency(%q<gcalapi>, [">= 0"])
|
79
|
+
s.add_dependency(%q<simple-rss>, [">= 0"])
|
77
80
|
s.add_dependency(%q<pit>, [">= 0"])
|
78
81
|
end
|
79
82
|
else
|
80
83
|
s.add_dependency(%q<ri_cal>, [">= 0"])
|
81
|
-
s.add_dependency(%q<
|
84
|
+
s.add_dependency(%q<gcalapi>, [">= 0"])
|
85
|
+
s.add_dependency(%q<simple-rss>, [">= 0"])
|
82
86
|
s.add_dependency(%q<pit>, [">= 0"])
|
83
87
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
84
88
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
85
89
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
86
90
|
s.add_dependency(%q<rcov>, [">= 0"])
|
87
91
|
s.add_dependency(%q<ri_cal>, [">= 0"])
|
88
|
-
s.add_dependency(%q<
|
92
|
+
s.add_dependency(%q<gcalapi>, [">= 0"])
|
93
|
+
s.add_dependency(%q<simple-rss>, [">= 0"])
|
89
94
|
s.add_dependency(%q<pit>, [">= 0"])
|
90
95
|
end
|
91
96
|
end
|
data/lib/google.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# -*- mode: ruby; coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'gcalapi'
|
4
|
+
require 'simple-rss'
|
5
|
+
|
6
|
+
module Ical2gcal
|
7
|
+
class Google
|
8
|
+
|
9
|
+
def initialize( opts )
|
10
|
+
@service = nil
|
11
|
+
@opts = {
|
12
|
+
'username' => nil,
|
13
|
+
'password' => nil,
|
14
|
+
'calendar' => nil
|
15
|
+
}.merge( opts )
|
16
|
+
@calendar = nil
|
17
|
+
@events = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# [return] GoogleCalendar::Service
|
22
|
+
#
|
23
|
+
def service
|
24
|
+
if ( !@service and @opts )
|
25
|
+
@service = GoogleCalendar::Service.new( @opts['username'],
|
26
|
+
@opts['password'] )
|
27
|
+
end
|
28
|
+
|
29
|
+
@service
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# [return] Array
|
34
|
+
#
|
35
|
+
def calendars
|
36
|
+
SimpleRSS.parse( service.calendars.body ).entries
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# [return] GoogleCalendar::Calendar
|
41
|
+
#
|
42
|
+
def calendar
|
43
|
+
if ( !@calendar )
|
44
|
+
cal = calendars.find { |c|
|
45
|
+
c.title == calendar_name
|
46
|
+
}
|
47
|
+
@calendar = GoogleCalendar::Calendar.new( @service, cal[:link] )
|
48
|
+
end
|
49
|
+
|
50
|
+
@calendar
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# [return] String
|
55
|
+
#
|
56
|
+
def calendar_name
|
57
|
+
@opts['calendar']['name']
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_event( event )
|
61
|
+
e = calendar.create_event
|
62
|
+
e.title = event.summary
|
63
|
+
e.desc = event.description
|
64
|
+
e.where = event.location
|
65
|
+
e.st = Time.parse(event.start_time.to_s.sub(/\+.*/, ''))
|
66
|
+
e.allday = e.st.hour == 0 and e.st.min == 0 and not event.respond_to? :end_time
|
67
|
+
e.en = if event.respond_to? :end_time
|
68
|
+
Time.parse(event.end_time.to_s.sub(/\+.*/, ''))
|
69
|
+
else
|
70
|
+
Time.parse(event.start_time.to_s.sub(/\+.*/, ''))
|
71
|
+
end
|
72
|
+
e.save!
|
73
|
+
end
|
74
|
+
|
75
|
+
def remove_all_events
|
76
|
+
calendar.events.each { |e|
|
77
|
+
e.destroy!
|
78
|
+
}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/ical2gcal.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rubygems' unless defined? ::Gem
|
2
2
|
require File.dirname( __FILE__ ) + '/ics'
|
3
|
-
require File.dirname( __FILE__ ) + '/
|
3
|
+
require File.dirname( __FILE__ ) + '/google'
|
4
4
|
|
5
5
|
require 'optparse'
|
6
6
|
require 'pit'
|
@@ -19,19 +19,18 @@ module Ical2gcal
|
|
19
19
|
|
20
20
|
opts = ::Pit.get('google')
|
21
21
|
opts.merge!( {'calendar' => {'name' => @target}} ) if @target
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
g.create_event( e )
|
28
|
-
}
|
22
|
+
g = Ical2gcal::Google.new( opts )
|
23
|
+
g.remove_all_events
|
24
|
+
calendars.each { |c|
|
25
|
+
Ical2gcal::Ics::Events.new( c ).each { |e|
|
26
|
+
g.create_event( e )
|
29
27
|
}
|
30
|
-
|
31
|
-
puts "Your `google' command is not authorized. Please type `google calendar list' and get auth."
|
32
|
-
end
|
28
|
+
}
|
33
29
|
end
|
34
30
|
|
31
|
+
#
|
32
|
+
# [return] Array
|
33
|
+
#
|
35
34
|
def calendars
|
36
35
|
if ( @ics )
|
37
36
|
@calendars = @ics
|
@@ -44,6 +43,9 @@ module Ical2gcal
|
|
44
43
|
@calendars
|
45
44
|
end
|
46
45
|
|
46
|
+
#
|
47
|
+
# [return] OptionParser
|
48
|
+
#
|
47
49
|
def opts
|
48
50
|
OptionParser.new do |opt|
|
49
51
|
opt.on( '-c', '--calendar-name NAME' ) { |c|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ical2gcal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 2
|
9
8
|
- 3
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- wtnabe
|
@@ -15,13 +15,10 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
19
|
-
default_executable: ical2gcal
|
18
|
+
date: 2011-04-30 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
-
type: :runtime
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
22
|
none: false
|
26
23
|
requirements:
|
27
24
|
- - ">="
|
@@ -31,11 +28,11 @@ dependencies:
|
|
31
28
|
- 0
|
32
29
|
version: "0"
|
33
30
|
name: ri_cal
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
31
|
prerelease: false
|
37
32
|
type: :runtime
|
38
|
-
requirement:
|
33
|
+
requirement: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
39
36
|
none: false
|
40
37
|
requirements:
|
41
38
|
- - ">="
|
@@ -44,12 +41,26 @@ dependencies:
|
|
44
41
|
segments:
|
45
42
|
- 0
|
46
43
|
version: "0"
|
47
|
-
name:
|
48
|
-
|
44
|
+
name: gcalapi
|
45
|
+
prerelease: false
|
46
|
+
type: :runtime
|
47
|
+
requirement: *id002
|
49
48
|
- !ruby/object:Gem::Dependency
|
49
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
hash: 3
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
name: simple-rss
|
50
59
|
prerelease: false
|
51
60
|
type: :runtime
|
52
|
-
requirement:
|
61
|
+
requirement: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
53
64
|
none: false
|
54
65
|
requirements:
|
55
66
|
- - ">="
|
@@ -59,11 +70,11 @@ dependencies:
|
|
59
70
|
- 0
|
60
71
|
version: "0"
|
61
72
|
name: pit
|
62
|
-
version_requirements: *id003
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
73
|
prerelease: false
|
65
|
-
type: :
|
66
|
-
requirement:
|
74
|
+
type: :runtime
|
75
|
+
requirement: *id004
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
67
78
|
none: false
|
68
79
|
requirements:
|
69
80
|
- - ~>
|
@@ -75,11 +86,11 @@ dependencies:
|
|
75
86
|
- 0
|
76
87
|
version: 2.3.0
|
77
88
|
name: rspec
|
78
|
-
version_requirements: *id004
|
79
|
-
- !ruby/object:Gem::Dependency
|
80
89
|
prerelease: false
|
81
90
|
type: :development
|
82
|
-
requirement:
|
91
|
+
requirement: *id005
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ~>
|
@@ -91,11 +102,11 @@ dependencies:
|
|
91
102
|
- 0
|
92
103
|
version: 1.0.0
|
93
104
|
name: bundler
|
94
|
-
version_requirements: *id005
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
105
|
prerelease: false
|
97
106
|
type: :development
|
98
|
-
requirement:
|
107
|
+
requirement: *id006
|
108
|
+
- !ruby/object:Gem::Dependency
|
109
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
99
110
|
none: false
|
100
111
|
requirements:
|
101
112
|
- - ~>
|
@@ -107,11 +118,11 @@ dependencies:
|
|
107
118
|
- 2
|
108
119
|
version: 1.5.2
|
109
120
|
name: jeweler
|
110
|
-
version_requirements: *id006
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
121
|
prerelease: false
|
113
122
|
type: :development
|
114
|
-
requirement:
|
123
|
+
requirement: *id007
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
115
126
|
none: false
|
116
127
|
requirements:
|
117
128
|
- - ">="
|
@@ -121,11 +132,11 @@ dependencies:
|
|
121
132
|
- 0
|
122
133
|
version: "0"
|
123
134
|
name: rcov
|
124
|
-
version_requirements: *id007
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
135
|
prerelease: false
|
127
|
-
type: :
|
128
|
-
requirement:
|
136
|
+
type: :development
|
137
|
+
requirement: *id008
|
138
|
+
- !ruby/object:Gem::Dependency
|
139
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
129
140
|
none: false
|
130
141
|
requirements:
|
131
142
|
- - ">="
|
@@ -135,11 +146,11 @@ dependencies:
|
|
135
146
|
- 0
|
136
147
|
version: "0"
|
137
148
|
name: ri_cal
|
138
|
-
version_requirements: *id008
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
149
|
prerelease: false
|
141
150
|
type: :runtime
|
142
|
-
requirement:
|
151
|
+
requirement: *id009
|
152
|
+
- !ruby/object:Gem::Dependency
|
153
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
143
154
|
none: false
|
144
155
|
requirements:
|
145
156
|
- - ">="
|
@@ -148,12 +159,26 @@ dependencies:
|
|
148
159
|
segments:
|
149
160
|
- 0
|
150
161
|
version: "0"
|
151
|
-
name:
|
152
|
-
|
162
|
+
name: gcalapi
|
163
|
+
prerelease: false
|
164
|
+
type: :runtime
|
165
|
+
requirement: *id010
|
153
166
|
- !ruby/object:Gem::Dependency
|
167
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
168
|
+
none: false
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
hash: 3
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
version: "0"
|
176
|
+
name: simple-rss
|
154
177
|
prerelease: false
|
155
178
|
type: :runtime
|
156
|
-
requirement:
|
179
|
+
requirement: *id011
|
180
|
+
- !ruby/object:Gem::Dependency
|
181
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
157
182
|
none: false
|
158
183
|
requirements:
|
159
184
|
- - ">="
|
@@ -163,7 +188,9 @@ dependencies:
|
|
163
188
|
- 0
|
164
189
|
version: "0"
|
165
190
|
name: pit
|
166
|
-
|
191
|
+
prerelease: false
|
192
|
+
type: :runtime
|
193
|
+
requirement: *id012
|
167
194
|
description: You can sync local and remote ics file(s) to google calendar
|
168
195
|
email: wtnabe@gmail.com
|
169
196
|
executables:
|
@@ -183,7 +210,7 @@ files:
|
|
183
210
|
- VERSION
|
184
211
|
- bin/ical2gcal
|
185
212
|
- ical2gcal.gemspec
|
186
|
-
- lib/
|
213
|
+
- lib/google.rb
|
187
214
|
- lib/ical2gcal.rb
|
188
215
|
- lib/ics.rb
|
189
216
|
- lib/ics/events.rb
|
@@ -193,7 +220,6 @@ files:
|
|
193
220
|
- spec/spec_helper.rb
|
194
221
|
- spec/support/ics_list.txt
|
195
222
|
- spec/support/japanese_holidays.ics
|
196
|
-
has_rdoc: true
|
197
223
|
homepage: http://github.com/wtnabe/ical2gcal
|
198
224
|
licenses:
|
199
225
|
- two-clause BSD
|
@@ -223,7 +249,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
249
|
requirements: []
|
224
250
|
|
225
251
|
rubyforge_project:
|
226
|
-
rubygems_version: 1.
|
252
|
+
rubygems_version: 1.7.2
|
227
253
|
signing_key:
|
228
254
|
specification_version: 3
|
229
255
|
summary: sync ics(es) to google calendar
|
data/lib/google_calendar.rb
DELETED
@@ -1,110 +0,0 @@
|
|
1
|
-
# -*- mode: ruby; coding: utf-8 -*-
|
2
|
-
|
3
|
-
require 'pty'
|
4
|
-
require 'expect'
|
5
|
-
require 'gcal4ruby'
|
6
|
-
|
7
|
-
module Ical2gcal
|
8
|
-
class GoogleCalendar
|
9
|
-
include GCal4Ruby
|
10
|
-
|
11
|
-
class GoogleclNotAuthenticated < StandardError; end
|
12
|
-
|
13
|
-
def initialize( opts )
|
14
|
-
@service = nil
|
15
|
-
@opts = {
|
16
|
-
'username' => nil,
|
17
|
-
'password' => nil,
|
18
|
-
'calendar' => nil
|
19
|
-
}.merge( opts )
|
20
|
-
@calendar = nil
|
21
|
-
@events = nil
|
22
|
-
end
|
23
|
-
|
24
|
-
def service
|
25
|
-
if ( !@service and @opts )
|
26
|
-
@service = Service.new
|
27
|
-
@service.authenticate( @opts['username'], @opts['password'] )
|
28
|
-
end
|
29
|
-
|
30
|
-
@service
|
31
|
-
end
|
32
|
-
|
33
|
-
def calendar
|
34
|
-
if ( !@calendar )
|
35
|
-
@calendar = Calendar.find( service, :title => calendar_name ).first
|
36
|
-
end
|
37
|
-
|
38
|
-
@calendar
|
39
|
-
end
|
40
|
-
|
41
|
-
def calendar_name
|
42
|
-
@opts['calendar']['name']
|
43
|
-
end
|
44
|
-
|
45
|
-
def create_event( event )
|
46
|
-
begin
|
47
|
-
e = Event.new( service )
|
48
|
-
e.calendar = calendar
|
49
|
-
e.title = event.summary
|
50
|
-
e.start_time = Time.parse(event.start_time.to_s.sub(/\+.*/, ''))
|
51
|
-
e.all_day = e.start_time.hour == 0 and e.start_time.min == 0 and not event.respond_to? :end_time
|
52
|
-
e.end_time = if event.respond_to? :end_time
|
53
|
-
Time.parse(event.end_time.to_s.sub(/\+.*/, ''))
|
54
|
-
else
|
55
|
-
Time.parse(event.start_time.to_s.sub(/\+.*/, ''))
|
56
|
-
end
|
57
|
-
e.save
|
58
|
-
rescue
|
59
|
-
;
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def remove_all_events
|
64
|
-
if ( events.size )
|
65
|
-
PTY.spawn( "google calendar delete --cal '#{calendar_name}' --title '.*'" ) { |r, w|
|
66
|
-
w.sync = true
|
67
|
-
|
68
|
-
events.each { |e|
|
69
|
-
r.expect( /Are you SURE.*\?.*\(y\/N\)/iu, 5 ) {
|
70
|
-
w.puts 'y'
|
71
|
-
}
|
72
|
-
}
|
73
|
-
}
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def events
|
78
|
-
if ( !@events )
|
79
|
-
@events = []
|
80
|
-
list_below = false
|
81
|
-
|
82
|
-
`google calendar list --cal '#{calendar_name}' --title '.*'`.lines.each { |line|
|
83
|
-
if ( line.chomp == "[#{calendar_name}]" )
|
84
|
-
list_below = true
|
85
|
-
next
|
86
|
-
end
|
87
|
-
if ( list_below )
|
88
|
-
@events << line.chomp
|
89
|
-
end
|
90
|
-
}
|
91
|
-
end
|
92
|
-
|
93
|
-
@events
|
94
|
-
end
|
95
|
-
|
96
|
-
def self.authenticated?
|
97
|
-
begin
|
98
|
-
PTY.spawn( 'google calendar list' ) { |r, w|
|
99
|
-
r.expect( /(?:user|pass)/, 3 ) { |s|
|
100
|
-
raise GoogleclNotAuthenticated if ( s and s[0] =~ /(?:user|pass)/ )
|
101
|
-
}
|
102
|
-
}
|
103
|
-
rescue GoogleclNotAuthenticated
|
104
|
-
false
|
105
|
-
else
|
106
|
-
true
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|