mhc 1.1.1 → 1.2.4
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 +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
|