whenever 0.9.2 → 0.9.3
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/.travis.yml +1 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +0 -5
- data/README.md +3 -1
- data/lib/whenever.rb +10 -11
- data/lib/whenever/capistrano/v3/tasks/whenever.rake +2 -2
- data/lib/whenever/command_line.rb +9 -9
- data/lib/whenever/cron.rb +11 -11
- data/lib/whenever/job.rb +2 -2
- data/lib/whenever/job_list.rb +18 -7
- data/lib/whenever/numeric_seconds.rb +54 -0
- data/lib/whenever/tasks/whenever.rake +2 -2
- data/lib/whenever/version.rb +1 -1
- data/test/functional/command_line_test.rb +221 -224
- data/test/functional/output_at_test.rb +188 -249
- data/test/functional/output_default_defined_jobs_test.rb +214 -290
- data/test/functional/output_defined_job_test.rb +65 -91
- data/test/functional/output_env_test.rb +22 -26
- data/test/functional/output_jobs_for_roles_test.rb +46 -66
- data/test/functional/output_redirection_test.rb +231 -309
- data/test/test_case.rb +39 -0
- data/test/test_helper.rb +33 -14
- data/test/unit/capistrano_support_test.rb +126 -148
- data/test/unit/cron_test.rb +188 -215
- data/test/unit/job_test.rb +111 -121
- data/whenever.gemspec +0 -2
- metadata +15 -41
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a1b180d6b22aaf3199ec47903e36483b327aeafd
         | 
| 4 | 
            +
              data.tar.gz: 91102f27ed51d7821ff1888ea73e92a65e402bb5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: f7044dac57adb8271c293e67efca30307731b7107415daa144e7dbd86cd273631df06d4cfda5142a592b936c0c06dcb44b2902969be837a304a57d86e2bf4022
         | 
| 7 | 
            +
              data.tar.gz: d8f94fb6114a737eb9b5d17c9884deba827057763b0c45af7e04e6ed5971101142f2df3bfc7bf37b75015f8d844e08f0ff3fd985f3214f61fc4e0d5748a1b929
         | 
    
        data/.travis.yml
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,14 @@ | |
| 1 | 
            +
            ### 0.9.3 / October 5, 2014
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Drop ActiveSupport dependency [James Healy, Javan Makhmali]
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Drop shoulda for tests
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * Fix `whenever:clear_crontab` Cap 3 task [Javan Makhmali]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            * Avoid using tempfiles [ahoward]
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             | 
| 1 12 | 
             
            ### 0.9.2 / March 4, 2014
         | 
| 2 13 |  | 
| 3 14 | 
             
            * Fix issues generating arguments for `execute` in Capistrano 3 tasks. [Javan Makhmali]
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -139,7 +139,9 @@ In your "Capfile" file: | |
| 139 139 | 
             
            require "whenever/capistrano"
         | 
| 140 140 | 
             
            ```
         | 
| 141 141 |  | 
| 142 | 
            -
            Take a look at the load:defaults (bottom of file) task for options you can set. < | 
| 142 | 
            +
            Take a look at the load:defaults (bottom of file) task for options you can set. <https://github.com/javan/whenever/blob/master/lib/whenever/capistrano/v3/tasks/whenever.rake>. For example, to namespace the crontab entries by application and stage do this.
         | 
| 143 | 
            +
             | 
| 144 | 
            +
            In your  in "config/deploy.rb" file:
         | 
| 143 145 |  | 
| 144 146 | 
             
            ```ruby
         | 
| 145 147 | 
             
            set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }
         | 
    
        data/lib/whenever.rb
    CHANGED
    
    | @@ -1,20 +1,19 @@ | |
| 1 | 
            -
            require ' | 
| 2 | 
            -
            require ' | 
| 1 | 
            +
            require 'whenever/numeric_seconds'
         | 
| 2 | 
            +
            require 'whenever/job_list'
         | 
| 3 | 
            +
            require 'whenever/job'
         | 
| 4 | 
            +
            require 'whenever/command_line'
         | 
| 5 | 
            +
            require 'whenever/cron'
         | 
| 6 | 
            +
            require 'whenever/output_redirection'
         | 
| 3 7 |  | 
| 4 8 | 
             
            module Whenever
         | 
| 5 | 
            -
              autoload :JobList,           'whenever/job_list'
         | 
| 6 | 
            -
              autoload :Job,               'whenever/job'
         | 
| 7 | 
            -
              autoload :CommandLine,       'whenever/command_line'
         | 
| 8 | 
            -
             | 
| 9 | 
            -
              module Output
         | 
| 10 | 
            -
                autoload :Cron,        'whenever/cron'
         | 
| 11 | 
            -
                autoload :Redirection, 'whenever/output_redirection'
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
             | 
| 14 9 | 
             
              def self.cron(options)
         | 
| 15 10 | 
             
                Whenever::JobList.new(options).generate_cron_output
         | 
| 16 11 | 
             
              end
         | 
| 17 12 |  | 
| 13 | 
            +
              def self.seconds(number, units)
         | 
| 14 | 
            +
                Whenever::NumericSeconds.seconds(number, units)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 18 17 | 
             
              def self.path
         | 
| 19 18 | 
             
                Dir.pwd
         | 
| 20 19 | 
             
              end
         | 
| @@ -3,10 +3,10 @@ namespace :whenever do | |
| 3 3 | 
             
                args = Array(fetch(:whenever_command)) + args
         | 
| 4 4 |  | 
| 5 5 | 
             
                on roles fetch(:whenever_roles) do |host|
         | 
