icalPal 1.1.3 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6df02cd393c1f6c4e11afcd99519b50014bfd5205b248cb7fafbfe15392293b8
4
- data.tar.gz: 3ef6ee87c41ea05aaef02faba595801070b420450b9ef05e62996339df93506d
3
+ metadata.gz: d82c766cc60d3f3948fe128bfb0649085da7e3f69c555f9b887ca06147dcba3b
4
+ data.tar.gz: b812180b65bffd342393a94553b076e51aa9a04a2359004c56e8e7d62db61d7e
5
5
  SHA512:
6
- metadata.gz: aaf7e02978bdd9bc596dbe720c6560c53e57e6f79bd98538d417a9880c020f25df0197f77a1a34101455518804dd5409788df2d7f3e1bb76573118f77a040363
7
- data.tar.gz: a1d3435ecad3586f7e5568ebd74dae1d7cc97786f20c613808a73b1ab8e3342d0963cc9eed7002cecb71e63784d80cef26bc6025cc6d22649552ba887c04c6e7
6
+ metadata.gz: 475339980a6262307c89e9ef4f086a642cd80508644533b25c94146e001eaffb3819d6fc2f919355b7347ed2eb267dad9a91b0352bdf298f9e94c1560247d824
7
+ data.tar.gz: da57c32c4a1377cb85d62bfec2bba0d517ae6203badecc37408d1172d6b301ac9cf37b7f82e839e824a01a57c032d21299bda9be8ee383ceefef7e68613c670f
data/README.md CHANGED
@@ -69,7 +69,7 @@ Global options:
69
69
  --db=DB Use DB file instead of Calendar
70
70
  --cf=FILE Set config file path (default: $HOME/.icalPal)
71
71
  -o, --output=FORMAT Print as FORMAT (default: default)
72
- [ansi, csv, default, hash, html, json, md, rdoc, toc, yaml]
72
+ [ansi, csv, default, hash, html, json, md, rdoc, toc, yaml, remind]
73
73
 
74
74
  Including/excluding calendars:
75
75
 
@@ -132,7 +132,7 @@ Formatting the output:
132
132
  --tf=FORMAT Set time format
133
133
  See https://ruby-doc.org/stdlib-2.6.1/libdoc/date/rdoc/DateTime.html#method-i-strftime for details
134
134
 
135
- -b, --ab=STRING Use STRING for bullets
135
+ -b, --bullet=STRING Use STRING for bullets
136
136
  --nnr=SEPARATOR Set replacement for newlines within notes
137
137
 
138
138
  -f Format output using standard ANSI colors
@@ -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
- All other formats, ANSI, HTML, Markdown, RDoc, and TOC, use Ruby's
184
+ [Remind](https://dianne.skoll.ca/projects/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. The are not included in the output, but are used to pass
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
@@ -17,11 +17,11 @@ require_relative '../lib/options'
17
17
  # Load options
18
18
 
19
19
  # All kids love log!
20
- $log = Logger.new(STDERR, { datetime_format: '%H:%M:%S.%L', level: $defaults[:common][:debug] })
20
+ $log = Logger.new(STDERR, { level: $defaults[:common][:debug] })
21
21
  $log.formatter = proc do |s, t, p, m| # Severity, time, progname, msg
22
22
  ($log.level.positive?)? "#{s}: #{m}\n" :
23
23
  "[%-5s] %s [%s] - %s\n" %
24
- [ s, t.strftime($log.datetime_format), caller(4, 1)[0].split('/')[-1], m ]
24
+ [ s, t.strftime('%H:%M:%S.%L'), caller(4, 1)[0].split('/')[-1], m ]
25
25
  end
26
26
 
27
27
  $opts = ICalPal::Options.new.parse_options
@@ -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.debug("Adding #{item['UUID']} (#{item['title']})") if item['UUID']
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,22 +146,24 @@ items = $items[0..$opts[:li] - 1]
143
146
 
144
147
  unless mu
145
148
  puts case $opts[:output]
146
- when 'csv' then
147
- o = {
148
- headers: items[0].keys,
149
- write_converters: proc { |f| f.respond_to?(:gsub)? f.gsub(/\n/, '\n') : f },
150
- write_headers: true,
151
- }
152
-
153
- CSV.generate(o) { |k| items.each { |i| k << i.values.map { |v| v.to_s } } }
154
- when 'hash' then items.map { |i| i.self }
155
- when 'json' then items.map { |i| i.self }.to_json
156
- when 'yaml' then items.map { |i| i.self }.to_yaml
157
- when 'remind' then items.map { |i|
158
- "REM #{i['sdate'].strftime('%F@%T')} MSG #{i['title']}\n"
159
- }.join
160
- else abort "No formatter for #{$opts[:output]}"
161
- end
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
162
167
 
163
168
  exit
164
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"
3
+ s.version = "1.1.5"
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
@@ -67,7 +67,7 @@ class RDoc::Markup::ToICalPal < RDoc::Markup::Formatter
67
67
  rescue
68
68
  end
69
69
 
70
- @res << "#{@opts[:bullet]} "
70
+ @res << "#{@opts[:bullet]} " unless @opts[:nb]
71
71
  end
72
72
 
73
73
  # Add a property name
data/lib/defaults.rb CHANGED
@@ -1,6 +1,6 @@
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 = {
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['sdate'].to_i == i['orig_date'] + ITIME }
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['sdate'].to_i == i['orig_date'] + ITIME } unless retval.count.positive?
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.1.3'
26
+ @op.version = '1.1.5'
27
27
 
