icalPal 1.0.2 → 1.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c99019fe1ea3b8cf003d5c153873acbfdd6a03c7ae21cf17d7c17d448c3a12de
4
- data.tar.gz: 3b7d9807aaf4189a99afdebe12c561138bfbebfc5a4faba22cf5b97e4453c86d
3
+ metadata.gz: 8950d0b14f9309fd520aba9eb995c55903cdad42171b32582188f94c66e3f0c3
4
+ data.tar.gz: ca6c0377e5215300dead2823200e4a3383a510c18e5b9077f403acfe87d950aa
5
5
  SHA512:
6
- metadata.gz: 93d335a0254948ac0ba398b2166592fa9098c9e1d903216cc09e9073ec032e2dab80048f50d687b097ab01ae11c96bc906e284dfa0cf5b1751b10d8ee01af1e7
7
- data.tar.gz: 69608d4a99241f863083db2ccb66c40da5ceae96d53f28d2f3b0b532200d856407d7f8ccdf53d465ef48a4679f2faf92d8a15b6740ce3ae0ab3110e1d43c1512
6
+ metadata.gz: 1580173a395e45c255d25e755a87cd18666f87f7d30803fd98ce4d74b52b6bd149650744294bcc2d41fd267471636b6c04563e47f694a4624a41dec712609885
7
+ data.tar.gz: 0370bc4bada2cfa8b221017e78edad0467a58a55132e646a7b64ac770743a61b1ef9b8a85413f05a6876360cf7c0d3e7d1d29551b5d827138eb4d4273648fbad
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -16,8 +16,6 @@ gem install icalPal
16
16
  icalPal events