| 6 | 
            -
                   | 
| 6 | 
            +
                  args = args + Array(yield(host)) if block_given?
         | 
| 7 7 | 
             
                  within release_path do
         | 
| 8 8 | 
             
                    with fetch(:whenever_command_environment_variables) do
         | 
| 9 | 
            -
                      execute * | 
| 9 | 
            +
                      execute *args
         | 
| 10 10 | 
             
                    end
         | 
| 11 11 | 
             
                  end
         | 
| 12 12 | 
             
                end
         | 
| @@ -1,5 +1,4 @@ | |
| 1 1 | 
             
            require 'fileutils'
         | 
| 2 | 
            -
            require 'tempfile'
         | 
| 3 2 |  | 
| 4 3 | 
             
            module Whenever
         | 
| 5 4 | 
             
              class CommandLine
         | 
| @@ -66,23 +65,24 @@ module Whenever | |
| 66 65 | 
             
                end
         | 
| 67 66 |  | 
| 68 67 | 
             
                def write_crontab(contents)
         | 
| 69 | 
            -
                  tmp_cron_file = Tempfile.open('whenever_tmp_cron')
         | 
| 70 | 
            -
                  tmp_cron_file << contents
         | 
| 71 | 
            -
                  tmp_cron_file.fsync
         | 
| 72 | 
            -
             | 
| 73 68 | 
             
                  command = ['crontab']
         | 
| 74 69 | 
             
                  command << "-u #{@options[:user]}" if @options[:user]
         | 
| 75 | 
            -
                  command <<  | 
| 70 | 
            +
                  command << "-"
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  IO.popen(command.join(' '), 'r+') do |crontab|
         | 
| 73 | 
            +
                    crontab.write(contents)
         | 
| 74 | 
            +
                    crontab.close_write
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  success = $?.exitstatus.zero?
         | 
| 76 78 |  | 
| 77 | 
            -
                  if  | 
| 79 | 
            +
                  if success
         | 
| 78 80 | 
             
                    action = 'written' if @options[:write]
         | 
| 79 81 | 
             
                    action = 'updated' if @options[:update]
         | 
| 80 82 | 
             
                    puts "[write] crontab file #{action}"
         | 
| 81 | 
            -
                    tmp_cron_file.close!
         | 
| 82 83 | 
             
                    exit(0)
         | 
| 83 84 | 
             
                  else
         | 
| 84 85 | 
             
                    warn "[fail] Couldn't write crontab; try running `whenever' with no options to ensure your schedule file is valid."
         | 
| 85 | 
            -
                    tmp_cron_file.close!
         | 
| 86 86 | 
             
                    exit(1)
         | 
| 87 87 | 
             
                  end
         | 
| 88 88 | 
             
                end
         | 
    
        data/lib/whenever/cron.rb
    CHANGED
    
    | @@ -60,11 +60,11 @@ module Whenever | |
| 60 60 | 
             
                  def parse_symbol
         | 
| 61 61 | 
             
                    shortcut = case @time
         | 
| 62 62 | 
             
                      when *KEYWORDS then "@#{@time}" # :reboot => '@reboot'
         | 
| 63 | 
            -
                      when :year     then 12 | 
| 64 | 
            -
                      when :day      then 1 | 
| 65 | 
            -
                      when :month    then 1 | 
| 66 | 
            -
                      when :week     then 1 | 
| 67 | 
            -
                      when :hour     then 1 | 
| 63 | 
            +
                      when :year     then Whenever.seconds(12, :months)
         | 
| 64 | 
            +
                      when :day      then Whenever.seconds(1, :day)
         | 
| 65 | 
            +
                      when :month    then Whenever.seconds(1, :month)
         | 
| 66 | 
            +
                      when :week     then Whenever.seconds(1, :week)
         | 
| 67 | 
            +
                      when :hour     then Whenever.seconds(1, :hour)
         | 
| 68 68 | 
             
                    end
         | 
| 69 69 |  | 
| 70 70 | 
             
                    if shortcut.is_a?(Numeric)
         | 
| @@ -84,21 +84,21 @@ module Whenever | |
| 84 84 | 
             
                  def parse_time
         | 
| 85 85 | 
             
                    timing = Array.new(5, '*')
         | 
| 86 86 | 
             
                    case @time
         | 
| 87 | 
            -
                      when 0.seconds | 
| 87 | 
            +
                      when Whenever.seconds(0, :seconds)...Whenever.seconds(1, :minute)
         | 
| 88 88 | 
             
                        raise ArgumentError, "Time must be in minutes or higher"
         | 
| 89 | 
            -
                      when 1 | 
| 89 | 
            +
                      when Whenever.seconds(1, :minute)...Whenever.seconds(1, :hour)
         | 
| 90 90 | 
             
                        minute_frequency = @time / 60
         | 
| 91 91 | 
             
                        timing[0] = comma_separated_timing(minute_frequency, 59, @at || 0)
         | 
| 92 | 
            -
                      when 1 | 
| 92 | 
            +
                      when Whenever.seconds(1, :hour)...Whenever.seconds(1, :day)
         | 
| 93 93 | 
             
                        hour_frequency = (@time / 60 / 60).round
         | 
| 94 94 | 
             
                        timing[0] = @at.is_a?(Time) ? @at.min : @at
         | 
| 95 95 | 
             
                        timing[1] = comma_separated_timing(hour_frequency, 23)
         | 
| 96 | 
            -
                      when 1 | 
