googlecalendar 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/CHANGELOG +16 -0
  2. data/README +14 -0
  3. data/lib/builders.rb +95 -0
  4. data/lib/googlecalendar.rb +161 -0
  5. 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> -&gt; 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: []