icalPal 2.0.0 → 2.1.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/README.md +45 -27
- data/bin/icalPal +18 -9
- data/lib/event.rb +2 -0
- data/lib/icalPal.rb +38 -14
- data/lib/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dab143a05d8a63ae36b721ca6ba53180c75d8b4dd0f0cebdc84fb533968c248
|
4
|
+
data.tar.gz: 8d243a120762c90059e4206a2deb5e79b821e558cf9ad9a437ad84fbfbb6a21b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24f4b88c592e59f2ffbc116761d6da41b60a7e5d4554feea9bdb023450967eaa7921f5c4708a66bf76554926ab4e0ca52965470f7576cef1cce5aec9a6112cbb
|
7
|
+
data.tar.gz: d69cc1d2cd63072020a4059a352ccdb2262a189e10c3c4e1891bd1c953ea2cb60a577fc83bd2ab55b561d0a752b0fb4198495bc2a5f57909d4216101cc7ea012
|
data/README.md
CHANGED
@@ -4,16 +4,30 @@
|
|
4
4
|
|
5
5
|
## Description
|
6
6
|
|
7
|
-
icalPal is a command-line tool to query a macOS Calendar
|
8
|
-
accounts, calendars, and
|
9
|
-
[Ruby](https://www.ruby-lang.org/) and access to a
|
10
|
-
|
7
|
+
icalPal is a command-line tool to query a macOS Calendar and Reminders
|
8
|
+
databases for accounts, calendars, events, and tasks. It can be run
|
9
|
+
on any system with [Ruby](https://www.ruby-lang.org/) and access to a
|
10
|
+
Calendar or Reminders database.
|
11
11
|
|
12
12
|
## Installation
|
13
13
|
|
14
|
+
As a system-wide Ruby gem:
|
15
|
+
|
14
16
|
```
|
15
17
|
gem install icalPal
|
16
|
-
|
18
|
+
```
|
19
|
+
|
20
|
+
or in your home diretory:
|
21
|
+
|
22
|
+
```
|
23
|
+
gem install --user-install icalPal
|
24
|
+
```
|
25
|
+
|
26
|
+
As a Homebrew formula:
|
27
|
+
|
28
|
+
```
|
29
|
+
brew tap ajrosen/icalPal
|
30
|
+
brew install icalPal
|
17
31
|
```
|
18
32
|
|
19
33
|
## Features
|
@@ -21,7 +35,8 @@ icalPal events
|
|
21
35
|
### Compatability with [icalBuddy](https://github.com/ali-rantakari/icalBuddy)
|
22
36
|
|
23
37
|
icalPal tries to be compatible with icalBuddy for command-line options
|
24
|
-
and for output. There are a
|
38
|
+
and for output. There are a some important differences to be aware
|
39
|
+
of.
|
25
40
|
|
26
41
|
* Options require two hyphens, except for single-letter options that require one hyphen
|
27
42
|
* *eventsFrom* is not supported. Instead there is *--from*, *--to*, and *--days*
|
@@ -184,27 +199,6 @@ Environment variables:
|
|
184
199
|
(default: /Users/ajr/.icalPal)
|
185
200
|
```
|
186
201
|
|
187
|
-
## History
|
188
|
-
|
189
|
-
I have used icalBuddy for many years. It's great for scripting,
|
190
|
-
automation, and as a desktop widget for apps like
|
191
|
-
[GeekTool](https://www.tynsoe.org/geektool/) and
|
192
|
-
[Übersicht](https://tracesof.net/uebersicht/).
|
193
|
-
|
194
|
-
As with many applications, I started to run into some limitations in
|
195
|
-
icalBuddy. The biggest being that active development ended in 2014.
|
196
|
-
It's only thanks to the efforts of [Jim
|
197
|
-
Lawton](https://github.com/jimlawton) that it even compiles anymore.
|
198
|
-
|
199
|
-
Instead of trying to understand and extend the existing code, I chose
|
200
|
-
to start anew using my language of choice. Using Ruby means icalPal
|
201
|
-
is multi-platform. It also meant *much* less code; about 1,200 lines
|
202
|
-
vs. 7,000.
|
203
|
-
|
204
|
-
I won't pretend to understand **why** you would want this on Linux or
|
205
|
-
Windows. But since icalPal is written in Ruby and gets its data
|
206
|
-
directly from the Calendar database file instead of an API, you *can*.
|
207
|
-
|
208
202
|
## Output formats
|
209
203
|
|
210
204
|
icalPal supports several output formats. The **default** format tries
|
@@ -242,5 +236,29 @@ objects, one for each of the item's properties:
|
|
242
236
|
|
243
237
|
The document will also include a number of
|
244
238
|
[RDoc::Markup::Verbatim](https://ruby-doc.org/stdlib-2.6.10/libdoc/rdoc/rdoc/RDoc/Markup/Verbatim.html)
|
239
|
+
and
|
240
|
+
[RDoc::Markup::Raw](https://ruby-doc.org/stdlib-2.6.10/libdoc/rdoc/rdoc/RDoc/Markup/Raw.html)
|
245
241
|
items. They are not included in the output, but are used to pass
|
246
242
|
information about the item and property to the default formatter.
|
243
|
+
|
244
|
+
## History
|
245
|
+
|
246
|
+
I used icalBuddy for many years. It's great for scripting,
|
247
|
+
automation, and as a desktop widget for apps like
|
248
|
+
[GeekTool](https://www.tynsoe.org/geektool/) and
|
249
|
+
[Übersicht](https://tracesof.net/uebersicht/).
|
250
|
+
|
251
|
+
As with many applications, I started to run into some limitations in
|
252
|
+
icalBuddy. The biggest being that active development ended in 2014.
|
253
|
+
It's only thanks to the efforts of [Jim
|
254
|
+
Lawton](https://github.com/jimlawton) that it even compiles anymore.
|
255
|
+
|
256
|
+
Instead of trying to understand and extend the existing code, I chose
|
257
|
+
to start anew using my language of choice: Ruby. Using Ruby meant
|
258
|
+
there is *much* less code; about 1,600 lines vs. 7,000. It also means
|
259
|
+
icalPal is multi-platform.
|
260
|
+
|
261
|
+
I won't pretend to understand **why** you would want to run this on
|
262
|
+
Linux or Windows. But since icalPal is written in Ruby and gets its
|
263
|
+
data directly from the Calendar and Reminders database files instead
|
264
|
+
of an API, you *can*.
|
data/bin/icalPal
CHANGED
@@ -1,16 +1,25 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# *-*- mode: enh-ruby -*-*
|
3
2
|
|
4
|
-
|
3
|
+
begin
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
require 'csv'
|
7
|
+
require 'json'
|
8
|
+
require 'rdoc'
|
9
|
+
require 'sqlite3'
|
10
|
+
require 'yaml'
|
11
|
+
|
12
|
+
require_relative '../lib/icalPal'
|
13
|
+
require_relative '../lib/options'
|
14
|
+
rescue LoadError => e
|
15
|
+
dep = e.message[/-- (.*)/, 1]
|
5
16
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require 'sqlite3'
|
10
|
-
require 'yaml'
|
17
|
+
$stderr.puts "FATAL: icalPal is missing a dependency: #{dep}"
|
18
|
+
$stderr.puts
|
19
|
+
$stderr.puts "Install with 'gem install --user-install #{dep}'"
|
11
20
|
|
12
|
-
|
13
|
-
|
21
|
+
exit
|
22
|
+
end
|
14
23
|
|
15
24
|
|
16
25
|
##################################################
|
data/lib/event.rb
CHANGED
@@ -114,6 +114,8 @@ module ICalPal
|
|
114
114
|
|
115
115
|
# Repeat for multi-day events
|
116
116
|
((self['duration'] / 86400).to_i + 1).times do |i|
|
117
|
+
break if self['sdate'] > $opts[:to]
|
118
|
+
|
117
119
|
$log.debug("multi-day event #{i + 1}") if (i > 0)
|
118
120
|
self['daynum'] = i + 1
|
119
121
|
retval.push(clone) if in_window?(self['sdate'])
|
data/lib/icalPal.rb
CHANGED
@@ -58,6 +58,9 @@ module ICalPal
|
|
58
58
|
rescue SQLite3::BusyException => e
|
59
59
|
$log.error("Non-fatal error closing database #{db.filename}")
|
60
60
|
|
61
|
+
rescue SQLite3::SQLException => e
|
62
|
+
$log.info("#{db_file}: #{e}")
|
63
|
+
|
61
64
|
rescue SQLite3::Exception => e
|
62
65
|
abort("#{db_file}: #{e}")
|
63
66
|
|
@@ -92,28 +95,49 @@ module ICalPal
|
|
92
95
|
CSV::Row::new(headers, values)
|
93
96
|
end
|
94
97
|
|
98
|
+
# Convert +self+ to XML
|
99
|
+
#
|
95
100
|
# @return [String] All fields in a simple XML format: <field>value</field>.
|
96
101
|
# Fields with empty values return <field/>.
|
97
102
|
def to_xml
|
98
103
|
retval = ""
|
99
|
-
|
100
|
-
@self.keys.each do |k|
|
101
|
-
v = @self[k]
|
102
|
-
|
103
|
-
if v.respond_to?(:length) then
|
104
|
-
if v.length == 0 or v[0] == nil then
|
105
|
-
retval += "<#{k}/>"
|
106
|
-
else
|
107
|
-
# Keep non-blank and whitespace, except form feeds and vertical whitespace
|
108
|
-
v = v.gsub(/[^[[:print:]][[:space:]]]/, '.').gsub(/[\f\v]/, '.')
|
109
|
-
retval += "<#{k}>#{v}</#{k}>"
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
104
|
+
@self.keys.each { |k| retval += xmlify(k, @self[k]) }
|
113
105
|
|
114
106
|
retval
|
115
107
|
end
|
116
108
|
|
109
|
+
# Convert a key/value pair to XML. The value should be +nil+, +String+,
|
110
|
+
# +Integer+, +Array+, or +ICalPal::RDT+
|
111
|
+
#
|
112
|
+
# @param key The key
|
113
|
+
# @param value The value
|
114
|
+
# @return [String] The key/value pair in a simple XML format
|
115
|
+
def xmlify(key, value)
|
116
|
+
case value
|
117
|
+
# Nil
|
118
|
+
when NilClass then return("<#{key}/>")
|
119
|
+
|
120
|
+
# String, Integer
|
121
|
+
when String then return("<#{key}>#{value}</#{key}>")
|
122
|
+
when Integer then return("<#{key}>#{value}</#{key}>")
|
123
|
+
|
124
|
+
# Array
|
125
|
+
when Array then
|
126
|
+
# Treat empty arrays as nil values
|
127
|
+
return(xmlify(key, nil)) if value[0] == nil
|
128
|
+
|
129
|
+
retval = ""
|
130
|
+
value.each { |x| retval += xmlify("#{key}0", x) }
|
131
|
+
return("<#{key}>#{retval}</#{key}>")
|
132
|
+
|
133
|
+
# RDT
|
134
|
+
when ICalPal::RDT then return("<#{key}>#{value.to_s}</#{key}>")
|
135
|
+
|
136
|
+
# Unknown
|
137
|
+
else return("<#{key}>#{value.to_s}</#{key}>")
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
117
141
|
# Get the +n+'th +dow+ in month +m+
|
118
142
|
#
|
119
143
|
# @param n [Integer] Integer between -4 and +4
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: icalPal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Rosen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sqlite3
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
requirements: []
|
84
|
-
rubygems_version: 3.5.
|
84
|
+
rubygems_version: 3.5.9
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: Command-line tool to query the macOS Calendar
|