| 96 | 
            +
                      when Whenever.seconds(1, :day)...Whenever.seconds(1, :month)
         | 
| 97 97 | 
             
                        day_frequency = (@time / 24 / 60 / 60).round
         | 
| 98 98 | 
             
                        timing[0] = @at.is_a?(Time) ? @at.min  : 0
         | 
| 99 99 | 
             
                        timing[1] = @at.is_a?(Time) ? @at.hour : @at
         | 
| 100 100 | 
             
                        timing[2] = comma_separated_timing(day_frequency, 31, 1)
         | 
| 101 | 
            -
                      when 1 | 
| 101 | 
            +
                      when Whenever.seconds(1, :month)..Whenever.seconds(12, :months)
         | 
| 102 102 | 
             
                        month_frequency = (@time / 30  / 24 / 60 / 60).round
         | 
| 103 103 | 
             
                        timing[0] = @at.is_a?(Time) ? @at.min  : 0
         | 
| 104 104 | 
             
                        timing[1] = @at.is_a?(Time) ? @at.hour : 0
         | 
| @@ -133,7 +133,7 @@ module Whenever | |
| 133 133 | 
             
                  end
         | 
| 134 134 |  | 
| 135 135 | 
             
                  def comma_separated_timing(frequency, max, start = 0)
         | 
| 136 | 
            -
                    return start     if frequency. | 
| 136 | 
            +
                    return start     if frequency.nil? || frequency == "" || frequency.zero?
         | 
| 137 137 | 
             
                    return '*'       if frequency == 1
         | 
| 138 138 | 
             
                    return frequency if frequency > (max * 0.5).ceil
         | 
| 139 139 |  | 
    
        data/lib/whenever/job.rb
    CHANGED
    
    | @@ -9,7 +9,7 @@ module Whenever | |
| 9 9 | 
             
                  @at                               = options.delete(:at)
         | 
| 10 10 | 
             
                  @template                         = options.delete(:template)
         | 
| 11 11 | 
             
                  @job_template                     = options.delete(:job_template) || ":job"
         | 
| 12 | 
            -
                  @roles                            = Array | 
| 12 | 
            +
                  @roles                            = Array(options.delete(:roles))
         | 
| 13 13 | 
             
                  @options[:output]                 = options.has_key?(:output) ? Whenever::Output::Redirection.new(options[:output]).to_s : ''
         | 
| 14 14 | 
             
                  @options[:environment_variable] ||= "RAILS_ENV"
         | 
| 15 15 | 
             
                  @options[:environment]          ||= :production
         | 
| @@ -40,7 +40,7 @@ module Whenever | |
| 40 40 | 
             
                    else
         | 
| 41 41 | 
             
                      option
         | 
| 42 42 | 
             
                    end
         | 
| 43 | 
            -
                  end. | 
| 43 | 
            +
                  end.gsub(/\s+/m, " ").strip
         | 
| 44 44 | 
             
                end
         | 
| 45 45 |  | 
| 46 46 | 
             
                def escape_single_quotes(str)
         | 
    
        data/lib/whenever/job_list.rb
    CHANGED
    
    | @@ -21,8 +21,8 @@ module Whenever | |
| 21 21 | 
             
                    File.read(options[:file])
         | 
| 22 22 | 
             
                  end
         | 
| 23 23 |  | 
| 24 | 
            -
                  instance_eval(setup, setup_file)
         | 
| 25 | 
            -
                  instance_eval(schedule, options[:file] || '<eval>')
         | 
| 24 | 
            +
                  instance_eval(Whenever::NumericSeconds.process_string(setup), setup_file)
         | 
| 25 | 
            +
                  instance_eval(Whenever::NumericSeconds.process_string(schedule), options[:file] || '<eval>')
         | 
| 26 26 | 
             
                end
         | 
| 27 27 |  | 
| 28 28 | 
             
                def set(variable, value)
         | 
| @@ -45,7 +45,7 @@ module Whenever | |
| 45 45 | 
             
                end
         | 
| 46 46 |  | 
| 47 47 | 
             
                def job_type(name, template)
         | 
| 48 | 
            -
                  class_eval do
         | 
| 48 | 
            +
                  singleton_class_shim.class_eval do
         | 
| 49 49 | 
             
                    define_method(name) do |task, *args|
         | 
| 50 50 | 
             
                      options = { :task => task, :template => template }
         | 
| 51 51 | 
             
                      options.merge!(args[0]) if args[0].is_a? Hash
         | 
| @@ -67,19 +67,30 @@ module Whenever | |
| 67 67 |  | 
| 68 68 | 
             
              private
         | 
| 69 69 |  | 
| 70 | 
            +
                # The Object#singleton_class method only became available in MRI 1.9.2, so
         | 
| 71 | 
            +
                # we need this to maintain 1.8 compatibility. Once 1.8 support is dropped,
         | 
| 72 | 
            +
                # this can be removed
         | 
| 73 | 
            +
                def singleton_class_shim
         | 
| 74 | 
            +
                  if self.respond_to?(:singleton_clas)
         | 
| 75 | 
            +
                    singleton_class
         | 
| 76 | 
            +
                  else
         | 
| 77 | 
            +
                    class << self; self; end
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 70 81 | 
             
                #
         | 
| 71 82 | 
             
                # Takes a string like: "variable1=something&variable2=somethingelse"
         | 
| 72 83 | 
             
                # and breaks it into variable/value pairs. Used for setting variables at runtime from the command line.
         | 
| 73 84 | 
             
                # Only works for setting values as strings.
         | 
