icalPal 1.1.2 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -2
- data/bin/icalPal +22 -14
- data/icalPal.gemspec +4 -2
- data/lib/ToICalPal.rb +1 -1
- data/lib/defaults.rb +3 -3
- data/lib/event.rb +17 -6
- data/lib/options.rb +2 -3
- data/lib/rdt.rb +4 -2
- metadata +23 -34
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4c83cdb34723fcb8765291ee5724c3a3521d32aa268649631b2ae6e0d597c13
|
4
|
+
data.tar.gz: 54c399338c62d6ee482ad5240ede35b0b86b7d796320ec95bc6076485e672365
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d284b817b3c49f1db9ca67920ccced88a4b0c1247b3137a590568f388b60f9b5e79af493cc16f6384a7d7ae09de16f3e578851cf184df9bcc16e8bf8ab8bef53
|
7
|
+
data.tar.gz: 716a3c40617e47413ce661157e0bface4671b0b400b1fad3f4bdf0b084d1fc4a9c75f88dfb05a89928749355cce56984692c6e740fd196820a8cb03f06c643aa
|
data/README.md
CHANGED
@@ -181,7 +181,9 @@ to mimic icalBuddy as much as possible.
|
|
181
181
|
CSV, Hash, JSON, and YAML print all fields for all items in their
|
182
182
|
respective formats. From that you can analyze the results any way you like.
|
183
183
|
|
184
|
-
|
184
|
+
Remind format uses a minimal implementation built in icalPal.
|
185
|
+
|
186
|
+
Other formats such as ANSI, HTML, Markdown, RDoc, and TOC, use Ruby's
|
185
187
|
[RDoc::Markup](https://ruby-doc.org/stdlib-2.6.10/libdoc/rdoc/rdoc/RDoc/Markup.html)
|
186
188
|
framework to build and render the items.
|
187
189
|
|
@@ -207,5 +209,5 @@ objects, one for each of the item's properties:
|
|
207
209
|
|
208
210
|
The document will also include a number of
|
209
211
|
[RDoc::Markup::Verbatim](https://ruby-doc.org/stdlib-2.6.10/libdoc/rdoc/rdoc/RDoc/Markup/Verbatim.html)
|
210
|
-
items.
|
212
|
+
items. They are not included in the output, but are used to pass
|
211
213
|
information about the item and property to the default formatter.
|
data/bin/icalPal
CHANGED
@@ -40,8 +40,10 @@ $log.info("Options: #{$opts}")
|
|
40
40
|
# Add an item to the list
|
41
41
|
#
|
42
42
|
# @param item[Object]
|
43
|
+
|
43
44
|
def add(item)
|
44
|
-
$log.
|
45
|
+
$log.info("Adding #{item.inspect} #{item['UUID']} (#{item['title']})") if item['UUID']
|
46
|
+
|
45
47
|
item['sday'] = ICalPal::RDT.new(*item['sdate'].to_a[0..2]) if item['sdate']
|
46
48
|
$items.push(item)
|
47
49
|
end
|
@@ -117,6 +119,7 @@ end
|
|
117
119
|
begin
|
118
120
|
$items.sort_by! { |i| [ i[$opts[:sep]], i[$opts[:sort]], i['sdate'] ] }
|
119
121
|
$items.reverse! if $opts[:reverse]
|
122
|
+
$items.uniq!
|
120
123
|
rescue ArgumentError => e
|
121
124
|
$log.warn("Sorting failed, results may be unexpected\n")
|
122
125
|
end
|
@@ -143,19 +146,24 @@ items = $items[0..$opts[:li] - 1]
|
|
143
146
|
|
144
147
|
unless mu
|
145
148
|
puts case $opts[:output]
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
149
|
+
when 'csv' then
|
150
|
+
o = {
|
151
|
+
headers: items[0].keys,
|
152
|
+
write_converters: proc { |f| f.respond_to?(:gsub)? f.gsub(/\n/, '\n') : f },
|
153
|
+
write_headers: true,
|
154
|
+
}
|
155
|
+
|
156
|
+
CSV.generate(o) { |k| items.each { |i| k << i.values.map { |v| v.to_s } } }
|
157
|
+
when 'hash' then items.map { |i| i.self }
|
158
|
+
when 'json' then items.map { |i| i.self }.to_json
|
159
|
+
when 'yaml' then items.map { |i| i.self }.to_yaml
|
160
|
+
when 'remind' then items.map { |i|
|
161
|
+
"REM #{i['sdate'].strftime('%F AT %R')} " +
|
162
|
+
"DURATION #{((i['edate'] - i['sdate']).to_f * 1440).to_i } " +
|
163
|
+
"MSG #{i['title']}"
|
164
|
+
}.join("\n")
|
165
|
+
else abort "No formatter for #{$opts[:output]}"
|
166
|
+
end
|
159
167
|
|
160
168
|
exit
|
161
169
|
end
|
data/icalPal.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "icalPal"
|
3
|
-
s.version = "1.1.
|
3
|
+
s.version = "1.1.4"
|
4
4
|
s.summary = "Command-line tool to query the macOS Calendar"
|
5
5
|
s.description = <<-EOF
|
6
6
|
Inspired by icalBuddy and maintains close compatability. Includes
|
@@ -10,12 +10,14 @@ EOF
|
|
10
10
|
s.authors = "Andy Rosen"
|
11
11
|
s.email = "ajr@corp.mlfs.org"
|
12
12
|
s.homepage = "https://github.com/ajrosen/#{s.name}"
|
13
|
-
s.licenses = [ "GPL-3.0
|
13
|
+
s.licenses = [ "GPL-3.0-or-later" ]
|
14
14
|
|
15
15
|
s.files = Dir[ "#{s.name}.gemspec", "bin/*", "lib/*.rb" ]
|
16
16
|
s.executables = [ "#{s.name}" ]
|
17
17
|
s.extra_rdoc_files = [ "README.md" ]
|
18
18
|
|
19
|
+
s.add_runtime_dependency "sqlite3", "~> 1"
|
20
|
+
|
19
21
|
s.bindir = 'bin'
|
20
22
|
s.required_ruby_version = '>= 2.6.0'
|
21
23
|
end
|
data/lib/ToICalPal.rb
CHANGED
data/lib/defaults.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# Does anybody really know what time it is?
|
2
2
|
$now = ICalPal::RDT.now
|
3
|
-
$today = ICalPal::RDT.new(*$now.to_a[0..2])
|
3
|
+
$today = ICalPal::RDT.new(*$now.to_a[0..2] + [0, 0, 0, $now.zone])
|
4
4
|
|
5
5
|
# Defaults
|
6
6
|
$defaults = {
|
7
7
|
common: {
|
8
8
|
aep: [],
|
9
|
-
|
9
|
+
bullet: '•',
|
10
10
|
cf: "#{ENV['HOME']}/.icalPal",
|
11
11
|
color: false,
|
12
12
|
db: "#{ENV['HOME']}/Library/Calendars/Calendar.sqlitedb",
|
@@ -29,7 +29,7 @@ $defaults = {
|
|
29
29
|
sp: false,
|
30
30
|
},
|
31
31
|
tasks: {
|
32
|
-
|
32
|
+
bullet: '!',
|
33
33
|
iep: [ 'notes', 'due', 'priority' ],
|
34
34
|
sort: 'priority',
|
35
35
|
},
|
data/lib/event.rb
CHANGED
@@ -3,6 +3,11 @@ module ICalPal
|
|
3
3
|
class Event
|
4
4
|
include ICalPal
|
5
5
|
|
6
|
+
def []=(k, v)
|
7
|
+
@self[k] = v
|
8
|
+
@self['sday'] = ICalPal::RDT.new(*self['sdate'].to_a[0..2]) if k == 'sdate'
|
9
|
+
end
|
10
|
+
|
6
11
|
# Standard accessor with special handling for +age+,
|
7
12
|
# +availability+, +datetime+, +location+, +notes+, +status+,
|
8
13
|
# +title+, and +uid+
|
@@ -35,6 +40,9 @@ module ICalPal
|
|
35
40
|
when 'notes' then # \n -> :nnr
|
36
41
|
@self['notes']? @self['notes'].strip.gsub(/\n/, $opts[:nnr]) : nil
|
37
42
|
|
43
|
+
when 'sday' then # pseudo-property
|
44
|
+
ICalPal::RDT.new(*@self['sdate'].to_a[0..2])
|
45
|
+
|
38
46
|
when 'status' then # Integer -> String
|
39
47
|
EventKit::EKEventStatus.select { |k, v| v == @self['status'] }.keys[0]
|
40
48
|
|
@@ -77,14 +85,15 @@ module ICalPal
|
|
77
85
|
@self["#{k[0]}date"] = RDT.new(*t.to_a.reverse[4..], t.zone) if t
|
78
86
|
end
|
79
87
|
|
80
|
-
obj['type'] = EventKit::EKSourceType.find_index { |i| i[:name] == 'Subscribed' } if obj['subcal_url']
|
81
|
-
type = EventKit::EKSourceType[obj['type']]
|
82
|
-
|
83
88
|
if @self['start_tz'] == '_float'
|
84
89
|
@self['sdate'] = RDT.new(*(@self['sdate'].to_time - Time.zone_offset($now.zone())).to_a.reverse[4..], $now.zone)
|
85
90
|
@self['edate'] = RDT.new(*(@self['edate'].to_time - Time.zone_offset($now.zone())).to_a.reverse[4..], $now.zone)
|
86
91
|
end
|
87
92
|
|
93
|
+
# Type of calendar event is from
|
94
|
+
obj['type'] = EventKit::EKSourceType.find_index { |i| i[:name] == 'Subscribed' } if obj['subcal_url']
|
95
|
+
type = EventKit::EKSourceType[obj['type']]
|
96
|
+
|
88
97
|
@self['symbolic_color_name'] ||= @self['color']
|
89
98
|
@self['type'] = type[:name]
|
90
99
|
end
|
@@ -130,7 +139,6 @@ module ICalPal
|
|
130
139
|
unless @self['xdate'].any?(@self['sdate']) # Exceptions?
|
131
140
|
o = get_occurrences(changes)
|
132
141
|
o.each { |r| retval.push(r) if in_window?(r['sdate'], r['edate']) }
|
133
|
-
|
134
142
|
end
|
135
143
|
|
136
144
|
apply_frequency!
|
@@ -145,6 +153,9 @@ module ICalPal
|
|
145
153
|
|
146
154
|
# @return a deep clone of self
|
147
155
|
def clone()
|
156
|
+
self['stime'] = @self['sdate'].to_i
|
157
|
+
self['etime'] = @self['edate'].to_i
|
158
|
+
|
148
159
|
Marshal.load(Marshal.dump(self))
|
149
160
|
end
|
150
161
|
|
@@ -190,14 +201,14 @@ module ICalPal
|
|
190
201
|
self['sdate'] = RDT.new(*ndate.to_a[0..2], *self['sdate'].to_a[3..])
|
191
202
|
self['edate'] = RDT.new(*ndate.to_a[0..2], *self['edate'].to_a[3..])
|
192
203
|
retval.push(clone)
|
193
|
-
}) { |i| @self['
|
204
|
+
}) { |i| @self['sday'] == i['sday'] }
|
194
205
|
end
|
195
206
|
|
196
207
|
# Check for changes
|
197
208
|
changes.detect(
|
198
209
|
proc {
|
199
210
|
retval.push(clone)
|
200
|
-
}) { |i| @self['
|
211
|
+
}) { |i| @self['sday'] == i['sday'] } unless retval.count.positive?
|
201
212
|
|
202
213
|
retval
|
203
214
|
end
|
data/lib/options.rb
CHANGED
@@ -23,7 +23,7 @@ module ICalPal
|
|
23
23
|
@op = OptionParser.new
|
24
24
|
@op.summary_width = 23
|
25
25
|
@op.banner += " [-c] COMMAND"
|
26
|
-
@op.version = '1.
|
26
|
+
@op.version = '1.1.4'
|
27
27
|
|
28
28
|
@op.accept(ICalPal::RDT) { |s| ICalPal::RDT.conv(s) }
|
29
29
|
|
@@ -134,7 +134,6 @@ module ICalPal
|
|
134
134
|
|
135
135
|
@op.separator('')
|
136
136
|
@op.on('-b', '--ab=STRING', String, 'Use STRING for bullets')
|
137
|
-
@op.on('--nb', 'Do not use bullets')
|
138
137
|
@op.on('--nnr=SEPARATOR', String, 'Set replacement for newlines within notes')
|
139
138
|
|
140
139
|
@op.separator('')
|
@@ -256,7 +255,7 @@ module ICalPal
|
|
256
255
|
COMMANDS = %w{events eventsToday eventsNow calendars accounts stores}
|
257
256
|
|
258
257
|
# Supported output formats
|
259
|
-
OUTFORMATS = %w{ansi csv default hash html json md rdoc toc yaml}
|
258
|
+
OUTFORMATS = %w{ansi csv default hash html json md rdoc toc yaml remind}
|
260
259
|
|
261
260
|
private
|
262
261
|
|
data/lib/rdt.rb
CHANGED
@@ -29,7 +29,9 @@ module ICalPal
|
|
29
29
|
def to_s
|
30
30
|
return strftime($opts[:df]) if $opts[:nrd] && $opts[:df]
|
31
31
|
|
32
|
-
|
32
|
+
d1 = RDT.new(year, month, day)
|
33
|
+
|
34
|
+
case Integer(d1 - $today)
|
33
35
|
when -2 then 'day before yesterday'
|
34
36
|
when -1 then 'yesterday'
|
35
37
|
when 0 then 'today'
|
@@ -40,7 +42,7 @@ module ICalPal
|
|
40
42
|
end
|
41
43
|
|
42
44
|
alias inspect to_s
|
43
|
-
|
45
|
+
|
44
46
|
# @see Time.to_a
|
45
47
|
#
|
46
48
|
# @return [Array] Self as an array
|
metadata
CHANGED
@@ -1,40 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: icalPal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Rosen
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
8z1Sp3Nv8IYOpTc11nDoNCtKHMffd+tKH0nIvp3lGaYfVYJsCfuT56pqmgZiR50S
|
28
|
-
QmlfH+EPXjTlrtg6VJPFzxflqrb4kl+Eaxt67RYbOgVgviXfue2ytKywxnyWGML6
|
29
|
-
EeA+y656Lalvu5XfjLuuqYLIUDJ+jyZDjTsDbUkzPbC/y1i0z4KycRnzETCSryvN
|
30
|
-
HI40svbvW9H+OT3D381Hvk760soXcLgrLA1hz5XQwDBFs7N/U7PeztxuurOw4NOb
|
31
|
-
ctKe1VpldN1JTHdz6u7TAGy0NjC86DF05fvAsEn1baKVZz5P+2OG2FEc+4NWa8/T
|
32
|
-
+v11ZpnzUfxx2TyCM1hTTaphxjAWEYeeylK+ozjZCopJLNkw6uXuni6TrUUQWRAs
|
33
|
-
PDmWrfNO9LeQhiYLyVsOQ1xuWKDF0acQFAVIZctRp4VuZZMVqis4FRmqMdZcB/R2
|
34
|
-
HaQXi3DWVibRuVZ3N77DWUKG
|
35
|
-
-----END CERTIFICATE-----
|
36
|
-
date: 2023-04-06 00:00:00.000000000 Z
|
37
|
-
dependencies: []
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-02-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sqlite3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1'
|
38
27
|
description: |
|
39
28
|
Inspired by icalBuddy and maintains close compatability. Includes
|
40
29
|
many additional features for querying, filtering, and formatting.
|
@@ -59,9 +48,9 @@ files:
|
|
59
48
|
- lib/store.rb
|
60
49
|
homepage: https://github.com/ajrosen/icalPal
|
61
50
|
licenses:
|
62
|
-
- GPL-3.0
|
51
|
+
- GPL-3.0-or-later
|
63
52
|
metadata: {}
|
64
|
-
post_install_message:
|
53
|
+
post_install_message:
|
65
54
|
rdoc_options: []
|
66
55
|
require_paths:
|
67
56
|
- lib
|
@@ -76,8 +65,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
65
|
- !ruby/object:Gem::Version
|
77
66
|
version: '0'
|
78
67
|
requirements: []
|
79
|
-
rubygems_version: 3.4
|
80
|
-
signing_key:
|
68
|
+
rubygems_version: 3.5.4
|
69
|
+
signing_key:
|
81
70
|
specification_version: 4
|
82
71
|
summary: Command-line tool to query the macOS Calendar
|
83
72
|
test_files: []
|
checksums.yaml.gz.sig
DELETED
Binary file
|
data.tar.gz.sig
DELETED
Binary file
|
metadata.gz.sig
DELETED
Binary file
|