Module: When

Defined in:
lib/when-do.rb,
lib/when-do/do.rb,
lib/when-do/cli.rb,
lib/when-do/job.rb,
lib/when-do/version.rb

Defined Under Namespace

Classes: CLI, Do, Error, InvalidArgs, InvalidCron, Job

Constant Summary collapse

DEFAULT_CONFIG =
{
  schedule_key:      'when:schedules',
  worker_queue_key:  'when:queue:default',
  delayed_queue_key: 'when:delayed'
}
VERSION =
'2.0.0'

Class Method Summary collapse

Class Method Details

.configObject



92
93
94
# File 'lib/when-do.rb', line 92

def self.config
  @config ||= DEFAULT_CONFIG
end

.config=(new_config) ⇒ Object



96
97
98
99
# File 'lib/when-do.rb', line 96

def self.config=(new_config)
  logger.info("Resetting config to #{new_config.inspect}") if @config
  @config = new_config
end

.delayed_queue_keyObject



118
119
120
# File 'lib/when-do.rb', line 118

def self.delayed_queue_key
  config[:delayed_queue_key] || 'when:delayed'
end

.enqueue(klass, args: [], worker_args: {}) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/when-do.rb', line 67

def self.enqueue(klass, args: [], worker_args: {})
  validate_args(args)
  job = worker_args.merge('jid' => SecureRandom.uuid, 'class' => klass.to_s, 'args' => args)
  if redis.lpush(worker_queue_key, job.to_json) > 0
    job['jid']
  else
    msg = "Failed to enqueue #{job}."
    logger.fatal(msg)
    raise msg
  end
end

.enqueue_at(time, klass, args: [], worker_args: {}) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/when-do.rb', line 54

def self.enqueue_at(time, klass, args: [], worker_args: {})
  validate_args(args)
  job = worker_args.merge('jid' => SecureRandom.uuid, 'class' => klass.to_s, 'args' => args)
  if redis.zadd(delayed_queue_key, time.to_i, job.to_json)
    logger.info("Delayed: will enqueue #{job} to run at #{time}.")
    job['jid']
  else
    msg = "Failed to enqueue #{job} to run at #{time}."
    logger.fatal(msg)
    raise msg
  end
end

.loggerObject



101
102
103
104
105
106
107
# File 'lib/when-do.rb', line 101

def self.logger
  @logger ||= if config[:log_path]
    Logger.new(config[:log_path], 100, 10_240_000)
  else
    Logger.new(STDOUT)
  end
end

.logger=(new_logger) ⇒ Object



109
110
111
112
# File 'lib/when-do.rb', line 109

def self.logger=(new_logger)
  logger.info("Changing logger to #{new_logger.inspect}")
  @logger = new_logger
end

.redisObject



79
80
81
82
83
84
85
# File 'lib/when-do.rb', line 79

def self.redis
  @redis ||= if config[:redis_config_path]
    Redis.new(YAML.load(File.read(config[:redis_config_path])))
  else
    Redis.new
  end
end

.redis=(redis) ⇒ Object



87
88
89
90
# File 'lib/when-do.rb', line 87

def self.redis=(redis)
  logger.info("Resetting redis to #{redis.inspect}")
  @redis = redis
end

.schedule(name, cron, klass, args: [], worker_args: {}) ⇒ Object

Raises:



19
20
21
22
23
24
25
# File 'lib/when-do.rb', line 19

def self.schedule(name, cron, klass, args: [], worker_args: {})
  raise InvalidCron, "\"#{cron}\" is invalid" unless valid_cron?(cron)
  validate_args(args)
  schedule = worker_args.merge('class' => klass.to_s, 'cron' => cron, 'args' => args)
  redis.hset(schedule_key, name.to_s, schedule.to_json)
  logger.info("Scheduled '#{name}' => #{schedule}.")
end

.schedule_keyObject



114
115
116
# File 'lib/when-do.rb', line 114

def self.schedule_key
  config[:schedule_key] || 'when:schedules'
end

.schedulesObject



49
50
51
52
# File 'lib/when-do.rb', line 49

def self.schedules
  schedules = redis.hgetall(schedule_key)
  schedules.each { |k, v| schedules[k] = JSON.parse(v) }
end

.unschedule(name) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/when-do.rb', line 31

def self.unschedule(name)
  json_sched = redis.hget(schedule_key, name.to_s)
  schedule = JSON.parse(json_sched) if json_sched
  if redis.hdel(schedule_key, name.to_s) > 0
    logger.info("Unscheduled '#{name}' => #{schedule}.")
    true
  else
    logger.warn("Could not unschedule '#{name}'. No schedule by that name was found.")
    false
  end
end

.unschedule_allObject



43
44
45
46
47
# File 'lib/when-do.rb', line 43

def self.unschedule_all
  count = redis.del(schedule_key)
  logger.info("Cleared #{count} schedules.")
  count
end

.valid_cron?(cron) ⇒ Boolean

Returns:

  • (Boolean)


27
28
29
# File 'lib/when-do.rb', line 27

def self.valid_cron?(cron)
  When::Cron.valid?(cron)
end

.worker_queue_keyObject



122
123
124
# File 'lib/when-do.rb', line 122

def self.worker_queue_key
  config[:worker_queue_key] || 'when:queue:default'
end