| 74 85 | 
             
                #
         | 
| 75 86 | 
             
                def pre_set(variable_string = nil)
         | 
| 76 | 
            -
                  return if variable_string. | 
| 87 | 
            +
                  return if variable_string.nil? || variable_string == ""
         | 
| 77 88 |  | 
| 78 89 | 
             
                  pairs = variable_string.split('&')
         | 
| 79 90 | 
             
                  pairs.each do |pair|
         | 
| 80 91 | 
             
                    next unless pair.index('=')
         | 
| 81 92 | 
             
                    variable, value = *pair.split('=')
         | 
| 82 | 
            -
                    unless variable. | 
| 93 | 
            +
                    unless variable.nil? || variable == "" || value.nil? || value == ""
         | 
| 83 94 | 
             
                      variable = variable.strip.to_sym
         | 
| 84 95 | 
             
                      set(variable, value.strip)
         | 
| 85 96 | 
             
                      @pre_set_variables[variable] = value
         | 
| @@ -92,7 +103,7 @@ module Whenever | |
| 92 103 |  | 
| 93 104 | 
             
                  output = []
         | 
| 94 105 | 
             
                  @env.each do |key, val|
         | 
| 95 | 
            -
                    output << "#{key}=#{val. | 
| 106 | 
            +
                    output << "#{key}=#{val.nil? || val == "" ? '""' : val}\n"
         | 
| 96 107 | 
             
                  end
         | 
| 97 108 | 
             
                  output << "\n"
         | 
| 98 109 |  | 
| @@ -140,7 +151,7 @@ module Whenever | |
| 140 151 | 
             
                      Whenever::Output::Cron.output(time, job) do |cron|
         | 
| 141 152 | 
             
                        cron << "\n\n"
         | 
| 142 153 |  | 
| 143 | 
            -
                        if cron | 
| 154 | 
            +
                        if cron[0,1] == "@"
         | 
| 144 155 | 
             
                          shortcut_jobs << cron
         | 
| 145 156 | 
             
                        else
         | 
| 146 157 | 
             
                          regular_jobs << cron
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            module Whenever
         | 
| 2 | 
            +
              class NumericSeconds
         | 
| 3 | 
            +
                PATTERN = /(\d+)\.(seconds?|minutes?|hours?|days?|weeks?|months?|years?)/
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                attr_reader :number
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def self.seconds(number, units)
         | 
| 8 | 
            +
                  new(number).send(units)
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def self.process_string(string)
         | 
| 12 | 
            +
                  string.gsub(PATTERN) { Whenever.seconds($1, $2) }
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def initialize(number)
         | 
| 16 | 
            +
                  @number = number.to_i
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def seconds
         | 
| 20 | 
            +
                  number
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
                alias :second :seconds
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def minutes
         | 
| 25 | 
            +
                  number * 60
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
                alias :minute :minutes
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def hours
         | 
| 30 | 
            +
                  number * 3_600
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
                alias :hour :hours
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def days
         | 
| 35 | 
            +
                  number * 86_400
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
                alias :day :days
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def weeks
         | 
| 40 | 
            +
                  number * 604_800
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
                alias :week :weeks
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                def months
         | 
| 45 | 
            +
                  number * 2_592_000
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
                alias :month :months
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def years
         | 
| 50 | 
            +
                  number * 31_557_600
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
                alias :year :years
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -3,10 +3,10 @@ namespace :whenever do | |
| 3 3 | 
             
                args = Array(fetch(:whenever_command)) + args
         | 
| 4 4 |  | 
| 5 5 | 
             
                on roles fetch(:whenever_roles) do |host|
         | 
| 6 | 
            -
                   | 
| 6 | 
            +
                  args = args + Array(yield(host)) if block_given?
         | 
| 7 7 | 
             
                  within release_path do
         | 
| 8 8 | 
             
                    with fetch(:whenever_command_environment_variables) do
         | 
| 9 | 
            -
                      execute * | 
| 9 | 
            +
                      execute *args
         | 
| 10 10 | 
             
                    end
         | 
| 11 11 | 
             
                  end
         | 
| 12 12 | 
             
                end
         | 
    
        data/lib/whenever/version.rb
    CHANGED
    
    
| @@ -1,44 +1,42 @@ | |
| 1 | 
            -
            require  | 
| 2 | 
            -
             | 
| 3 | 
            -
            class  | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
                 | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                  Whenever.expects(:cron).returns(@task)
         | 
| 11 | 
            -
                end
         | 
| 1 | 
            +
            require 'test_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class CommandLineWriteTest < Whenever::TestCase
         | 
| 4 | 
            +
              setup do
         | 
| 5 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 6 | 
            +
                @command = Whenever::CommandLine.new(:write => true, :identifier => 'My identifier')
         | 
| 7 | 
            +
                @task = "#{two_hours} /my/command"
         | 
| 8 | 
            +
                Whenever.expects(:cron).returns(@task)
         | 
| 9 | 
            +
              end
         | 
| 12 10 |  | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 11 | 
            +
              should "output the cron job with identifier blocks" do
         | 
| 12 | 
            +
                output = <<-EXPECTED
         | 
| 15 13 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| 16 14 | 
             
            #{@task}
         | 
| 17 15 | 
             
            # End Whenever generated tasks for: My identifier
         | 
| 18 16 | 
             
            EXPECTED
         | 
| 19 17 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 18 | 
            +
                assert_equal output, @command.send(:whenever_cron)
         | 
| 19 | 
            +
              end
         | 
| 22 20 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                end
         | 
