rufus-scheduler 2.0.17 → 2.0.18
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.
- data/CHANGELOG.txt +7 -0
- data/CREDITS.txt +4 -0
- data/LICENSE.txt +1 -1
- data/README.rdoc +13 -11
- data/lib/rufus/sc/cronline.rb +54 -34
- data/lib/rufus/sc/jobqueues.rb +1 -1
- data/lib/rufus/sc/jobs.rb +2 -2
- data/lib/rufus/sc/rtime.rb +31 -24
- data/lib/rufus/sc/scheduler.rb +1 -1
- data/lib/rufus/sc/version.rb +2 -2
- data/lib/rufus/scheduler.rb +1 -1
- data/spec/blocking_spec.rb +16 -12
- data/spec/cronline_spec.rb +53 -1
- data/spec/rtime_spec.rb +24 -0
- metadata +52 -32
- data/out.txt +0 -4
    
        data/CHANGELOG.txt
    CHANGED
    
    | @@ -2,6 +2,13 @@ | |
| 2 2 | 
             
            = rufus-scheduler CHANGELOG.txt
         | 
| 3 3 |  | 
| 4 4 |  | 
| 5 | 
            +
            == rufus-scheduler - 2.0.18    released 2012/03/06
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            - support for "L" in cron lines (Thanks Andrew Davey)
         | 
| 8 | 
            +
            - support for negative time strings (Thanks Danny "northox" Fullerton)
         | 
| 9 | 
            +
            - reject invalid weekdays (Thanks pazustep)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             | 
| 5 12 | 
             
            == rufus-scheduler - 2.0.17    released 2012/06/14
         | 
| 6 13 |  | 
| 7 14 | 
             
            - @andrehjr patch to make it work on Ruby 1.9.3
         | 
    
        data/CREDITS.txt
    CHANGED
    
    | @@ -4,6 +4,10 @@ | |
| 4 4 |  | 
| 5 5 | 
             
            == Contributors
         | 
