delayed_cron 0.2.9 → 0.2.10
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/.ruby-version +1 -1
- data/CHANGES.md +5 -0
- data/README.md +20 -5
- data/lib/delayed_cron.rb +9 -8
- data/lib/delayed_cron/cron_job.rb +58 -0
- data/lib/delayed_cron/scheduling.rb +11 -39
- data/lib/delayed_cron/version.rb +1 -1
- data/spec/cron_job_spec.rb +139 -0
- data/spec/delayed_cron_spec.rb +11 -0
- data/spec/scheduling_spec.rb +15 -54
- data/spec/spec_helper.rb +3 -2
- metadata +5 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d7a2942e092055795c248a6eb82433c760c26733
         | 
| 4 | 
            +
              data.tar.gz: 195e7f6a46052e687611a825afede8ab3d4ef4f5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 596b466d8708c44a8023995a0df0ff7c6fa87b2c74b1d2e42521f5671e6d1b41147525fde9e1bdaecfc981978efcadcbf503a01e49d3fc4f1243765586d60f6a
         | 
| 7 | 
            +
              data.tar.gz: f2c640b98de5f67f384a54b7c493715b4b14a1a7024ad52c903bb103fc004810a1de8c33c1f259df4efb4ca571774de81d89a3ba15832022a68539c30d5e8fd2
         | 
    
        data/.ruby-version
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            2.2.5
         | 
    
        data/CHANGES.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -23,12 +23,22 @@ class Product < ActiveRecord::Base | |
| 23 23 | 
             
              # * this is an alternative to the cron_jobs array in config
         | 
| 24 24 | 
             
              #
         | 
| 25 25 | 
             
              # OPTIONS: *optional
         | 
| 26 | 
            -
              # - interval | 
| 27 | 
            -
              # - at | 
| 28 | 
            -
               | 
| 26 | 
            +
              # - interval  - override default_interval from setup
         | 
| 27 | 
            +
              # - at        - set time of day the cron should be run, timezone and seconds are optional
         | 
| 28 | 
            +
              # - time_zone - override default time zone for this job
         | 
| 29 | 
            +
              # - precision - set to :hourly to run job at an hourly interval instead of daily
         | 
| 30 | 
            +
              #
         | 
| 31 | 
            +
              # NOTE: only one of interval or at will be used, at will take precedence if
         | 
| 32 | 
            +
              # both are specified
         | 
| 33 | 
            +
              cron_job :some_method_to_run_as_cron, at: "00:00:00 -0400"
         | 
| 34 | 
            +
              cron_job :some_hourly_job, at: "15:00", precision: :hourly
         | 
| 29 35 |  | 
| 30 36 | 
             
              def self.some_method_to_run_as_cron
         | 
| 31 | 
            -
                # this method will be run every  | 
| 37 | 
            +
                # this method will be run every every day at midnight
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def self.some_hourly_job
         | 
| 41 | 
            +
                # this method will be run hourly at fifteen minutes past the hour
         | 
| 32 42 | 
             
              end
         | 
| 33 43 |  | 
| 34 44 | 
             
              ...
         | 
| @@ -43,6 +53,11 @@ DelayedCron.setup do |config| | |
| 43 53 | 
             
              # default interval to run cron jobs
         | 
| 44 54 | 
             
              config.default_interval = 10.minutes
         | 
| 45 55 |  | 
| 56 | 
            +
              # default time zone for scheduling `:at` jobs
         | 
| 57 | 
            +
              # accepts an ActiveSupport or TZInfo time zone name
         | 
| 58 | 
            +
              config.default_time_zone = "Eastern Time (US & Canada)"
         | 
| 59 | 
            +
             | 
| 60 | 
            +
             | 
| 46 61 | 
             
              # array of methods to run at the above configured interval
         | 