| 21 | 
            +
              should "write the crontab when run" do
         | 
| 22 | 
            +
                @command.expects(:write_crontab).returns(true)
         | 
| 23 | 
            +
                assert @command.run
         | 
| 27 24 | 
             
              end
         | 
| 25 | 
            +
            end
         | 
| 28 26 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 27 | 
            +
            class CommandLineUpdateTest < Whenever::TestCase
         | 
| 28 | 
            +
              setup do
         | 
| 29 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 30 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :identifier => 'My identifier')
         | 
| 31 | 
            +
                @task = "#{two_hours} /my/command"
         | 
| 32 | 
            +
                Whenever.expects(:cron).returns(@task)
         | 
| 33 | 
            +
              end
         | 
| 36 34 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 35 | 
            +
              should "add the cron to the end of the file if there is no existing identifier block" do
         | 
| 36 | 
            +
                existing = '# Existing crontab'
         | 
| 37 | 
            +
                @command.expects(:read_crontab).at_least_once.returns(existing)
         | 
| 40 38 |  | 
| 41 | 
            -
             | 
| 39 | 
            +
                new_cron = <<-EXPECTED
         | 
| 42 40 | 
             
            #{existing}
         | 
| 43 41 |  | 
| 44 42 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| @@ -46,14 +44,14 @@ EXPECTED | |
| 46 44 | 
             
            # End Whenever generated tasks for: My identifier
         | 
| 47 45 | 
             
            EXPECTED
         | 
| 48 46 |  | 
| 49 | 
            -
             | 
| 47 | 
            +
                assert_equal new_cron, @command.send(:updated_crontab)
         | 
| 50 48 |  | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 49 | 
            +
                @command.expects(:write_crontab).with(new_cron).returns(true)
         | 
| 50 | 
            +
                assert @command.run
         | 
| 51 | 
            +
              end
         | 
| 54 52 |  | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 53 | 
            +
              should "replace an existing block if the identifier matches" do
         | 
| 54 | 
            +
                existing = <<-EXISTING_CRON
         | 
| 57 55 | 
             
            # Something
         | 
| 58 56 |  | 
| 59 57 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| @@ -65,7 +63,7 @@ This shouldn't get replaced | |
| 65 63 | 
             
            # End Whenever generated tasks for: Other identifier
         | 
| 66 64 | 
             
            EXISTING_CRON
         | 
| 67 65 |  | 
| 68 | 
            -
             | 
| 66 | 
            +
                new_cron = <<-NEW_CRON
         | 
| 69 67 | 
             
            # Something
         | 
| 70 68 |  | 
| 71 69 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| @@ -77,62 +75,62 @@ This shouldn't get replaced | |
| 77 75 | 
             
            # End Whenever generated tasks for: Other identifier
         | 
| 78 76 | 
             
            NEW_CRON
         | 
| 79 77 |  | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 78 | 
            +
                @command.expects(:read_crontab).at_least_once.returns(existing)
         | 
| 79 | 
            +
                assert_equal new_cron, @command.send(:updated_crontab)
         | 
| 82 80 |  | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
                end
         | 
| 81 | 
            +
                @command.expects(:write_crontab).with(new_cron).returns(true)
         | 
| 82 | 
            +
                assert @command.run
         | 
| 86 83 | 
             
              end
         | 
| 84 | 
            +
            end
         | 
| 87 85 |  | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 86 | 
            +
            class CommandLineUpdateWithBackslashesTest < Whenever::TestCase
         | 
| 87 | 
            +
              setup do
         | 
| 88 | 
            +
                @existing = <<-EXISTING_CRON
         | 
| 91 89 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| 92 90 | 
             
            script/runner -e production 'puts '\\''hello'\\'''
         | 
| 93 91 | 
             
            # End Whenever generated tasks for: My identifier
         | 
| 94 92 | 
             
            EXISTING_CRON
         | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 93 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 94 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :identifier => 'My identifier')
         | 
| 95 | 
            +
                @command.expects(:read_crontab).at_least_once.returns(@existing)
         | 
| 96 | 
            +
                @command.expects(:whenever_cron).returns(@existing)
         | 
| 97 | 
            +
              end
         | 
| 100 98 |  | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
                end
         | 
| 99 | 
            +
              should "replace the existing block with the backslashes in tact" do
         | 
| 100 | 
            +
                assert_equal @existing, @command.send(:updated_crontab)
         | 
| 104 101 | 
             
              end
         | 
| 102 | 
            +
            end
         | 
| 105 103 |  | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 104 | 
            +
            class CommandLineUpdateToSimilarCrontabTest < Whenever::TestCase
         | 
| 105 | 
            +
              setup do
         | 
| 106 | 
            +
                @existing = <<-EXISTING_CRON
         | 
| 109 107 | 
             
            # Begin Whenever generated tasks for: WheneverExisting
         | 
| 110 108 | 
             
            # End Whenever generated tasks for: WheneverExisting
         | 
| 111 109 | 
             
            EXISTING_CRON
         | 
| 112 | 
            -
             | 
| 110 | 
            +
                @new = <<-NEW_CRON
         | 
| 113 111 | 
             
            # Begin Whenever generated tasks for: Whenever
         | 
| 114 112 | 
             
            # End Whenever generated tasks for: Whenever
         | 
| 115 113 | 
             
            NEW_CRON
         | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 114 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 115 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :identifier => 'Whenever')
         | 
| 116 | 
            +
                @command.expects(:read_crontab).at_least_once.returns(@existing)
         | 
