polyrex-calendar 0.3.11 → 0.5.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +1 -2
- data/lib/polyrex-calendar.rb +30 -399
- data/lib/polyrex-calendar.rb~ +30 -400
- data.tar.gz.sig +0 -0
- metadata +5 -86
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bce4882cc2ad150e9fb2edd2d6a786896b5ebeb9
|
4
|
+
data.tar.gz: 3451f7a0e86515f3186875b6c3026f42cd94fcbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6f54c2840a6833dc3720cb8c331558b3baca82250606969ea3bea904a2773281ea8463318c184c4192a873b2ac29e50263c9fd535a7bc277e0fff7beb630a8a
|
7
|
+
data.tar.gz: 45b084ec740fdd9163163e22aff6a32ed13a0b83f6ec7fc7d05b9f2316eb69c7120bef21fabe59ec9e0cabf2f3cccdeb405ad8532ad61c75b986685e2d6a2bc4
|
checksums.yaml.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
������E;r�CAEE���/�ΧI� �Jf���A�$Ԕ����0�Ζ��*��r�e�M���ˮ{��p�r>h�r&���p��������r'����T���e5k�����ɂ����r��J7�%�/��+��yHj�n��W�W�/�io_�@E8�`ݜ��'ɷ�4m�ݑ��T�_��U�QwB��,����I$��#�)+�������E
|
1
|
+
F�Ȭ2泚8���wb$�9r�_%HX��O��)��@ii=�IɊ�疓 @������k�P�.G�~q[�pgM�n~��X:����o� E�e�x� VH����r��j��̱Ak���P�����W��U�����{+�0J��L��\��oqS#�h��]�B��:��J;��\mbe#x�t�������-+�����G�!�[`�=#� (U��~��1�5�wGQ������^I�A7AlĈw!,l
|
data/lib/polyrex-calendar.rb
CHANGED
@@ -2,230 +2,65 @@
|
|
2
2
|
|
3
3
|
# file: polyrex-calendar.rb
|
4
4
|
|
5
|
-
require '
|
6
|
-
require 'date'
|
7
|
-
require 'nokogiri'
|
8
|
-
require 'chronic_duration'
|
9
|
-
require 'chronic_cron'
|
10
|
-
require 'rxfhelper'
|
5
|
+
require 'px-calendarbase'
|
11
6
|
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
h = {
|
17
|
-
calendar: 'calendar[year]',
|
18
|
-
month: 'month[n, title]',
|
19
|
-
week: 'week[n, mon, no, label]',
|
20
|
-
day: 'day[sdate, xday, event, bankholiday, title, sunrise, sunset]',
|
21
|
-
entry: 'entry[time_start, time_end, duration, title]'
|
22
|
-
}
|
23
|
-
visual_schema = h.values.join '/'
|
24
|
-
PolyrexObjects.new(visual_schema)
|
25
|
-
|
26
|
-
module LIBRARY
|
27
|
-
|
28
|
-
def fetch_file(filename)
|
29
|
-
|
30
|
-
lib = File.dirname(__FILE__)
|
31
|
-
File.read filename
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def generate_webpage(xml, xsl)
|
36
|
-
|
37
|
-
# transform the xml to html
|
38
|
-
doc = Nokogiri::XML(xml)
|
39
|
-
xslt = Nokogiri::XSLT(xsl)
|
40
|
-
xslt.transform(doc).to_s
|
41
|
-
end
|
42
|
-
|
43
|
-
def read(s)
|
44
|
-
RXFHelper.read(s).first
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class Polyrex
|
49
|
-
include LIBRARY
|
50
|
-
|
51
|
-
attr_accessor :xslt, :css_layout, :css_style, :filename
|
52
|
-
|
53
|
-
def inspect()
|
54
|
-
"#<Polyrex:%s" % __id__
|
55
|
-
end
|
56
|
-
|
57
|
-
def to_webpage()
|
58
|
-
|
59
|
-
year_xsl = self.xslt ? read(self.xslt) : fetch_file(self.xslt)
|
60
|
-
year_layout_css = fetch_file self.css_layout
|
61
|
-
year_css = fetch_file self.css_style
|
62
|
-
File.open('self.xml','w'){|f| f.write (self.to_xml pretty: true)}
|
63
|
-
File.open(self.xslt,'w'){|f| f.write year_xsl }
|
64
|
-
#html = Rexslt.new(month_xsl, self.to_xml).to_xml
|
65
|
-
|
66
|
-
html = generate_webpage self.to_xml, year_xsl
|
67
|
-
{self.filename => html,
|
68
|
-
self.css_layout => year_layout_css, self.css_style => year_css}
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
class PolyrexObjects::Month
|
74
|
-
include LIBRARY
|
75
|
-
|
76
|
-
attr_accessor :xslt, :css_layout, :css_style
|
77
|
-
|
78
|
-
def inspect()
|
79
|
-
"#<PolyrexObjects::Month:%s" % __id__
|
80
|
-
end
|
81
|
-
|
82
|
-
def to_webpage()
|
83
|
-
|
84
|
-
month_xsl = fetch_file self.xslt
|
85
|
-
month_layout_css = fetch_file self.css_layout
|
86
|
-
month_css = fetch_file self.css_style
|
87
|
-
|
88
|
-
# add a css selector for the current day
|
89
|
-
date = Time.now.strftime("%Y-%b-%d")
|
90
|
-
|
91
|
-
e = self.element("records/week/records/day/summary[sdate='#{date}']")
|
92
|
-
e.attributes[:class] = 'selected' if e
|
93
|
-
|
94
|
-
File.write 'self.xml', self.to_xml(pretty: true)
|
95
|
-
File.write 'month.xsl', month_xsl
|
96
|
-
|
97
|
-
|
98
|
-
html = generate_webpage self.to_xml, month_xsl
|
99
|
-
{self.title.downcase[0..2] + '_calendar.html' => html,
|
100
|
-
self.css_layout => month_layout_css, self.css_style => month_css}
|
101
|
-
end
|
8
|
+
class PolyrexObjects
|
102
9
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
class PolyrexObjects::Week
|
109
|
-
include LIBRARY
|
110
|
-
|
111
|
-
def inspect()
|
112
|
-
"#<PolyrexObjects::Week:%s" % __id__
|
10
|
+
class Month
|
11
|
+
|
12
|
+
def wk(n)
|
13
|
+
self.records[n-1]
|
14
|
+
end
|
113
15
|
end
|
114
|
-
|
115
|
-
def to_webpage()
|
116
|
-
|
117
|
-
week_xsl = fetch_file 'week_calendar.xsl'
|
118
|
-
week_layout_css = fetch_file 'week_layout.css'
|
119
|
-
week_css = fetch_file 'week.css'
|
120
16
|
|
121
|
-
|
122
|
-
|
17
|
+
class Week
|
18
|
+
|
19
|
+
def to_webpage()
|
123
20
|
|
124
|
-
|
125
|
-
|
21
|
+
week_xsl = fetch_file 'week_calendar.xsl'
|
22
|
+
week_layout_css = fetch_file 'week_layout.css'
|
23
|
+
week_css = fetch_file 'week.css'
|
126
24
|
|
127
|
-
|
128
|
-
|
25
|
+
File.write 'self.xml', self.to_xml(pretty: true)
|
26
|
+
File.write 'week.xsl', week_xsl
|
27
|
+
#html = Rexslt.new(week_xsl, self.to_xml).to_xml
|
28
|
+
#html = xsltproc 'week_calendar.xsl', self.to_xml
|
129
29
|
|
30
|
+
# add a css selector for the current day
|
31
|
+
date = Time.now.strftime("%Y-%b-%d")
|
130
32
|
|
131
|
-
|
132
|
-
|
133
|
-
'week.css' => week_css}
|
134
|
-
end
|
135
|
-
end
|
33
|
+
e = self.element("records/day/summary[sdate='#{date}']")
|
34
|
+
e.attributes[:class] = 'selected' if e
|
136
35
|
|
137
|
-
class PolyrexObjects::Day
|
138
36
|
|
139
|
-
|
140
|
-
|
37
|
+
html = generate_webpage self.to_xml, week_xsl
|
38
|
+
{'week' + self.no + '_planner.html' => html, 'week_layout.css' => week_layout_css, \
|
39
|
+
'week.css' => week_css}
|
40
|
+
end
|
141
41
|
end
|
142
42
|
|
143
|
-
def wday()
|
144
|
-
self.date.wday
|
145
|
-
end
|
146
43
|
|
147
|
-
def day()
|
148
|
-
self.date.day
|
149
|
-
end
|
150
44
|
end
|
151
45
|
|
152
|
-
class PolyrexCalendar
|
153
|
-
include LIBRARY
|
154
|
-
|
155
|
-
attr_accessor :xsl, :css, :polyrex, :month_xsl, :month_css
|
156
|
-
attr_reader :day
|
46
|
+
class PolyrexCalendar < PolyrexCalendarBase
|
157
47
|
|
158
48
|
def initialize(calendar_file=nil, options={})
|
159
49
|
|
160
|
-
|
161
|
-
@year = opts[:year]
|
162
|
-
|
163
|
-
h = {
|
164
|
-
calendar: 'calendar[year]',
|
165
|
-
month: 'month[n, title]',
|
166
|
-
week: 'week[n]',
|
167
|
-
day: 'day[sdate, xday, event, bankholiday, title, sunrise, sunset]',
|
168
|
-
entry: 'entry[time_start, time_end, duration, title]'
|
169
|
-
}
|
170
|
-
@schema = %i(calendar month day entry).map{|x| h[x]}.join '/'
|
171
|
-
@visual_schema = h.values.join '/'
|
172
|
-
|
173
|
-
|
174
|
-
if calendar_file then
|
175
|
-
@polyrex = Polyrex.new calendar_file
|
176
|
-
@id = @polyrex.id_counter
|
177
|
-
|
178
|
-
else
|
179
|
-
@id = '1'
|
180
|
-
# generate the calendar
|
181
|
-
|
182
|
-
a = (Date.parse(@year + '-01-01')...Date.parse(@year.succ + '-01-01')).to_a
|
183
|
-
|
184
|
-
@polyrex = Polyrex.new(@schema, id_counter: @id)
|
185
|
-
@polyrex.summary.year = @year
|
186
|
-
|
187
|
-
a.group_by(&:month).each do |month, days|
|
188
|
-
|
189
|
-
@polyrex.create.month no: month.to_s, title: Date::MONTHNAMES[month] do |create|
|
190
|
-
days.each do |x|
|
191
|
-
create.day sdate: x.strftime("%Y-%b-%d"), xday: x.day.to_s, title: Date::DAYNAMES[x.wday]
|
192
|
-
end
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
end
|
197
|
-
|
198
|
-
visual_schema = h.values.join '/'
|
199
|
-
PolyrexObjects.new(visual_schema)
|
50
|
+
super(calendar_file, options)
|
200
51
|
|
201
52
|
@xsl = fetch_file 'calendar.xsl'
|
202
53
|
@css = fetch_file 'layout.css'
|
203
54
|
|
204
55
|
end
|
205
56
|
|
206
|
-
def to_a()
|
207
|
-
@a
|
208
|
-
end
|
209
|
-
|
210
|
-
def to_xml()
|
211
|
-
@polyrex.to_xml pretty: true
|
212
|
-
end
|
213
|
-
|
214
|
-
def import_events(objx)
|
215
|
-
@id = @polyrex.id_counter
|
216
|
-
method('import_'.+(objx.class.to_s.downcase).to_sym).call(objx)
|
217
|
-
self
|
218
|
-
end
|
219
|
-
|
220
|
-
alias import! import_events
|
221
|
-
|
222
57
|
def inspect()
|
223
58
|
%Q(=> #<PolyrexCalendar:#{self.object_id} @id="#{@id}", @year="#{@year}">)
|
224
59
|
end
|
225
60
|
|
226
61
|
def kitchen_planner()
|
227
62
|
|
228
|
-
px = @
|
63
|
+
px = @calendar
|
229
64
|
|
230
65
|
# add a css selector for the current day
|
231
66
|
date = DateTime.now.strftime("%Y-%b-%d")
|
@@ -285,7 +120,6 @@ class PolyrexCalendar
|
|
285
120
|
|
286
121
|
r
|
287
122
|
|
288
|
-
|
289
123
|
end
|
290
124
|
|
291
125
|
pxmonth.xslt = 'monthday_calendar.xsl'
|
@@ -320,37 +154,11 @@ class PolyrexCalendar
|
|
320
154
|
end
|
321
155
|
|
322
156
|
end
|
323
|
-
def month_day()
|
324
|
-
end
|
325
|
-
|
326
|
-
def months
|
327
|
-
@polyrex.records
|
328
|
-
end
|
329
|
-
|
330
|
-
def parse_events(list)
|
331
157
|
|
332
|
-
polyrex = Polyrex.new('events/dayx[date, title]/entryx[start_time, end_time,' + \
|
333
|
-
' duration, title]')
|
334
|
-
|
335
|
-
polyrex.format_masks[1] = '([!start_time] \([!duration]\) [!title]|' + \
|
336
|
-
'[!start_time]-[!end_time] [!title]|' + \
|
337
|
-
'[!start_time] [!title])'
|
338
|
-
|
339
|
-
polyrex.parse(list)
|
340
|
-
|
341
|
-
self.import_events polyrex
|
342
|
-
# for testing only
|
343
|
-
#polyrex
|
344
|
-
end
|
345
|
-
|
346
|
-
def save(filename='polyrex.xml')
|
347
|
-
@polyrex.save filename
|
348
|
-
end
|
349
|
-
|
350
158
|
def this_week()
|
351
159
|
|
352
160
|
dt = DateTime.now
|
353
|
-
days = @
|
161
|
+
days = @calendar.month(dt.month).day
|
354
162
|
|
355
163
|
r = days.find {|day| day.date.cweek == dt.cweek }
|
356
164
|
pxweek = PolyrexObjects::Week.new
|
@@ -365,165 +173,13 @@ class PolyrexCalendar
|
|
365
173
|
def this_month()
|
366
174
|
self.month(DateTime.now.month)
|
367
175
|
end
|
368
|
-
|
369
|
-
def import_bankholidays(dynarex)
|
370
|
-
import_dynarex(dynarex, :bankholiday=)
|
371
|
-
end
|
372
|
-
|
373
|
-
def import_recurring_events(dynarex)
|
374
|
-
|
375
|
-
title = dynarex.summary[:event_title]
|
376
|
-
cc = ChronicCron.new dynarex.summary[:description].split(/,/,2).first
|
377
|
-
time_start= "%s:%02d" % cc.to_time.to_a.values_at(2,1)
|
378
|
-
|
379
|
-
dynarex.flat_records.each do |event|
|
380
|
-
|
381
|
-
dt = DateTime.parse(event[:date])
|
382
|
-
m, d = dt.month, dt.day
|
383
|
-
record = {title: title, time_start: time_start}
|
384
|
-
|
385
|
-
@polyrex.records[m-1].day[d-1].create.entry record
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
def import_sunrise_times(dynarex)
|
390
|
-
import_suntimes dynarex, :sunrise=
|
391
|
-
end
|
392
|
-
|
393
|
-
def import_sunset_times(dynarex)
|
394
|
-
import_suntimes dynarex, :sunset=
|
395
|
-
end
|
396
176
|
|
397
177
|
private
|
398
178
|
|
399
|
-
def import_suntimes(dynarex, event_type=:sunrise=)
|
400
|
-
|
401
|
-
dynarex.flat_records.each do |event|
|
402
|
-
|
403
|
-
dt = DateTime.parse(event[:date])
|
404
|
-
m, d = dt.month, dt.day
|
405
|
-
@polyrex.records[m-1].day[d-1].method(event_type).call event[:time]
|
406
|
-
end
|
407
|
-
end
|
408
|
-
|
409
|
-
def import_dynarex(dynarex, daytype=:event=)
|
410
|
-
|
411
|
-
dynarex.flat_records.each do |event|
|
412
|
-
|
413
|
-
dt = DateTime.parse(event[:date])
|
414
|
-
m, d = dt.month, dt.day
|
415
|
-
|
416
|
-
case daytype
|
417
|
-
when :event=
|
418
|
-
if dynarex.fields.include?(:time) then
|
419
|
-
|
420
|
-
match = event[:time].match(/(\S+)\s*(?:to|-)\s*(\S+)/)
|
421
|
-
|
422
|
-
if match then
|
423
|
-
|
424
|
-
start_time, end_time = match.captures
|
425
|
-
# add an event entry
|
426
|
-
title = [event[:title], dynarex.summary[:label],
|
427
|
-
event[:desc]].compact.join(': ')
|
428
|
-
record = {
|
429
|
-
title: title,
|
430
|
-
time_start: Time.parse(start_time).strftime("%H:%M%p"),
|
431
|
-
time_end: Time.parse(end_time).strftime("%H:%M%p")
|
432
|
-
}
|
433
|
-
|
434
|
-
@polyrex.records[m-1].day[d-1].create.entry record
|
435
|
-
else
|
436
|
-
|
437
|
-
dt = DateTime.parse(event[:date] + ' ' + event[:time])
|
438
|
-
# add the event
|
439
|
-
title = [event[:title], dynarex.summary[:label],
|
440
|
-
event[:desc]].compact.join(': ')
|
441
|
-
event_label = "%s at %s" % [title, dt.strftime("%H:%M%p")]
|
442
|
-
|
443
|
-
@polyrex.records[m-1].day[d-1].method(daytype).call event_label
|
444
|
-
end
|
445
|
-
|
446
|
-
else
|
447
|
-
|
448
|
-
event_label = "%s at %s" % [event[:title], dt.strftime("%H:%M%p")]
|
449
|
-
@polyrex.records[m-1].day[d-1].method(daytype).call event_label
|
450
|
-
end
|
451
|
-
|
452
|
-
else
|
453
|
-
|
454
|
-
event_label = "%s" % event[:title]
|
455
|
-
@polyrex.records[m-1].day[d-1].method(daytype).call event_label
|
456
|
-
end
|
457
|
-
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
|
-
def import_polyrex(polyrex)
|
462
|
-
|
463
|
-
polyrex.records.each do |day|
|
464
|
-
|
465
|
-
dt = day.date
|
466
|
-
|
467
|
-
sd = dt.strftime("%Y-%b-%d ")
|
468
|
-
m, i = dt.month, dt.day
|
469
|
-
cal_day = @polyrex.records[m - 1].day[i-1]
|
470
|
-
|
471
|
-
cal_day.event = day.title
|
472
|
-
|
473
|
-
if day.records.length > 0 then
|
474
|
-
|
475
|
-
raw_entries = day.records
|
476
|
-
|
477
|
-
entries = raw_entries.inject({}) do |r,entry|
|
478
|
-
|
479
|
-
start_time = entry.start_time
|
480
|
-
|
481
|
-
if entry.end_time.length > 0 then
|
482
|
-
|
483
|
-
end_time = entry.end_time
|
484
|
-
duration = ChronicDuration.output(Time.parse(sd + end_time) \
|
485
|
-
- Time.parse(sd + start_time))
|
486
|
-
else
|
487
|
-
|
488
|
-
if entry.duration.length > 0 then
|
489
|
-
duration = entry.duration
|
490
|
-
else
|
491
|
-
duration = '10 mins'
|
492
|
-
end
|
493
|
-
|
494
|
-
end_time = (Time.parse(sd + start_time) + ChronicDuration.parse(duration))\
|
495
|
-
.strftime("%H:%M")
|
496
|
-
end
|
497
|
-
|
498
|
-
r.merge!(start_time => {time_start: start_time, time_end: end_time, \
|
499
|
-
duration: duration, title: entry.title})
|
500
|
-
|
501
|
-
end
|
502
|
-
|
503
|
-
seconds = entries.keys.map{|x| Time.parse(x) - Time.parse('08:00')}
|
504
|
-
|
505
|
-
unless dt.saturday? or dt.sunday? then
|
506
|
-
rows = slotted_sort(seconds).map do |x|
|
507
|
-
(Time.parse('08:00') + x.to_i).strftime("%H:%M") if x
|
508
|
-
end
|
509
|
-
else
|
510
|
-
rows = entries.keys
|
511
|
-
end
|
512
|
-
|
513
|
-
rows.each do |row|
|
514
|
-
create = cal_day.create
|
515
|
-
create.id = @id
|
516
|
-
create.entry entries[row] || {}
|
517
|
-
end
|
518
|
-
|
519
|
-
end
|
520
|
-
end
|
521
|
-
|
522
|
-
end
|
523
179
|
|
524
180
|
def make_month(m)
|
525
181
|
|
526
|
-
cal_month = @
|
182
|
+
cal_month = @calendar.month(m)
|
527
183
|
days_in_month = cal_month.records
|
528
184
|
pxmonth = cal_month.clone
|
529
185
|
pxmonth.records.each(&:delete)
|
@@ -578,29 +234,4 @@ class PolyrexCalendar
|
|
578
234
|
'th' : %w{ th st nd rd th th th th th th }[val % 10]
|
579
235
|
end
|
580
236
|
|
581
|
-
def slotted_sort(a)
|
582
|
-
|
583
|
-
upper = 36000 # upper slot value
|
584
|
-
slot_width = 9000 # 2.5 hours
|
585
|
-
max_slots = 3
|
586
|
-
|
587
|
-
b = a.reverse.inject([]) do |r,x|
|
588
|
-
|
589
|
-
upper ||= 10; i ||= 0
|
590
|
-
diff = upper - x
|
591
|
-
|
592
|
-
if diff >= slot_width and (i + a.length) < max_slots then
|
593
|
-
r << nil
|
594
|
-
i += 1
|
595
|
-
upper -= slot_width
|
596
|
-
redo
|
597
|
-
else
|
598
|
-
upper -= slot_width if x <= upper
|
599
|
-
r << x
|
600
|
-
end
|
601
|
-
end
|
602
|
-
|
603
|
-
a = b.+([nil] * max_slots).take(max_slots).reverse
|
604
|
-
end
|
605
|
-
|
606
237
|
end
|
data/lib/polyrex-calendar.rb~
CHANGED
@@ -2,228 +2,65 @@
|
|
2
2
|
|
3
3
|
# file: polyrex-calendar.rb
|
4
4
|
|
5
|
-
require '
|
6
|
-
require 'date'
|
7
|
-
require 'nokogiri'
|
8
|
-
require 'chronic_duration'
|
9
|
-
require 'chronic_cron'
|
5
|
+
require 'px-calendarbase'
|
10
6
|
|
11
7
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
h = {
|
16
|
-
calendar: 'calendar[year]',
|
17
|
-
month: 'month[n, title]',
|
18
|
-
week: 'week[n, mon, no, label]',
|
19
|
-
day: 'day[sdate, xday, event, bankholiday, title, sunrise, sunset]',
|
20
|
-
entry: 'entry[time_start, time_end, duration, title]'
|
21
|
-
}
|
22
|
-
visual_schema = h.values.join '/'
|
23
|
-
PolyrexObjects.new(visual_schema)
|
24
|
-
|
25
|
-
module LIBRARY
|
26
|
-
|
27
|
-
def fetch_file(filename)
|
28
|
-
|
29
|
-
lib = File.dirname(__FILE__)
|
30
|
-
File.read File.join(lib, filename )
|
31
|
-
end
|
32
|
-
|
33
|
-
def generate_webpage(xml, xsl)
|
34
|
-
|
35
|
-
# transform the xml to html
|
36
|
-
doc = Nokogiri::XML(xml)
|
37
|
-
xslt = Nokogiri::XSLT(xsl)
|
38
|
-
xslt.transform(doc).to_s
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
class Polyrex
|
43
|
-
include LIBRARY
|
44
|
-
|
45
|
-
attr_accessor :xslt, :css_layout, :css_style, :filename
|
46
|
-
|
47
|
-
def inspect()
|
48
|
-
"#<Polyrex:%s" % __id__
|
49
|
-
end
|
50
|
-
|
51
|
-
def to_webpage()
|
52
|
-
|
53
|
-
year_xsl = fetch_file self.xslt
|
54
|
-
year_layout_css = fetch_file self.css_layout
|
55
|
-
year_css = fetch_file self.css_style
|
56
|
-
File.open('self.xml','w'){|f| f.write (self.to_xml pretty: true)}
|
57
|
-
File.open(self.xslt,'w'){|f| f.write year_xsl }
|
58
|
-
#html = Rexslt.new(month_xsl, self.to_xml).to_xml
|
59
|
-
|
60
|
-
html = generate_webpage self.to_xml, year_xsl
|
61
|
-
{self.filename => html,
|
62
|
-
self.css_layout => year_layout_css, self.css_style => year_css}
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
class PolyrexObjects::Month
|
68
|
-
include LIBRARY
|
69
|
-
|
70
|
-
attr_accessor :xslt, :css_layout, :css_style
|
71
|
-
|
72
|
-
def inspect()
|
73
|
-
"#<PolyrexObjects::Month:%s" % __id__
|
74
|
-
end
|
75
|
-
|
76
|
-
def to_webpage()
|
77
|
-
|
78
|
-
month_xsl = fetch_file self.xslt
|
79
|
-
month_layout_css = fetch_file self.css_layout
|
80
|
-
month_css = fetch_file self.css_style
|
81
|
-
|
82
|
-
#html = Rexslt.new(month_xsl, self.to_xml).to_xml
|
83
|
-
|
84
|
-
# add a css selector for the current day
|
85
|
-
date = Time.now.strftime("%Y-%b-%d")
|
86
|
-
|
87
|
-
e = self.element("records/week/records/day/summary[sdate='#{date}']")
|
88
|
-
e.attributes[:class] = 'selected' if e
|
89
|
-
|
90
|
-
File.write 'self.xml', self.to_xml(pretty: true)
|
91
|
-
File.write 'month.xsl', month_xsl
|
92
|
-
|
93
|
-
|
94
|
-
html = generate_webpage self.to_xml, month_xsl
|
95
|
-
{self.title.downcase[0..2] + '_calendar.html' => html,
|
96
|
-
self.css_layout => month_layout_css, self.css_style => month_css}
|
97
|
-
end
|
8
|
+
class PolyrexObjects
|
98
9
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
class PolyrexObjects::Week
|
105
|
-
include LIBRARY
|
106
|
-
|
107
|
-
def inspect()
|
108
|
-
"#<PolyrexObjects::Week:%s" % __id__
|
10
|
+
class Month
|
11
|
+
|
12
|
+
def wk(n)
|
13
|
+
self.records[n-1]
|
14
|
+
end
|
109
15
|
end
|
110
|
-
|
111
|
-
def to_webpage()
|
112
|
-
|
113
|
-
week_xsl = fetch_file 'week_calendar.xsl'
|
114
|
-
week_layout_css = fetch_file 'week_layout.css'
|
115
|
-
week_css = fetch_file 'week.css'
|
116
16
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
#html = xsltproc 'week_calendar.xsl', self.to_xml
|
17
|
+
class Week
|
18
|
+
|
19
|
+
def to_webpage()
|
121
20
|
|
122
|
-
|
123
|
-
|
21
|
+
week_xsl = fetch_file 'week_calendar.xsl'
|
22
|
+
week_layout_css = fetch_file 'week_layout.css'
|
23
|
+
week_css = fetch_file 'week.css'
|
124
24
|
|
125
|
-
|
126
|
-
|
25
|
+
File.write 'self.xml', self.to_xml(pretty: true)
|
26
|
+
File.write 'week.xsl', week_xsl
|
27
|
+
#html = Rexslt.new(week_xsl, self.to_xml).to_xml
|
28
|
+
#html = xsltproc 'week_calendar.xsl', self.to_xml
|
127
29
|
|
30
|
+
# add a css selector for the current day
|
31
|
+
date = Time.now.strftime("%Y-%b-%d")
|
128
32
|
|
129
|
-
|
130
|
-
|
131
|
-
'week.css' => week_css}
|
132
|
-
end
|
133
|
-
end
|
33
|
+
e = self.element("records/day/summary[sdate='#{date}']")
|
34
|
+
e.attributes[:class] = 'selected' if e
|
134
35
|
|
135
|
-
class PolyrexObjects::Day
|
136
36
|
|
137
|
-
|
138
|
-
|
37
|
+
html = generate_webpage self.to_xml, week_xsl
|
38
|
+
{'week' + self.no + '_planner.html' => html, 'week_layout.css' => week_layout_css, \
|
39
|
+
'week.css' => week_css}
|
40
|
+
end
|
139
41
|
end
|
140
42
|
|
141
|
-
def wday()
|
142
|
-
self.date.wday
|
143
|
-
end
|
144
43
|
|
145
|
-
def day()
|
146
|
-
self.date.day
|
147
|
-
end
|
148
44
|
end
|
149
45
|
|
150
|
-
class PolyrexCalendar
|
151
|
-
include LIBRARY
|
152
|
-
|
153
|
-
attr_accessor :xsl, :css, :polyrex, :month_xsl, :month_css
|
154
|
-
attr_reader :day
|
46
|
+
class PolyrexCalendar < PolyrexCalendarBase
|
155
47
|
|
156
48
|
def initialize(calendar_file=nil, options={})
|
157
49
|
|
158
|
-
|
159
|
-
@year = opts[:year]
|
160
|
-
|
161
|
-
h = {
|
162
|
-
calendar: 'calendar[year]',
|
163
|
-
month: 'month[n, title]',
|
164
|
-
week: 'week[n]',
|
165
|
-
day: 'day[sdate, xday, event, bankholiday, title, sunrise, sunset]',
|
166
|
-
entry: 'entry[time_start, time_end, duration, title]'
|
167
|
-
}
|
168
|
-
@schema = %i(calendar month day entry).map{|x| h[x]}.join '/'
|
169
|
-
@visual_schema = h.values.join '/'
|
170
|
-
|
171
|
-
|
172
|
-
if calendar_file then
|
173
|
-
@polyrex = Polyrex.new calendar_file
|
174
|
-
@id = @polyrex.id_counter
|
175
|
-
|
176
|
-
else
|
177
|
-
@id = '1'
|
178
|
-
# generate the calendar
|
179
|
-
|
180
|
-
a = (Date.parse(@year + '-01-01')...Date.parse(@year.succ + '-01-01')).to_a
|
181
|
-
|
182
|
-
@polyrex = Polyrex.new(@schema, id_counter: @id)
|
183
|
-
@polyrex.summary.year = @year
|
184
|
-
|
185
|
-
a.group_by(&:month).each do |month, days|
|
186
|
-
|
187
|
-
@polyrex.create.month no: month.to_s, title: Date::MONTHNAMES[month] do |create|
|
188
|
-
days.each do |x|
|
189
|
-
create.day sdate: x.strftime("%Y-%b-%d"), xday: x.day.to_s, title: Date::DAYNAMES[x.wday]
|
190
|
-
end
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
end
|
195
|
-
|
196
|
-
visual_schema = h.values.join '/'
|
197
|
-
PolyrexObjects.new(visual_schema)
|
50
|
+
super(calendar_file, options)
|
198
51
|
|
199
52
|
@xsl = fetch_file 'calendar.xsl'
|
200
53
|
@css = fetch_file 'layout.css'
|
201
54
|
|
202
55
|
end
|
203
56
|
|
204
|
-
def to_a()
|
205
|
-
@a
|
206
|
-
end
|
207
|
-
|
208
|
-
def to_xml()
|
209
|
-
@polyrex.to_xml pretty: true
|
210
|
-
end
|
211
|
-
|
212
|
-
def import_events(objx)
|
213
|
-
@id = @polyrex.id_counter
|
214
|
-
method('import_'.+(objx.class.to_s.downcase).to_sym).call(objx)
|
215
|
-
self
|
216
|
-
end
|
217
|
-
|
218
|
-
alias import! import_events
|
219
|
-
|
220
57
|
def inspect()
|
221
58
|
%Q(=> #<PolyrexCalendar:#{self.object_id} @id="#{@id}", @year="#{@year}">)
|
222
59
|
end
|
223
60
|
|
224
61
|
def kitchen_planner()
|
225
62
|
|
226
|
-
px = @
|
63
|
+
px = @calendar
|
227
64
|
|
228
65
|
# add a css selector for the current day
|
229
66
|
date = DateTime.now.strftime("%Y-%b-%d")
|
@@ -252,8 +89,6 @@ class PolyrexCalendar
|
|
252
89
|
+ "summary[sdate='#{date}']")
|
253
90
|
e.attributes[:class] = 'selected' if e
|
254
91
|
|
255
|
-
|
256
|
-
px.xslt = 'calendar.xsl'
|
257
92
|
px.css_layout = 'layout.css'
|
258
93
|
px.css_style = 'year.css'
|
259
94
|
px.filename = px.summary.year.to_s + '-planner.html'
|
@@ -285,7 +120,6 @@ class PolyrexCalendar
|
|
285
120
|
|
286
121
|
r
|
287
122
|
|
288
|
-
|
289
123
|
end
|
290
124
|
|
291
125
|
pxmonth.xslt = 'monthday_calendar.xsl'
|
@@ -320,37 +154,11 @@ class PolyrexCalendar
|
|
320
154
|
end
|
321
155
|
|
322
156
|
end
|
323
|
-
def month_day()
|
324
|
-
end
|
325
|
-
|
326
|
-
def months
|
327
|
-
@polyrex.records
|
328
|
-
end
|
329
|
-
|
330
|
-
def parse_events(list)
|
331
157
|
|
332
|
-
polyrex = Polyrex.new('events/dayx[date, title]/entryx[start_time, end_time,' + \
|
333
|
-
' duration, title]')
|
334
|
-
|
335
|
-
polyrex.format_masks[1] = '([!start_time] \([!duration]\) [!title]|' + \
|
336
|
-
'[!start_time]-[!end_time] [!title]|' + \
|
337
|
-
'[!start_time] [!title])'
|
338
|
-
|
339
|
-
polyrex.parse(list)
|
340
|
-
|
341
|
-
self.import_events polyrex
|
342
|
-
# for testing only
|
343
|
-
#polyrex
|
344
|
-
end
|
345
|
-
|
346
|
-
def save(filename='polyrex.xml')
|
347
|
-
@polyrex.save filename
|
348
|
-
end
|
349
|
-
|
350
158
|
def this_week()
|
351
159
|
|
352
160
|
dt = DateTime.now
|
353
|
-
days = @
|
161
|
+
days = @calendar.month(dt.month).day
|
354
162
|
|
355
163
|
r = days.find {|day| day.date.cweek == dt.cweek }
|
356
164
|
pxweek = PolyrexObjects::Week.new
|
@@ -365,165 +173,13 @@ class PolyrexCalendar
|
|
365
173
|
def this_month()
|
366
174
|
self.month(DateTime.now.month)
|
367
175
|
end
|
368
|
-
|
369
|
-
def import_bankholidays(dynarex)
|
370
|
-
import_dynarex(dynarex, :bankholiday=)
|
371
|
-
end
|
372
|
-
|
373
|
-
def import_recurring_events(dynarex)
|
374
|
-
|
375
|
-
title = dynarex.summary[:event_title]
|
376
|
-
cc = ChronicCron.new dynarex.summary[:description].split(/,/,2).first
|
377
|
-
time_start= "%s:%02d" % cc.to_time.to_a.values_at(2,1)
|
378
|
-
|
379
|
-
dynarex.flat_records.each do |event|
|
380
|
-
|
381
|
-
dt = DateTime.parse(event[:date])
|
382
|
-
m, d = dt.month, dt.day
|
383
|
-
record = {title: title, time_start: time_start}
|
384
|
-
|
385
|
-
@polyrex.records[m-1].day[d-1].create.entry record
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
def import_sunrise_times(dynarex)
|
390
|
-
import_suntimes dynarex, :sunrise=
|
391
|
-
end
|
392
|
-
|
393
|
-
def import_sunset_times(dynarex)
|
394
|
-
import_suntimes dynarex, :sunset=
|
395
|
-
end
|
396
176
|
|
397
177
|
private
|
398
178
|
|
399
|
-
def import_suntimes(dynarex, event_type=:sunrise=)
|
400
|
-
|
401
|
-
dynarex.flat_records.each do |event|
|
402
|
-
|
403
|
-
dt = DateTime.parse(event[:date])
|
404
|
-
m, d = dt.month, dt.day
|
405
|
-
@polyrex.records[m-1].day[d-1].method(event_type).call event[:time]
|
406
|
-
end
|
407
|
-
end
|
408
|
-
|
409
|
-
def import_dynarex(dynarex, daytype=:event=)
|
410
|
-
|
411
|
-
dynarex.flat_records.each do |event|
|
412
|
-
|
413
|
-
dt = DateTime.parse(event[:date])
|
414
|
-
m, d = dt.month, dt.day
|
415
|
-
|
416
|
-
case daytype
|
417
|
-
when :event=
|
418
|
-
if dynarex.fields.include?(:time) then
|
419
|
-
|
420
|
-
match = event[:time].match(/(\S+)\s*(?:to|-)\s*(\S+)/)
|
421
|
-
|
422
|
-
if match then
|
423
|
-
|
424
|
-
start_time, end_time = match.captures
|
425
|
-
# add an event entry
|
426
|
-
title = [event[:title], dynarex.summary[:label],
|
427
|
-
event[:desc]].compact.join(': ')
|
428
|
-
record = {
|
429
|
-
title: title,
|
430
|
-
time_start: Time.parse(start_time).strftime("%H:%M%p"),
|
431
|
-
time_end: Time.parse(end_time).strftime("%H:%M%p")
|
432
|
-
}
|
433
|
-
|
434
|
-
@polyrex.records[m-1].day[d-1].create.entry record
|
435
|
-
else
|
436
|
-
|
437
|
-
dt = DateTime.parse(event[:date] + ' ' + event[:time])
|
438
|
-
# add the event
|
439
|
-
title = [event[:title], dynarex.summary[:label],
|
440
|
-
event[:desc]].compact.join(': ')
|
441
|
-
event_label = "%s at %s" % [title, dt.strftime("%H:%M%p")]
|
442
|
-
|
443
|
-
@polyrex.records[m-1].day[d-1].method(daytype).call event_label
|
444
|
-
end
|
445
|
-
|
446
|
-
else
|
447
|
-
|
448
|
-
event_label = "%s at %s" % [event[:title], dt.strftime("%H:%M%p")]
|
449
|
-
@polyrex.records[m-1].day[d-1].method(daytype).call event_label
|
450
|
-
end
|
451
|
-
|
452
|
-
else
|
453
|
-
|
454
|
-
event_label = "%s" % event[:title]
|
455
|
-
@polyrex.records[m-1].day[d-1].method(daytype).call event_label
|
456
|
-
end
|
457
|
-
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
|
-
def import_polyrex(polyrex)
|
462
|
-
|
463
|
-
polyrex.records.each do |day|
|
464
|
-
|
465
|
-
dt = day.date
|
466
|
-
|
467
|
-
sd = dt.strftime("%Y-%b-%d ")
|
468
|
-
m, i = dt.month, dt.day
|
469
|
-
cal_day = @polyrex.records[m - 1].day[i-1]
|
470
|
-
|
471
|
-
cal_day.event = day.title
|
472
|
-
|
473
|
-
if day.records.length > 0 then
|
474
|
-
|
475
|
-
raw_entries = day.records
|
476
|
-
|
477
|
-
entries = raw_entries.inject({}) do |r,entry|
|
478
|
-
|
479
|
-
start_time = entry.start_time
|
480
|
-
|
481
|
-
if entry.end_time.length > 0 then
|
482
|
-
|
483
|
-
end_time = entry.end_time
|
484
|
-
duration = ChronicDuration.output(Time.parse(sd + end_time) \
|
485
|
-
- Time.parse(sd + start_time))
|
486
|
-
else
|
487
|
-
|
488
|
-
if entry.duration.length > 0 then
|
489
|
-
duration = entry.duration
|
490
|
-
else
|
491
|
-
duration = '10 mins'
|
492
|
-
end
|
493
|
-
|
494
|
-
end_time = (Time.parse(sd + start_time) + ChronicDuration.parse(duration))\
|
495
|
-
.strftime("%H:%M")
|
496
|
-
end
|
497
|
-
|
498
|
-
r.merge!(start_time => {time_start: start_time, time_end: end_time, \
|
499
|
-
duration: duration, title: entry.title})
|
500
|
-
|
501
|
-
end
|
502
|
-
|
503
|
-
seconds = entries.keys.map{|x| Time.parse(x) - Time.parse('08:00')}
|
504
|
-
|
505
|
-
unless dt.saturday? or dt.sunday? then
|
506
|
-
rows = slotted_sort(seconds).map do |x|
|
507
|
-
(Time.parse('08:00') + x.to_i).strftime("%H:%M") if x
|
508
|
-
end
|
509
|
-
else
|
510
|
-
rows = entries.keys
|
511
|
-
end
|
512
|
-
|
513
|
-
rows.each do |row|
|
514
|
-
create = cal_day.create
|
515
|
-
create.id = @id
|
516
|
-
create.entry entries[row] || {}
|
517
|
-
end
|
518
|
-
|
519
|
-
end
|
520
|
-
end
|
521
|
-
|
522
|
-
end
|
523
179
|
|
524
180
|
def make_month(m)
|
525
181
|
|
526
|
-
cal_month = @
|
182
|
+
cal_month = @calendar.month(m)
|
527
183
|
days_in_month = cal_month.records
|
528
184
|
pxmonth = cal_month.clone
|
529
185
|
pxmonth.records.each(&:delete)
|
@@ -578,30 +234,4 @@ class PolyrexCalendar
|
|
578
234
|
'th' : %w{ th st nd rd th th th th th th }[val % 10]
|
579
235
|
end
|
580
236
|
|
581
|
-
def slotted_sort(a)
|
582
|
-
|
583
|
-
upper = 36000 # upper slot value
|
584
|
-
slot_width = 9000 # 2.5 hours
|
585
|
-
max_slots = 3
|
586
|
-
|
587
|
-
b = a.reverse.inject([]) do |r,x|
|
588
|
-
|
589
|
-
upper ||= 10; i ||= 0
|
590
|
-
diff = upper - x
|
591
|
-
|
592
|
-
if diff >= slot_width and (i + a.length) < max_slots then
|
593
|
-
r << nil
|
594
|
-
i += 1
|
595
|
-
upper -= slot_width
|
596
|
-
redo
|
597
|
-
else
|
598
|
-
upper -= slot_width if x <= upper
|
599
|
-
r << x
|
600
|
-
end
|
601
|
-
end
|
602
|
-
|
603
|
-
a = b.+([nil] * max_slots).take(max_slots).reverse
|
604
|
-
end
|
605
|
-
|
606
|
-
|
607
237
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyrex-calendar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -31,90 +31,10 @@ cert_chain:
|
|
31
31
|
V2LbfuIuDVCUDR9ON1ozFySFLuTnZSmO6lR4UsFjHKwbtnnbapfQVvEJ1PLW/F13
|
32
32
|
1r3+lzIVNJhpdQ==
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date: 2014-
|
34
|
+
date: 2014-10-02 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement: !ruby/object:Gem::Requirement
|
39
|
-
requirements:
|
40
|
-
- - "~>"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '0.9'
|
43
|
-
- - ">="
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 0.9.3
|
46
|
-
type: :runtime
|
47
|
-
prerelease: false
|
48
|
-
version_requirements: !ruby/object:Gem::Requirement
|
49
|
-
requirements:
|
50
|
-
- - "~>"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '0.9'
|
53
|
-
- - ">="
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 0.9.3
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: nokogiri
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
59
|
-
requirements:
|
60
|
-
- - "~>"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '1.6'
|
63
|
-
- - ">="
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: 1.6.2.1
|
66
|
-
type: :runtime
|
67
|
-
prerelease: false
|
68
|
-
version_requirements: !ruby/object:Gem::Requirement
|
69
|
-
requirements:
|
70
|
-
- - "~>"
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: '1.6'
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 1.6.2.1
|
76
|
-
- !ruby/object:Gem::Dependency
|
77
|
-
name: chronic_duration
|
78
|
-
requirement: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0.10'
|
83
|
-
- - ">="
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 0.10.4
|
86
|
-
type: :runtime
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
requirements:
|
90
|
-
- - "~>"
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
version: '0.10'
|
93
|
-
- - ">="
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: 0.10.4
|
96
|
-
- !ruby/object:Gem::Dependency
|
97
|
-
name: chronic_cron
|
98
|
-
requirement: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - "~>"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0.2'
|
103
|
-
- - ">="
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: 0.2.33
|
106
|
-
type: :runtime
|
107
|
-
prerelease: false
|
108
|
-
version_requirements: !ruby/object:Gem::Requirement
|
109
|
-
requirements:
|
110
|
-
- - "~>"
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: '0.2'
|
113
|
-
- - ">="
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: 0.2.33
|
116
|
-
- !ruby/object:Gem::Dependency
|
117
|
-
name: rxfhelper
|
37
|
+
name: polyrex_calendarbase
|
118
38
|
requirement: !ruby/object:Gem::Requirement
|
119
39
|
requirements:
|
120
40
|
- - "~>"
|
@@ -122,7 +42,7 @@ dependencies:
|
|
122
42
|
version: '0.1'
|
123
43
|
- - ">="
|
124
44
|
- !ruby/object:Gem::Version
|
125
|
-
version: 0.1.
|
45
|
+
version: 0.1.3
|
126
46
|
type: :runtime
|
127
47
|
prerelease: false
|
128
48
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -132,7 +52,7 @@ dependencies:
|
|
132
52
|
version: '0.1'
|
133
53
|
- - ">="
|
134
54
|
- !ruby/object:Gem::Version
|
135
|
-
version: 0.1.
|
55
|
+
version: 0.1.3
|
136
56
|
description:
|
137
57
|
email: james@r0bertson.co.uk
|
138
58
|
executables: []
|
@@ -180,4 +100,3 @@ signing_key:
|
|
180
100
|
specification_version: 4
|
181
101
|
summary: Generates an HTML calendar from a Polyrex document
|
182
102
|
test_files: []
|
183
|
-
has_rdoc:
|
metadata.gz.sig
CHANGED
Binary file
|