add_to_calendar 0.2.5 → 0.3.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
- data/Gemfile.lock +5 -3
- data/README.md +5 -3
- data/add_to_calendar.gemspec +1 -0
- data/lib/add_to_calendar/version.rb +1 -1
- data/lib/add_to_calendar.rb +88 -26
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3067d7dd6fcf157682aa1e25172ad8fd591262168b42f7a453712c5d7483b36d
|
4
|
+
data.tar.gz: 8152eee8b227acecaf7e7abba6625b7a785e18f2cd786f2f56b777179d9b1647
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5c7a1dc4e614fcd1d1d819ee788f29689a815f0b944429423586f71b1b4841ea6377eab52400b8a8c507daf84280f99171fa04d1c98f583145ddd249e40eb0e
|
7
|
+
data.tar.gz: 1f2419f32a56d07bcfd9d632a700aae5f89d79cf87a4255fd8ddeb5e302cd809b2c17b166efb33e31f267137f81ba3e15c91804ff80ab5e0fdb99f6fa3f31ddd
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
add_to_calendar (0.
|
4
|
+
add_to_calendar (0.3.0)
|
5
5
|
tzinfo (>= 1.1, < 3)
|
6
6
|
tzinfo-data (~> 1.2020)
|
7
7
|
|
@@ -11,11 +11,12 @@ GEM
|
|
11
11
|
coderay (1.1.2)
|
12
12
|
concurrent-ruby (1.1.6)
|
13
13
|
method_source (1.0.0)
|
14
|
-
minitest (5.
|
14
|
+
minitest (5.18.0)
|
15
15
|
pry (0.13.1)
|
16
16
|
coderay (~> 1.1)
|
17
17
|
method_source (~> 1.0)
|
18
18
|
rake (13.0.1)
|
19
|
+
timecop (0.9.6)
|
19
20
|
tzinfo (2.0.2)
|
20
21
|
concurrent-ruby (~> 1.0)
|
21
22
|
tzinfo-data (1.2020.1)
|
@@ -30,6 +31,7 @@ DEPENDENCIES
|
|
30
31
|
minitest (~> 5.0)
|
31
32
|
pry (~> 0.13.1)
|
32
33
|
rake (~> 13.0.1)
|
34
|
+
timecop (~> 0.9)
|
33
35
|
|
34
36
|
BUNDLED WITH
|
35
|
-
2.
|
37
|
+
2.4.12
|
data/README.md
CHANGED
@@ -78,10 +78,11 @@ event_attributes = {
|
|
78
78
|
location: "20 W 34th St, New York, NY 10001",
|
79
79
|
url: "https://www.ruby-lang.org/en/",
|
80
80
|
description: "Join us to learn all about Ruby.",
|
81
|
-
add_url_to_description: true # defaults to true
|
81
|
+
add_url_to_description: true # defaults to true,
|
82
|
+
all_day: true # defaults to false
|
82
83
|
}
|
83
84
|
|
84
|
-
cal = AddToCalendar::URLs.new(event_attributes)
|
85
|
+
cal = AddToCalendar::URLs.new(**event_attributes)
|
85
86
|
```
|
86
87
|
|
87
88
|
| Attribute | Required? | Class | Notes |
|
@@ -93,7 +94,8 @@ cal = AddToCalendar::URLs.new(event_attributes)
|
|
93
94
|
| location | No | String | |
|
94
95
|
| url | No | String | Most providers do not have a native URL field. If you set `url` it will be added to the end of the description field (see `add_url_to_description`) |
|
95
96
|
| description | No | String | Accepts newlines by passing `\n` Eg. `"Join us for fun & drinks\n\nPS. Smart casual"` |
|
96
|
-
| add_url_to_description | No | true/false |
|
97
|
+
| add_url_to_description | No | true/false | Defaults to `true`. Set `add_url_to_description: false` to stop the URL from being added to the description |
|
98
|
+
| all_day | No | true/false | <ul><li>Defaults to `false`.</li><li>When set to `true` the times will be ignored.</li><li>If no end_datetime provided it will be a single day event.</li><li>When providing end_datetime, use the final day of the event (eg. 1 day event start: 2023-05-01, end: 2023-05-01; 3 day event start: 2023-05-01, end: 2023-05-03).</li><li>Some calendars require you to specify the _day after_ as the end date which feels counterintuitive, this Gem takes care of that for you.</li></ul> |
|
97
99
|
|
98
100
|
### Timezones and offsets
|
99
101
|
|
data/add_to_calendar.gemspec
CHANGED
data/lib/add_to_calendar.rb
CHANGED
@@ -13,8 +13,8 @@ module AddToCalendar
|
|
13
13
|
class Error < StandardError; end
|
14
14
|
|
15
15
|
class URLs
|
16
|
-
attr_accessor :start_datetime, :end_datetime, :title, :timezone, :location, :url, :description, :add_url_to_description
|
17
|
-
def initialize(start_datetime:, end_datetime: nil, title:, timezone:, location: nil, url: nil, description: nil, add_url_to_description: true)
|
16
|
+
attr_accessor :start_datetime, :end_datetime, :title, :timezone, :location, :url, :description, :add_url_to_description, :all_day
|
17
|
+
def initialize(start_datetime:, end_datetime: nil, title:, timezone:, location: nil, url: nil, description: nil, add_url_to_description: true, all_day: false)
|
18
18
|
@start_datetime = start_datetime
|
19
19
|
@end_datetime = end_datetime
|
20
20
|
@title = title
|
@@ -23,6 +23,7 @@ module AddToCalendar
|
|
23
23
|
@url = url
|
24
24
|
@description = description
|
25
25
|
@add_url_to_description = add_url_to_description
|
26
|
+
@all_day = all_day
|
26
27
|
|
27
28
|
validate_attributes
|
28
29
|
end
|
@@ -32,11 +33,7 @@ module AddToCalendar
|
|
32
33
|
calendar_url = "https://www.google.com/calendar/render?action=TEMPLATE"
|
33
34
|
params = {}
|
34
35
|
params[:text] = url_encode(title)
|
35
|
-
|
36
|
-
params[:dates] = "#{format_date_google(start_datetime)}/#{format_date_google(end_datetime)}"
|
37
|
-
else
|
38
|
-
params[:dates] = "#{format_date_google(start_datetime)}/#{format_date_google(start_datetime + 60*60)}" # end time is 1 hour later
|
39
|
-
end
|
36
|
+
params[:dates] = google_dates(start_datetime, end_datetime, all_day)
|
40
37
|
params[:ctz] = timezone.identifier
|
41
38
|
params[:location] = url_encode(location) if location
|
42
39
|
params[:details] = url_encode(description) if description
|
@@ -56,17 +53,28 @@ module AddToCalendar
|
|
56
53
|
end
|
57
54
|
|
58
55
|
def yahoo_url
|
59
|
-
# Eg. https://calendar.yahoo.com/?v=60&
|
60
|
-
calendar_url = "https://calendar.yahoo.com/?v=60
|
56
|
+
# Eg. https://calendar.yahoo.com/?v=60&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
|
57
|
+
calendar_url = "https://calendar.yahoo.com/?v=60"
|
61
58
|
params = {}
|
62
59
|
params[:title] = url_encode(title)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
60
|
+
if all_day
|
61
|
+
params[:st] = format_date(start_datetime)
|
62
|
+
if end_datetime
|
63
|
+
params[:et] = format_date(end_datetime)
|
64
|
+
else
|
65
|
+
params[:et] = format_date(start_datetime)
|
66
|
+
end
|
67
|
+
params[:dur] = "allday"
|
67
68
|
else
|
68
|
-
params[:
|
69
|
+
params[:st] = utc_datetime(start_datetime)
|
70
|
+
if end_datetime
|
71
|
+
seconds = duration_seconds(start_datetime, end_datetime)
|
72
|
+
params[:dur] = seconds_to_hours_minutes(seconds)
|
73
|
+
else
|
74
|
+
params[:dur] = "0100"
|
75
|
+
end
|
69
76
|
end
|
77
|
+
|
70
78
|
params[:desc] = url_encode(description) if description
|
71
79
|
if add_url_to_description && url
|
72
80
|
if params[:desc]
|
@@ -78,7 +86,7 @@ module AddToCalendar
|
|
78
86
|
params[:in_loc] = url_encode(location) if location
|
79
87
|
|
80
88
|
params.each do |key, value|
|
81
|
-
calendar_url << "&#{key}=#{value}"
|
89
|
+
calendar_url << "&#{yahoo_param(key)}=#{value}"
|
82
90
|
end
|
83
91
|
|
84
92
|
return calendar_url
|
@@ -97,13 +105,25 @@ module AddToCalendar
|
|
97
105
|
def ical_url
|
98
106
|
# Downloads a *.ics file provided as a data-uri
|
99
107
|
# 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"
|
100
|
-
calendar_url = "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0ABEGIN:VEVENT"
|
108
|
+
calendar_url = "data:text/calendar;charset=utf8,BEGIN:VCALENDAR%0AVERSION:2.0%0APRODID:-//AddToCalendar//RubyGem//EN%0ABEGIN:VEVENT"
|
109
|
+
|
101
110
|
params = {}
|
102
|
-
params[:
|
103
|
-
if
|
104
|
-
|
111
|
+
params[:DTSTAMP] = Time.now.strftime("%Y%m%dT%H%M%SZ")
|
112
|
+
if all_day
|
113
|
+
one_day = 1 * 24 * 60 * 60
|
114
|
+
params["DTSTART;VALUE=DATE"] = format_date(start_datetime)
|
115
|
+
if end_datetime
|
116
|
+
params["DTEND;VALUE=DATE"] = format_date(end_datetime + one_day)
|
117
|
+
else
|
118
|
+
params["DTEND;VALUE=DATE"] = format_date(start_datetime + one_day)
|
119
|
+
end
|
105
120
|
else
|
106
|
-
params[:
|
121
|
+
params[:DTSTART] = utc_datetime(start_datetime)
|
122
|
+
if end_datetime
|
123
|
+
params[:DTEND] = utc_datetime(end_datetime)
|
124
|
+
else
|
125
|
+
params[:DTEND] = utc_datetime(start_datetime + 60*60) # 1 hour later
|
126
|
+
end
|
107
127
|
end
|
108
128
|
params[:SUMMARY] = url_encode_ical(title)
|
109
129
|
params[:URL] = url_encode(url) if url
|
@@ -174,11 +194,22 @@ module AddToCalendar
|
|
174
194
|
end
|
175
195
|
params = {}
|
176
196
|
params[:subject] = url_encode(title.gsub(' & ', ' and '))
|
177
|
-
|
178
|
-
|
179
|
-
params[:
|
197
|
+
if all_day
|
198
|
+
one_day = 1 * 24 * 60 * 60
|
199
|
+
params[:startdt] = microsoft_date(start_datetime)
|
200
|
+
if end_datetime
|
201
|
+
params[:enddt] = microsoft_date(end_datetime + one_day)
|
202
|
+
else
|
203
|
+
params[:enddt] = microsoft_date(start_datetime + one_day)
|
204
|
+
end
|
205
|
+
params[:allday] = "true"
|
180
206
|
else
|
181
|
-
params[:
|
207
|
+
params[:startdt] = utc_datetime_microsoft(start_datetime)
|
208
|
+
if end_datetime
|
209
|
+
params[:enddt] = utc_datetime_microsoft(end_datetime)
|
210
|
+
else
|
211
|
+
params[:enddt] = utc_datetime_microsoft(start_datetime + 60*60) # 1 hour later
|
212
|
+
end
|
182
213
|
end
|
183
214
|
params[:body] = url_encode(newlines_to_html_br(description)) if description
|
184
215
|
if add_url_to_description && url
|
@@ -226,11 +257,34 @@ module AddToCalendar
|
|
226
257
|
|
227
258
|
return t.strftime('%Y-%m-%dT%H:%M:%SZ')
|
228
259
|
end
|
260
|
+
|
261
|
+
def microsoft_date(date)
|
262
|
+
date.strftime('%Y-%m-%d')
|
263
|
+
end
|
264
|
+
|
265
|
+
def google_dates(start_datetime, end_datetime, all_day)
|
266
|
+
one_day = 1 * 24 * 60 * 60
|
267
|
+
if all_day
|
268
|
+
if end_datetime
|
269
|
+
"#{format_date(start_datetime)}/#{format_date(end_datetime + one_day)}"
|
270
|
+
else
|
271
|
+
"#{format_date(start_datetime)}/#{format_date(start_datetime + one_day)}"
|
272
|
+
end
|
273
|
+
elsif end_datetime
|
274
|
+
"#{format_datetime_google(start_datetime)}/#{format_datetime_google(end_datetime)}"
|
275
|
+
else
|
276
|
+
"#{format_datetime_google(start_datetime)}/#{format_datetime_google(start_datetime + 60*60)}" # end time is 1 hour later
|
277
|
+
end
|
278
|
+
end
|
229
279
|
|
230
|
-
def
|
280
|
+
def format_datetime_google(start_datetime)
|
231
281
|
start_datetime.strftime('%Y%m%dT%H%M%S')
|
232
282
|
end
|
233
283
|
|
284
|
+
def format_date(date)
|
285
|
+
date.strftime('%Y%m%d')
|
286
|
+
end
|
287
|
+
|
234
288
|
def duration_seconds(start_time, end_time)
|
235
289
|
(start_time.to_i - end_time.to_i).abs
|
236
290
|
end
|
@@ -258,5 +312,13 @@ module AddToCalendar
|
|
258
312
|
end
|
259
313
|
}.join("\\n")
|
260
314
|
end
|
315
|
+
|
316
|
+
def yahoo_param(key)
|
317
|
+
if key == :in_loc
|
318
|
+
key.to_s
|
319
|
+
else
|
320
|
+
key.to_s.upcase
|
321
|
+
end
|
322
|
+
end
|
261
323
|
end
|
262
|
-
end
|
324
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jared Turner
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: tzinfo
|
@@ -100,6 +100,20 @@ dependencies:
|
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: 0.13.1
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: timecop
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.9'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0.9'
|
103
117
|
description:
|
104
118
|
email:
|
105
119
|
- jaredlt01@gmail.com
|
@@ -142,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
156
|
- !ruby/object:Gem::Version
|
143
157
|
version: '0'
|
144
158
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
159
|
+
rubygems_version: 3.3.26
|
146
160
|
signing_key:
|
147
161
|
specification_version: 4
|
148
162
|
summary: Generate 'Add To Calendar' URLs for Android, Apple, Google, Office 365, Outlook,
|