| 117 | 
            +
                @command.expects(:whenever_cron).returns(@new)
         | 
| 118 | 
            +
              end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
              should "append the similarly named command" do
         | 
| 121 | 
            +
                assert_equal @existing + "\n" + @new, @command.send(:updated_crontab)
         | 
| 122 | 
            +
              end
         | 
| 123 | 
            +
            end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
            class CommandLineClearTest < Whenever::TestCase
         | 
| 126 | 
            +
              setup do
         | 
| 127 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 128 | 
            +
                @command = Whenever::CommandLine.new(:clear => true, :identifier => 'My identifier')
         | 
| 129 | 
            +
                @task = "#{two_hours} /my/command"
         | 
| 130 | 
            +
              end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
              should "clear an existing block if the identifier matches" do
         | 
| 133 | 
            +
                existing = <<-EXISTING_CRON
         | 
| 136 134 | 
             
            # Something
         | 
| 137 135 |  | 
| 138 136 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| @@ -144,9 +142,9 @@ This shouldn't get replaced | |
| 144 142 | 
             
            # End Whenever generated tasks for: Other identifier
         | 
| 145 143 | 
             
            EXISTING_CRON
         | 
| 146 144 |  | 
| 147 | 
            -
             | 
| 145 | 
            +
                @command.expects(:read_crontab).at_least_once.returns(existing)
         | 
| 148 146 |  | 
| 149 | 
            -
             | 
| 147 | 
            +
                new_cron = <<-NEW_CRON
         | 
| 150 148 | 
             
            # Something
         | 
| 151 149 |  | 
| 152 150 | 
             
            # Begin Whenever generated tasks for: Other identifier
         | 
| @@ -154,137 +152,138 @@ This shouldn't get replaced | |
| 154 152 | 
             
            # End Whenever generated tasks for: Other identifier
         | 
| 155 153 | 
             
            NEW_CRON
         | 
| 156 154 |  | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 162 | 
            -
             | 
| 163 | 
            -
             | 
| 164 | 
            -
             | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
| 168 | 
            -
             | 
| 169 | 
            -
             | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 178 | 
            -
             | 
| 179 | 
            -
             | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
             | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
             | 
| 187 | 
            -
             | 
| 188 | 
            -
             | 
| 189 | 
            -
             | 
| 190 | 
            -
             | 
| 191 | 
            -
             | 
| 192 | 
            -
             | 
| 193 | 
            -
             | 
| 194 | 
            -
             | 
| 195 | 
            -
             | 
| 196 | 
            -
             | 
| 197 | 
            -
             | 
| 198 | 
            -
             | 
| 199 | 
            -
             | 
| 200 | 
            -
             | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 203 | 
            -
             | 
| 204 | 
            -
             | 
| 205 | 
            -
             | 
| 206 | 
            -
             | 
| 207 | 
            -
             | 
| 208 | 
            -
             | 
| 209 | 
            -
             | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 212 | 
            -
             | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 215 | 
            -
             | 
| 216 | 
            -
             | 
| 217 | 
            -
             | 
| 218 | 
            -
             | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 222 | 
            -
             | 
| 223 | 
            -
             | 
| 224 | 
            -
             | 
| 225 | 
            -
             | 
| 226 | 
            -
             | 
| 227 | 
            -
             | 
| 228 | 
            -
             | 
| 229 | 
            -
             | 
| 230 | 
            -
             | 
| 231 | 
            -
             | 
| 232 | 
            -
             | 
| 233 | 
            -
             | 
| 234 | 
            -
             | 
| 235 | 
            -
                     | 
| 236 | 
            -
                   | 
| 237 | 
            -
                 | 
| 238 | 
            -
             | 
| 239 | 
            -
             | 
| 240 | 
            -
             | 
| 241 | 
            -
                 | 
| 242 | 
            -
              end
         | 
| 243 | 
            -
             | 
| 244 | 
            -
             | 
| 245 | 
            -
             | 
| 246 | 
            -
             | 
| 247 | 
            -
             | 
| 248 | 
            -
             | 
| 249 | 
            -
             | 
| 250 | 
            -
             | 
| 251 | 
            -
             | 
| 252 | 
            -
             | 
| 253 | 
            -
                     | 
| 254 | 
            -
                   | 
| 255 | 
            -
                 | 
| 256 | 
            -
             | 
| 257 | 
            -
             | 
| 258 | 
            -
             | 
| 259 | 
            -
                 | 
| 260 | 
            -
              end
         | 
| 261 | 
            -
             | 
| 262 | 
            -
             | 
| 263 | 
            -
             | 
| 264 | 
            -
             | 
| 265 | 
            -
             | 
| 266 | 
            -
             | 
| 267 | 
            -
             | 
| 268 | 
            -
             | 
| 269 | 
            -
             | 
| 270 | 
            -
             | 
| 271 | 
            -
                     | 
| 272 | 
            -
                   | 
| 273 | 
            -
                 | 
| 274 | 
            -
             | 
| 275 | 
            -
             | 
| 276 | 
            -
             | 
| 277 | 
            -
                 | 
| 278 | 
            -
              end
         | 
| 279 | 
            -
             | 
| 280 | 
            -
             | 
| 281 | 
            -
             | 
| 282 | 
            -
             | 
| 283 | 
            -
                 | 
| 284 | 
            -
             | 
| 285 | 
            -
             | 
| 286 | 
            -
             | 
| 287 | 
            -
             | 
| 155 | 
            +
                assert_equal new_cron, @command.send(:updated_crontab)
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                @command.expects(:write_crontab).with(new_cron).returns(true)
         | 
