mhc 1.1.1 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -1
- data/bin/mhc +82 -3
- data/emacs/Cask +1 -1
- data/emacs/mhc-calendar.el +7 -5
- data/emacs/mhc-date.el +5 -12
- data/emacs/mhc-day.el +1 -1
- data/emacs/mhc-db.el +57 -38
- data/emacs/mhc-draft.el +36 -22
- data/emacs/mhc-face.el +1 -1
- data/emacs/mhc-header.el +20 -1
- data/emacs/mhc-minibuf.el +12 -7
- data/emacs/mhc-parse.el +1 -1
- data/emacs/mhc-process.el +26 -9
- data/emacs/mhc-ps.el +1 -1
- data/emacs/mhc-record.el +1 -1
- data/emacs/mhc-schedule.el +5 -2
- data/emacs/mhc-summary.el +36 -16
- data/emacs/mhc-vars.el +15 -2
- data/emacs/mhc.el +51 -25
- data/lib/mhc.rb +3 -1
- data/lib/mhc/builder.rb +5 -1
- data/lib/mhc/caldav.rb +1 -1
- data/lib/mhc/calendar.rb +5 -1
- data/lib/mhc/command/cache.rb +5 -4
- data/lib/mhc/command/completions.rb +1 -1
- data/lib/mhc/command/init.rb +2 -0
- data/lib/mhc/converter.rb +3 -2
- data/lib/mhc/datastore.rb +52 -13
- data/lib/mhc/date_enumerator.rb +2 -2
- data/lib/mhc/event.rb +42 -21
- data/lib/mhc/formatter.rb +17 -312
- data/lib/mhc/formatter/base.rb +125 -0
- data/lib/mhc/formatter/emacs.rb +47 -0
- data/lib/mhc/formatter/howm.rb +35 -0
- data/lib/mhc/formatter/icalendar.rb +17 -0
- data/lib/mhc/formatter/json.rb +27 -0
- data/lib/mhc/formatter/mail.rb +20 -0
- data/lib/mhc/formatter/org_table.rb +24 -0
- data/lib/mhc/formatter/symbolic_expression.rb +42 -0
- data/lib/mhc/formatter/text.rb +29 -0
- data/lib/mhc/modifier.rb +1 -0
- data/lib/mhc/occurrence.rb +27 -5
- data/lib/mhc/occurrence_enumerator.rb +1 -1
- data/lib/mhc/property_value.rb +6 -0
- data/lib/mhc/property_value/date.rb +23 -14
- data/lib/mhc/property_value/date_time.rb +19 -0
- data/lib/mhc/property_value/integer.rb +5 -1
- data/lib/mhc/property_value/list.rb +7 -6
- data/lib/mhc/property_value/period.rb +3 -1
- data/lib/mhc/property_value/range.rb +1 -1
- data/lib/mhc/property_value/time.rb +8 -1
- data/lib/mhc/version.rb +1 -1
- data/mhc.gemspec +0 -1
- data/samples/japanese-holidays.mhcc +36 -9
- data/spec/mhc_spec.rb +83 -0
- metadata +13 -18
@@ -71,7 +71,7 @@ module Mhc
|
|
71
71
|
first_date = date_or_range
|
72
72
|
last_date = date_or_range
|
73
73
|
end
|
74
|
-
if last_date < @date_range.first or @date_range.last < first_date
|
74
|
+
if last_date.to_date < @date_range.first or @date_range.last < first_date.to_date
|
75
75
|
next
|
76
76
|
end
|
77
77
|
next if @exceptions.include?(first_date)
|
data/lib/mhc/property_value.rb
CHANGED
@@ -15,12 +15,18 @@ module Mhc
|
|
15
15
|
return @value.to_s
|
16
16
|
end
|
17
17
|
|
18
|
+
def empty?
|
19
|
+
return true if @value.nil? || (@value.respond_to?(:empty?) && @value.empty?)
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
|
18
23
|
alias_method :to_s, :to_mhc_string
|
19
24
|
end
|
20
25
|
|
21
26
|
dir = File.dirname(__FILE__) + "/property_value"
|
22
27
|
|
23
28
|
autoload :Date, "#{dir}/date.rb"
|
29
|
+
autoload :DateTime, "#{dir}/date_time.rb"
|
24
30
|
autoload :Integer, "#{dir}/integer.rb"
|
25
31
|
autoload :List, "#{dir}/list.rb"
|
26
32
|
autoload :Period, "#{dir}/period.rb"
|
@@ -8,12 +8,25 @@ module Mhc
|
|
8
8
|
|
9
9
|
DAYS_OF_MONTH = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
10
10
|
|
11
|
-
def self.parse(string)
|
12
|
-
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
def self.parse(string, default = nil)
|
12
|
+
begin
|
13
|
+
# YYYYMMDD/HH:MM => DateTime
|
14
|
+
if /^(\d{4})(\d{2})(\d{2})\/(\d{2}):(\d{2})$/ =~ string
|
15
|
+
DateTime.new($1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, 0)
|
16
|
+
|
17
|
+
# YYYYMMDD => Date
|
18
|
+
elsif /^(\d{4})(\d{2})(\d{2})$/ =~ string
|
19
|
+
Date.new($1.to_i, $2.to_i, $3.to_i)
|
20
|
+
|
21
|
+
# YYYYMMDD/hh:mm-HH:MM => DateTime taking YYYYMMDD, HH:MM
|
22
|
+
elsif /^(\d+):(\d+)$/ =~ string && default
|
23
|
+
DateTime.new(default.year, default.month, default.day, $1.to_i, $2.to_i, 0)
|
24
|
+
|
25
|
+
else
|
26
|
+
fail ParseError
|
27
|
+
end
|
28
|
+
rescue
|
29
|
+
raise ParseError, "invalid date string \"#{string}\""
|
17
30
|
end
|
18
31
|
end
|
19
32
|
|
@@ -38,7 +51,7 @@ module Mhc
|
|
38
51
|
return self.today.first_day_of_month.next_month
|
39
52
|
|
40
53
|
else
|
41
|
-
raise ParseError, "invalid date string
|
54
|
+
raise ParseError, "invalid date string \"#{date_string}\""
|
42
55
|
end
|
43
56
|
end
|
44
57
|
|
@@ -65,7 +78,7 @@ module Mhc
|
|
65
78
|
date = parse_relative($1)
|
66
79
|
return date..date
|
67
80
|
else
|
68
|
-
raise ParseError, "invalid date range string
|
81
|
+
raise ParseError, "invalid date range string \"#{range_string}\""
|
69
82
|
end
|
70
83
|
end
|
71
84
|
|
@@ -80,12 +93,8 @@ module Mhc
|
|
80
93
|
end
|
81
94
|
end
|
82
95
|
|
83
|
-
def parse(string)
|
84
|
-
|
85
|
-
self.class.parse(string)
|
86
|
-
else
|
87
|
-
return nil # raise ParseError
|
88
|
-
end
|
96
|
+
def parse(string, default = nil)
|
97
|
+
self.class.parse(string, default)
|
89
98
|
end
|
90
99
|
|
91
100
|
def add_time(time = nil)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "date"
|
2
|
+
|
3
|
+
module Mhc
|
4
|
+
module PropertyValue
|
5
|
+
class DateTime < ::DateTime
|
6
|
+
|
7
|
+
def to_mhc_string
|
8
|
+
return strftime("%Y%m%d/%H:%M")
|
9
|
+
end
|
10
|
+
|
11
|
+
def absolute_from_epoch
|
12
|
+
return (self - Date.new(1970, 1, 1)).to_i
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :to_s, :to_mhc_string
|
16
|
+
|
17
|
+
end # class DateTime
|
18
|
+
end # module PropertyValue
|
19
|
+
end # module Mhc
|
@@ -2,7 +2,11 @@ module Mhc
|
|
2
2
|
module PropertyValue
|
3
3
|
class Integer < Base
|
4
4
|
def parse(string)
|
5
|
-
|
5
|
+
if /^\d+$/ =~ string
|
6
|
+
@value = string.to_i
|
7
|
+
else
|
8
|
+
raise ParseError, "invalid integer format \"#{string}\""
|
9
|
+
end
|
6
10
|
return self
|
7
11
|
end
|
8
12
|
|
@@ -6,35 +6,36 @@ module Mhc
|
|
6
6
|
ITEM_SEPARATOR = " "
|
7
7
|
|
8
8
|
def initialize(item_class)
|
9
|
-
@
|
9
|
+
@value = []
|
10
10
|
@item_class = item_class
|
11
11
|
end
|
12
12
|
|
13
13
|
def each
|
14
|
-
@
|
14
|
+
@value.each do |value|
|
15
15
|
yield value
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def include?(o)
|
20
|
-
@
|
20
|
+
@value.include?(o)
|
21
21
|
end
|
22
22
|
|
23
23
|
def empty?
|
24
|
-
@
|
24
|
+
@value.empty?
|
25
25
|
end
|
26
26
|
|
27
27
|
def parse(string)
|
28
28
|
string.strip.split(ITEM_SEPARATOR).each do |str|
|
29
29
|
item = @item_class.parse(str)
|
30
|
-
@
|
30
|
+
@value << item if item
|
31
31
|
end
|
32
32
|
return self
|
33
33
|
end
|
34
34
|
|
35
35
|
def to_mhc_string
|
36
|
-
@
|
36
|
+
@value.map{|item| item.to_mhc_string}.join(ITEM_SEPARATOR)
|
37
37
|
end
|
38
|
+
alias_method :to_s, :to_mhc_string
|
38
39
|
|
39
40
|
end # class List
|
40
41
|
end # module PropertyValue
|
@@ -4,7 +4,7 @@ module Mhc
|
|
4
4
|
|
5
5
|
UNIT2MIN = {'minute' => 1, 'hour' => 60, 'day' => 60*24}
|
6
6
|
UNITS = UNIT2MIN.keys
|
7
|
-
REGEXP = /(\d+)\s*(#{UNITS.join("|")})s
|
7
|
+
REGEXP = /(\d+)\s*(#{UNITS.join("|")})s?$/
|
8
8
|
|
9
9
|
def self.parse(string)
|
10
10
|
return new.parse(string)
|
@@ -13,6 +13,8 @@ module Mhc
|
|
13
13
|
def parse(string)
|
14
14
|
if REGEXP =~ string
|
15
15
|
@minutes = (UNIT2MIN[$2] * $1.to_i)
|
16
|
+
else
|
17
|
+
raise ParseError, "invalid period string \"#{string}\""
|
16
18
|
end
|
17
19
|
return self
|
18
20
|
end
|
@@ -25,7 +25,7 @@ module Mhc
|
|
25
25
|
last = first if last.nil? # single "A" means "A-A"
|
26
26
|
|
27
27
|
@first = @item_class.parse(first) unless first.to_s == ""
|
28
|
-
@last = @item_class.parse(last) unless last.to_s == ""
|
28
|
+
@last = @item_class.parse(last, @first) unless last.to_s == ""
|
29
29
|
return self.class.new(@item_class, @prefix, @first, @last)
|
30
30
|
end
|
31
31
|
|
@@ -7,13 +7,20 @@ module Mhc
|
|
7
7
|
class Time < Base
|
8
8
|
include Comparable
|
9
9
|
|
10
|
-
def parse(string)
|
10
|
+
def parse(string, default = nil)
|
11
|
+
# default is dummy for matching interface
|
11
12
|
if /^(\d+):(\d+)$/ =~ string
|
12
13
|
@sec = ($1.to_i) * 3600 + ($2.to_i) * 60
|
14
|
+
else
|
15
|
+
raise ParseError, "invalid time format \"#{string}\""
|
13
16
|
end
|
14
17
|
return self
|
15
18
|
end
|
16
19
|
|
20
|
+
def self.parse(string, default = nil)
|
21
|
+
new.parse(string, default)
|
22
|
+
end
|
23
|
+
|
17
24
|
def days; (@sec ) / 86400 ;end
|
18
25
|
def hour; (@sec % 86400) / 3600 ;end
|
19
26
|
def minute; (@sec % 3600) / 60 ;end
|
data/lib/mhc/version.rb
CHANGED
data/mhc.gemspec
CHANGED
@@ -28,7 +28,6 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_runtime_dependency "tzinfo", ">= 1.2.2"
|
29
29
|
spec.add_runtime_dependency "tzinfo-data", ">= 1.2015.4"
|
30
30
|
|
31
|
-
spec.add_development_dependency "bundler", "~> 1.5"
|
32
31
|
spec.add_development_dependency "rake"
|
33
32
|
spec.add_development_dependency "rspec"
|
34
33
|
end
|
@@ -72,12 +72,14 @@ X-SC-Record-Id: 5E03776A-4280-4337-85C0-F1322A3AAE6E
|
|
72
72
|
|
73
73
|
X-SC-Subject: 海の日
|
74
74
|
X-SC-Category: Holiday Japanese
|
75
|
+
X-SC-Day: !20200720 20200723 !20210719 20210722
|
75
76
|
X-SC-Cond: 3rd Mon Jul
|
76
77
|
X-SC-Duration: 20030701-
|
77
78
|
X-SC-Record-Id: BD4156C2-5546-4146-8297-09CF4210A346
|
78
79
|
|
79
80
|
X-SC-Subject: 山の日
|
80
81
|
X-SC-Category: Holiday Japanese
|
82
|
+
X-SC-Day: 20200810 !20200811 20210808 !20210811
|
81
83
|
X-SC-Cond: 11 Aug
|
82
84
|
X-SC-Duration: 20160811-
|
83
85
|
X-SC-Record-Id: FC7C481B-7BF5-4639-B700-3B60CB99E05D
|
@@ -103,9 +105,16 @@ X-SC-Record-Id: AFABC42C-2E9D-4093-A4AF-DA12D4D4B9D7
|
|
103
105
|
X-SC-Subject: 体育の日
|
104
106
|
X-SC-Category: Holiday Japanese
|
105
107
|
X-SC-Cond: 2nd Mon Oct
|
106
|
-
X-SC-Duration: 20001009-
|
108
|
+
X-SC-Duration: 20001009-20191231
|
107
109
|
X-SC-Record-Id: C17D9CA5-28AF-4826-AD33-8B75473E5B52
|
108
110
|
|
111
|
+
X-SC-Subject: スポーツの日
|
112
|
+
X-SC-Category: Holiday Japanese
|
113
|
+
X-SC-Day: 20200724 !20201012 20210723 !20211011
|
114
|
+
X-SC-Cond: 2nd Mon Oct
|
115
|
+
X-SC-Duration: 20200101-
|
116
|
+
X-SC-Record-Id: F10B2B18-B0FB-477E-A7D3-A067B31F4736
|
117
|
+
|
109
118
|
X-SC-Subject: 文化の日
|
110
119
|
X-SC-Category: Holiday Japanese
|
111
120
|
X-SC-Cond: 3 Nov
|
@@ -121,11 +130,27 @@ X-SC-Record-Id: 97E6F125-2625-44A9-8D43-A6FCA9670D8D
|
|
121
130
|
X-SC-Subject: 天皇誕生日
|
122
131
|
X-SC-Category: Holiday Japanese
|
123
132
|
X-SC-Cond: 23 Dec
|
124
|
-
X-SC-Duration: 19891223-
|
133
|
+
X-SC-Duration: 19891223-20190430
|
125
134
|
X-SC-Record-Id: 51D42B0D-EF46-4D65-B62A-6ED2F0D1F0B5
|
126
135
|
|
136
|
+
X-SC-Subject: 天皇誕生日
|
137
|
+
X-SC-Category: Holiday Japanese
|
138
|
+
X-SC-Cond: 23 Feb
|
139
|
+
X-SC-Duration: 20190501-
|
140
|
+
X-SC-Record-Id: 59B83B1E-6161-45F5-9DEC-95E3C1CCA4EE
|
141
|
+
|
127
142
|
## 毎年変わる祝日と振替休日
|
128
143
|
|
144
|
+
X-SC-Subject: 即位の日
|
145
|
+
X-SC-Day: 20190501
|
146
|
+
X-SC-Category: Holiday Japanese
|
147
|
+
X-SC-Record-Id: 25C73788-1104-42BE-85F6-570861B0020B
|
148
|
+
|
149
|
+
X-SC-Subject: 即位礼正殿の儀
|
150
|
+
X-SC-Category: Holiday Japanese
|
151
|
+
X-SC-Day: 20191022
|
152
|
+
X-SC-Record-Id: 76F9756D-C00F-47D0-9592-67E21909C39D
|
153
|
+
|
129
154
|
X-SC-Subject: 春分の日
|
130
155
|
X-SC-Day: 19960320 19970320 19980321 19990321 20000320 20010320 20020321
|
131
156
|
20030321 20040320 20050320 20060321 20070321 20080320 20090320
|
@@ -158,14 +183,15 @@ X-SC-Day: 19730430 19730924 19740506 19740916 19741104 19751124
|
|
158
183
|
20050321 20060102 20070212 20070430 20070924 20071224 20080506
|
159
184
|
20081124 20090506 20100322 20120102 20120430 20121224 20130506
|
160
185
|
20131104 20140506 20141124 20150506 20160321 20170102 20180212
|
161
|
-
20180430 20180924 20181224 20190506 20190812 20191104 20200506
|
162
|
-
|
186
|
+
20180430 20180924 20181224 20190506 20190812 20191104 20200224 20200506
|
187
|
+
20210809
|
188
|
+
20230102 20240212 20240506 20240812 20240923 20241104 20250224 20250506
|
163
189
|
20251124 20260506 20270322 20290212 20290430 20290924 20291224
|
164
|
-
20300506 20300812 20301104 20310506 20311124 20330321 20340102
|
190
|
+
20300506 20300812 20301104 20310224 20310506 20311124 20330321 20340102
|
165
191
|
20350212 20350430 20350924 20351224 20360506 20361124 20370506
|
166
|
-
20400102 20400430 20401224 20410506 20410812 20411104 20420506
|
192
|
+
20400102 20400430 20401224 20410506 20410812 20411104 20420224 20420506
|
167
193
|
20421124 20430506 20440321 20450102 20460212 20460430 20460924
|
168
|
-
20461224 20470506 20470812 20471104 20480506 20500321
|
194
|
+
20461224 20470506 20470812 20471104 20480224 20480506 20500321
|
169
195
|
X-SC-Category: Holiday Japanese
|
170
196
|
X-SC-Record-Id: E2D696DF-EB49-44D7-B06C-812B10BD99A2
|
171
197
|
|
@@ -173,8 +199,9 @@ X-SC-Subject: 国民の休日
|
|
173
199
|
X-SC-Category: Holiday Japanese
|
174
200
|
X-SC-Day: 19880504 19890504 19900504 19910504 19930504 19940504 19950504
|
175
201
|
19960504 19990504 20000504 20010504 20020504 20040504 20050504 20060504
|
176
|
-
20090922 20150922 20260922 20320921 20370922 20430922
|
177
|
-
20600921 20650922 20710922 20770921 20880921 20940921
|
202
|
+
20090922 20150922 20190430 20190502 20260922 20320921 20370922 20430922
|
203
|
+
20490921 20540922 20600921 20650922 20710922 20770921 20880921 20940921
|
204
|
+
20990922
|
178
205
|
X-SC-Record-Id: 46953810-BD72-45DE-BC11-104CBE970CFF
|
179
206
|
|
180
207
|
## Make sure you have at least one blank line for each entry (改行で終わる)
|
data/spec/mhc_spec.rb
CHANGED
@@ -125,6 +125,20 @@ describe Mhc::Event do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
|
128
|
+
it "should emit an error on parsing invalid time format." do
|
129
|
+
str = <<-EOF.strip_heredoc
|
130
|
+
X-SC-Subject: Invalid Date format
|
131
|
+
X-SC-Location: Room1
|
132
|
+
X-SC-Day: 19960930
|
133
|
+
X-SC-Duration: 19960930-
|
134
|
+
X-SC-Time: 19:30-2030
|
135
|
+
X-SC-Record-Id: 54A339AD-F7FD-4E56-9B70-2D09F840E94D
|
136
|
+
X-SC-Sequence: 0
|
137
|
+
EOF
|
138
|
+
errors = Mhc::Event.validate(str)
|
139
|
+
expect(errors.length).to eq 1
|
140
|
+
expect(errors.first.first.message).to match /invalid time format/
|
141
|
+
end
|
128
142
|
|
129
143
|
it "should occur weekly on Monday and Thursday from 2014-04-01 to 2014-04-30 with exception of 2014-04-10 (Thu)" do
|
130
144
|
ev = Mhc::Event.parse <<-EOF.strip_heredoc
|
@@ -204,6 +218,53 @@ describe Mhc::Event do
|
|
204
218
|
["20140203 10:00-12:00 TEST", "20140509 10:00-12:00 TEST", "20140831 10:00-12:00 TEST"]
|
205
219
|
end
|
206
220
|
|
221
|
+
it "should produce a list of occurrences, and one occurrence has different Time" do
|
222
|
+
ev = Mhc::Event.parse <<-EOF.strip_heredoc
|
223
|
+
X-SC-Subject: X-Project
|
224
|
+
X-SC-Location: 101
|
225
|
+
X-SC-Day: 20160601 20160602/16:00-18:00 20160616 20160617 20160623 20160624
|
226
|
+
X-SC-Time: 09:00-11:00
|
227
|
+
X-SC-Category: Conference
|
228
|
+
X-SC-Record-Id: FEDA4C97-21C2-46AA-A395-075856FBD5C3
|
229
|
+
EOF
|
230
|
+
expect(ev.occurrences.take(30).map{|o| "#{o.dtstart.strftime("%Y%m%d/%H:%M")}-#{o.dtend.strftime("%Y%m%d/%H:%M")} #{o.subject}"}).to eq \
|
231
|
+
["20160601/09:00-20160601/11:00 X-Project",
|
232
|
+
"20160602/16:00-20160602/18:00 X-Project",
|
233
|
+
"20160616/09:00-20160616/11:00 X-Project",
|
234
|
+
"20160617/09:00-20160617/11:00 X-Project",
|
235
|
+
"20160623/09:00-20160623/11:00 X-Project",
|
236
|
+
"20160624/09:00-20160624/11:00 X-Project"]
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should produce a list of occurrences, and one occurrence has different Time crossing days" do
|
240
|
+
ev = Mhc::Event.parse <<-EOF.strip_heredoc
|
241
|
+
X-SC-Subject: TEST
|
242
|
+
X-SC-Time: 10:00-12:00
|
243
|
+
X-SC-Day: 20150203/10:30-20150205/12:30 20150509 20150831
|
244
|
+
X-SC-Record-Id: FEDA4C97-21C2-46AA-A395-075856FBD5C3
|
245
|
+
EOF
|
246
|
+
|
247
|
+
expect(ev.occurrences.take(30).map{|o| "#{o.dtstart.strftime("%Y%m%d/%H:%M")}-#{o.dtend.strftime("%Y%m%d/%H:%M")} #{o.subject}"}).to eq \
|
248
|
+
["20150203/10:30-20150205/12:30 TEST",
|
249
|
+
"20150509/10:00-20150509/12:00 TEST",
|
250
|
+
"20150831/10:00-20150831/12:00 TEST"]
|
251
|
+
|
252
|
+
expect(ev.to_ics).to eq <<-'EOF'.strip_heredoc
|
253
|
+
BEGIN:VEVENT
|
254
|
+
RDATE;VALUE=PERIOD:20150509T100000Z/20150509T120000Z,20150831T100000Z/20150831T120000Z
|
255
|
+
CREATED;VALUE=DATE-TIME:20140101T000000Z
|
256
|
+
DTEND;VALUE=DATE-TIME:20150205T123000Z
|
257
|
+
DTSTART;VALUE=DATE-TIME:20150203T103000Z
|
258
|
+
DTSTAMP;VALUE=DATE-TIME:20140101T000000Z
|
259
|
+
LAST-MODIFIED;VALUE=DATE-TIME:20140101T000000Z
|
260
|
+
UID:FEDA4C97-21C2-46AA-A395-075856FBD5C3
|
261
|
+
DESCRIPTION:
|
262
|
+
SUMMARY:TEST
|
263
|
+
SEQUENCE:0
|
264
|
+
END:VEVENT
|
265
|
+
EOF
|
266
|
+
end
|
267
|
+
|
207
268
|
it "should return true when #allday? is called if X-SC-Time: is blank" do
|
208
269
|
ev = Mhc::Event.parse <<-EOF.strip_heredoc
|
209
270
|
X-SC-Subject: TEST
|
@@ -397,6 +458,28 @@ describe Mhc::Event do
|
|
397
458
|
EOF
|
398
459
|
end
|
399
460
|
|
461
|
+
it "should return icalendar VEVENT over 24h event" do
|
462
|
+
ev = Mhc::Event.parse <<-EOF.strip_heredoc
|
463
|
+
X-SC-Subject: CS1
|
464
|
+
X-SC-Time: 12:00-13:00
|
465
|
+
X-SC-Day: 20140508/12:00-20140509/10:10
|
466
|
+
X-SC-Record-Id: 69CFD0DF-4058-425B-8C2B-40D81E6A2392
|
467
|
+
EOF
|
468
|
+
expect(ev.to_ics).to eq <<-'EOF'.strip_heredoc
|
469
|
+
BEGIN:VEVENT
|
470
|
+
CREATED;VALUE=DATE-TIME:20140101T000000Z
|
471
|
+
DTEND;VALUE=DATE-TIME:20140509T101000Z
|
472
|
+
DTSTART;VALUE=DATE-TIME:20140508T120000Z
|
473
|
+
DTSTAMP;VALUE=DATE-TIME:20140101T000000Z
|
474
|
+
LAST-MODIFIED;VALUE=DATE-TIME:20140101T000000Z
|
475
|
+
UID:69CFD0DF-4058-425B-8C2B-40D81E6A2392
|
476
|
+
DESCRIPTION:
|
477
|
+
SUMMARY:CS1
|
478
|
+
SEQUENCE:0
|
479
|
+
END:VEVENT
|
480
|
+
EOF
|
481
|
+
end
|
482
|
+
|
400
483
|
it "should return icalendar VEVENT two day's allday event" do
|
401
484
|
ev = Mhc::Event.parse <<-EOF.strip_heredoc
|
402
485
|
X-SC-Subject: CS1
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mhc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshinari Nomura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.2015.4
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: bundler
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.5'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.5'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: rake
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,12 +184,22 @@ files:
|
|
198
184
|
- lib/mhc/etag.rb
|
199
185
|
- lib/mhc/event.rb
|
200
186
|
- lib/mhc/formatter.rb
|
187
|
+
- lib/mhc/formatter/base.rb
|
188
|
+
- lib/mhc/formatter/emacs.rb
|
189
|
+
- lib/mhc/formatter/howm.rb
|
190
|
+
- lib/mhc/formatter/icalendar.rb
|
191
|
+
- lib/mhc/formatter/json.rb
|
192
|
+
- lib/mhc/formatter/mail.rb
|
193
|
+
- lib/mhc/formatter/org_table.rb
|
194
|
+
- lib/mhc/formatter/symbolic_expression.rb
|
195
|
+
- lib/mhc/formatter/text.rb
|
201
196
|
- lib/mhc/logger.rb
|
202
197
|
- lib/mhc/modifier.rb
|
203
198
|
- lib/mhc/occurrence.rb
|
204
199
|
- lib/mhc/occurrence_enumerator.rb
|
205
200
|
- lib/mhc/property_value.rb
|
206
201
|
- lib/mhc/property_value/date.rb
|
202
|
+
- lib/mhc/property_value/date_time.rb
|
207
203
|
- lib/mhc/property_value/integer.rb
|
208
204
|
- lib/mhc/property_value/list.rb
|
209
205
|
- lib/mhc/property_value/period.rb
|
@@ -259,8 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
255
|
- !ruby/object:Gem::Version
|
260
256
|
version: '0'
|
261
257
|
requirements: []
|
262
|
-
|
263
|
-
rubygems_version: 2.4.5
|
258
|
+
rubygems_version: 3.1.4
|
264
259
|
signing_key:
|
265
260
|
specification_version: 4
|
266
261
|
summary: Message Harmonized Calendaring
|