| 6 6 |  | 
| 7 | 
            +
            - Andrew Davey (https://github.com/asdavey) "L" in cron lines
         | 
| 8 | 
            +
            - Stig Kleppe-Jørgensen (https://github.com/stigkj)
         | 
| 9 | 
            +
            - Danny "northox" Fullerton (https://github.com/northox) negative time strings
         | 
| 10 | 
            +
            - Marcus Brito (https://github.com/pazustep) CronLine proofing
         | 
| 7 11 | 
             
            - André Luis Leal Cardoso Junior (https://github.com/andrehjr) 1.9.3 patch
         | 
| 8 12 | 
             
            - Anthony Lewis (https://github.com/anthonylewis) cron lines and 09 issue
         | 
| 9 13 | 
             
            - concept47 (https://github.com/concept47) every and :discard_past
         | 
    
        data/LICENSE.txt
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 |  | 
| 2 | 
            -
            Copyright (c) 2005- | 
| 2 | 
            +
            Copyright (c) 2005-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 |  | 
| 4 4 | 
             
            Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            of this software and associated documentation files (the "Software"), to deal
         | 
    
        data/README.rdoc
    CHANGED
    
    | @@ -1,4 +1,3 @@ | |
| 1 | 
            -
             | 
| 2 1 | 
             
            = rufus-scheduler
         | 
| 3 2 |  | 
| 4 3 | 
             
            rufus-scheduler is a Ruby gem for scheduling pieces of code (jobs). It understands running a job AT a certain time, IN a certain time, EVERY x time or simply via a CRON statement.
         | 
| @@ -60,10 +59,10 @@ This PlainScheduler accepts a :thread_name option : | |
| 60 59 |  | 
| 61 60 | 
             
              scheduler = Rufus::Scheduler::PlainScheduler.start_new(:thread_name => 'my scheduler')
         | 
| 62 61 |  | 
| 63 | 
            -
            might be helpful when tracking threads.
         | 
| 62 | 
            +
            which might be helpful when tracking threads.
         | 
| 64 63 |  | 
| 65 64 |  | 
| 66 | 
            -
            Note that  | 
| 65 | 
            +
            Note that if there is an EventMachine present and running,
         | 
| 67 66 |  | 
| 68 67 | 
             
              scheduler = Rufus::Scheduler.start_new
         | 
| 69 68 |  | 
| @@ -78,12 +77,16 @@ This is a classical cron : | |
| 78 77 | 
             
                # every day of the week at 22:00 (10pm)
         | 
| 79 78 | 
             
              end
         | 
| 80 79 |  | 
| 81 | 
            -
            Rufus-scheduler supports  | 
| 80 | 
            +
            Rufus-scheduler supports three variants to that notation : seconds, last day of month and timezones.
         | 
| 82 81 |  | 
| 83 82 | 
             
              scheduler.cron '13 0 22 * * 1-5' do
         | 
| 84 83 | 
             
                # every day of the week at 22:00:13
         | 
| 85 84 | 
             
              end
         | 
| 86 85 |  | 
| 86 | 
            +
              scheduler.cron '0 22 L * *' do
         | 
| 87 | 
            +
                # every month on the last day at 22:00
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 87 90 | 
             
              scheduler.cron '0 22 * * 1-5 Europe/Paris' do
         | 
| 88 91 | 
             
                # every day of the week when it's 22:00 in Paris
         | 
| 89 92 | 
             
              end
         | 
| @@ -120,7 +123,7 @@ If you place | |
| 120 123 |  | 
| 121 124 | 
             
              scheduler.join
         | 
| 122 125 |  | 
| 123 | 
            -
            at  | 
| 126 | 
            +
            at the end, it will make the current (main) thread join the scheduler and prevent the Ruby runtime from exiting.
         | 
| 124 127 |  | 
| 125 128 | 
             
            You shouldn't be exposed to this issue when using EventMachine, since while running EM, your runtime won't exit.
         | 
| 126 129 |  | 
| @@ -200,7 +203,7 @@ If at 4pm the scheduler is in a blocking task, there will be no four o'clock tea | |
| 200 203 | 
             
                puts "order espresso"
         | 
| 201 204 | 
             
              end
         | 
| 202 205 |  | 
| 203 | 
            -
            the "order espresso" will only get triggered once the ristretto has been consumed. Rufus-scheduler | 
| 206 | 
            +
            the "order espresso" will only get triggered once the ristretto has been consumed. Rufus-scheduler will create a 'that_mutex' mutex and keep track of it. Don't go on passing too many different mutex names, rufus-scheduler will keep track of each of them (they won't get garbage collected).
         | 
| 204 207 |  | 
| 205 208 | 
             
            It's OK to use a mutex directly:
         | 
| 206 209 |  | 
| @@ -240,7 +243,7 @@ By default, every and cron jobs will "overlap": | |
| 240 243 | 
             
                end
         | 
| 241 244 | 
             
              end
         | 
| 242 245 |  | 
| 243 | 
            -
            You  | 
| 246 | 
            +
            You might end up with something that looks like
         | 
| 244 247 |  | 
| 245 248 | 
             
              hello 0
         | 
| 246 249 | 
             
              hello 1
         | 
| @@ -250,7 +253,7 @@ You mind end up with something that looks like | |
| 250 253 | 
             
              hello 4
         | 
| 251 254 | 
             
              ...
         | 
| 252 255 |  | 
| 253 | 
            -
            This every job | 
| 256 | 
            +
            This every job will have overlaps. To prevent that:
         | 
| 254 257 |  | 
| 255 258 | 
             
              scheduler.every '3s', :allow_overlapping => false do
         | 
| 256 259 | 
             
                # ...
         | 
| @@ -446,7 +449,7 @@ This timeout feature relies on an 'in' job scheduled at the moment the main job | |
| 446 449 |  | 
| 447 450 | 
             
            == exceptions in jobs
         | 
| 448 451 |  | 
| 449 | 
            -
            By default, when  | 
| 452 | 
            +
            By default, when exceptions occur when a job performs, the error messages will be output to the STDOUT.
         | 
| 450 453 |  | 
| 451 454 | 
             
            It's easy to customize that behaviour :
         | 
| 452 455 |  | 
| @@ -564,7 +567,7 @@ http://github.com/jmettraux/rufus-scheduler/blob/master/CREDITS.txt | |
| 564 567 |  | 
| 565 568 | 
             
            == authors
         | 
| 566 569 |  | 
| 567 | 
            -
            John Mettraux, jmettraux@gmail.com, http://jmettraux. | 
| 570 | 
            +
            John Mettraux, jmettraux@gmail.com, http://jmettraux.github.com
         | 
| 568 571 |  | 
| 569 572 |  | 
| 570 573 | 
             
            == the rest of Rufus
         | 
| @@ -575,4 +578,3 @@ http://rufus.rubyforge.org | |
| 575 578 | 
             
            == license
         | 
| 576 579 |  | 
| 577 580 | 
             
            MIT
         | 
| 578 | 
            -
             | 
    
        data/lib/rufus/sc/cronline.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #--
         | 
| 2 | 
            -
            # Copyright (c) 2006- | 
| 2 | 
            +
            # Copyright (c) 2006-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            # of this software and associated documentation files (the "Software"), to deal
         | 
| @@ -69,6 +69,13 @@ module Rufus | |
| 69 69 | 
             
                  @days = parse_item(items[2 + offset], 1, 31)
         | 
| 70 70 | 
             
                  @months = parse_item(items[3 + offset], 1, 12)
         | 
| 71 71 | 
             
                  @weekdays, @monthdays = parse_weekdays(items[4 + offset])
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  [ @seconds, @minutes, @hours, @months ].each do |es|
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    raise ArgumentError.new(
         | 
| 76 | 
            +
                      "invalid cronline: '#{line}'"
         | 
| 77 | 
            +
                    ) if es && es.find { |e| ! e.is_a?(Integer) }
         | 
| 78 | 
            +
                  end
         | 
| 72 79 | 
             
                end
         | 
| 73 80 |  | 
| 74 81 | 
             
                # Returns true if the given time matches this cron line.
         | 
| @@ -79,9 +86,9 @@ module Rufus | |
| 79 86 |  | 
| 80 87 | 
             
                  time = @timezone.utc_to_local(time.getutc) if @timezone
         | 
| 81 88 |  | 
| 82 | 
            -
                  return false unless sub_match?(time | 
| 83 | 
            -
                  return false unless sub_match?(time | 
| 84 | 
            -
                  return false unless sub_match?(time | 
| 89 | 
            +
                  return false unless sub_match?(time, :sec, @seconds)
         | 
| 90 | 
            +
                  return false unless sub_match?(time, :min, @minutes)
         | 
| 91 | 
            +
                  return false unless sub_match?(time, :hour, @hours)
         | 
| 85 92 | 
             
                  return false unless date_match?(time)
         | 
| 86 93 | 
             
                  true
         | 
| 87 94 | 
             
                end
         | 
| @@ -126,15 +133,15 @@ module Rufus | |
| 126 133 | 
             
                      time += (24 - time.hour) * 3600 - time.min * 60 - time.sec
         | 
| 127 134 | 
             
                      next
         | 
| 128 135 | 
             
                    end
         | 
| 129 | 
            -
                    unless sub_match?(time | 
| 136 | 
            +
                    unless sub_match?(time, :hour, @hours)
         | 
| 130 137 | 
             
                      time += (60 - time.min) * 60 - time.sec
         | 
| 131 138 | 
             
                      next
         | 
| 132 139 | 
             
                    end
         | 
| 133 | 
            -
                    unless sub_match?(time | 
| 140 | 
            +
                    unless sub_match?(time, :min, @minutes)
         | 
| 134 141 | 
             
                      time += 60 - time.sec
         | 
| 135 142 | 
             
                      next
         | 
| 136 143 | 
             
                    end
         | 
| 137 | 
            -
                    unless sub_match?(time | 
| 144 | 
            +
                    unless sub_match?(time, :sec, @seconds)
         | 
| 138 145 | 
             
                      time += 1
         | 
| 139 146 | 
             
                      next
         | 
| 140 147 | 
             
                    end
         | 
| @@ -192,10 +199,14 @@ module Rufus | |
| 192 199 | 
             
                      (monthdays ||= []) << it
         | 
| 193 200 |  | 
| 194 201 | 
             
                    else
         | 
| 202 | 
            +
                      expr = it.dup
         | 
| 203 | 
            +
                      WEEKDAYS.each_with_index { |a, i| expr.gsub!(/#{a}/, i.to_s) }
         | 
| 195 204 |  | 
| 196 | 
            -
                       | 
| 205 | 
            +
                      raise ArgumentError.new(
         | 
| 206 | 
            +
                        "invalid weekday expression (#{it})"
         | 
| 207 | 
            +
                      ) if expr !~ /^0*[0-7](-0*[0-7])?$/
         | 
| 197 208 |  | 
| 198 | 
            -
                      its =  | 
| 209 | 
            +
                      its = expr.index('-') ? parse_range(expr, 0, 7) : [ Integer(expr) ]
         | 
| 199 210 | 
             
                      its = its.collect { |i| i == 7 ? 0 : i }
         | 
| 200 211 |  | 
| 201 212 | 
             
                      (weekdays ||= []).concat(its)
         | 
| @@ -210,8 +221,9 @@ module Rufus | |
| 210 221 | 
             
                def parse_item(item, min, max)
         | 
| 211 222 |  | 
| 212 223 | 
             
                  return nil if item == '*'
         | 
| 224 | 
            +
                  return [ 'L' ] if item == 'L'
         | 
| 213 225 | 
             
                  return parse_list(item, min, max) if item.index(',')
         | 
| 214 | 
            -
                  return parse_range(item, min, max) if item. | 
| 226 | 
            +
                  return parse_range(item, min, max) if item.match(/[*-\/]/)
         | 
| 215 227 |  | 
| 216 228 | 
             
                  i = item.to_i
         | 
| 217 229 |  | 
| @@ -223,32 +235,36 @@ module Rufus | |
| 223 235 |  | 
| 224 236 | 
             
                def parse_list(item, min, max)
         | 
| 225 237 |  | 
| 226 | 
            -
                  item.split(','). | 
| 227 | 
            -
             | 
| 228 | 
            -
                   | 
| 238 | 
            +
                  l = item.split(',').collect { |i| parse_range(i, min, max) }.flatten
         | 
| 239 | 
            +
             | 
| 240 | 
            +
                  raise ArgumentError.new(
         | 
| 241 | 
            +
                    "found duplicates in #{item.inspect}"
         | 
| 242 | 
            +
                  ) if l.uniq.size < l.size
         | 
| 243 | 
            +
             | 
| 244 | 
            +
                  l
         | 
| 229 245 | 
             
                end
         | 
| 230 246 |  | 
| 231 247 | 
             
                def parse_range(item, min, max)
         | 
| 232 248 |  | 
| 233 | 
            -
                   | 
| 234 | 
            -
                   | 
| 249 | 
            +
                  dash = item.index('-')
         | 
| 250 | 
            +
                  slash = item.index('/')
         | 
| 235 251 |  | 
| 236 | 
            -
                  return item | 
| 252 | 
            +
                  return parse_item(item, min, max) if (not slash) and (not dash)
         | 
| 237 253 |  | 
| 238 | 
            -
                   | 
| 254 | 
            +
                  raise ArgumentError.new(
         | 
| 255 | 
            +
                    "'L' (end of month) is not accepted in ranges, " +
         | 
| 256 | 
            +
                    "#{item.inspect} is not valid"
         | 
| 257 | 
            +
                  ) if item.index('L')
         | 
| 258 | 
            +
             | 
| 259 | 
            +
                  inc = slash ? item[slash + 1..-1].to_i : 1
         | 
| 239 260 |  | 
| 240 261 | 
             
                  istart = -1
         | 
| 241 262 | 
             
                  iend = -1
         | 
| 242 263 |  | 
| 243 | 
            -
                  if  | 
| 244 | 
            -
             | 
| 245 | 
            -
                    istart = item[0..i - 1].to_i
         | 
| 264 | 
            +
                  if dash
         | 
| 246 265 |  | 
| 247 | 
            -
                     | 
| 248 | 
            -
             | 
| 249 | 
            -
                    else
         | 
| 250 | 
            -
                      item[i + 1..-1].to_i
         | 
| 251 | 
            -
                    end
         | 
| 266 | 
            +
                    istart = item[0..dash - 1].to_i
         | 
| 267 | 
            +
                    iend = (slash ? item[dash + 1..slash - 1] : item[dash + 1..-1]).to_i
         | 
| 252 268 |  | 
| 253 269 | 
             
                  else # case */x
         | 
| 254 270 |  | 
| @@ -271,22 +287,26 @@ module Rufus | |
| 271 287 | 
             
                  result
         | 
| 272 288 | 
             
                end
         | 
| 273 289 |  | 
| 274 | 
            -
                def sub_match?( | 
| 290 | 
            +
                def sub_match?(time, accessor, values=:none)
         | 
| 275 291 |  | 
| 276 | 
            -
                  values | 
| 277 | 
            -
             | 
| 292 | 
            +
                  value, values =
         | 
| 293 | 
            +
                    if values == :none
         | 
| 294 | 
            +
                      [ time, accessor ]
         | 
| 295 | 
            +
                    else
         | 
| 296 | 
            +
                      [ time.send(accessor), values ]
         | 
| 297 | 
            +
                    end
         | 
| 278 298 |  | 
| 279 | 
            -
             | 
| 299 | 
            +
                  return true if values.nil?
         | 
| 300 | 
            +
                  return true if values.include?('L') && (time + 24 * 3600).day == 1
         | 
| 280 301 |  | 
| 281 | 
            -
                   | 
| 282 | 
            -
                  return true if monthdays.include?(monthday)
         | 
| 302 | 
            +
                  values.include?(value)
         | 
| 283 303 | 
             
                end
         | 
| 284 304 |  | 
| 285 305 | 
             
                def date_match?(date)
         | 
| 286 306 |  | 
| 287 | 
            -
                  return false unless sub_match?(date | 
| 288 | 
            -
                  return false unless sub_match?(date | 
| 289 | 
            -
                  return false unless sub_match?(date | 
| 307 | 
            +
                  return false unless sub_match?(date, :day, @days)
         | 
| 308 | 
            +
                  return false unless sub_match?(date, :month, @months)
         | 
| 309 | 
            +
                  return false unless sub_match?(date, :wday, @weekdays)
         | 
| 290 310 | 
             
                  return false unless sub_match?(CronLine.monthday(date), @monthdays)
         | 
| 291 311 | 
             
                  true
         | 
| 292 312 | 
             
                end
         | 
    
        data/lib/rufus/sc/jobqueues.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #--
         | 
| 2 | 
            -
            # Copyright (c) 2006- | 
| 2 | 
            +
            # Copyright (c) 2006-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            # of this software and associated documentation files (the "Software"), to deal
         | 
    
        data/lib/rufus/sc/jobs.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #--
         | 
| 2 | 
            -
            # Copyright (c) 2006- | 
| 2 | 
            +
            # Copyright (c) 2006-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            # of this software and associated documentation files (the "Software"), to deal
         | 
| @@ -30,7 +30,7 @@ module Scheduler | |
| 30 30 | 
             
              # The base class for all types of jobs.
         | 
| 31 31 | 
             
              #
         | 
| 32 32 | 
             
              class Job
         | 
| 33 | 
            -
             | 
| 33 | 
            +
             | 
| 34 34 | 
             
                # A reference to the scheduler owning this job
         | 
| 35 35 | 
             
                #
         | 
| 36 36 | 
             
                attr_accessor :scheduler
         | 
    
        data/lib/rufus/sc/rtime.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #--
         | 
| 2 | 
            -
            # Copyright (c) 2005- | 
| 2 | 
            +
            # Copyright (c) 2005-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            # of this software and associated documentation files (the "Software"), to deal
         | 
| @@ -96,8 +96,6 @@ module Rufus | |
| 96 96 | 
             
                (Time.new.to_f * 1000).to_i
         | 
| 97 97 | 
             
              end
         | 
| 98 98 |  | 
| 99 | 
            -
              FLOAT_DURATION = /^\d*\.\d*$/
         | 
| 100 | 
            -
             | 
| 101 99 | 
             
              # Turns a string like '1m10s' into a float like '70.0', more formally,
         | 
| 102 100 | 
             
              # turns a time duration expressed as a string into a Float instance
         | 
| 103 101 | 
             
              # (millisecond count).
         | 
| @@ -120,24 +118,35 @@ module Rufus | |
| 120 118 | 
             
              #   Rufus.parse_time_string "1h10s"  # => 3610.0
         | 
| 121 119 | 
             
              #   Rufus.parse_time_string "1w2d"   # => 777600.0
         | 
| 122 120 | 
             
              #
         | 
| 123 | 
            -
              def  | 
| 124 | 
            -
             | 
| 125 | 
            -
                if m = string.match(/^(\d*)\.?(\d*)([A-Za-z])(.*)$/)
         | 
| 121 | 
            +
              def self.parse_time_string(string)
         | 
| 126 122 |  | 
| 127 | 
            -
             | 
| 128 | 
            -
                  multiplier = DURATIONS[m[3]]
         | 
| 123 | 
            +
                return 0.0 if string == ''
         | 
| 129 124 |  | 
| 130 | 
            -
             | 
| 125 | 
            +
                m = string.match(/^(-?)([\d\.#{DURATION_LETTERS}]+)$/)
         | 
| 131 126 |  | 
| 132 | 
            -
             | 
| 127 | 
            +
                raise ArgumentError.new("cannot parse '#{string}'") unless m
         | 
| 133 128 |  | 
| 134 | 
            -
                 | 
| 129 | 
            +
                mod = m[1] == '-' ? -1.0 : 1.0
         | 
| 130 | 
            +
                val = 0.0
         | 
| 135 131 |  | 
| 136 | 
            -
             | 
| 137 | 
            -
                  return string.to_f if string.match(/^\d*\.?\d*$/)
         | 
| 132 | 
            +
                s = m[2]
         | 
| 138 133 |  | 
| 139 | 
            -
             | 
| 134 | 
            +
                while s.length > 0
         | 
| 135 | 
            +
                  m = nil
         | 
| 136 | 
            +
                  if m = s.match(/^(\d+|\d+\.\d*|\d*\.\d+)([#{DURATION_LETTERS}])(.*)$/)
         | 
| 137 | 
            +
                    val += m[1].to_f * DURATIONS[m[2]]
         | 
| 138 | 
            +
                  elsif s.match(/^\d+$/)
         | 
| 139 | 
            +
                    val += s.to_i / 1000.0
         | 
| 140 | 
            +
                  elsif s.match(/^\d*\.\d*$/)
         | 
| 141 | 
            +
                    val += s.to_f
         | 
| 142 | 
            +
                  else
         | 
| 143 | 
            +
                    raise ArgumentError.new("cannot parse '#{string}' (especially '#{s}')")
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
                  break unless m && m[3]
         | 
| 146 | 
            +
                  s = m[3]
         | 
| 140 147 | 
             
                end
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                mod * val
         | 
| 141 150 | 
             
              end
         | 
| 142 151 |  | 
| 143 152 | 
             
              class << self
         | 
| @@ -185,7 +194,7 @@ module Rufus | |
| 185 194 |  | 
| 186 195 | 
             
              def Rufus.to_local_time(dtime)
         | 
| 187 196 |  | 
| 188 | 
            -
                to_ttime(dtime.new_offset(DateTime.now.offset-offset), :local)
         | 
| 197 | 
            +
                to_ttime(dtime.new_offset(DateTime.now.offset - offset), :local)
         | 
| 189 198 | 
             
              end
         | 
| 190 199 |  | 
| 191 200 | 
             
              def Rufus.to_ttime(d, method)
         | 
| @@ -232,7 +241,7 @@ module Rufus | |
| 232 241 |  | 
| 233 242 | 
             
                return (options[:drop_seconds] ? '0m' : '0s') if seconds <= 0
         | 
| 234 243 |  | 
| 235 | 
            -
                h = to_duration_hash | 
| 244 | 
            +
                h = to_duration_hash(seconds, options)
         | 
| 236 245 |  | 
| 237 246 | 
             
                s = DU_KEYS.inject('') { |r, key|
         | 
| 238 247 | 
             
                  count = h[key]
         | 
| @@ -280,7 +289,7 @@ module Rufus | |
| 280 289 | 
             
                end
         | 
| 281 290 |  | 
| 282 291 | 
             
                if options[:drop_seconds]
         | 
| 283 | 
            -
                  h.delete | 
| 292 | 
            +
                  h.delete(:ms)
         | 
| 284 293 | 
             
                  seconds = (seconds - seconds % 60)
         | 
| 285 294 | 
             
                end
         | 
| 286 295 |  | 
| @@ -317,8 +326,8 @@ module Rufus | |
| 317 326 |  | 
| 318 327 | 
             
                # TODO : use chronic if present
         | 
| 319 328 |  | 
| 320 | 
            -
                at =  | 
| 321 | 
            -
                at =  | 
| 329 | 
            +
                at = to_ruby_time(at) if at.is_a?(String)
         | 
| 330 | 
            +
                at = to_gm_time(at) if at.is_a?(DateTime)
         | 
| 322 331 | 
             
                #at = at.to_f if at.is_a?(Time)
         | 
| 323 332 | 
             
                at = at.to_f if at.respond_to?(:to_f)
         | 
| 324 333 |  | 
| @@ -329,7 +338,7 @@ module Rufus | |
| 329 338 | 
             
                at
         | 
| 330 339 | 
             
              end
         | 
| 331 340 |  | 
| 332 | 
            -
              protected
         | 
| 341 | 
            +
              protected # well, somehow
         | 
| 333 342 |  | 
| 334 343 | 
             
              DURATIONS2M = [
         | 
| 335 344 | 
             
                [ 'y', 365 * 24 * 3600 ],
         | 
| @@ -343,10 +352,8 @@ module Rufus | |
| 343 352 | 
             
              DURATIONS2 = DURATIONS2M.dup
         | 
| 344 353 | 
             
              DURATIONS2.delete_at(1)
         | 
| 345 354 |  | 
| 346 | 
            -
              DURATIONS = DURATIONS2M.inject({})  | 
| 347 | 
            -
             | 
| 348 | 
            -
                r
         | 
| 349 | 
            -
              end
         | 
| 355 | 
            +
              DURATIONS = DURATIONS2M.inject({}) { |r, (k, v)| r[k] = v; r }
         | 
| 356 | 
            +
              DURATION_LETTERS = DURATIONS.keys.join
         | 
| 350 357 |  | 
| 351 358 | 
             
              DU_KEYS = DURATIONS2M.collect { |k, v| k.to_sym }
         | 
| 352 359 | 
             
            end
         | 
    
        data/lib/rufus/sc/scheduler.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #--
         | 
| 2 | 
            -
            # Copyright (c) 2006- | 
| 2 | 
            +
            # Copyright (c) 2006-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            # of this software and associated documentation files (the "Software"), to deal
         | 
    
        data/lib/rufus/sc/version.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #--
         | 
| 2 | 
            -
            # Copyright (c) 2006- | 
| 2 | 
            +
            # Copyright (c) 2006-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            # of this software and associated documentation files (the "Software"), to deal
         | 
| @@ -26,7 +26,7 @@ | |
| 26 26 | 
             
            module Rufus
         | 
| 27 27 | 
             
            module Scheduler
         | 
| 28 28 |  | 
| 29 | 
            -
              VERSION = '2.0. | 
| 29 | 
            +
              VERSION = '2.0.18'
         | 
| 30 30 | 
             
            end
         | 
| 31 31 | 
             
            end
         | 
| 32 32 |  | 
    
        data/lib/rufus/scheduler.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            #--
         | 
| 2 | 
            -
            # Copyright (c) 2006- | 
| 2 | 
            +
            # Copyright (c) 2006-2013, John Mettraux, jmettraux@gmail.com
         | 
| 3 3 | 
             
            #
         | 
| 4 4 | 
             
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 5 5 | 
             
            # of this software and associated documentation files (the "Software"), to deal
         | 
    
        data/spec/blocking_spec.rb
    CHANGED
    
    | @@ -17,17 +17,18 @@ describe SCHEDULER_CLASS do | |
| 17 17 | 
             
                stop_scheduler(@s)
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 | 
            -
              JOB = | 
| 21 | 
            -
                 | 
| 22 | 
            -
                   | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                   | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 20 | 
            +
              JOB =
         | 
| 21 | 
            +
                Proc.new do |x|
         | 
| 22 | 
            +
                  begin
         | 
| 23 | 
            +
                    $var << "a#{x}"
         | 
| 24 | 
            +
                    sleep 0.500
         | 
| 25 | 
            +
                    $var << "b#{x}"
         | 
| 26 | 
            +
                  rescue Exception => e
         | 
| 27 | 
            +
                    puts '=' * 80
         | 
| 28 | 
            +
                    p e
         | 
| 29 | 
            +
                    puts '=' * 80
         | 
| 30 | 
            +
                  end
         | 
| 29 31 | 
             
                end
         | 
| 30 | 
            -
              end
         | 
| 31 32 |  | 
| 32 33 | 
             
              context ':blocking => nil' do
         | 
| 33 34 |  | 
| @@ -37,9 +38,12 @@ describe SCHEDULER_CLASS do | |
| 37 38 | 
             
                  @s.in('1s') { JOB.call(1) }
         | 
| 38 39 | 
             
                  @s.in('1s') { JOB.call(2) }
         | 
| 39 40 |  | 
| 40 | 
            -
                  sleep  | 
| 41 | 
            +
                  sleep 4.0
         | 
| 41 42 |  | 
| 42 | 
            -
                  [ | 
| 43 | 
            +
                  [
         | 
| 44 | 
            +
                    %w{ a1 a2 b1 b2 }, %w{ a1 a2 b2 b1 },
         | 
| 45 | 
            +
                    %w{ a2 a1 b2 b1 }, %w{ a2 a1 b1 b2 }
         | 
| 46 | 
            +
                  ].should include($var)
         | 
| 43 47 | 
             
                end
         | 
| 44 48 | 
             
              end
         | 
| 45 49 |  | 
    
        data/spec/cronline_spec.rb
    CHANGED
    
    | @@ -36,7 +36,7 @@ describe Rufus::CronLine do | |
| 36 36 | 
             
                it 'interprets cron strings correctly' do
         | 
| 37 37 |  | 
| 38 38 | 
             
                  to_a '* * * * *', [ [0], nil, nil, nil, nil, nil, nil, nil ]
         | 
| 39 | 
            -
                  to_a '10-12 * * * *', [ [0], [10, 11, 12], nil, nil, | 
| 39 | 
            +
                  to_a '10-12 * * * *', [ [0], [10, 11, 12], nil, nil,  nil, nil, nil, nil ]
         | 
| 40 40 | 
             
                  to_a '* * * * sun,mon', [ [0], nil, nil, nil, nil, [0, 1], nil, nil ]
         | 
| 41 41 | 
             
                  to_a '* * * * mon-wed', [ [0], nil, nil, nil, nil, [1, 2, 3], nil, nil ]
         | 
| 42 42 | 
             
                  to_a '* * * * 7', [ [0], nil, nil, nil, nil, [0], nil, nil ]
         | 
| @@ -56,6 +56,21 @@ describe Rufus::CronLine do | |
| 56 56 | 
             
                  to_a '0 0 1 1 *', [ [0], [0], [0], [1], [1], nil, nil, nil ]
         | 
| 57 57 | 
             
                end
         | 
| 58 58 |  | 
| 59 | 
            +
                it 'rejects invalid weekday expressions' do
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  lambda { cl '0 17 * * MON_FRI' }.should raise_error
         | 
| 62 | 
            +
                    # underline instead of dash
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  lambda { cl '* * * * 9' }.should raise_error
         | 
| 65 | 
            +
                  lambda { cl '* * * * 0-12' }.should raise_error
         | 
| 66 | 
            +
                  lambda { cl '* * * * BLABLA' }.should raise_error
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                it 'rejects invalid cronlines' do
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  lambda { cl '* nada * * 9' }.should raise_error(ArgumentError)
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 59 74 | 
             
                it 'interprets cron strings with TZ correctly' do
         | 
| 60 75 |  | 
| 61 76 | 
             
                  to_a '* * * * * EST', [ [0], nil, nil, nil, nil, nil, nil, 'EST' ]
         | 
| @@ -94,6 +109,29 @@ describe Rufus::CronLine do | |
| 94 109 | 
             
                  to_a '* 01-09/04 * * *', [ [0], nil, [1, 5, 9], nil, nil, nil, nil, nil ]
         | 
| 95 110 | 
             
                  to_a '* * * * 06', [ [0], nil, nil, nil, nil, [6], nil, nil ]
         | 
| 96 111 | 
             
                end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                it 'interprets cron strings with L correctly' do
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                  to_a '* * L * *', [[0], nil, nil, ['L'], nil, nil, nil, nil ]
         | 
| 116 | 
            +
                  to_a '* * 2-5,L * *', [[0], nil, nil, [2,3,4,5,'L'], nil, nil, nil, nil ]
         | 
| 117 | 
            +
                  to_a '* * */8,L * *', [[0], nil, nil, [1,9,17,25,'L'], nil, nil, nil, nil ]
         | 
| 118 | 
            +
                end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                it 'does not support ranges for L' do
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                  lambda { cl '* * 15-L * *'}.should raise_error(ArgumentError)
         | 
| 123 | 
            +
                  lambda { cl '* * L/4 * *'}.should raise_error(ArgumentError)
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                it 'does not support multiple Ls' do
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                  lambda { cl '* * L,L * *'}.should raise_error(ArgumentError)
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                it 'raises if L is used for something else than days' do
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  lambda { cl '* L * * *'}.should raise_error(ArgumentError)
         | 
| 134 | 
            +
                end
         | 
| 97 135 | 
             
              end
         | 
| 98 136 |  | 
| 99 137 | 
             
              describe '#next_time' do
         | 
| @@ -207,6 +245,14 @@ describe Rufus::CronLine do | |
| 207 245 |  | 
| 208 246 | 
             
                  nt('* * * * sun#2,sun#3', now).should == local(1970, 1, 18)
         | 
| 209 247 | 
             
                end
         | 
| 248 | 
            +
             | 
| 249 | 
            +
               it 'computes the next time correctly when there is a L (last day of month)' do
         | 
| 250 | 
            +
             | 
| 251 | 
            +
                 nt('* * L * *', local(1970,1,1)).should == local(1970, 1, 31)
         | 
| 252 | 
            +
                 nt('* * L * *', local(1970,2,1)).should == local(1970, 2, 28)
         | 
| 253 | 
            +
                 nt('* * L * *', local(1972,2,1)).should == local(1972, 2, 29)
         | 
| 254 | 
            +
                 nt('* * L * *', local(1970,4,1)).should == local(1970, 4, 30)
         | 
| 255 | 
            +
               end
         | 
| 210 256 | 
             
              end
         | 
| 211 257 |  | 
| 212 258 | 
             
              describe '#matches?' do
         | 
| @@ -264,6 +310,12 @@ describe Rufus::CronLine do | |
| 264 310 | 
             
                  no_match '* * 13 * fri#2', utc(1970, 2, 20)
         | 
| 265 311 | 
             
                end
         | 
| 266 312 |  | 
| 313 | 
            +
                it 'matches correctly when there is a L involved' do
         | 
| 314 | 
            +
             | 
| 315 | 
            +
                  match '* * L * *', utc(1970, 1, 31)
         | 
| 316 | 
            +
                  no_match '* * L * *', utc(1970, 1, 30)
         | 
| 317 | 
            +
                end
         | 
| 318 | 
            +
             | 
| 267 319 | 
             
                it 'matches correctly when there is a sun#2,sun#3 involved' do
         | 
| 268 320 |  | 
| 269 321 | 
             
                  no_match '* * * * sun#2,sun#3', local(1970, 1, 4)
         | 
    
        data/spec/rtime_spec.rb
    CHANGED
    
    | @@ -24,6 +24,15 @@ describe 'rufus/rtime' do | |
| 24 24 |  | 
| 25 25 | 
             
              it 'parses duration strings' do
         | 
| 26 26 |  | 
| 27 | 
            +
                pts('-1.0d1.0w1.0d').should == -777600.0
         | 
| 28 | 
            +
                pts('-1d1w1d').should == -777600.0
         | 
| 29 | 
            +
                pts('-1w2d').should == -777600.0
         | 
| 30 | 
            +
                pts('-1h10s').should == -3610.0
         | 
| 31 | 
            +
                pts('-1h').should == -3600.0
         | 
| 32 | 
            +
                pts('-5.').should == -5.0
         | 
| 33 | 
            +
                pts('-2.5s').should == -2.5
         | 
| 34 | 
            +
                pts('-1s').should == -1.0
         | 
| 35 | 
            +
                pts('-500').should == -0.5
         | 
| 27 36 | 
             
                pts('').should == 0.0
         | 
| 28 37 | 
             
                pts('5.0').should == 5.0
         | 
| 29 38 | 
             
                pts('0.5').should == 0.5
         | 
| @@ -39,6 +48,21 @@ describe 'rufus/rtime' do | |
| 39 48 | 
             
                pts('1w2d').should == 777600.0
         | 
| 40 49 | 
             
                pts('1d1w1d').should == 777600.0
         | 
| 41 50 | 
             
                pts('1.0d1.0w1.0d').should == 777600.0
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                pts('.5m').should == 30.0
         | 
| 53 | 
            +
                pts('5.m').should == 300.0
         | 
| 54 | 
            +
                pts('1m.5s').should == 60.5
         | 
| 55 | 
            +
                pts('-.5m').should == -30.0
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              it 'raises on wrong duration strings' do
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                lambda { pts('-') }.should raise_error(ArgumentError)
         | 
| 61 | 
            +
                lambda { pts('h') }.should raise_error(ArgumentError)
         | 
| 62 | 
            +
                lambda { pts('whatever') }.should raise_error(ArgumentError)
         | 
| 63 | 
            +
                lambda { pts('hms') }.should raise_error(ArgumentError)
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                lambda { pts(' 1h ') }.should raise_error(ArgumentError)
         | 
| 42 66 | 
             
              end
         | 
| 43 67 |  | 
| 44 68 | 
             
              it 'generates duration strings' do
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rufus-scheduler
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.0. | 
| 4 | 
            +
              version: 2.0.18
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2013-03-05 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: tzinfo
         | 
| 16 | 
            -
              requirement:  | 
| 16 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,10 +21,15 @@ dependencies: | |
| 21 21 | 
             
                    version: 0.3.23
         | 
| 22 22 | 
             
              type: :runtime
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements:  | 
| 24 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 25 | 
            +
                none: false
         | 
| 26 | 
            +
                requirements:
         | 
| 27 | 
            +
                - - ! '>='
         | 
| 28 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            +
                    version: 0.3.23
         | 
| 25 30 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 31 | 
             
              name: rake
         | 
| 27 | 
            -
              requirement:  | 
| 32 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 28 33 | 
             
                none: false
         | 
| 29 34 | 
             
                requirements:
         | 
| 30 35 | 
             
                - - ! '>='
         | 
| @@ -32,10 +37,15 @@ dependencies: | |
| 32 37 | 
             
                    version: '0'
         | 
| 33 38 | 
             
              type: :development
         | 
| 34 39 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements:  | 
| 40 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 41 | 
            +
                none: false
         | 
| 42 | 
            +
                requirements:
         | 
| 43 | 
            +
                - - ! '>='
         | 
| 44 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            +
                    version: '0'
         | 
| 36 46 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 37 47 | 
             
              name: rspec
         | 
| 38 | 
            -
              requirement:  | 
| 48 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 39 49 | 
             
                none: false
         | 
| 40 50 | 
             
                requirements:
         | 
| 41 51 | 
             
                - - ! '>='
         | 
| @@ -43,7 +53,12 @@ dependencies: | |
| 43 53 | 
             
                    version: 2.7.0
         | 
| 44 54 | 
             
              type: :development
         | 
| 45 55 | 
             
              prerelease: false
         | 
| 46 | 
            -
              version_requirements:  | 
| 56 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 57 | 
            +
                none: false
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - ! '>='
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: 2.7.0
         | 
| 47 62 | 
             
            description: job scheduler for Ruby (at, cron, in and every jobs).
         | 
| 48 63 | 
             
            email:
         | 
| 49 64 | 
             
            - jmettraux@gmail.com
         | 
| @@ -52,39 +67,38 @@ extensions: [] | |
| 52 67 | 
             
            extra_rdoc_files: []
         | 
| 53 68 | 
             
            files:
         | 
| 54 69 | 
             
            - Rakefile
         | 
| 55 | 
            -
            - lib/rufus | 
| 56 | 
            -
            - lib/rufus/ | 
| 57 | 
            -
            - lib/rufus/sc/jobqueues.rb
         | 
| 58 | 
            -
            - lib/rufus/sc/jobs.rb
         | 
| 59 | 
            -
            - lib/rufus/sc/rtime.rb
         | 
| 70 | 
            +
            - lib/rufus-scheduler.rb
         | 
| 71 | 
            +
            - lib/rufus/scheduler.rb
         | 
| 60 72 | 
             
            - lib/rufus/sc/scheduler.rb
         | 
| 73 | 
            +
            - lib/rufus/sc/rtime.rb
         | 
| 61 74 | 
             
            - lib/rufus/sc/version.rb
         | 
| 62 | 
            -
            - lib/rufus/ | 
| 63 | 
            -
            - lib/rufus | 
| 64 | 
            -
            -  | 
| 65 | 
            -
            -  | 
| 66 | 
            -
            - spec/ | 
| 67 | 
            -
            - spec/ | 
| 68 | 
            -
            - spec/ | 
| 69 | 
            -
            - spec/every_spec.rb
         | 
| 75 | 
            +
            - lib/rufus/sc/cronline.rb
         | 
| 76 | 
            +
            - lib/rufus/sc/jobs.rb
         | 
| 77 | 
            +
            - lib/rufus/sc/jobqueues.rb
         | 
| 78 | 
            +
            - lib/rufus/otime.rb
         | 
| 79 | 
            +
            - spec/job_spec.rb
         | 
| 80 | 
            +
            - spec/stress_schedule_unschedule_spec.rb
         | 
| 81 | 
            +
            - spec/schedulable_spec.rb
         | 
| 70 82 | 
             
            - spec/exception_spec.rb
         | 
| 71 83 | 
             
            - spec/in_spec.rb
         | 
| 72 | 
            -
            - spec/ | 
| 73 | 
            -
            - spec/ | 
| 84 | 
            +
            - spec/timeout_spec.rb
         | 
| 85 | 
            +
            - spec/at_spec.rb
         | 
| 86 | 
            +
            - spec/at_in_spec.rb
         | 
| 87 | 
            +
            - spec/spec_base.rb
         | 
| 88 | 
            +
            - spec/cronline_spec.rb
         | 
| 74 89 | 
             
            - spec/rtime_spec.rb
         | 
| 75 | 
            -
            - spec/ | 
| 90 | 
            +
            - spec/mutex_spec.rb
         | 
| 76 91 | 
             
            - spec/scheduler_spec.rb
         | 
| 77 | 
            -
            - spec/ | 
| 78 | 
            -
            - spec/ | 
| 79 | 
            -
            - spec/ | 
| 80 | 
            -
            - test/kjw.rb
         | 
| 92 | 
            +
            - spec/blocking_spec.rb
         | 
| 93 | 
            +
            - spec/every_spec.rb
         | 
| 94 | 
            +
            - spec/cron_spec.rb
         | 
| 81 95 | 
             
            - test/t.rb
         | 
| 96 | 
            +
            - test/kjw.rb
         | 
| 82 97 | 
             
            - rufus-scheduler.gemspec
         | 
| 83 98 | 
             
            - CHANGELOG.txt
         | 
| 84 | 
            -
            - CREDITS.txt
         | 
| 85 | 
            -
            - LICENSE.txt
         | 
| 86 | 
            -
            - out.txt
         | 
| 87 99 | 
             
            - TODO.txt
         | 
| 100 | 
            +
            - LICENSE.txt
         | 
| 101 | 
            +
            - CREDITS.txt
         | 
| 88 102 | 
             
            - README.rdoc
         | 
| 89 103 | 
             
            homepage: http://github.com/jmettraux/rufus-scheduler
         | 
| 90 104 | 
             
            licenses: []
         | 
| @@ -98,15 +112,21 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 98 112 | 
             
              - - ! '>='
         | 
| 99 113 | 
             
                - !ruby/object:Gem::Version
         | 
| 100 114 | 
             
                  version: '0'
         | 
| 115 | 
            +
                  segments:
         | 
| 116 | 
            +
                  - 0
         | 
| 117 | 
            +
                  hash: 4543164608551708958
         | 
| 101 118 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 102 119 | 
             
              none: false
         | 
| 103 120 | 
             
              requirements:
         | 
| 104 121 | 
             
              - - ! '>='
         | 
| 105 122 | 
             
                - !ruby/object:Gem::Version
         | 
| 106 123 | 
             
                  version: '0'
         | 
| 124 | 
            +
                  segments:
         | 
| 125 | 
            +
                  - 0
         | 
| 126 | 
            +
                  hash: 4543164608551708958
         | 
| 107 127 | 
             
            requirements: []
         | 
| 108 128 | 
             
            rubyforge_project: rufus
         | 
| 109 | 
            -
            rubygems_version: 1.8. | 
| 129 | 
            +
            rubygems_version: 1.8.24
         | 
| 110 130 | 
             
            signing_key: 
         | 
| 111 131 | 
             
            specification_version: 3
         | 
| 112 132 | 
             
            summary: job scheduler for Ruby (at, cron, in and every jobs)
         | 
    
        data/out.txt
    DELETED