| 158 | 
            +
                assert @command.run
         | 
| 159 | 
            +
              end
         | 
| 160 | 
            +
            end
         | 
| 161 | 
            +
             | 
| 162 | 
            +
            class CommandLineClearWithNoScheduleTest < Whenever::TestCase
         | 
| 163 | 
            +
              setup do
         | 
| 164 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(false)
         | 
| 165 | 
            +
                @command = Whenever::CommandLine.new(:clear => true, :identifier => 'My identifier')
         | 
| 166 | 
            +
              end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
              should "run successfully" do
         | 
| 169 | 
            +
                @command.expects(:write_crontab).returns(true)
         | 
| 170 | 
            +
                assert @command.run
         | 
| 171 | 
            +
              end
         | 
| 172 | 
            +
            end
         | 
| 173 | 
            +
             | 
| 174 | 
            +
            class CommandLineUpdateWithNoIdentifierTest < Whenever::TestCase
         | 
| 175 | 
            +
              setup do
         | 
| 176 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 177 | 
            +
                Whenever::CommandLine.any_instance.expects(:default_identifier).returns('DEFAULT')
         | 
| 178 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :file => @file)
         | 
| 179 | 
            +
              end
         | 
| 180 | 
            +
             | 
| 181 | 
            +
              should "use the default identifier" do
         | 
| 182 | 
            +
                assert_equal "Whenever generated tasks for: DEFAULT", @command.send(:comment_base)
         | 
| 183 | 
            +
              end
         | 
| 184 | 
            +
            end
         | 
| 185 | 
            +
             | 
| 186 | 
            +
            class CombinedParamsTest < Whenever::TestCase
         | 
| 187 | 
            +
              setup do
         | 
| 188 | 
            +
                Whenever::CommandLine.any_instance.expects(:exit)
         | 
| 189 | 
            +
                Whenever::CommandLine.any_instance.expects(:warn)
         | 
| 190 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 191 | 
            +
              end
         | 
| 192 | 
            +
             | 
| 193 | 
            +
              should "exit with write and clear" do
         | 
| 194 | 
            +
                @command = Whenever::CommandLine.new(:write => true, :clear => true)
         | 
| 195 | 
            +
              end
         | 
| 196 | 
            +
             | 
| 197 | 
            +
              should "exit with write and update" do
         | 
| 198 | 
            +
                @command = Whenever::CommandLine.new(:write => true, :update => true)
         | 
| 199 | 
            +
              end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
              should "exit with update and clear" do
         | 
| 202 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :clear => true)
         | 
| 203 | 
            +
              end
         | 
| 204 | 
            +
            end
         | 
| 205 | 
            +
             | 
| 206 | 
            +
            class RunnerOverwrittenWithSetOptionTest < Whenever::TestCase
         | 
| 207 | 
            +
              setup do
         | 
| 208 | 
            +
                @output = Whenever.cron :set => 'environment=serious', :string => \
         | 
| 209 | 
            +
                <<-file
         | 
| 210 | 
            +
                  set :job_template, nil
         | 
| 211 | 
            +
                  set :environment, :silly
         | 
| 212 | 
            +
                  set :path, '/my/path'
         | 
| 213 | 
            +
                  every 2.hours do
         | 
| 214 | 
            +
                    runner "blahblah"
         | 
| 215 | 
            +
                  end
         | 
| 216 | 
            +
                file
         | 
| 217 | 
            +
              end
         | 
| 218 | 
            +
             | 
| 219 | 
            +
              should "output the runner using the override environment" do
         | 
| 220 | 
            +
                assert_match two_hours + %( cd /my/path && script/runner -e serious 'blahblah'), @output
         | 
| 221 | 
            +
              end
         | 
| 222 | 
            +
            end
         | 
| 223 | 
            +
             | 
| 224 | 
            +
             | 
| 225 | 
            +
            class EnvironmentAndPathOverwrittenWithSetOptionTest < Whenever::TestCase
         | 
| 226 | 
            +
              setup do
         | 
| 227 | 
            +
                @output = Whenever.cron :set => 'environment=serious&path=/serious/path', :string => \
         | 
| 228 | 
            +
                <<-file
         | 
| 229 | 
            +
                  set :job_template, nil
         | 
| 230 | 
            +
                  set :environment, :silly
         | 
| 231 | 
            +
                  set :path, '/silly/path'
         | 
| 232 | 
            +
                  every 2.hours do
         | 
| 233 | 
            +
                    runner "blahblah"
         | 
| 234 | 
            +
                  end
         | 
| 235 | 
            +
                file
         | 
| 236 | 
            +
              end
         | 
| 237 | 
            +
             | 
| 238 | 
            +
              should "output the runner using the overridden path and environment" do
         | 
| 239 | 
            +
                assert_match two_hours + %( cd /serious/path && script/runner -e serious 'blahblah'), @output
         | 
| 240 | 
            +
              end
         | 
| 241 | 
            +
            end
         | 
| 242 | 
            +
             | 
| 243 | 
            +
            class EnvironmentAndPathOverwrittenWithSetOptionWithSpacesTest < Whenever::TestCase
         | 
| 244 | 
            +
              setup do
         | 
| 245 | 
            +
                @output = Whenever.cron :set => ' environment = serious&  path =/serious/path', :string => \
         | 
| 246 | 
            +
                <<-file
         | 
| 247 | 
            +
                  set :job_template, nil
         | 
| 248 | 
            +
                  set :environment, :silly
         | 
