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.
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: []