28
28
  @op.accept(ICalPal::RDT) { |s| ICalPal::RDT.conv(s) }
29
29
 
@@ -133,7 +133,8 @@ module ICalPal
133
133
  'See https://ruby-doc.org/stdlib-2.6.1/libdoc/date/rdoc/DateTime.html#method-i-strftime for details')
134
134
 
135
135
  @op.separator('')
136
- @op.on('-b', '--ab=STRING', String, 'Use STRING for bullets')
136
+ @op.on('-b', '--bullet=STRING', String, 'Use STRING for bullets')
137
+ @op.on('--nb', 'Do not use bullets')
137
138
  @op.on('--nnr=SEPARATOR', String, 'Set replacement for newlines within notes')
138
139
 
139
140
  @op.separator('')
data/lib/rdt.rb CHANGED
@@ -29,9 +29,7 @@ module ICalPal
29
29
  def to_s
30
30
  return strftime($opts[:df]) if $opts[:nrd] && $opts[:df]
31
31
 
32
- d1 = RDT.new(year, month, day)
33
-
34
- case Integer(d1 - $today)
32
+ case Integer(RDT.new(year, month, day) - $today)
35
33
  when -2 then 'day before yesterday'
36
34
  when -1 then 'yesterday'
37
35
  when 0 then 'today'
@@ -42,7 +40,7 @@ module ICalPal
42
40
  end
43
41
 
44
42
  alias inspect to_s
45
-
43
+
46
44
  # @see Time.to_a
47
45
  #
48
46
  # @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.3
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Rosen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
- cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIID/jCCAmagAwIBAgIBBDANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBphanIv
14
- REM9Y29ycC9EQz1tbGZzL0RDPW9yZzAeFw0yMzAyMjMyMDEzMjBaFw0yNDAyMjMy
15
- MDEzMjBaMCUxIzAhBgNVBAMMGmFqci9EQz1jb3JwL0RDPW1sZnMvREM9b3JnMIIB
16
- ojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAqQ2xCUJ4wY8WujSzYd3OGTbj
17
- JDMeU44pXOTLc49Rs8ydukGfd0YBvYMzifmiVRj6depGx2+Ln28Y2mT6IB+zHq8X
18
- s1lrMdFCReztJjQ7OYS16YcZ6pmLkYClnHN3VNqayk1lQEJGCr8aawMeroSB01om
19
- d5wqDATnKEG3x4bnlxFJb3LHzUG1CgNuVCuNREi8zN/uYdm2MGe1fTJguy4/vzBQ
20
- /FnAMt1mr3LtM6YZRGaitIlOKBV/08v7fjH31KRmSMMHPq6A+WyWKRNKnK3tHpSN
21
- JbnFW7mFQGtBpfh8zY8OCQ76Aw8cb5bEIPTI+Hd4FoJLPKnexTI28endSLigOUCF
22
- 76kLOiVOVOjdqZ8vEdSgWVugEAzIC30xW5b8yD6N7GdT7n3ktgoZu7jZMUW3D6PQ
23
- wS6BaABVsXbeVtFrzK2tQ65EwLfRluRLTfbnQ7qvMIYCwC3Ib9DTMLavCiOot1vc
24
- RBWXIrDex0tt3EN0dDIxP9O+7ciDgM4zPe6BvaF/AgMBAAGjOTA3MAkGA1UdEwQC
25
- MAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBRDowzw+kmcX6FV7T9BkQsUgmzLZjAN
26
- BgkqhkiG9w0BAQsFAAOCAYEAV5j0cxPzFyLXyohgiT0DsruPVcNuICp+gcZ1xSeF
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-07-21 00:00:00.000000000 Z
37
- dependencies: []
10
+ cert_chain: []
11
+ date: 2024-03-16 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.15
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