add_to_calendar 0.1.0 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +12 -0
- data/.gitignore +1 -0
- data/Gemfile.lock +5 -5
- data/README.md +23 -7
- data/add_to_calendar.gemspec +6 -4
- data/lib/add_to_calendar.rb +104 -27
- data/lib/add_to_calendar/version.rb +1 -1
- metadata +20 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ccdbe13aa98bd8e94caba7b5ab6b270a7d180f29d4b45229275c1d58a4da0c7
|
4
|
+
data.tar.gz: c75a18bf0b11590e57ecf129f5b5b4a9abbbc665e50ef8017ca2b66a2d81e872
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b15f499801d1d934d6903ac75f43122d60e38023600591b4a4e7d8286bee3a610c26f52b8b968bdc4a257216334c4bf300201ee3137f5cd8a0871ddafb31ce9f
|
7
|
+
data.tar.gz: 4a6fa0af927ff0676b0248ec869627c77c12e60feca22e884d62e83545e6f0d5e04ec4b3d69a05be5ae60f221c3cc537f50b342ad3d58d68dc166c367213dff6
|
data/.github/FUNDING.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# These are supported funding model platforms
|
2
|
+
|
3
|
+
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
4
|
+
patreon: # Replace with a single Patreon username
|
5
|
+
open_collective: # Replace with a single Open Collective username
|
6
|
+
ko_fi: jaredlt
|
7
|
+
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
8
|
+
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
9
|
+
liberapay: # Replace with a single Liberapay username
|
10
|
+
issuehunt: # Replace with a single IssueHunt username
|
11
|
+
otechie: # Replace with a single Otechie username
|
12
|
+
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
add_to_calendar (0.
|
5
|
-
tzinfo (
|
6
|
-
tzinfo-data (~> 1.2020
|
4
|
+
add_to_calendar (0.2.4)
|
5
|
+
tzinfo (>= 1.1, < 3)
|
6
|
+
tzinfo-data (~> 1.2020)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
@@ -15,7 +15,7 @@ GEM
|
|
15
15
|
pry (0.13.1)
|
16
16
|
coderay (~> 1.1)
|
17
17
|
method_source (~> 1.0)
|
18
|
-
rake (
|
18
|
+
rake (13.0.1)
|
19
19
|
tzinfo (2.0.2)
|
20
20
|
concurrent-ruby (~> 1.0)
|
21
21
|
tzinfo-data (1.2020.1)
|
@@ -29,7 +29,7 @@ DEPENDENCIES
|
|
29
29
|
bundler (~> 2.0)
|
30
30
|
minitest (~> 5.0)
|
31
31
|
pry (~> 0.13.1)
|
32
|
-
rake (~>
|
32
|
+
rake (~> 13.0.1)
|
33
33
|
|
34
34
|
BUNDLED WITH
|
35
35
|
2.0.2
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# AddToCalendar
|
2
2
|
|
3
|
-
A ruby gem to generate 'Add To Calendar' URLs for
|
3
|
+
A ruby gem to generate 'Add To Calendar' URLs for Apple, Google, Office 365, Outlook, Outlook.com and Yahoo calendars.
|
4
4
|
|
5
|
-
|
5
|
+
If this gem brings you some value feel free to buy me a coffee :) [![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/P5P71PK9T)
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
@@ -41,16 +41,23 @@ Or install it yourself as:
|
|
41
41
|
@cal.yahoo_url
|
42
42
|
#=> "https://calendar.yahoo.com/?v=60&view=d&type=20&title=Christmas%20party%21&st=20201212T133000Z&dur=0100"
|
43
43
|
|
44
|
+
@cal.office365_url
|
45
|
+
#=> "https://outlook.office.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent&subject=Christmas%20party%21&startdt=2020-12-12T13:30:00Z&enddt=2020-12-12T14:30:00Z"
|
46
|
+
|
47
|
+
# For outlook.com, different to Outlook the desktop application below
|
48
|
+
@cal.outlook_com_url
|
49
|
+
#=> "https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent&subject=Christmas%20party%21&startdt=2020-12-12T13:30:00Z&enddt=2020-12-12T14:30:00Z"
|
50
|
+
|
44
51
|
# ical provides a data-uri which will download a properly formatted *.ics file (see 'Creating HTML links' section)
|
45
52
|
@cal.ical_url
|
46
|
-
#=> "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART
|
53
|
+
#=> "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART:20201212T133000Z%0ADTEND:20201212T143000Z%0ASUMMARY:Christmas%20party%21%0AUID:-20201212T133000Z-Christmas%20party%21%0AEND:VEVENT%0AEND:VCALENDAR"
|
47
54
|
|
48
55
|
# apple_url and outlook_url are simply helper methods that call ical_url
|
49
56
|
@cal.apple_url
|
50
|
-
#=> "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART
|
57
|
+
#=> "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART:20201212T133000Z%0ADTEND:20201212T143000Z%0ASUMMARY:Christmas%20party%21%0AUID:-20201212T133000Z-Christmas%20party%21%0AEND:VEVENT%0AEND:VCALENDAR"
|
51
58
|
|
52
59
|
@cal.outlook_url
|
53
|
-
#=> "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART
|
60
|
+
#=> "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART:20201212T133000Z%0ADTEND:20201212T143000Z%0ASUMMARY:Christmas%20party%21%0AUID:-20201212T133000Z-Christmas%20party%21%0AEND:VEVENT%0AEND:VCALENDAR"
|
54
61
|
```
|
55
62
|
|
56
63
|
### Creating HTML links
|
@@ -97,16 +104,25 @@ cal = AddToCalendar::URLs.new(event_attributes)
|
|
97
104
|
|
98
105
|
- Offset values eg. "2020-05-13 15:31:00 **+05:00**" are ignored. It is only important that you have the correct date and time numbers set. The timezone is set directly using its own attribute `timezone`.
|
99
106
|
- You must set a timezone so that when users add the event to their calendar it shows at their correct local time.
|
100
|
-
- Eg. London event @ `2020-05-13 13:30:00` will save in a New
|
107
|
+
- Eg. London event @ `2020-05-13 13:30:00` will save in a New Yorker's calendar as local time `2020-05-13 17:30:00`
|
101
108
|
|
102
109
|
### Browser support
|
103
110
|
|
104
|
-
- IE11 and lower will not work for `ical_url`, `apple_url` and `outlook_url` (IE does not properly support [data-uri links](https://caniuse.com/#feat=datauri). See [#16](https://github.com/jaredlt/add_to_calendar/issues/16)).
|
111
|
+
- IE11 and lower will not work for `ical_url`, `apple_url` and `outlook_url` (IE does not properly support [data-uri links](https://caniuse.com/#feat=datauri). See [#16](https://github.com/jaredlt/add_to_calendar/issues/16)).
|
112
|
+
- IE11 will also not work with `Yahoo`, but this is because Yahoo only offers a simplified interface for IE11 which does not work with the add event URL.
|
105
113
|
|
106
114
|
### More details
|
107
115
|
|
108
116
|
- Read the [Wiki](https://github.com/jaredlt/add_to_calendar/wiki) for more specific details
|
109
117
|
|
118
|
+
## Why build this?
|
119
|
+
|
120
|
+
I couldn't find an approriate gem or javascript library that did exactly what I wanted. So I decided to scratch my own itch to solve a problem for a startup I'm working on: https://www.littlefutures.org
|
121
|
+
|
122
|
+
## Releases
|
123
|
+
|
124
|
+
- https://rubygems.org/gems/add_to_calendar
|
125
|
+
|
110
126
|
## Development
|
111
127
|
|
112
128
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/add_to_calendar.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Jared Turner"]
|
9
9
|
spec.email = ["jaredlt01@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary = "Generate 'Add To Calendar' URLs for
|
11
|
+
spec.summary = "Generate 'Add To Calendar' URLs for Apple, Google, Office 365, Outlook, Outlook.com and Yahoo calendars"
|
12
12
|
# spec.description = %q{TODO: Write a longer description or delete this line.}
|
13
13
|
spec.homepage = "https://github.com/jaredlt/add_to_calendar"
|
14
14
|
spec.license = "MIT"
|
@@ -26,11 +26,13 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
27
|
spec.require_paths = ["lib"]
|
28
28
|
|
29
|
-
spec.
|
30
|
-
|
29
|
+
spec.required_ruby_version = '>= 2.0'
|
30
|
+
|
31
|
+
spec.add_dependency "tzinfo", ">= 1.1", "< 3"
|
32
|
+
spec.add_dependency "tzinfo-data", "~> 1.2020"
|
31
33
|
|
32
34
|
spec.add_development_dependency "bundler", "~> 2.0"
|
33
|
-
spec.add_development_dependency "rake", "~>
|
35
|
+
spec.add_development_dependency "rake", "~> 13.0.1"
|
34
36
|
spec.add_development_dependency "minitest", "~> 5.0"
|
35
37
|
spec.add_development_dependency "pry", "~> 0.13.1"
|
36
38
|
end
|
data/lib/add_to_calendar.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "add_to_calendar/version"
|
2
2
|
|
3
|
-
# needed for url_encode method
|
3
|
+
# erb util needed for url_encode method
|
4
|
+
# CGI::escape uses + instead of %20 which doesn't work for ical files
|
4
5
|
require "erb"
|
5
6
|
include ERB::Util
|
6
7
|
require 'tzinfo'
|
@@ -32,9 +33,9 @@ module AddToCalendar
|
|
32
33
|
params = {}
|
33
34
|
params[:text] = url_encode(title)
|
34
35
|
if end_datetime
|
35
|
-
params[:dates] = "#{
|
36
|
+
params[:dates] = "#{format_date_google(start_datetime)}/#{format_date_google(end_datetime)}"
|
36
37
|
else
|
37
|
-
params[:dates] = "#{
|
38
|
+
params[:dates] = "#{format_date_google(start_datetime)}/#{format_date_google(start_datetime + 60*60)}" # end time is 1 hour later
|
38
39
|
end
|
39
40
|
params[:ctz] = timezone.identifier
|
40
41
|
params[:location] = url_encode(location) if location
|
@@ -54,10 +55,6 @@ module AddToCalendar
|
|
54
55
|
return calendar_url
|
55
56
|
end
|
56
57
|
|
57
|
-
# def office_365_url
|
58
|
-
|
59
|
-
# end
|
60
|
-
|
61
58
|
def yahoo_url
|
62
59
|
# Eg. https://calendar.yahoo.com/?v=60&view=d&type=20&title=Holly%27s%208th%20Birthday!&st=20200615T170000Z&dur=0100&desc=Join%20us%20to%20celebrate%20with%20lots%20of%20games%20and%20cake!&in_loc=7%20Apartments,%20London
|
63
60
|
calendar_url = "https://calendar.yahoo.com/?v=60&view=d&type=20"
|
@@ -87,9 +84,19 @@ module AddToCalendar
|
|
87
84
|
return calendar_url
|
88
85
|
end
|
89
86
|
|
87
|
+
def office365_url
|
88
|
+
# Eg. https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent&subject=Holly%27s%208th%20Birthday%21&startdt=2020-05-12T12:30:00Z&enddt=2020-05-12T16:00:00Z&body=Come%20join%20us%20for%20lots%20of%20fun%20%26%20cake%21%0A%0Ahttps%3A%2F%2Fwww.example.com%2Fevent-details&location=Flat%204%2C%20The%20Edge%2C%2038%20Smith-Dorrien%20St%2C%20London%2C%20N1%207GU
|
89
|
+
microsoft("office365")
|
90
|
+
end
|
91
|
+
|
92
|
+
def outlook_com_url
|
93
|
+
# Eg. https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent&subject=Holly%27s%208th%20Birthday%21&startdt=2020-05-12T12:30:00Z&enddt=2020-05-12T16:00:00Z&body=Come%20join%20us%20for%20lots%20of%20fun%20%26%20cake%21%0A%0Ahttps%3A%2F%2Fwww.example.com%2Fevent-details&location=Flat%204%2C%20The%20Edge%2C%2038%20Smith-Dorrien%20St%2C%20London%2C%20N1%207GU
|
94
|
+
microsoft("outlook.com")
|
95
|
+
end
|
96
|
+
|
90
97
|
def ical_url
|
91
|
-
# Downloads a *.ics file provided as a data
|
92
|
-
# Eg. data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART
|
98
|
+
# Downloads a *.ics file provided as a data-uri
|
99
|
+
# Eg. "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT%0ADTSTART:20200512T123000Z%0ADTEND:20200512T160000Z%0ASUMMARY:Holly%27s%208th%20Birthday%21%0AURL:https%3A%2F%2Fwww.example.com%2Fevent-details%0ADESCRIPTION:Come%20join%20us%20for%20lots%20of%20fun%20%26%20cake%21\\n\\nhttps%3A%2F%2Fwww.example.com%2Fevent-details%0ALOCATION:Flat%204%5C%2C%20The%20Edge%5C%2C%2038%20Smith-Dorrien%20St%5C%2C%20London%5C%2C%20N1%207GU%0AUID:-https%3A%2F%2Fwww.example.com%2Fevent-details%0AEND:VEVENT%0AEND:VCALENDAR"
|
93
100
|
calendar_url = "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT"
|
94
101
|
params = {}
|
95
102
|
params[:DTSTART] = utc_datetime(start_datetime)
|
@@ -98,23 +105,23 @@ module AddToCalendar
|
|
98
105
|
else
|
99
106
|
params[:DTEND] = utc_datetime(start_datetime + 60*60) # 1 hour later
|
100
107
|
end
|
101
|
-
params[:SUMMARY] =
|
108
|
+
params[:SUMMARY] = url_encode_ical(title)
|
102
109
|
params[:URL] = url_encode(url) if url
|
103
|
-
params[:DESCRIPTION] =
|
110
|
+
params[:DESCRIPTION] = url_encode_ical(description) if description
|
104
111
|
if add_url_to_description && url
|
105
112
|
if params[:DESCRIPTION]
|
106
|
-
params[:DESCRIPTION] << "
|
113
|
+
params[:DESCRIPTION] << "\\n\\n#{url_encode(url)}"
|
107
114
|
else
|
108
115
|
params[:DESCRIPTION] = url_encode(url)
|
109
116
|
end
|
110
117
|
end
|
111
|
-
params[:LOCATION] =
|
118
|
+
params[:LOCATION] = url_encode_ical(location) if location
|
112
119
|
params[:UID] = "-#{url_encode(url)}" if url
|
113
|
-
params[:UID] = "-#{utc_datetime(start_datetime)}-#{
|
114
|
-
|
120
|
+
params[:UID] = "-#{utc_datetime(start_datetime)}-#{url_encode_ical(title)}" unless params[:UID] # set uid based on starttime and title only if url is unavailable
|
121
|
+
|
115
122
|
new_line = "%0A"
|
116
123
|
params.each do |key, value|
|
117
|
-
calendar_url << "#{new_line}#{key}
|
124
|
+
calendar_url << "#{new_line}#{key}:#{value}"
|
118
125
|
end
|
119
126
|
|
120
127
|
calendar_url << "%0AEND:VEVENT%0AEND:VCALENDAR"
|
@@ -152,21 +159,71 @@ module AddToCalendar
|
|
152
159
|
end
|
153
160
|
end
|
154
161
|
|
162
|
+
def microsoft(service)
|
163
|
+
# Eg.
|
164
|
+
if service == "outlook.com"
|
165
|
+
calendar_url = "https://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent"
|
166
|
+
elsif service == "office365"
|
167
|
+
calendar_url = "https://outlook.office.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent"
|
168
|
+
else
|
169
|
+
raise MicrosoftServiceError, ":service must be 'outlook.com' or 'office365'. '#{service}' given"
|
170
|
+
end
|
171
|
+
params = {}
|
172
|
+
params[:subject] = url_encode(title)
|
173
|
+
params[:startdt] = utc_datetime_microsoft(start_datetime)
|
174
|
+
if end_datetime
|
175
|
+
params[:enddt] = utc_datetime_microsoft(end_datetime)
|
176
|
+
else
|
177
|
+
params[:enddt] = utc_datetime_microsoft(start_datetime + 60*60) # 1 hour later
|
178
|
+
end
|
179
|
+
params[:body] = url_encode(newlines_to_html_br(description)) if description
|
180
|
+
if add_url_to_description && url
|
181
|
+
if params[:body]
|
182
|
+
params[:body] << url_encode(newlines_to_html_br("\n\n#{url}"))
|
183
|
+
else
|
184
|
+
params[:body] = url_encode(url)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
params[:location] = url_encode(location) if location
|
188
|
+
|
189
|
+
params.each do |key, value|
|
190
|
+
calendar_url << "&#{key}=#{value}"
|
191
|
+
end
|
192
|
+
|
193
|
+
return calendar_url
|
194
|
+
end
|
195
|
+
|
155
196
|
def utc_datetime(datetime)
|
156
|
-
t = timezone.
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
197
|
+
t = timezone.local_to_utc(
|
198
|
+
Time.new(
|
199
|
+
datetime.strftime("%Y").to_i,
|
200
|
+
datetime.strftime("%m").to_i,
|
201
|
+
datetime.strftime("%d").to_i,
|
202
|
+
datetime.strftime("%H").to_i,
|
203
|
+
datetime.strftime("%M").to_i,
|
204
|
+
datetime.strftime("%S").to_i
|
205
|
+
)
|
206
|
+
)
|
164
207
|
|
165
|
-
|
208
|
+
return t.strftime('%Y%m%dT%H%M%SZ')
|
209
|
+
end
|
210
|
+
|
211
|
+
def utc_datetime_microsoft(datetime)
|
212
|
+
t = timezone.local_to_utc(
|
213
|
+
Time.new(
|
214
|
+
datetime.strftime("%Y").to_i,
|
215
|
+
datetime.strftime("%m").to_i,
|
216
|
+
datetime.strftime("%d").to_i,
|
217
|
+
datetime.strftime("%H").to_i,
|
218
|
+
datetime.strftime("%M").to_i,
|
219
|
+
datetime.strftime("%S").to_i
|
220
|
+
)
|
221
|
+
)
|
222
|
+
|
223
|
+
return t.strftime('%Y-%m-%dT%H:%M:%SZ')
|
166
224
|
end
|
167
225
|
|
168
|
-
|
169
|
-
def format_date(start_datetime)
|
226
|
+
def format_date_google(start_datetime)
|
170
227
|
start_datetime.strftime('%Y%m%dT%H%M%S')
|
171
228
|
end
|
172
229
|
|
@@ -177,5 +234,25 @@ module AddToCalendar
|
|
177
234
|
def seconds_to_hours_minutes(sec)
|
178
235
|
"%02d%02d" % [sec / 3600, sec / 60 % 60]
|
179
236
|
end
|
237
|
+
|
238
|
+
def newlines_to_html_br(string)
|
239
|
+
string.gsub(/(?:\n\r?|\r\n?)/, '<br>')
|
240
|
+
end
|
241
|
+
|
242
|
+
def url_encode_ical(s)
|
243
|
+
# per https://tools.ietf.org/html/rfc5545#section-3.3.11
|
244
|
+
string = s.dup # don't modify original input
|
245
|
+
string.gsub!("\\", "\\\\\\") # \ >> \\ --yes, really: https://stackoverflow.com/questions/6209480/how-to-replace-backslash-with-double-backslash
|
246
|
+
string.gsub!(",", "\\,")
|
247
|
+
string.gsub!(";", "\\;")
|
248
|
+
string.gsub!("\r\n", "\n") # so can handle all newlines the same
|
249
|
+
string.split("\n").map { |e|
|
250
|
+
if e.empty?
|
251
|
+
e
|
252
|
+
else
|
253
|
+
url_encode(e)
|
254
|
+
end
|
255
|
+
}.join("\\n")
|
256
|
+
end
|
180
257
|
end
|
181
258
|
end
|
metadata
CHANGED
@@ -1,43 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: add_to_calendar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jared Turner
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tzinfo
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.1'
|
20
|
+
- - "<"
|
18
21
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
22
|
+
version: '3'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
29
|
+
version: '1.1'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: tzinfo-data
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.2020
|
39
|
+
version: '1.2020'
|
34
40
|
type: :runtime
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
44
|
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.2020
|
46
|
+
version: '1.2020'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: bundler
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,14 +64,14 @@ dependencies:
|
|
58
64
|
requirements:
|
59
65
|
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
67
|
+
version: 13.0.1
|
62
68
|
type: :development
|
63
69
|
prerelease: false
|
64
70
|
version_requirements: !ruby/object:Gem::Requirement
|
65
71
|
requirements:
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
74
|
+
version: 13.0.1
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: minitest
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,6 +107,7 @@ executables: []
|
|
101
107
|
extensions: []
|
102
108
|
extra_rdoc_files: []
|
103
109
|
files:
|
110
|
+
- ".github/FUNDING.yml"
|
104
111
|
- ".gitignore"
|
105
112
|
- ".travis.yml"
|
106
113
|
- Gemfile
|
@@ -128,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
128
135
|
requirements:
|
129
136
|
- - ">="
|
130
137
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
138
|
+
version: '2.0'
|
132
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
140
|
requirements:
|
134
141
|
- - ">="
|
@@ -138,6 +145,6 @@ requirements: []
|
|
138
145
|
rubygems_version: 3.0.6
|
139
146
|
signing_key:
|
140
147
|
specification_version: 4
|
141
|
-
summary: Generate 'Add To Calendar' URLs for
|
142
|
-
calendars
|
148
|
+
summary: Generate 'Add To Calendar' URLs for Apple, Google, Office 365, Outlook, Outlook.com
|
149
|
+
and Yahoo calendars
|
143
150
|
test_files: []
|