wheneverd 0.2.0 → 0.2.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 +4 -4
- data/CHANGELOG.md +7 -1
- data/FEATURE_SUMMARY.md +4 -2
- data/README.md +13 -13
- data/lib/wheneverd/dsl/context.rb +2 -3
- data/lib/wheneverd/entry.rb +2 -4
- data/lib/wheneverd/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7ef1858fab03a38b36da00bf0093d4025762263ca868d05a78c1876d8aeb6441
|
|
4
|
+
data.tar.gz: 539fbeec1db7023059767501172d7337da50a966e0727c29879f88cd81770303
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2656962166f254b2d48f94d23329db78a16964eda9c164457c5586b4dabfa095077b75372b94da9f9cad38862d5548be15ba7b2567cef5d2fb2cdc3cb94d4984
|
|
7
|
+
data.tar.gz: a06b649a079b18fd3f321bc818e322d3284c98d96bfbabaf43244b4d604193b395186d31548efdf2296fe12509f47e665f1cdf96f47e2af25512b3eae53ba20d
|
data/CHANGELOG.md
CHANGED
|
@@ -5,10 +5,16 @@ On release, entries are moved into `## x.y.z` sections that match the gem versio
|
|
|
5
5
|
|
|
6
6
|
## Unreleased
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 0.2.1
|
|
9
|
+
|
|
10
|
+
- Removes an unused filtering metadata keyword argument from the schedule DSL.
|
|
9
11
|
|
|
10
12
|
## 0.2.0
|
|
11
13
|
|
|
14
|
+
- Adds `wheneverd linger enable|disable|status` for managing systemd user lingering via `loginctl`.
|
|
15
|
+
|
|
16
|
+
## 0.1.0
|
|
17
|
+
|
|
12
18
|
- Provides a Clamp-based `wheneverd` CLI with `--help`, `--version`, and `--verbose` (usage errors in `ERROR: ...` format).
|
|
13
19
|
- Adds core domain objects and helpers for building schedules (interval parsing, durations, triggers, entries, jobs).
|
|
14
20
|
- Adds a Ruby DSL loader (`Wheneverd::DSL::Loader.load_file`) supporting `every(...)` blocks with `command(...)` jobs.
|
data/FEATURE_SUMMARY.md
CHANGED
|
@@ -12,19 +12,21 @@ It complements [`CHANGELOG.md`](CHANGELOG.md) by staying high-level and focusing
|
|
|
12
12
|
|
|
13
13
|
## Unreleased
|
|
14
14
|
|
|
15
|
+
## 0.2.1
|
|
16
|
+
|
|
15
17
|
- Adds `wheneverd linger enable|disable|status` for managing systemd user lingering via `loginctl`.
|
|
18
|
+
- Removes an unused filtering metadata keyword argument from the schedule DSL.
|
|
16
19
|
|
|
17
20
|
## 0.2.0
|
|
18
21
|
|
|
19
22
|
- The `wheneverd` CLI is implemented using Clamp (`--help`, usage errors in `ERROR: ...` format, `--verbose` for details).
|
|
20
23
|
- The gem includes a small “whenever-like” domain model (interval parsing, durations, triggers, schedules).
|
|
21
24
|
- The gem can load a Ruby schedule DSL file via `Wheneverd::DSL::Loader.load_file`.
|
|
22
|
-
- Schedule DSL supports `every(period, at:
|
|
25
|
+
- Schedule DSL supports `every(period, at: ...) { command("...") }` entries (multiple `command` calls per entry).
|
|
23
26
|
- Schedule DSL supports multiple calendar period symbols per `every` block (e.g. `every :tuesday, :wednesday`).
|
|
24
27
|
- Supported `every` periods include interval strings/durations, calendar shortcuts (`:hour`, `:day`, `:month`, `:year`),
|
|
25
28
|
day selectors (`:monday..:sunday`, `:weekday`, `:weekend`), and standard 5-field cron strings.
|
|
26
29
|
- `at:` supports a string or an array of strings (for calendar schedules), like `"4:30 am"` or `"00:15"`.
|
|
27
|
-
- `roles:` is accepted and stored on entries, but is not used for filtering yet.
|
|
28
30
|
- The gem can render systemd `.service` and `.timer` units via `Wheneverd::Systemd::Renderer.render`.
|
|
29
31
|
- Generated unit basenames include a stable ID derived from the job’s trigger + command (reordering schedule blocks won’t rename units).
|
|
30
32
|
- Interval timers include both `OnActiveSec=` and `OnUnitActiveSec=` to ensure a newly started timer has a next run scheduled.
|
data/README.md
CHANGED
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Wheneverd is to systemd timers what the [`whenever` gem](https://github.com/javan/whenever) is to cron.
|
|
4
4
|
|
|
5
|
-
Tagline / repo: `git@github.com:bigcurl/wheneverd.git`
|
|
6
|
-
|
|
7
5
|
## Status
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
Pre-1.0, but working end-to-end for user systemd timers:
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
- Loads a Ruby schedule DSL file (default: `config/schedule.rb`).
|
|
10
|
+
- Renders systemd `.service`/`.timer` units (interval, calendar, and 5-field cron schedules).
|
|
11
|
+
- Writes, lists, and deletes generated unit files (default: `~/.config/systemd/user`).
|
|
12
|
+
- Enables/starts/stops/disables/restarts timers via `systemctl --user`.
|
|
13
|
+
- Manages lingering via `loginctl` (so timers can run while logged out).
|
|
12
14
|
|
|
13
|
-
See `FEATURE_SUMMARY.md` for
|
|
15
|
+
See `FEATURE_SUMMARY.md` for user-visible behavior, and `CHANGELOG.md` for release notes.
|
|
14
16
|
|
|
15
17
|
## Installation
|
|
16
18
|
|
|
@@ -38,7 +40,7 @@ wheneverd activate
|
|
|
38
40
|
wheneverd deactivate
|
|
39
41
|
wheneverd reload
|
|
40
42
|
wheneverd current
|
|
41
|
-
wheneverd linger
|
|
43
|
+
wheneverd linger
|
|
42
44
|
```
|
|
43
45
|
|
|
44
46
|
### Minimal `config/schedule.rb` example
|
|
@@ -120,7 +122,7 @@ Note: schedule files are executed as Ruby. Do not run untrusted schedule code.
|
|
|
120
122
|
The core shape is:
|
|
121
123
|
|
|
122
124
|
```ruby
|
|
123
|
-
every(period, at: nil
|
|
125
|
+
every(period, at: nil) do
|
|
124
126
|
command "echo hello"
|
|
125
127
|
end
|
|
126
128
|
```
|
|
@@ -185,10 +187,6 @@ Cron translation supports standard 5-field crontab strings (`minute hour day-of-
|
|
|
185
187
|
|
|
186
188
|
Unsupported cron patterns raise an error at render time (e.g. non-5-field strings, `@daily`, `L`, `W`, `#`, `?`).
|
|
187
189
|
|
|
188
|
-
### `roles:`
|
|
189
|
-
|
|
190
|
-
`roles:` is accepted and stored on entries, but is ignored in v1 (no role-based filtering yet).
|
|
191
|
-
|
|
192
190
|
## CLI
|
|
193
191
|
|
|
194
192
|
Defaults:
|
|
@@ -204,17 +202,19 @@ Notes:
|
|
|
204
202
|
- Identifiers are sanitized for use in unit file names (non-alphanumeric characters become `-`).
|
|
205
203
|
- Unit basenames include a stable ID derived from the job’s trigger + command (reordering schedule blocks won’t rename units).
|
|
206
204
|
- `wheneverd write` / `wheneverd reload` prune previously generated units for the identifier by default (use `--no-prune` to keep old units around).
|
|
205
|
+
- `--unit-dir` controls where unit files are written/read/deleted; `activate`/`deactivate` use systemd’s unit search path.
|
|
207
206
|
|
|
208
207
|
Commands:
|
|
209
208
|
|
|
210
209
|
- `wheneverd init [--schedule PATH] [--force]` writes a template schedule file.
|
|
211
210
|
- `wheneverd show [--schedule PATH] [--identifier NAME]` prints rendered units to stdout.
|
|
212
|
-
- `wheneverd write [--
|
|
213
|
-
- `wheneverd delete [--
|
|
211
|
+
- `wheneverd write [--schedule PATH] [--identifier NAME] [--unit-dir PATH] [--dry-run] [--[no-]prune]` writes units to disk (or prints paths in `--dry-run` mode).
|
|
212
|
+
- `wheneverd delete [--identifier NAME] [--unit-dir PATH] [--dry-run]` deletes previously generated units for the identifier.
|
|
214
213
|
- `wheneverd activate [--schedule PATH] [--identifier NAME]` runs `systemctl --user daemon-reload` and enables/starts the timers.
|
|
215
214
|
- `wheneverd deactivate [--schedule PATH] [--identifier NAME]` stops and disables the timers.
|
|
216
215
|
- `wheneverd reload [--schedule PATH] [--identifier NAME] [--unit-dir PATH] [--[no-]prune]` writes units, reloads systemd, and restarts timers.
|
|
217
216
|
- `wheneverd current [--identifier NAME] [--unit-dir PATH]` prints the currently installed unit file contents from disk.
|
|
217
|
+
- `wheneverd linger [--user NAME] [enable|disable|status]` manages lingering via `loginctl` (`status` is the default).
|
|
218
218
|
|
|
219
219
|
## Development
|
|
220
220
|
|
|
@@ -25,16 +25,15 @@ module Wheneverd
|
|
|
25
25
|
#
|
|
26
26
|
# @param periods [Array<String, Symbol, Wheneverd::Duration, Array<Symbol>>]
|
|
27
27
|
# @param at [String, Array<String>, nil]
|
|
28
|
-
# @param roles [Object] stored but currently not used for filtering
|
|
29
28
|
# @return [Wheneverd::Entry]
|
|
30
|
-
def every(*periods, at: nil,
|
|
29
|
+
def every(*periods, at: nil, &block)
|
|
31
30
|
raise InvalidPeriodError.new("every() requires a block", path: path) unless block
|
|
32
31
|
|
|
33
32
|
raise InvalidPeriodError.new("every() requires a period", path: path) if periods.empty?
|
|
34
33
|
|
|
35
34
|
period = periods.length == 1 ? periods.first : periods
|
|
36
35
|
trigger = @period_parser.trigger_for(period, at: at)
|
|
37
|
-
entry = Wheneverd::Entry.new(trigger: trigger
|
|
36
|
+
entry = Wheneverd::Entry.new(trigger: trigger)
|
|
38
37
|
|
|
39
38
|
schedule.add_entry(entry)
|
|
40
39
|
|
data/lib/wheneverd/entry.rb
CHANGED
|
@@ -6,17 +6,15 @@ module Wheneverd
|
|
|
6
6
|
# An entry ties together a trigger (when to run) and one or more jobs (what to run).
|
|
7
7
|
class Entry
|
|
8
8
|
# @return [Wheneverd::Trigger::Interval, Wheneverd::Trigger::Calendar, Wheneverd::Trigger::Boot]
|
|
9
|
-
attr_reader :trigger, :jobs
|
|
9
|
+
attr_reader :trigger, :jobs
|
|
10
10
|
|
|
11
11
|
# @param trigger [Object] a trigger object describing when to run
|
|
12
12
|
# @param jobs [Array<Object>] job objects (usually {Wheneverd::Job::Command})
|
|
13
|
-
|
|
14
|
-
def initialize(trigger:, jobs: [], roles: nil)
|
|
13
|
+
def initialize(trigger:, jobs: [])
|
|
15
14
|
raise ArgumentError, "trigger is required" if trigger.nil?
|
|
16
15
|
|
|
17
16
|
@trigger = trigger
|
|
18
17
|
@jobs = jobs.dup
|
|
19
|
-
@roles = roles
|
|
20
18
|
end
|
|
21
19
|
|
|
22
20
|
# Append a job to the entry.
|
data/lib/wheneverd/version.rb
CHANGED