Class: Aias::CronDescriber

Inherits:
Object
  • Object
show all
Defined in:
lib/aias/cron_describer.rb

Overview

Converts a cron expression or @ keyword into a plain-English description. Returns the original expression unchanged for anything it cannot parse, so it is always safe to call.

Usage:

CronDescriber.describe("0 8 * * *")         # => "every day at 8am"
CronDescriber.describe("0 8 * * 1-5")       # => "every weekday at 8am"
CronDescriber.display("0 8 * * *")           # => "every day at 8am (0 8 * * *)"

Constant Summary collapse

DAYS =
%w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday].freeze
MONTHS =
[
  nil, "January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
].freeze
KEYWORDS =
{
  "@yearly"   => "every year",
  "@annually" => "every year",
  "@monthly"  => "every month",
  "@weekly"   => "every Sunday at midnight",
  "@daily"    => "every day at midnight",
  "@midnight" => "every day at midnight",
  "@hourly"   => "every hour"
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(expr) ⇒ CronDescriber



41
42
43
# File 'lib/aias/cron_describer.rb', line 41

def initialize(expr)
  @expr = expr
end

Class Method Details

.describe(expr) ⇒ Object

Returns only the plain-English description (or the original expr on failure).



37
38
39
# File 'lib/aias/cron_describer.rb', line 37

def self.describe(expr)
  new(expr.to_s.strip).describe
end

.display(expr) ⇒ Object

Returns "plain english (expr)".



31
32
33
34
# File 'lib/aias/cron_describer.rb', line 31

def self.display(expr)
  desc = describe(expr)
  desc == expr ? expr : "#{desc} (#{expr})"
end

Instance Method Details

#describeObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/aias/cron_describer.rb', line 45

def describe
  return KEYWORDS[@expr] if KEYWORDS.key?(@expr)

  parts = @expr.split
  return @expr unless parts.size == 5

  min, hour, dom, mon, dow = parts

  # Fall back for step expressions (*/n) — we don't describe these.
  return @expr if [min, hour, dom, mon, dow].any? { |f| f.include?("/") }

  "#{describe_date(dom, mon, dow)}#{describe_time(min, hour)}"
rescue StandardError
  @expr
end