gcalgen 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f89666dd0a13e2411cfb70bb1379da58e8b85b59
4
+ data.tar.gz: dc9ce2aef77ba32d6f840dceed03c8569d057727
5
+ SHA512:
6
+ metadata.gz: c6e0e8fdae6f59c680c9c7ec80a2c70cb26b30f229f070d85ae30d673004b78a2c595cb852f216603398c29bdf74f813601c87e9bc4324290c0edef93de9aa64
7
+ data.tar.gz: e0096c754b9b6abfef32dc4862fd960af1243ccb6cab8d6a13b53f6e9e9c6e144cf8c2bf237050097d59be8a831acfa821bf3df356ead12be95fd67e47c75f23
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+
4
+ gem 'active_support'
5
+ gem 'gcalapi'
6
+ gem 'cal-jp-holiday'
7
+
8
+ gem 'pry'
9
+
10
+ # Specify your gem's dependencies in gcalgen.gemspec
11
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 いざわゆきみつ (Yukimitsu Izawa)
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # Gcalgen
2
+
3
+ Google calendar event generator
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem install gcalgen
10
+
11
+ and create ~/.gcalgenrc
12
+
13
+ ## Usage
14
+
15
+ % gcalgen eventfile1 [eventfile2....]
16
+
17
+ ## Contributing
18
+
19
+ 1. Fork it
20
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
21
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
22
+ 4. Push to the branch (`git push origin my-new-feature`)
23
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/gcalgen ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'gcalgen'
4
+ include Gcalgen
5
+
6
+ if ARGV.size < 1
7
+ print "Google Calendar event generator - version #{VERSION}\n"
8
+ print "Usage:\n gcalgen datafile1 [datafile2 ....]\n"
9
+ exit 1
10
+ end
11
+
12
+ #
13
+ # load ~/.gcalgenrc
14
+ #
15
+ $myConfig = { }
16
+ load File.expand_path('~/.gcalgenrc')
17
+
18
+ #
19
+ # execute calendar
20
+ #
21
+ ARGV.each { |datafile|
22
+ load datafile
23
+ }
data/gcalgen.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gcalgen/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "gcalgen"
8
+ spec.version = Gcalgen::VERSION
9
+ spec.authors = ["Yukimitsu Izawa"]
10
+ spec.email = ["izawa@izawa.org"]
11
+ spec.description = %q{Google Calendar event generator}
12
+ spec.summary = %q{Google Calendar event generator}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,25 @@
1
+
2
+ class GcalConfig
3
+ attr_accessor :cal_name, :cal_feed, :cal_user, :cal_password
4
+
5
+ def initialize(name)
6
+ @cal_name = name
7
+ end
8
+
9
+ ####
10
+ ## DSL functions
11
+ ####
12
+
13
+ def feed(feed)
14
+ @cal_feed = feed
15
+ end
16
+
17
+ def user(user)
18
+ @cal_user = user
19
+ end
20
+
21
+ def password(password)
22
+ @cal_password = password
23
+ end
24
+
25
+ end
@@ -0,0 +1,276 @@
1
+ require 'gcalapi'
2
+ require 'active_support/time'
3
+ require 'calendar/japanese/holiday'
4
+
5
+ require 'pry'
6
+
7
+ class Event
8
+ attr_accessor :title, :start_time, :end_time, :desc, :main_method, :sub_method, :date, :location, :range_begins, :range_ends, :allday, :every
9
+ attr_accessor :cal_name
10
+
11
+ def initialize(title)
12
+ @title = title
13
+ end
14
+
15
+ ####
16
+ ## DSL functions
17
+ ####
18
+
19
+ def on(date)
20
+ @date=DateTime.parse(date)
21
+ @date = @date.change(:offset => DateTime.now.zone)
22
+ end
23
+
24
+ def starts(start_time)
25
+ @start_time = start_time
26
+ end
27
+
28
+ def ends(end_time)
29
+ @end_time = end_time
30
+ end
31
+
32
+ def at(location)
33
+ @location = location
34
+ end
35
+
36
+ def desc(desc)
37
+ @desc = desc
38
+ end
39
+
40
+ def all_day
41
+ @allday = true
42
+ end
43
+
44
+ def every(method, &block)
45
+ @every = Every.new(method)
46
+ @every.instance_eval &block if block_given?
47
+ end
48
+
49
+ def range_begins(date)
50
+ @range_begins = DateTime.parse(date)
51
+ @range_begins = @range_begins.change(:offset => DateTime.now.zone)
52
+ end
53
+
54
+ def range_ends(date)
55
+ @range_ends = DateTime.parse(date)
56
+ @range_ends = @range_ends.change(:offset => DateTime.now.zone)
57
+ end
58
+
59
+ def calendar(cal_name)
60
+ @cal_name = cal_name
61
+ end
62
+
63
+
64
+ ####
65
+ ## internal methods
66
+ ####
67
+
68
+ def _check_holiday(date)
69
+ d = date.to_date.extend Calendar::Japanese::Holiday
70
+ d.holiday?
71
+ end
72
+
73
+ def _get_first(date, business_day)
74
+ first = date.beginning_of_month
75
+ if business_day
76
+ while _check_holiday(first)
77
+ first += 1.day
78
+ end
79
+ end
80
+ first
81
+ end
82
+
83
+ def _get_last(date, business_day)
84
+ last = date.end_of_month
85
+ if business_day
86
+ while _check_holiday(last)
87
+ last -= 1.day
88
+ end
89
+ end
90
+ last
91
+ end
92
+
93
+ def _generate_st_en(today)
94
+ allday = true if @allday
95
+ if @start_time =~/(\d\d):(\d\d)/
96
+ st = today.to_time
97
+ st += $1.to_i.hours
98
+ st += $2.to_i.minutes
99
+ if @end_time =~/(\d\d):(\d\d)/
100
+ en = today.to_time
101
+ en+= $1.to_i.hours
102
+ en+= $2.to_i.minutes
103
+ else
104
+ en = st + 1.hour
105
+ end
106
+ else
107
+ st = today.in_time_zone
108
+ en = today.in_time_zone
109
+ allday = true
110
+ end
111
+ return {:st => st, :en => en, :allday => allday}
112
+ end
113
+
114
+ def _generate_weekly
115
+ ret = []
116
+
117
+ if @range_begins
118
+ today = @range_begins
119
+ else
120
+ today = Date.today
121
+ today = today.change(:offset => DateTime.now.zone)
122
+ end
123
+ if @range_ends
124
+ limit = @range_ends
125
+ else
126
+ limit = today + 3.month
127
+ limit = limit.change(:offset => DateTime.now.zone)
128
+ end
129
+
130
+ @every.weekday = today.strftime('%A') unless @every.weekday
131
+
132
+ # search matched wday forward
133
+ while today.strftime('%A') !~ /#{@every.weekday}/i
134
+ today += 1.day
135
+ end
136
+ # generate array of st,en
137
+ while today < limit
138
+ if _check_holiday(today)
139
+ if @every.business
140
+ if @every.shift
141
+ while _check_holiday(today)
142
+ today += 1.day
143
+ end
144
+ else
145
+ today += 7.days
146
+ next
147
+ end
148
+ end
149
+ end
150
+ ret << _generate_st_en(today)
151
+ today = today.next_week
152
+ end
153
+ ret
154
+ end
155
+
156
+ def _generate_monthly
157
+ ret = []
158
+
159
+ if @range_begins
160
+ today = @range_begins
161
+ else
162
+ today = Date.today
163
+ today = today.change(:offset => DateTime.now.zone)
164
+ end
165
+
166
+ if @range_ends
167
+ limit = @range_ends
168
+ else
169
+ limit = today + 6.month
170
+ limit = limit.change(:offset => DateTime.now.zone)
171
+ end
172
+
173
+ # generate array of st/en
174
+ while today < limit
175
+ if @every.first_flg
176
+ today = _get_first(today, @every.business_day)
177
+ elsif @every.last_flg
178
+ today = _get_last(today, @every.business_day)
179
+ end
180
+ today = today.beginning_of_day
181
+
182
+ ## st time/ en time
183
+ ##
184
+ ret << _generate_st_en(today)
185
+ today = today.next_month.beginning_of_month
186
+ end
187
+ ret
188
+ end
189
+
190
+ def _generate_annualy
191
+ ret = []
192
+
193
+ today = @date
194
+ if @range_begins
195
+ while @range_begins > today
196
+ today = today.next_year
197
+ end
198
+ end
199
+ if @range_ends
200
+ limit = @range_ends
201
+ else
202
+ limit = today + 5.years
203
+ limit = limit.change(:offset => DateTime.now.zone)
204
+ end
205
+
206
+ # generate array of st/en
207
+ while today < limit
208
+ ## st time/ en time
209
+ ##
210
+ ret << _generate_st_en(today)
211
+ today = today.next_year
212
+ end
213
+ ret
214
+ end
215
+
216
+ def _generate_oneshot
217
+ ret = []
218
+ if @start_time
219
+ today = @date.beginning_of_day
220
+ today = DateTime.parse(@date.strftime("%Y/%m/%d ") + @start_time + DateTime.now.zone)
221
+ st = today
222
+ if @end_time
223
+ today = @date.beginning_of_day
224
+ today = DateTime.parse(@date.strftime("%Y/%m/%d ") + @end_time + DateTime.now.zone)
225
+ en=today
226
+ else
227
+ en = st + 1.hour
228
+ end
229
+ else
230
+ st = @date.beginning_of_day
231
+ en= @date.beginning_of_day
232
+ allday = true
233
+ end
234
+ ret << {:st => st, :en => en, :allday => allday}
235
+ end
236
+
237
+ def generate_gcalevent
238
+ ret = []
239
+
240
+ if @cal_name
241
+ user = $myConfig[@cal_name].cal_user
242
+ password = $myConfig[@cal_name].cal_password
243
+ feed = $myConfig[@cal_name].cal_feed
244
+ else
245
+ user = $myConfig['default'].cal_user
246
+ password = $myConfig['default'].cal_password
247
+ feed = $myConfig['default'].cal_feed
248
+ end
249
+
250
+ cal = GoogleCalendar::Calendar.new(GoogleCalendar::Service.new(user, password), feed)
251
+
252
+ if @every
253
+ if @every.method =~ /week/i
254
+ st_en = _generate_weekly
255
+ elsif @every.method =~ /month/i
256
+ st_en = _generate_monthly
257
+ elsif @every.method =~ /year/i
258
+ st_en = _generate_annualy
259
+ end
260
+ else # one shot event
261
+ st_en = _generate_oneshot
262
+ end
263
+
264
+ st_en.each {|val|
265
+ event = cal.create_event
266
+ event.title = @title
267
+ event.desc = @desc
268
+ event.where = @location
269
+ event.allday = val[:allday]
270
+ event.st = val[:st]
271
+ event.en = val[:en]
272
+ ret << event
273
+ }
274
+ ret
275
+ end
276
+ end
@@ -0,0 +1,26 @@
1
+ class Every
2
+ attr_accessor :method, :weekday, :mmdd, :first_flg, :last_flg, :shift, :business
3
+ def initialize(method)
4
+ @method = method
5
+ end
6
+
7
+ def wday(weekday)
8
+ @weekday = weekday
9
+ end
10
+
11
+ def first
12
+ @first_flg = true
13
+ end
14
+
15
+ def last
16
+ @last_flg = true
17
+ end
18
+
19
+ def shift_enable
20
+ @shift = true
21
+ end
22
+
23
+ def business_day
24
+ @business = true
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ module Gcalgen
2
+ VERSION = "0.0.1"
3
+ end
data/lib/gcalgen.rb ADDED
@@ -0,0 +1,20 @@
1
+ require "gcalgen/version"
2
+ require 'gcalgen/config'
3
+ require 'gcalgen/event'
4
+ require 'gcalgen/every'
5
+
6
+ module Gcalgen
7
+ def def_calendar(name, &block)
8
+ c = GcalConfig.new(name)
9
+ c.instance_eval &block
10
+ $myConfig[name] = c
11
+ end
12
+
13
+ def event(title, &block)
14
+ c = Event.new(title)
15
+ c.instance_eval &block
16
+ c.generate_gcalevent.each { |event|
17
+ event.save!
18
+ }
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gcalgen
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Yukimitsu Izawa
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Google Calendar event generator
42
+ email:
43
+ - izawa@izawa.org
44
+ executables:
45
+ - gcalgen
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - .gitignore
50
+ - Gemfile
51
+ - LICENSE.txt
52
+ - README.md
53
+ - Rakefile
54
+ - bin/gcalgen
55
+ - gcalgen.gemspec
56
+ - lib/gcalgen.rb
57
+ - lib/gcalgen/config.rb
58
+ - lib/gcalgen/event.rb
59
+ - lib/gcalgen/every.rb
60
+ - lib/gcalgen/version.rb
61
+ homepage: ''
62
+ licenses:
63
+ - MIT
64
+ metadata: {}
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubyforge_project:
81
+ rubygems_version: 2.0.6
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: Google Calendar event generator
85
+ test_files: []