17
17
  ```
18
18
 
19
- A [Homebrew](https://brew.sh) formula is in the works.
20
-
21
19
  ## Features
22
20
 
23
21
  ### Compatability with [icalBuddy](https://github.com/ali-rantakari/icalBuddy)
data/bin/icalPal CHANGED
@@ -124,7 +124,6 @@ end
124
124
  # Configure formatting
125
125
  mu = case $opts[:output]
126
126
  when 'ansi' then RDoc::Markup::ToAnsi.new
127
- when 'csv' then proc { |f| f.respond_to?(:gsub)? f.gsub(/\n/, '\n') : f }
128
127
  when 'default' then RDoc::Markup::ToICalPal.new($opts)
129
128
  when 'html' then
130
129
  rdoc = RDoc::Options.new
@@ -140,65 +139,76 @@ mu = case $opts[:output]
140
139
  ##################################################
141
140
  # Print the data
142
141
 
142
+ items = $items[0..$opts[:li] - 1]
143
+
144
+ unless mu
145
+ 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
+ else abort "No formatter for #{$opts[:output]}"
158
+ end
159
+
160
+ exit
161
+ end
162
+
143
163
  section = nil if $opts[:sep]
144
164
 
145
- $items.each_with_index do |i, j|
165
+ items.each_with_index do |i, j|
146
166
  # --li
147
167
  break if $opts[:li].positive? && j >= $opts[:li]
148
168
 
149
- case $opts[:output]
150
- when 'csv' then
151
- values = i.values.map { |v| v.to_s }
152
- puts CSV.generate(write_converters: mu) { |k| k << i.keys } unless j.positive?
153
- puts CSV.generate(write_converters: mu) { |k| k << values }
154
- when 'hash' then p i.self
155
- when 'json' then puts i.self.to_json
156
- when 'yaml' then puts i.self.to_yaml
157
- else
158
- doc = RDoc::Markup::Document.new
169
+ doc = RDoc::Markup::Document.new
159
170
 
160
- # Sections
161
- if $opts[:sep] && section != i[$opts[:sep]]
162
- $log.debug("Section: #{i[$opts[:sep]]}")
171
+ # Sections
172
+ if $opts[:sep] && section != i[$opts[:sep]]
173
+ $log.debug("Section: #{i[$opts[:sep]]}")
163
174
 
164
- v = RDoc::Markup::Verbatim.new
165
- v.format = { item: i, prop: $opts[:sep] }
166
- doc << v
175
+ v = RDoc::Markup::Verbatim.new
176
+ v.format = { item: i, prop: $opts[:sep] }
177
+ doc << v
167
178
 
168
- doc << RDoc::Markup::BlankLine.new if j.positive?
169
- doc << RDoc::Markup::Heading.new(1, i[$opts[:sep]].to_s)
170
- doc << RDoc::Markup::Rule.new(0)
179
+ doc << RDoc::Markup::BlankLine.new if j.positive?
180
+ doc << RDoc::Markup::Heading.new(1, i[$opts[:sep]].to_s)
181
+ doc << RDoc::Markup::Rule.new(0)
171
182
 
172
- section = i[$opts[:sep]]
173
- end
183
+ section = i[$opts[:sep]]
184
+ end
174
185
 
175
- # Item
176
- props = RDoc::Markup::List.new(:BULLET)
186
+ # Item
187
+ props = RDoc::Markup::List.new(:BULLET)
177
188
 
178
- # Properties
179
- $opts[:props].each_with_index do |prop, k|
180
- next unless i[prop]
181
- next if Array === i[prop] && !i[prop][0]
189
+ # Properties
190
+ $opts[:props].each_with_index do |prop, k|
191
+ next unless i[prop]
192
+ next if Array === i[prop] && !i[prop][0]
182
193
 
183
- $log.debug("#{prop}: #{i[prop]}")
194
+ $log.debug("#{prop}: #{i[prop]}")
184
195
 
185
- v = RDoc::Markup::Verbatim.new
186
- v.format = { item: i, prop: prop }
187
- props << v
196
+ v = RDoc::Markup::Verbatim.new
197
+ v.format = { item: i, prop: prop }
198
+ props << v
188
199
 
189
- unless k.positive?
190
- # First property, value only
191
- props << RDoc::Markup::Heading.new(2, i[prop].to_s)
192
- else
193
- props << RDoc::Markup::BlankLine.new unless (i['placeholder'] || $opts[:ps])
194
- props << RDoc::Markup::ListItem.new(prop, RDoc::Markup::Paragraph.new(i[prop]))
195
- end
200
+ unless k.positive?
201
+ # First property, value only
202
+ props << RDoc::Markup::Heading.new(2, i[prop].to_s)
203
+ else
204
+ props << RDoc::Markup::BlankLine.new unless (i['placeholder'] || $opts[:ps])
205
+ props << RDoc::Markup::ListItem.new(prop, RDoc::Markup::Paragraph.new(i[prop]))
196
206
  end
207
+ end
197
208
 
198
- # Print it
199
- unless props.empty?
200
- doc << props
201
- puts doc.accept(mu)
202
- end
209
+ # Print it
210
+ unless props.empty?
211
+ doc << props
212
+ puts doc.accept(mu)
203
213
  end
204
214
  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.0.2"
3
+ s.version = "1.1.1"
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
data/lib/event.rb CHANGED
@@ -95,8 +95,10 @@ module ICalPal
95
95
 
96
96
  # Repeat for multi-day events
97
97
  ((self['duration'] / 86400).to_i + 1).times do |i|
98
- retval.push(Marshal.load(Marshal.dump(self))) if in_window?(self['sdate'])
98
+ self['daynum'] = i + 1
99
+ retval.push(clone) if in_window?(self['sdate'])
99
100
  self['sdate'] += 1
101
+ self['edate'] += 1
100
102
  end
101
103
 
102
104
  retval
@@ -118,12 +120,13 @@ module ICalPal
118
120
 
119
121
  i = 1
120
122
  while self['sdate'] <= stop
123
+ return(retval) if self['count'].positive? && i > self['count']
124
+ i += 1
125
+
121
126
  unless @self['xdate'].any?(@self['sdate']) # Exceptions?
122
127
  o = get_occurrences(changes)
123
128
  o.each { |r| retval.push(r) if in_window?(r['sdate'], r['edate']) }
124
129
 
125
- i += 1
126
- return(retval) if self['count'].positive? && i > self['count']
127
130
  end
128
131
 
129
132
  apply_frequency!
@@ -136,6 +139,13 @@ module ICalPal
136
139
 
137
140
  # @!visibility public
138
141
 
142
+ # @return a deep clone of self
143
+ def clone()
144
+ self['stime'] = self['sdate'].to_i
145
+ self['etime'] = self['edate'].to_i
146
+ Marshal.load(Marshal.dump(self))
147
+ end
148
+
139
149
  # Get next occurences of a recurring event
140
150
  #
141
151
  # @param changes [Array] Recurrence changes for the event
@@ -177,14 +187,14 @@ module ICalPal
177
187
  proc {
178
188
  self['sdate'] = RDT.new(*ndate.to_a[0..2], *self['sdate'].to_a[3..])
179
189
  self['edate'] = RDT.new(*ndate.to_a[0..2], *self['edate'].to_a[3..])
180
- retval.push(Marshal.load(Marshal.dump(self)))
190
+ retval.push(clone)
181
191
  }) { |i| @self['sdate'].to_i == i['orig_date'] + ITIME }
182
192
  end
183
193
 
184
194
  # Check for changes
185
195
  changes.detect(
186
196
  proc {
187
- retval.push(Marshal.load(Marshal.dump(self)))
197
+ retval.push(clone)
188
198
  }) { |i| @self['sdate'].to_i == i['orig_date'] + ITIME } unless retval.count.positive?
189
199
 
190
200
  retval
@@ -238,6 +248,7 @@ CalendarItem.availability,
238
248
  CalendarItem.conference_url_detected,
239
249
  CalendarItem.description AS notes,
240
250
  CalendarItem.has_recurrences,
251
+ CalendarItem.invitation_status,
241
252
  CalendarItem.orig_item_id,
242
253
  CalendarItem.rowid,
243
254
  CalendarItem.start_tz,
@@ -258,7 +269,9 @@ Recurrence.count,
258
269
  CAST(Recurrence.end_date AS INT) AS rend_date,
259
270
  Recurrence.frequency,
260
271
  Recurrence.interval,
261
- Recurrence.specifier
272
+ Recurrence.specifier,
273
+
274
+ min(Alarm.trigger_interval) AS trigger_interval
262
275
 
263
276
  FROM Store
264
277
 
@@ -268,7 +281,7 @@ JOIN CalendarItem ON CalendarItem.calendar_id = Calendar.rowid
268
281
  LEFT OUTER JOIN Location ON Location.rowid = CalendarItem.location_id
269
282
  LEFT OUTER JOIN Recurrence ON Recurrence.owner_id = CalendarItem.rowid
270
283
  LEFT OUTER JOIN ExceptionDate ON ExceptionDate.owner_id = CalendarItem.rowid
271
-
284
+ LEFT OUTER JOIN Alarm ON Alarm.calendaritem_owner_id = CalendarItem.rowid
272
285
  LEFT OUTER JOIN Participant ON Participant.owner_id = CalendarItem.rowid
273
286
  LEFT OUTER JOIN Identity ON Identity.rowid = Participant.identity_id
274
287
 
data/lib/options.rb CHANGED
@@ -174,6 +174,8 @@ module ICalPal
174
174
  @op.parse!(File.read(File.expand_path(cli[:cf])).split, into: cf) rescue nil
175
175
 
176
176
  cli[:cmd] ||= @op.default_argv[0]
177
+ cli[:cmd] ||= env[:cmd] if env[:cmd]
178
+ cli[:cmd] ||= cf[:cmd] if cf[:cmd]
177
179
  cli[:cmd] = 'stores' if cli[:cmd] == 'accounts'
178
180
 
179
181
  # Parse eventsNow and eventsToday commands
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icalPal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Rosen
@@ -33,7 +33,7 @@ cert_chain:
33
33
  PDmWrfNO9LeQhiYLyVsOQ1xuWKDF0acQFAVIZctRp4VuZZMVqis4FRmqMdZcB/R2
34
34
  HaQXi3DWVibRuVZ3N77DWUKG
35
35
  -----END CERTIFICATE-----
36
- date: 2023-02-25 00:00:00.000000000 Z
36
+ date: 2023-03-21 00:00:00.000000000 Z
37
37
  dependencies: []
38
38
  description: |
39
39
  Inspired by icalBuddy and maintains close compatability. Includes
metadata.gz.sig CHANGED
Binary file