| 249 | 
            +
                  set :path, '/silly/path'
         | 
| 250 | 
            +
                  every 2.hours do
         | 
| 251 | 
            +
                    runner "blahblah"
         | 
| 252 | 
            +
                  end
         | 
| 253 | 
            +
                file
         | 
| 254 | 
            +
              end
         | 
| 255 | 
            +
             | 
| 256 | 
            +
              should "output the runner using the overridden path and environment" do
         | 
| 257 | 
            +
                assert_match two_hours + %( cd /serious/path && script/runner -e serious 'blahblah'), @output
         | 
| 258 | 
            +
              end
         | 
| 259 | 
            +
            end
         | 
| 260 | 
            +
             | 
| 261 | 
            +
            class EnvironmentOverwrittenWithoutValueTest < Whenever::TestCase
         | 
| 262 | 
            +
              setup do
         | 
| 263 | 
            +
                @output = Whenever.cron :set => ' environment=', :string => \
         | 
| 264 | 
            +
                <<-file
         | 
| 265 | 
            +
                  set :job_template, nil
         | 
| 266 | 
            +
                  set :environment, :silly
         | 
| 267 | 
            +
                  set :path, '/silly/path'
         | 
| 268 | 
            +
                  every 2.hours do
         | 
| 269 | 
            +
                    runner "blahblah"
         | 
| 270 | 
            +
                  end
         | 
| 271 | 
            +
                file
         | 
| 272 | 
            +
              end
         | 
| 273 | 
            +
             | 
| 274 | 
            +
              should "output the runner using the original environmnet" do
         | 
| 275 | 
            +
                assert_match two_hours + %( cd /silly/path && script/runner -e silly 'blahblah'), @output
         | 
| 276 | 
            +
              end
         | 
| 277 | 
            +
            end
         | 
| 278 | 
            +
             | 
| 279 | 
            +
            class PreparingOutputTest < Whenever::TestCase
         | 
| 280 | 
            +
              setup do
         | 
| 281 | 
            +
                File.expects(:exists?).with('config/schedule.rb').returns(true)
         | 
| 282 | 
            +
              end
         | 
| 283 | 
            +
             | 
| 284 | 
            +
              should "not trim off the top lines of the file" do
         | 
| 285 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :identifier => 'My identifier', :cut => 0)
         | 
| 286 | 
            +
                existing = <<-EXISTING_CRON
         | 
| 288 287 | 
             
            # Useless Comments
         | 
| 289 288 | 
             
            # at the top of the file
         | 
| 290 289 |  | 
| @@ -293,12 +292,12 @@ My whenever job that was already here | |
| 293 292 | 
             
            # End Whenever generated tasks for: My identifier
         | 
| 294 293 | 
             
            EXISTING_CRON
         | 
| 295 294 |  | 
| 296 | 
            -
             | 
| 297 | 
            -
             | 
| 295 | 
            +
                assert_equal existing, @command.send(:prepare, existing)
         | 
| 296 | 
            +
              end
         | 
| 298 297 |  | 
| 299 | 
            -
             | 
| 300 | 
            -
             | 
| 301 | 
            -
             | 
| 298 | 
            +
              should "trim off the top lines of the file" do
         | 
| 299 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :identifier => 'My identifier', :cut => '3')
         | 
| 300 | 
            +
                existing = <<-EXISTING_CRON
         | 
| 302 301 | 
             
            # Useless Comments
         | 
| 303 302 | 
             
            # at the top of the file
         | 
| 304 303 |  | 
| @@ -307,18 +306,18 @@ My whenever job that was already here | |
| 307 306 | 
             
            # End Whenever generated tasks for: My identifier
         | 
| 308 307 | 
             
            EXISTING_CRON
         | 
| 309 308 |  | 
| 310 | 
            -
             | 
| 309 | 
            +
                new_cron = <<-NEW_CRON
         | 
| 311 310 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| 312 311 | 
             
            My whenever job that was already here
         | 
| 313 312 | 
             
            # End Whenever generated tasks for: My identifier
         | 
| 314 313 | 
             
            NEW_CRON
         | 
| 315 314 |  | 
| 316 | 
            -
             | 
| 317 | 
            -
             | 
| 315 | 
            +
                assert_equal new_cron, @command.send(:prepare, existing)
         | 
| 316 | 
            +
              end
         | 
| 318 317 |  | 
| 319 | 
            -
             | 
| 320 | 
            -
             | 
| 321 | 
            -
             | 
| 318 | 
            +
              should "preserve terminating newlines in files" do
         | 
| 319 | 
            +
                @command = Whenever::CommandLine.new(:update => true, :identifier => 'My identifier')
         | 
| 320 | 
            +
                existing = <<-EXISTING_CRON
         | 
| 322 321 | 
             
            # Begin Whenever generated tasks for: My identifier
         | 
| 323 322 | 
             
            My whenever job that was already here
         | 
| 324 323 | 
             
            # End Whenever generated tasks for: My identifier
         | 
| @@ -327,8 +326,6 @@ My whenever job that was already here | |
| 327 326 | 
             
            My non-whenever job that was already here
         | 
| 328 327 | 
             
            EXISTING_CRON
         | 
| 329 328 |  | 
| 330 | 
            -
             | 
| 331 | 
            -
                end
         | 
| 329 | 
            +
                assert_equal existing, @command.send(:prepare, existing)
         | 
| 332 330 | 
             
              end
         | 
| 333 | 
            -
             | 
| 334 331 | 
             
            end
         |