googlecalendar 0.0.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/CHANGELOG +16 -0
- data/README +14 -0
- data/lib/builders.rb +95 -0
- data/lib/googlecalendar.rb +161 -0
- metadata +41 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
= Versions
|
2
|
+
|
3
|
+
=== 0.0.2 (June 16th, 2006)
|
4
|
+
* Refactor googlecalendar to a single rb file
|
5
|
+
* Add Rakefile
|
6
|
+
* Add Gem, Zip, Tar packaging
|
7
|
+
* Add RDoc
|
8
|
+
|
9
|
+
=== 0.0.1 (Mai 11th, 2006)
|
10
|
+
* Started project
|
11
|
+
|
12
|
+
= About Versioning
|
13
|
+
* Version number: major.minor.build
|
14
|
+
* Compatible release (increment the build number)
|
15
|
+
* Backward compatible, new feature release (increment minor number)
|
16
|
+
* Backward incompatible release (increment the major number)
|
data/README
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
== Google Calendar
|
2
|
+
The Google Calendar project provides
|
3
|
+
* Export features (text file, simple html page or excel files),
|
4
|
+
* Ruby api's to connect to google calendars
|
5
|
+
* A plugin for Ruby On Rails.
|
6
|
+
|
7
|
+
== License
|
8
|
+
GoogleCalendar for Ruby is released under the Apache license.
|
9
|
+
|
10
|
+
== Support
|
11
|
+
http://rubyforge.org/projects/googlecalendar/
|
12
|
+
|
13
|
+
== Author
|
14
|
+
Benjamin Francisoud - http://rubyscube.blogspot.com
|
data/lib/builders.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/googlecalendar'
|
2
|
+
|
3
|
+
class TextBuilder
|
4
|
+
attr_accessor :calendar, :filename
|
5
|
+
|
6
|
+
def export
|
7
|
+
begin
|
8
|
+
File.delete(@filename)
|
9
|
+
rescue
|
10
|
+
# if doesn't exist
|
11
|
+
end
|
12
|
+
File.open(@filename, File::CREAT|File::RDWR) do |file|
|
13
|
+
file << calendar.to_s
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def text(calendar, filename)
|
19
|
+
text_builder = TextBuilder.new
|
20
|
+
text_builder.calendar = calendar
|
21
|
+
text_builder.filename = filename
|
22
|
+
text_builder.export
|
23
|
+
end
|
24
|
+
|
25
|
+
class HtmlBuilder
|
26
|
+
attr_accessor :calendar, :filename, :date_format
|
27
|
+
|
28
|
+
def export
|
29
|
+
begin
|
30
|
+
File.delete(@filename)
|
31
|
+
rescue
|
32
|
+
# if doesn't exist
|
33
|
+
end
|
34
|
+
File.open(@filename, File::CREAT|File::RDWR) do |file|
|
35
|
+
file << "<html><head>\n"
|
36
|
+
file << "<title>Calendar</tilte>\n"
|
37
|
+
IO.foreach("html/styles.css") { |line| file << line }
|
38
|
+
file << "\n"
|
39
|
+
IO.foreach("html/scripts.js") { |line| file << line }
|
40
|
+
file << "\n</head>\n<body>"
|
41
|
+
file << summary
|
42
|
+
event_number = 0
|
43
|
+
@calendar.events.each do |event|
|
44
|
+
file << "<p class=\"event\">"
|
45
|
+
file << "<h2>Event [" + event.start_date.to_s + "]</h2>"
|
46
|
+
file << "<div><b>From: </b>" + event.start_date.to_s + "<b> -> To:</b> " + event.end_date.to_s + "</div>"
|
47
|
+
file << div(event, 'summary')
|
48
|
+
file << details(event, event_number)
|
49
|
+
file << "</p>\n"
|
50
|
+
event_number += 1
|
51
|
+
end
|
52
|
+
file << "</body></html>"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def format(date)
|
57
|
+
Date.strptime(date, @date_format)
|
58
|
+
end
|
59
|
+
|
60
|
+
def summary
|
61
|
+
data = "<p class=\"calendar\">"
|
62
|
+
data << "<h1>Calendar</h1>"
|
63
|
+
data << div(@calendar, 'version')
|
64
|
+
data << div(@calendar, 'scale')
|
65
|
+
data << div(@calendar, 'method')
|
66
|
+
data << "<div><b>number of events: </b>" + @calendar.events.size.to_s + "</div>"
|
67
|
+
data << "</p>\n"
|
68
|
+
return data
|
69
|
+
end
|
70
|
+
|
71
|
+
def details(event, number)
|
72
|
+
details = "<a href=\"javascript:displayHideSection('details" + number.to_s + "');\">Display details</a>"
|
73
|
+
details << "<div id=\"details" + number.to_s + "\" class=\"details\">"
|
74
|
+
details << div(event, 'start_date')
|
75
|
+
details << div(event, 'end_date')
|
76
|
+
details << div(event, 'time_stamp')
|
77
|
+
details << div(event, 'created')
|
78
|
+
details << div(event, 'last_modified')
|
79
|
+
details << div(event, 'status')
|
80
|
+
details << div(event, 'class_name')
|
81
|
+
details << "</div>"
|
82
|
+
end
|
83
|
+
|
84
|
+
def div(object, field)
|
85
|
+
"<div><b>" + field.capitalize + ": </b>" + object.send(field).to_s + "</div>\n"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def html(calendar, filename)
|
90
|
+
html_builder = HtmlBuilder.new
|
91
|
+
html_builder.calendar = calendar
|
92
|
+
html_builder.filename = filename
|
93
|
+
html_builder.date_format = "%d-%m-%y" #"%F"#"%A %B %d %Y" #"%d-%m-%Y"
|
94
|
+
html_builder.export
|
95
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
class Calendar
|
5
|
+
attr_accessor :product_id, :version, :scale, :method, :events
|
6
|
+
|
7
|
+
def add(event)
|
8
|
+
# create events if it doesn't exist
|
9
|
+
@events ||= []
|
10
|
+
@events.push event
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
data = "########## calendar ##########\n"
|
15
|
+
data << 'version: ' + @version.to_s + "\n"
|
16
|
+
data << 'scale: ' + @scale.to_s + "\n"
|
17
|
+
data << 'method: ' + @method.to_s + "\n"
|
18
|
+
data << 'number of events: ' + @events.size.to_s + "\n"
|
19
|
+
@events.each do |event|
|
20
|
+
data << event.to_s
|
21
|
+
end
|
22
|
+
return data
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Event
|
27
|
+
attr_accessor :start_date, :end_date, :time_stamp, :class_name, :created, :last_modified, :status, :summary
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
data = "---------- event ----------\n"
|
31
|
+
data << 'start_date: ' + @start_date.to_s + "\n"
|
32
|
+
data << 'end_date: ' + @end_date.to_s + "\n"
|
33
|
+
data << 'time_stamp: ' + @time_stamp.to_s + "\n"
|
34
|
+
data << 'class_name: ' + @class_name.to_s + "\n"
|
35
|
+
data << 'created: ' + @created.to_s + "\n"
|
36
|
+
data << 'last_modified: ' + @last_modified.to_s + "\n"
|
37
|
+
data << 'status: ' + @status.to_s + "\n"
|
38
|
+
data << 'summary: ' + @summary.to_s + "\n"
|
39
|
+
return data
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class ICALParser
|
44
|
+
attr_reader :calendar
|
45
|
+
|
46
|
+
def parse(data)
|
47
|
+
lines = data.split("\n")
|
48
|
+
|
49
|
+
reset_prefix
|
50
|
+
lines.each do |line|
|
51
|
+
handle_element(line)
|
52
|
+
end
|
53
|
+
|
54
|
+
return @calendar
|
55
|
+
end
|
56
|
+
|
57
|
+
def handle_element(line)
|
58
|
+
pair = line.split(':')
|
59
|
+
name = pair[0]
|
60
|
+
value = pair[1]
|
61
|
+
handler_method = @method_prefix + name.split(';')[0].tr('-', '_').downcase
|
62
|
+
if self.respond_to? handler_method
|
63
|
+
self.send(handler_method, value.chomp)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def reset_prefix
|
68
|
+
@method_prefix = "handle_"
|
69
|
+
end
|
70
|
+
|
71
|
+
def handle_begin(value)
|
72
|
+
if value == "VCALENDAR"
|
73
|
+
handle_vcalendar_begin(value)
|
74
|
+
elsif value == "VEVENT"
|
75
|
+
handle_vevent_begin(value)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def handle_vcalendar_end(value)
|
80
|
+
reset_prefix
|
81
|
+
end
|
82
|
+
|
83
|
+
def handle_vcalendar_begin(value)
|
84
|
+
@calendar = Calendar.new
|
85
|
+
@method_prefix = @method_prefix + value.downcase + "_"
|
86
|
+
end
|
87
|
+
|
88
|
+
def handle_vcalendar_version(value)
|
89
|
+
@calendar.version = value
|
90
|
+
end
|
91
|
+
|
92
|
+
def handle_vcalendar_calscale(value)
|
93
|
+
@calendar.scale = value
|
94
|
+
end
|
95
|
+
|
96
|
+
def handle_vcalendar_method(value)
|
97
|
+
@calendar.method = value
|
98
|
+
# FIXME don't like to do this!
|
99
|
+
reset_prefix
|
100
|
+
end
|
101
|
+
|
102
|
+
def handle_vevent_begin(value)
|
103
|
+
event = Event.new
|
104
|
+
@calendar.add event
|
105
|
+
@method_prefix = @method_prefix + value.downcase + "_"
|
106
|
+
end
|
107
|
+
|
108
|
+
def handle_vevent_end(value)
|
109
|
+
reset_prefix
|
110
|
+
end
|
111
|
+
|
112
|
+
def handle_vevent_dtstart(value)
|
113
|
+
@calendar.events.last.start_date = Date.parse(value)
|
114
|
+
end
|
115
|
+
|
116
|
+
def handle_vevent_dtend(value)
|
117
|
+
@calendar.events.last.end_date = Date.parse(value)
|
118
|
+
end
|
119
|
+
|
120
|
+
def handle_vevent_dtstamp(value)
|
121
|
+
@calendar.events.last.time_stamp = DateTime.parse(value)
|
122
|
+
end
|
123
|
+
|
124
|
+
def handle_vevent_class(value)
|
125
|
+
@calendar.events.last.class_name = value
|
126
|
+
end
|
127
|
+
|
128
|
+
def handle_vevent_created(value)
|
129
|
+
@calendar.events.last.created = DateTime.parse(value)
|
130
|
+
end
|
131
|
+
|
132
|
+
def handle_vevent_last_modified(value)
|
133
|
+
@calendar.events.last.last_modified = DateTime.parse(value)
|
134
|
+
end
|
135
|
+
|
136
|
+
def handle_vevent_status(value)
|
137
|
+
@calendar.events.last.status = value
|
138
|
+
end
|
139
|
+
|
140
|
+
def handle_vevent_summary(value)
|
141
|
+
@calendar.events.last.summary = value
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def parse(data)
|
146
|
+
parser = ICALParser.new
|
147
|
+
parser.parse(data)
|
148
|
+
end
|
149
|
+
|
150
|
+
def scan(ical_url)
|
151
|
+
Net::HTTP.start('www.google.com', 80) do |http|
|
152
|
+
response, data = http.get(ical_url)
|
153
|
+
case response
|
154
|
+
when Net::HTTPSuccess, Net::HTTPRedirection
|
155
|
+
return data
|
156
|
+
else
|
157
|
+
response.error!
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
metadata
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.10
|
3
|
+
specification_version: 1
|
4
|
+
name: googlecalendar
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2006-06-20
|
8
|
+
summary: Google Calendar api for Ruby
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email:
|
12
|
+
homepage:
|
13
|
+
rubyforge_project: googlecalendar
|
14
|
+
description: "The Google Calendar project provides: Export features (text file, simple html
|
15
|
+
page or excel files), Ruby api's to connect to google calendars, A plugin for
|
16
|
+
Ruby On Rails."
|
17
|
+
autorequire: googlecalendar
|
18
|
+
default_executable:
|
19
|
+
bindir: bin
|
20
|
+
has_rdoc: true
|
21
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
22
|
+
requirements:
|
23
|
+
-
|
24
|
+
- ">"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.0
|
27
|
+
version:
|
28
|
+
platform: ruby
|
29
|
+
authors: []
|
30
|
+
files:
|
31
|
+
- README
|
32
|
+
- CHANGELOG
|
33
|
+
- lib/builders.rb
|
34
|
+
- lib/googlecalendar.rb
|
35
|
+
test_files: []
|
36
|
+
rdoc_options: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
executables: []
|
39
|
+
extensions: []
|
40
|
+
requirements: []
|
41
|
+
dependencies: []
|