| 47 62 | 
             
              config.cron_jobs = [
         | 
| 48 63 | 
             
                "SomeClass.expensive_task", # will run at default interval
         | 
| @@ -56,7 +71,7 @@ end | |
| 56 71 |  | 
| 57 72 | 
             
            - when using with sidekiq and rails there can be a config/initializer load order issue. Below is a fix to insure sidekiq is loaded first
         | 
| 58 73 | 
             
            ```ruby
         | 
| 59 | 
            -
            Rails.application.config.after_initialize do | 
| 74 | 
            +
            Rails.application.config.after_initialize do
         | 
| 60 75 | 
             
              DelayedCron.setup do |config|
         | 
| 61 76 | 
             
                ...
         | 
| 62 77 | 
             
              end
         | 
    
        data/lib/delayed_cron.rb
    CHANGED
    
    | @@ -4,7 +4,7 @@ require 'delayed_cron/railtie' | |
| 4 4 |  | 
| 5 5 | 
             
            module DelayedCron
         | 
| 6 6 |  | 
| 7 | 
            -
              mattr_accessor :default_interval, :cron_jobs
         | 
| 7 | 
            +
              mattr_accessor :default_interval, :default_time_zone, :cron_jobs
         | 
| 8 8 |  | 
| 9 9 | 
             
              class << self
         | 
| 10 10 |  | 
| @@ -17,15 +17,12 @@ module DelayedCron | |
| 17 17 |  | 
| 18 18 | 
             
                def define_cron_jobs
         | 
| 19 19 | 
             
                  return false unless cron_jobs.present?
         | 
| 20 | 
            +
             | 
| 20 21 | 
             
                  cron_jobs.each do |job|
         | 
| 21 | 
            -
                     | 
| 22 | 
            -
                     | 
| 23 | 
            -
                    job         = job_is_hash ? obj[:job] : job
         | 
| 24 | 
            -
                    interval    = job_is_hash ? obj[:interval] : default_interval
         | 
| 25 | 
            -
                    options_at  = job_is_hash ? obj[:at] : nil
         | 
| 26 | 
            -
                    klass, name = job.split(".")
         | 
| 22 | 
            +
                    job = job.is_a?(Hash) ? job : { job: job }
         | 
| 23 | 
            +
                    klass, name = job[:job].split(".")
         | 
| 27 24 | 
             
                    # TODO: raise error if interval is not set
         | 
| 28 | 
            -
                    options     = timing_opts( | 
| 25 | 
            +
                    options     = timing_opts(job)
         | 
| 29 26 | 
             
                    DelayedCron.schedule(klass, name, options)
         | 
| 30 27 | 
             
                  end
         | 
| 31 28 | 
             
                end
         | 
| @@ -44,6 +41,10 @@ module DelayedCron | |
| 44 41 | 
             
                  schedule(klass, method_name, symbolized_options)
         | 
| 45 42 | 
             
                end
         | 
| 46 43 |  | 
| 44 | 
            +
                def default_time_zone
         | 
| 45 | 
            +
                  @@default_time_zone || "Eastern Time (US & Canada)"
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 47 48 | 
             
              end
         | 
| 48 49 |  | 
| 49 50 | 
             
              module Glue
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            module DelayedCron
         | 
| 2 | 
            +
              class CronJob
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                attr_accessor :klass, :method_name
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                def initialize(options)
         | 
| 7 | 
            +
                  self.klass = options.delete(:klass)
         | 
| 8 | 
            +
                  self.method_name = options.delete(:method_name)
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  self.raw_options = options
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def enqueue(processor)
         | 
| 14 | 
            +
                  schedule.each do |opts|
         | 
| 15 | 
            +
                    processor.enqueue_delayed_cron(klass, method_name, opts)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                private
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                attr_accessor :raw_options
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def schedule
         | 
| 24 | 
            +
                  return [raw_options] if raw_options[:at].blank?
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  Array.wrap(raw_options[:at]).map do |at_option|
         | 
| 27 | 
            +
                    interval_from_at(raw_options.merge(at: at_option))
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def interval_from_at(options)
         | 
| 32 | 
            +
                  interval = convert_time_string_to_seconds_interval(options[:at], options[:time_zone])
         | 
| 33 | 
            +
                  options.merge(interval: interval)
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def convert_time_string_to_seconds_interval(scheduled_time_string, zone_name)
         | 
| 37 | 
            +
                  zone_name ||= DelayedCron.default_time_zone
         | 
| 38 | 
            +
                  zone = Time.find_zone!(zone_name)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  if hourly?
         | 
| 41 | 
            +
                    period_in_seconds = 60 * 60
         | 
| 42 | 
            +
                    scheduled_time_string = "%H:#{scheduled_time_string}"
         | 
| 43 | 
            +
                  else
         | 
| 44 | 
            +
                    period_in_seconds = 60 * 60 * 24
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  scheduled_time = zone.now.strftime("%Y-%m-%d #{scheduled_time_string}")
         | 
| 48 | 
            +
                  scheduled_time = zone.parse(scheduled_time)
         | 
| 49 | 
            +
                  scheduled_time += period_in_seconds if zone.now >= scheduled_time
         | 
| 50 | 
            +
                  scheduled_time.to_i - zone.now.to_i
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                def hourly?
         | 
| 54 | 
            +
                  raw_options[:precision].to_s == "hourly"
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
| @@ -1,48 +1,20 @@ | |
| 1 | 
            +
            require 'delayed_cron/cron_job'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module DelayedCron
         | 
| 2 4 | 
             
              module Scheduling
         | 
| 3 5 |  | 
| 4 6 | 
             
                def schedule(klass, method_name, options)
         | 
| 5 | 
            -
                   | 
| 6 | 
            -
                   | 
| 7 | 
            -
                    parsed_options.each do |opts|
         | 
| 8 | 
            -
                      processor.enqueue_delayed_cron(klass, method_name, opts)
         | 
| 9 | 
            -
                    end
         | 
| 10 | 
            -
                  else
         | 
| 11 | 
            -
                    processor.enqueue_delayed_cron(klass, method_name, parsed_options)
         | 
| 12 | 
            -
                  end
         | 
| 13 | 
            -
                end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                def parse_options(options)
         | 
| 16 | 
            -
                  original_options = options
         | 
| 17 | 
            -
                  if at = options[:at]
         | 
| 18 | 
            -
                    options = if at.is_a?(Array)
         | 
| 19 | 
            -
                      at.map do |at_option|
         | 
| 20 | 
            -
                        add_interval(original_options.merge(at: at_option))
         | 
| 21 | 
            -
                      end
         | 
| 22 | 
            -
                    else
         | 
| 23 | 
            -
                      add_interval(options)
         | 
| 24 | 
            -
                    end
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
                  options
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                def add_interval(options)
         | 
| 30 | 
            -
                  options[:interval] = convert_time_string_to_seconds_interval(options[:at])
         | 
| 31 | 
            -
                  options
         | 
| 32 | 
            -
                end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                def convert_time_string_to_seconds_interval(scheduled_time_string)
         | 
| 35 | 
            -
                  day_in_seconds = 60 * 60 * 24
         | 
| 36 | 
            -
                  scheduled_time = Time.now.strftime("%Y-%m-%d #{scheduled_time_string}")
         | 
| 37 | 
            -
                  scheduled_time = DateTime.parse(scheduled_time, false).to_time
         | 
| 38 | 
            -
                  scheduled_time += day_in_seconds if Time.now >= scheduled_time
         | 
| 39 | 
            -
                  scheduled_time.to_i - Time.now.to_i
         | 
| 7 | 
            +
                  job = CronJob.new(options.merge(klass: klass, method_name: method_name))
         | 
| 8 | 
            +
                  job.enqueue(processor)
         | 
| 40 9 | 
             
                end
         | 
| 41 10 |  | 
| 42 | 
            -
                def timing_opts( | 
| 43 | 
            -
                   | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 11 | 
            +
                def timing_opts(job)
         | 
| 12 | 
            +
                  {
         | 
| 13 | 
            +
                    interval: job[:interval] || default_interval,
         | 
| 14 | 
            +
                    time_zone: job[:time_zone],
         | 
| 15 | 
            +
                    precision: job[:precision],
         | 
| 16 | 
            +
                    at: job[:at]
         | 
| 17 | 
            +
                  }.select { |_, value| !value.nil? }
         | 
| 46 18 | 
             
                end
         | 
| 47 19 |  | 
| 48 20 | 
             
              end
         | 
    
        data/lib/delayed_cron/version.rb
    CHANGED
    
    
| @@ -0,0 +1,139 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module DelayedCron
         | 
| 4 | 
            +
              RSpec.describe CronJob do
         | 
| 5 | 
            +
                describe "#new" do
         | 
| 6 | 
            +
                  let(:job) { described_class.new(klass: "Foo", method_name: "bar") }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  it "stores klass" do
         | 
| 9 | 
            +
                    expect(job.klass).to eq "Foo"
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  it "stores method_name" do
         | 
| 13 | 
            +
                    expect(job.method_name).to eq "bar"
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                describe "#enqueue" do
         | 
| 18 | 
            +
                  let(:job) { described_class.new(klass: "Foo", method_name: "bar", interval: 3600) }
         | 
| 19 | 
            +
                  let(:processor) { class_double(Jobs::Sidekiq) }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  before { Timecop.freeze(Time.utc(2014, 1, 1, 12, 0, 0)) }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  it "passes interval through for periodic jobs" do
         | 
| 24 | 
            +
                    job = described_class.new(klass: "Foo", method_name: "bar", interval: 3600)
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    expect(processor).to receive(:enqueue_delayed_cron)
         | 
| 27 | 
            +
                      .with("Foo", "bar", interval: 3600)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    job.enqueue(processor)
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  it "converts :at to interval" do
         | 
| 33 | 
            +
                    job = described_class.new(klass: "Foo", method_name: "bar", interval: 3600, at: "10:00:00")
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    expect(processor).to receive(:enqueue_delayed_cron)
         | 
| 36 | 
            +
                      .with("Foo", "bar", interval: 10800, at: "10:00:00")
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    job.enqueue(processor)
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  it "enqueues multiple jobs from array of :at times" do
         | 
| 42 | 
            +
                    job = described_class.new(
         | 
| 43 | 
            +
                      klass: "Foo",
         | 
| 44 | 
            +
                      method_name: "bar",
         | 
| 45 | 
            +
                      interval: 3600,
         | 
| 46 | 
            +
                      at: ["10:00:00", "09:00:00"]
         | 
| 47 | 
            +
                    )
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    expect(processor).to receive(:enqueue_delayed_cron)
         | 
| 50 | 
            +
                      .with("Foo", "bar", interval: 10800, at: "10:00:00")
         | 
| 51 | 
            +
                    expect(processor).to receive(:enqueue_delayed_cron)
         | 
| 52 | 
            +
                      .with("Foo", "bar", interval: 7200, at: "09:00:00")
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    job.enqueue(processor)
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  it 'respects time zone parameter' do
         | 
| 58 | 
            +
                    job = described_class.new(
         | 
| 59 | 
            +
                      klass: "Foo",
         | 
| 60 | 
            +
                      method_name: "bar",
         | 
| 61 | 
            +
                      interval: 3600,
         | 
| 62 | 
            +
                      at: "13:00:00",
         | 
| 63 | 
            +
                      time_zone: "UTC"
         | 
| 64 | 
            +
                    )
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    expect(processor).to receive(:enqueue_delayed_cron)
         | 
| 67 | 
            +
                      .with("Foo", "bar", interval: 3600, at: "13:00:00", time_zone: "UTC")
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    job.enqueue(processor)
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                describe ".convert_time_string_to_seconds_interval" do
         | 
| 74 | 
            +
                  let(:job) { described_class.new({}) }
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  let(:next_occurrence) do
         | 
| 77 | 
            +
                    job.send(:convert_time_string_to_seconds_interval, scheduled_time, "Eastern Time (US & Canada)")
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                  # Set Time.now to January 1, 2014 12:00:00 PM
         | 
| 80 | 
            +
                  before { Timecop.freeze(Time.utc(2014, 1, 1, 12, 0, 0)) }
         | 
| 81 | 
            +
                  context "next occurrence is today" do
         | 
| 82 | 
            +
                    let(:known_interval) { 21600 }
         | 
| 83 | 
            +
                    let(:scheduled_time) { "13:00:00 -0500" }
         | 
| 84 | 
            +
                    it "converts a time string to seconds" do
         | 
| 85 | 
            +
                      expect(next_occurrence).to be(known_interval)
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                  context "next occurrence is tomorrow" do
         | 
| 90 | 
            +
                    let(:known_interval) { 14400 }
         | 
| 91 | 
            +
                    let(:scheduled_time) { "11:00:00 -0500" }
         | 
| 92 | 
            +
                    it "converts a time string to seconds" do
         | 
| 93 | 
            +
                      expect(next_occurrence).to be(known_interval)
         | 
| 94 | 
            +
                    end
         | 
| 95 | 
            +
                  end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                  context "with time zone" do
         | 
| 98 | 
            +
                    let(:known_interval) { 14400 }
         | 
| 99 | 
            +
                    let(:scheduled_time) { "11:00:00 Eastern Time (US & Canada)" }
         | 
| 100 | 
            +
                    it "converts a time string to seconds" do
         | 
| 101 | 
            +
                      expect(next_occurrence).to be(known_interval)
         | 
| 102 | 
            +
                    end
         | 
| 103 | 
            +
                  end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  context "with DST" do
         | 
| 106 | 
            +
                    let(:known_interval) { 14400 }
         | 
| 107 | 
            +
                    let(:scheduled_time) { "11:00:00 -0500" }
         | 
| 108 | 
            +
                    it "converts a time string to seconds" do
         | 
| 109 | 
            +
                      Timecop.freeze(Time.utc(2014, 6, 1, 12, 0, 0))
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                      expect(next_occurrence).to be(known_interval)
         | 
| 112 | 
            +
                    end
         | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                  context "hourly interval" do
         | 
| 116 | 
            +
                    let(:job) { described_class.new(precision: :hourly) }
         | 
| 117 | 
            +
                    let(:known_interval) { 300 }
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    let(:scheduled_time) { "05:00 -0500" }
         | 
| 120 | 
            +
                    it "converts a time string to seconds" do
         | 
| 121 | 
            +
                      expect(next_occurrence).to be(known_interval)
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                  context "next hour" do
         | 
| 126 | 
            +
                    let(:job) { described_class.new(precision: :hourly) }
         | 
| 127 | 
            +
                    let(:known_interval) { 300 }
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                    let(:scheduled_time) { "00:00" }
         | 
| 130 | 
            +
                    it "converts a time string to seconds" do
         | 
| 131 | 
            +
                      Timecop.freeze(Time.utc(2014, 1, 1, 12, 55, 0))
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                      expect(next_occurrence).to be(known_interval)
         | 
| 134 | 
            +
                    end
         | 
| 135 | 
            +
                  end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                end
         | 
| 138 | 
            +
              end
         | 
| 139 | 
            +
            end
         | 
    
        data/spec/delayed_cron_spec.rb
    CHANGED
    
    | @@ -26,6 +26,17 @@ describe DelayedCron do | |
| 26 26 | 
             
                  expect(DelayedCron.default_interval).not_to be_nil
         | 
| 27 27 | 
             
                end
         | 
| 28 28 |  | 
| 29 | 
            +
                it "should have a default_time_zone" do
         | 
| 30 | 
            +
                  setup(default_time_zone: "UTC")
         | 
| 31 | 
            +
                  expect(DelayedCron.default_time_zone).to eq "UTC"
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it "should default TZ to Eastern Time when not specified" do
         | 
| 35 | 
            +
                  setup(cron_jobs: [{job: "Test"}])
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  expect(DelayedCron.default_time_zone).to eq "Eastern Time (US & Canada)"
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 29 40 | 
             
                it "should have an array of cron_jobs" do
         | 
| 30 41 | 
             
                  setup(default_interval: 1.hour)
         | 
| 31 42 | 
             
                  expect(DelayedCron.cron_jobs).to be_an(Array)
         | 
    
        data/spec/scheduling_spec.rb
    CHANGED
    
    | @@ -9,61 +9,10 @@ describe DelayedCron::Scheduling do | |
| 9 9 | 
             
                  DelayedCron.schedule("SomeClass", "long_method", { interval: 1.hour })
         | 
| 10 10 | 
             
                  expect(DelayedCron.processor).to be_processed_in :cron_job
         | 
| 11 11 | 
             
                  expect(DelayedCron.processor.jobs.size).to eq(1)
         | 
| 12 | 
            -
                end
         | 
| 13 | 
            -
              end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
              describe ".parse_options" do
         | 
| 16 | 
            -
                let(:at_string) { { interval: 1.day, at: "00:00:00 -0500" } }
         | 
| 17 | 
            -
                let(:at_array)  { { interval: 1.day, at: ["00:00:00 -0500", "01:00:00 -0500"]} }
         | 
| 18 | 
            -
                let(:no_at)     { { interval: 1.day } }
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                it "parses options `at` option as string" do
         | 
| 21 | 
            -
                  expect(DelayedCron.parse_options(at_string)[:at]).to eq("00:00:00 -0500")
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                it "parses options `at` option as array" do
         | 
| 25 | 
            -
                  expected_options_array = [
         | 
| 26 | 
            -
                    { interval: 123, at: "00:00:00 -0500" },
         | 
| 27 | 
            -
                    { interval: 123, at: "01:00:00 -0500" }
         | 
| 28 | 
            -
                  ]
         | 
| 29 | 
            -
                  expect(DelayedCron.parse_options(at_array)[0][:at]).to eq("00:00:00 -0500")
         | 
| 30 | 
            -
                  expect(DelayedCron.parse_options(at_array)[1][:at]).to eq("01:00:00 -0500")
         | 
| 31 | 
            -
                end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                it "does not change options if `at` is not present" do
         | 
| 34 | 
            -
                  expect(DelayedCron.parse_options(no_at)).to eq(no_at)
         | 
| 35 | 
            -
                end
         | 
| 36 | 
            -
              end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
              describe ".add_interval" do
         | 
| 39 | 
            -
                it 'adds an interval key and value to the options hash' do
         | 
| 40 | 
            -
                  options = DelayedCron.add_interval(at: '12:00:00 -0500')
         | 
| 41 | 
            -
                  expect(options).to include(:interval)
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
              describe ".convert_time_string_to_seconds_interval" do
         | 
| 46 | 
            -
                let(:next_occurrence) do
         | 
| 47 | 
            -
                  DelayedCron.convert_time_string_to_seconds_interval(scheduled_time)
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
                # Set Time.now to January 1, 2014 12:00:00 PM
         | 
| 50 | 
            -
                before { Timecop.freeze(Time.local(2014, 1, 1, 12, 0, 0)) }
         | 
| 51 | 
            -
                context "next occurrence is today" do
         | 
| 52 | 
            -
                  let(:known_interval) { 3600 }
         | 
| 53 | 
            -
                  let(:scheduled_time) { "13:00:00 -0500" }
         | 
| 54 | 
            -
                  it "converts a time string to seconds" do
         | 
| 55 | 
            -
                    expect(next_occurrence).to be(known_interval)
         | 
| 56 | 
            -
                  end
         | 
| 57 | 
            -
                end
         | 
| 58 12 |  | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
                  let(:scheduled_time) { "11:00:00 -0500" }
         | 
| 62 | 
            -
                  it "converts a time string to seconds" do
         | 
| 63 | 
            -
                    expect(next_occurrence).to be(known_interval)
         | 
| 64 | 
            -
                  end
         | 
| 13 | 
            +
                  expect(DelayedCron.processor.jobs.last["args"])
         | 
| 14 | 
            +
                    .to eq(["SomeClass", "long_method", { "interval" => 1.hour.to_s }])
         | 
| 65 15 | 
             
                end
         | 
| 66 | 
            -
             | 
| 67 16 | 
             
              end
         | 
| 68 17 |  | 
| 69 18 | 
             
              describe ".timing_opts" do
         | 
| @@ -74,10 +23,22 @@ describe DelayedCron::Scheduling do | |
| 74 23 |  | 
| 75 24 | 
             
                it "collects the timing options" do
         | 
| 76 25 | 
             
                  interval = { interval: 1.day }
         | 
| 77 | 
            -
                  timing_opts = DelayedCron.timing_opts(options | 
| 26 | 
            +
                  timing_opts = DelayedCron.timing_opts(options)
         | 
| 78 27 | 
             
                  expect(timing_opts).to eq(options)
         | 
| 79 28 | 
             
                  expect(timing_opts).not_to eq(interval)
         | 
| 80 29 | 
             
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                it "passes time_zone through" do
         | 
| 32 | 
            +
                  options_with_zone = options.merge(time_zone: "UTC")
         | 
| 33 | 
            +
                  timing_opts = DelayedCron.timing_opts(options_with_zone)
         | 
| 34 | 
            +
                  expect(timing_opts).to eq(options_with_zone)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                it "ignores unknown parameters" do
         | 
| 38 | 
            +
                  timing_opts = DelayedCron.timing_opts(foo: :bar)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  expect(timing_opts).to_not have_key(:foo)
         | 
| 41 | 
            +
                end
         | 
| 81 42 | 
             
              end
         | 
| 82 43 |  | 
| 83 44 | 
             
            end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -21,6 +21,7 @@ end | |
| 21 21 | 
             
            def setup(options)
         | 
| 22 22 | 
             
              DelayedCron.setup do |config|
         | 
| 23 23 | 
             
                config.default_interval = options[:default_interval]
         | 
| 24 | 
            +
                config.default_time_zone = options[:default_time_zone]
         | 
| 24 25 | 
             
                config.cron_jobs = options[:cron_jobs] || []
         | 
| 25 26 | 
             
              end
         | 
| 26 27 | 
             
            end
         | 
| @@ -44,6 +45,6 @@ def build_class(class_name, name, options = {}) | |
| 44 45 | 
             
                end
         | 
| 45 46 |  | 
| 46 47 | 
             
              end
         | 
| 47 | 
            -
             | 
| 48 | 
            +
             | 
| 48 49 | 
             
              klass
         | 
| 49 | 
            -
            end
         | 
| 50 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: delayed_cron
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.10
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Justin Grubbs
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017- | 
| 11 | 
            +
            date: 2017-06-21 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: delayed_job
         | 
| @@ -181,6 +181,7 @@ files: | |
| 181 181 | 
             
            - delayed_cron.gemspec
         | 
| 182 182 | 
             
            - init.rb
         | 
| 183 183 | 
             
            - lib/delayed_cron.rb
         | 
| 184 | 
            +
            - lib/delayed_cron/cron_job.rb
         | 
| 184 185 | 
             
            - lib/delayed_cron/jobs.rb
         | 
| 185 186 | 
             
            - lib/delayed_cron/jobs/delayed_job.rb
         | 
| 186 187 | 
             
            - lib/delayed_cron/jobs/resque.rb
         | 
| @@ -190,6 +191,7 @@ files: | |
| 190 191 | 
             
            - lib/delayed_cron/scheduling.rb
         | 
| 191 192 | 
             
            - lib/delayed_cron/version.rb
         | 
| 192 193 | 
             
            - rails/init.rb
         | 
| 194 | 
            +
            - spec/cron_job_spec.rb
         | 
| 193 195 | 
             
            - spec/delayed_cron_spec.rb
         | 
| 194 196 | 
             
            - spec/jobs/sidekiq_spec.rb
         | 
| 195 197 | 
             
            - spec/scheduling_spec.rb
         | 
| @@ -218,6 +220,7 @@ signing_key: | |
| 218 220 | 
             
            specification_version: 4
         | 
| 219 221 | 
             
            summary: Run your cron jobs with sidekiq, delayed_job, resque, or sucker_punch.
         | 
| 220 222 | 
             
            test_files:
         | 
| 223 | 
            +
            - spec/cron_job_spec.rb
         | 
| 221 224 | 
             
            - spec/delayed_cron_spec.rb
         | 
| 222 225 | 
             
            - spec/jobs/sidekiq_spec.rb
         | 
| 223 226 | 
             
            - spec/scheduling_spec.rb
         |