montrose 0.6.0 → 0.7.0

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +19 -0
  3. data/.rubocop.yml +6 -0
  4. data/.travis.yml +9 -0
  5. data/Appraisals +4 -0
  6. data/CHANGELOG.md +21 -1
  7. data/Gemfile +3 -2
  8. data/Guardfile +1 -0
  9. data/README.md +13 -2
  10. data/Rakefile +1 -0
  11. data/bin/appraisal +17 -0
  12. data/gemfiles/activesupport_4.1.gemfile +6 -6
  13. data/gemfiles/activesupport_4.2.gemfile +6 -6
  14. data/gemfiles/activesupport_5.0.gemfile +6 -6
  15. data/gemfiles/activesupport_5.1.gemfile +16 -0
  16. data/lib/montrose.rb +1 -0
  17. data/lib/montrose/chainable.rb +1 -0
  18. data/lib/montrose/clock.rb +1 -0
  19. data/lib/montrose/errors.rb +1 -0
  20. data/lib/montrose/frequency.rb +1 -0
  21. data/lib/montrose/frequency/daily.rb +1 -0
  22. data/lib/montrose/frequency/hourly.rb +1 -0
  23. data/lib/montrose/frequency/minutely.rb +1 -0
  24. data/lib/montrose/frequency/monthly.rb +1 -0
  25. data/lib/montrose/frequency/secondly.rb +1 -0
  26. data/lib/montrose/frequency/weekly.rb +1 -0
  27. data/lib/montrose/frequency/yearly.rb +1 -0
  28. data/lib/montrose/options.rb +8 -9
  29. data/lib/montrose/recurrence.rb +12 -2
  30. data/lib/montrose/refinements/array_concat.rb +1 -0
  31. data/lib/montrose/rule.rb +4 -2
  32. data/lib/montrose/rule/after.rb +2 -1
  33. data/lib/montrose/rule/between.rb +28 -0
  34. data/lib/montrose/rule/day_of_month.rb +1 -0
  35. data/lib/montrose/rule/day_of_week.rb +1 -0
  36. data/lib/montrose/rule/day_of_year.rb +1 -0
  37. data/lib/montrose/rule/except.rb +1 -0
  38. data/lib/montrose/rule/hour_of_day.rb +1 -0
  39. data/lib/montrose/rule/month_of_year.rb +1 -0
  40. data/lib/montrose/rule/nth_day_matcher.rb +1 -0
  41. data/lib/montrose/rule/nth_day_of_month.rb +1 -0
  42. data/lib/montrose/rule/nth_day_of_year.rb +1 -0
  43. data/lib/montrose/rule/time_of_day.rb +1 -0
  44. data/lib/montrose/rule/total.rb +6 -5
  45. data/lib/montrose/rule/until.rb +31 -0
  46. data/lib/montrose/rule/week_of_year.rb +1 -0
  47. data/lib/montrose/schedule.rb +1 -0
  48. data/lib/montrose/stack.rb +4 -2
  49. data/lib/montrose/utils.rb +1 -0
  50. data/lib/montrose/version.rb +1 -1
  51. data/montrose.gemspec +7 -6
  52. metadata +20 -17
  53. data/lib/montrose/rule/before.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6586fb7cc1e8bfb5bf4a60b01dc27687703b613
4
- data.tar.gz: 2de01900143bb357b8250d7213b02f18d63f7f6e
3
+ metadata.gz: 177a7778b6014cbf29338af5d999c7214662f15d
4
+ data.tar.gz: 7a375b6e47b4399277246f490714983b1ce7bf69
5
5
  SHA512:
6
- metadata.gz: 97c05ddc454035a90a397d3aa0b498baedee44288a0e1488c57629e62ff5516542e023deac99ec2ac26b2ac3e612836e8f15d18da08403f77ef848564ea23b37
7
- data.tar.gz: e8e8d506f11e6dade4915e3af9c4a518102a1eb5199a499485975020334744ba67a2943db5ccaa094cff05827c2172ec912c42d23dd69bd09107cf16c23e7843
6
+ metadata.gz: 79edb791f61f1bf5b9a4250eaaeee275c81241aa7ddf2312de365726b48977c12b4d51793a6e0027e5d6debb12415dad710bba5cf029f8a5ccf022b12fdfd97a
7
+ data.tar.gz: c9f41be8ea24bc7f686c91aaf3f842e3ce6e2b39fbacbcbacb0bba4a059e4e70a55a5194a05427b1ae65abb6d493378be68ed795a0674f78e046f05d9592307f
@@ -0,0 +1,19 @@
1
+ ---
2
+ engines:
3
+ bundler-audit:
4
+ enabled: true
5
+ duplication:
6
+ enabled: true
7
+ config:
8
+ languages:
9
+ - ruby
10
+ fixme:
11
+ enabled: true
12
+ rubocop:
13
+ enabled: true
14
+ ratings:
15
+ paths:
16
+ - Gemfile.lock
17
+ - "**.rb"
18
+ exclude_paths:
19
+ - spec/
@@ -118,3 +118,9 @@ Style/VariableNumber:
118
118
 
119
119
  Style/FormatString:
120
120
  Enabled: false
121
+
122
+ Style/MutableConstant:
123
+ Enabled: false
124
+
125
+ Style/NumericPredicate:
126
+ Enabled: false
@@ -1,6 +1,7 @@
1
1
  bundler_args: "--jobs 4 --retry 3"
2
2
  cache: bundler
3
3
  gemfile:
4
+ - gemfiles/activesupport_5.1.gemfile
4
5
  - gemfiles/activesupport_5.0.gemfile
5
6
  - gemfiles/activesupport_4.2.gemfile
6
7
  - gemfiles/activesupport_4.1.gemfile
@@ -9,9 +10,17 @@ matrix:
9
10
  exclude:
10
11
  - rvm: 2.1.10
11
12
  gemfile: gemfiles/activesupport_5.0.gemfile # Requires Ruby 2.2+
13
+ - rvm: 2.1.10
14
+ gemfile: gemfiles/activesupport_5.1.gemfile # Requires Ruby 2.2+
15
+ - rvm: 2.4.0
16
+ gemfile: gemfiles/activesupport_4.1.gemfile # Requires json 1.8.5+
12
17
  fast_finish: true
13
18
  rvm:
14
19
  - 2.1.10
15
20
  - 2.2.6
16
21
  - 2.3.3
22
+ - 2.4.0
17
23
  sudo: false
24
+ before_install:
25
+ - gem update --system
26
+ - gem --version
data/Appraisals CHANGED
@@ -1,3 +1,7 @@
1
+ appraise "activesupport-5.1" do
2
+ gem "activesupport", "~> 5.1.0"
3
+ end
4
+
1
5
  appraise "activesupport-5.0" do
2
6
  gem "activesupport", "~> 5.0.0"
3
7
  end
@@ -1,4 +1,24 @@
1
- ### 0.6.0 - (2016-01-05)
1
+ ### 0.7.0 - (2017-09-18)
2
+
3
+ * enhancements
4
+ * Adds the :exclude_end option can be used to determine whether :until value
5
+ is included in the recurrence. Mimics the API to Ruby's Range.
6
+ * Support activesupport-5.1 (by @fauxparse)
7
+ * Support ruby-2.4
8
+
9
+ * bug fixes
10
+ * Recurrence#to_json accepts arguments for JSON.dump
11
+
12
+ * breaking changes
13
+ * Previously, the :between option served as a shorthand for :starts to :until.
14
+ Now, when both :starts and :between are provided, the recurrence will behave
15
+ as if anchored by the given :starts option, but filtered through the given
16
+ :betweeen option.
17
+ * The :exclude_end option changes the default behavior of :until--when the
18
+ timestamp of the interval matches the :until timestamp, it will be included
19
+ by default unless the :exclude_end option is set to true.
20
+
21
+ ### 0.6.0 - (2017-01-05)
2
22
 
3
23
  * enhancements
4
24
  * Alias `every` to `frequency`
data/Gemfile CHANGED
@@ -1,12 +1,13 @@
1
+ # frozen_string_literal: true
1
2
  source "https://rubygems.org"
2
3
 
3
4
  gemspec
4
5
 
5
6
  group :development do
6
- gem "pry-byebug", platforms: [:ruby_21, :ruby_22, :ruby_23]
7
+ gem "coveralls"
7
8
  gem "guard", platforms: [:ruby_22, :ruby_23] # Guard no longer supports ruby 2.1
8
9
  gem "guard-minitest", platforms: [:ruby_22, :ruby_23]
9
10
  gem "guard-rubocop", platforms: [:ruby_22, :ruby_23]
11
+ gem "pry-byebug", platforms: [:ruby_21, :ruby_22, :ruby_23]
10
12
  gem "yard"
11
- gem "coveralls"
12
13
  end
data/Guardfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # A sample Guardfile
2
3
  # More info at https://github.com/guard/guard#readme
3
4
 
data/README.md CHANGED
@@ -1,15 +1,15 @@
1
1
  # Montrose
2
2
 
3
3
  [![Build Status](https://travis-ci.org/rossta/montrose.svg?branch=master)](https://travis-ci.org/rossta/montrose)
4
- [![Coverage Status](https://coveralls.io/repos/rossta/montrose/badge.svg?branch=master&service=github)](https://coveralls.io/github/rossta/montrose?branch=master)
5
4
  [![Code Climate](https://codeclimate.com/github/rossta/montrose/badges/gpa.svg)](https://codeclimate.com/github/rossta/montrose)
5
+ [![Coverage Status](https://coveralls.io/repos/rossta/montrose/badge.svg?branch=master&service=github)](https://coveralls.io/github/rossta/montrose?branch=master)
6
6
  [![Dependency Status](https://gemnasium.com/rossta/montrose.svg)](https://gemnasium.com/rossta/montrose)
7
7
 
8
8
  Montrose is an easy-to-use library for defining recurring events in Ruby. It uses a simple chaining system for building recurrences, inspired heavily by the design principles of [HTTP.rb](https://github.com/httprb/http) and rule definitions available in [Recurrence](https://github.com/fnando/recurrence).
9
9
 
10
10
  * [Introductory blog post](http://bit.ly/1PA68Zb)
11
11
  * [NYC.rb
12
- presentation](https://speaderdeck.com/rossta/recurring-events-with-montrose)
12
+ presentation](https://speakerdeck.com/rossta/recurring-events-with-montrose)
13
13
 
14
14
  ## Installation
15
15
 
@@ -370,6 +370,17 @@ r.events.take(10).each { |date| puts date.to_s }
370
370
  r.events.lazy.select { |time| time > 1.month.from_now }.take(3).each { |date| puts date.to_s }
371
371
  ```
372
372
 
373
+ ### Ruby on Rails
374
+
375
+ Instances of `Montrose::Recurrence` support the ActiveRecord serialization API so recurrence objects can be marshalled to and from a single database column:
376
+
377
+ ```ruby
378
+ class RecurringEvent < ApplicationRecord
379
+ serialize :recurrence, Montrose::Recurrence
380
+
381
+ end
382
+ ```
383
+
373
384
  ## Inspiration
374
385
 
375
386
  Montrose is named after the beautifully diverse and artistic [neighborhood in Houston, Texas](https://en.wikipedia.org/wiki/Montrose,_Houston).
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "bundler/setup"
2
3
  require "bundler/gem_tasks"
3
4
  require "rake/testtask"
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'appraisal' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("appraisal", "appraisal")
@@ -5,12 +5,12 @@ source "https://rubygems.org"
5
5
  gem "activesupport", "~> 4.1.0"
6
6
 
7
7
  group :development do
8
- gem "pry-byebug", :platforms => [:ruby_21, :ruby_22, :ruby_23]
9
- gem "guard", :platforms => [:ruby_22, :ruby_23]
10
- gem "guard-minitest", :platforms => [:ruby_22, :ruby_23]
11
- gem "guard-rubocop", :platforms => [:ruby_22, :ruby_23]
12
- gem "yard"
13
8
  gem "coveralls"
9
+ gem "guard", platforms: [:ruby_22, :ruby_23]
10
+ gem "guard-minitest", platforms: [:ruby_22, :ruby_23]
11
+ gem "guard-rubocop", platforms: [:ruby_22, :ruby_23]
12
+ gem "pry-byebug", platforms: [:ruby_21, :ruby_22, :ruby_23]
13
+ gem "yard"
14
14
  end
15
15
 
16
- gemspec :path => "../"
16
+ gemspec path: "../"
@@ -5,12 +5,12 @@ source "https://rubygems.org"
5
5
  gem "activesupport", "~> 4.2.0"
6
6
 
7
7
  group :development do
8
- gem "pry-byebug", :platforms => [:ruby_21, :ruby_22, :ruby_23]
9
- gem "guard", :platforms => [:ruby_22, :ruby_23]
10
- gem "guard-minitest", :platforms => [:ruby_22, :ruby_23]
11
- gem "guard-rubocop", :platforms => [:ruby_22, :ruby_23]
12
- gem "yard"
13
8
  gem "coveralls"
9
+ gem "guard", platforms: [:ruby_22, :ruby_23]
10
+ gem "guard-minitest", platforms: [:ruby_22, :ruby_23]
11
+ gem "guard-rubocop", platforms: [:ruby_22, :ruby_23]
12
+ gem "pry-byebug", platforms: [:ruby_21, :ruby_22, :ruby_23]
13
+ gem "yard"
14
14
  end
15
15
 
16
- gemspec :path => "../"
16
+ gemspec path: "../"
@@ -5,12 +5,12 @@ source "https://rubygems.org"
5
5
  gem "activesupport", "~> 5.0.0"
6
6
 
7
7
  group :development do
8
- gem "pry-byebug", :platforms => [:ruby_21, :ruby_22, :ruby_23]
9
- gem "guard", :platforms => [:ruby_22, :ruby_23]
10
- gem "guard-minitest", :platforms => [:ruby_22, :ruby_23]
11
- gem "guard-rubocop", :platforms => [:ruby_22, :ruby_23]
12
- gem "yard"
13
8
  gem "coveralls"
9
+ gem "guard", platforms: [:ruby_22, :ruby_23]
10
+ gem "guard-minitest", platforms: [:ruby_22, :ruby_23]
11
+ gem "guard-rubocop", platforms: [:ruby_22, :ruby_23]
12
+ gem "pry-byebug", platforms: [:ruby_21, :ruby_22, :ruby_23]
13
+ gem "yard"
14
14
  end
15
15
 
16
- gemspec :path => "../"
16
+ gemspec path: "../"
@@ -0,0 +1,16 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activesupport", "~> 5.1.0"
6
+
7
+ group :development do
8
+ gem "coveralls"
9
+ gem "guard", platforms: [:ruby_22, :ruby_23]
10
+ gem "guard-minitest", platforms: [:ruby_22, :ruby_23]
11
+ gem "guard-rubocop", platforms: [:ruby_22, :ruby_23]
12
+ gem "pry-byebug", platforms: [:ruby_21, :ruby_22, :ruby_23]
13
+ gem "yard"
14
+ end
15
+
16
+ gemspec path: "../"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "active_support"
2
3
  require "active_support/core_ext/object"
3
4
  require "active_support/core_ext/numeric"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "montrose/options"
2
3
  require "montrose/refinements/array_concat"
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "montrose/errors"
2
3
 
3
4
  module Montrose
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  Error = Class.new(StandardError)
3
4
  ConfigurationError = Class.new(Error)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "montrose/errors"
2
3
  require "montrose/options"
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Frequency
3
4
  class Daily < Frequency
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Frequency
3
4
  class Hourly < Frequency
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Frequency
3
4
  class Minutely < Frequency
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Frequency
3
4
  class Monthly < Frequency
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Frequency
3
4
  class Secondly < Frequency
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Frequency
3
4
  class Weekly < Frequency
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Frequency
3
4
  class Yearly < Frequency
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  class Options
3
4
  include Montrose::Utils
@@ -71,6 +72,7 @@ module Montrose
71
72
  def_option :every
72
73
  def_option :starts
73
74
  def_option :until
75
+ def_option :between
74
76
  def_option :hour
75
77
  def_option :day
76
78
  def_option :mday
@@ -82,6 +84,7 @@ module Montrose
82
84
  def_option :at
83
85
  def_option :on
84
86
  def_option :except
87
+ def_option :exclude_end
85
88
 
86
89
  def initialize(opts = {})
87
90
  defaults = {
@@ -94,7 +97,8 @@ module Montrose
94
97
  yday: nil,
95
98
  week: nil,
96
99
  month: nil,
97
- total: nil
100
+ total: nil,
101
+ exclude_end: nil
98
102
  }
99
103
 
100
104
  options = defaults.merge(opts || {})
@@ -182,14 +186,9 @@ module Montrose
182
186
  end
183
187
 
184
188
  def between=(range)
185
- self[:starts] = range.first
186
- self[:until] = range.last
187
- end
188
-
189
- def between
190
- return nil unless self[:starts] && self[:until]
191
-
192
- (self[:starts]..self[:until])
189
+ @between = range
190
+ self[:starts] = range.first unless self[:starts]
191
+ self[:until] = range.last unless self[:until]
193
192
  end
194
193
 
195
194
  def at=(time)
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  require "json"
3
+ require "yaml"
2
4
  require "montrose/chainable"
3
5
  require "montrose/errors"
4
6
  require "montrose/stack"
@@ -310,8 +312,16 @@ module Montrose
310
312
  #
311
313
  # @return [String] json of recurrence options
312
314
  #
313
- def to_json
314
- to_hash.to_json
315
+ def to_json(*args)
316
+ JSON.dump(to_hash, *args)
317
+ end
318
+
319
+ # Returns options used to create the recurrence in YAML format
320
+ #
321
+ # @return [String] YAML-formatted recurrence options
322
+ #
323
+ def to_yaml(*args)
324
+ YAML.dump(to_hash, *args)
315
325
  end
316
326
 
317
327
  def inspect
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Refinements
3
4
  module ArrayConcat
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  # Defines the Rule duck type for recurrence rules
3
4
  module Rule
@@ -13,7 +14,7 @@ module Montrose
13
14
  true
14
15
  end
15
16
 
16
- def continue?
17
+ def continue?(_time = nil)
17
18
  true
18
19
  end
19
20
 
@@ -34,7 +35,7 @@ module Montrose
34
35
  end
35
36
 
36
37
  require "montrose/rule/after"
37
- require "montrose/rule/before"
38
+ require "montrose/rule/between"
38
39
  require "montrose/rule/day_of_month"
39
40
  require "montrose/rule/day_of_week"
40
41
  require "montrose/rule/day_of_year"
@@ -45,4 +46,5 @@ require "montrose/rule/nth_day_of_month"
45
46
  require "montrose/rule/nth_day_of_year"
46
47
  require "montrose/rule/time_of_day"
47
48
  require "montrose/rule/total"
49
+ require "montrose/rule/until"
48
50
  require "montrose/rule/week_of_year"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class After
@@ -19,7 +20,7 @@ module Montrose
19
20
  time >= @start_time
20
21
  end
21
22
 
22
- def continue?
23
+ def continue?(_time)
23
24
  false
24
25
  end
25
26
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ module Montrose
3
+ module Rule
4
+ class Between
5
+ include Montrose::Rule
6
+
7
+ def self.apply_options(opts)
8
+ opts[:between].is_a?(Range) && opts[:between]
9
+ end
10
+
11
+ # Initializes rule
12
+ #
13
+ # @param [Range] between - timestamp range
14
+ #
15
+ def initialize(between)
16
+ @between = between
17
+ end
18
+
19
+ def include?(time)
20
+ @between.cover?(time)
21
+ end
22
+
23
+ def continue?(time)
24
+ @between.max > time
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class DayOfMonth
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class DayOfWeek
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class DayOfYear
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class Except
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class HourOfDay
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class MonthOfYear
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "forwardable"
2
3
 
3
4
  module Montrose
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "montrose/rule/nth_day_matcher"
2
3
 
3
4
  module Montrose
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "montrose/rule/nth_day_matcher"
2
3
 
3
4
  module Montrose
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class TimeOfDay
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class Total
@@ -12,16 +13,16 @@ module Montrose
12
13
  @count = 0
13
14
  end
14
15
 
15
- def include?(_time)
16
- continue?
16
+ def include?(time)
17
+ continue?(time)
17
18
  end
18
19
 
19
- def advance!(_time)
20
+ def advance!(time)
20
21
  @count += 1
21
- continue?
22
+ continue?(time)
22
23
  end
23
24
 
24
- def continue?
25
+ def continue?(_time)
25
26
  @count <= @max
26
27
  end
27
28
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+ module Montrose
3
+ module Rule
4
+ class Until
5
+ include Montrose::Rule
6
+
7
+ def self.apply_options(opts)
8
+ return false unless opts[:until]
9
+
10
+ { until: opts[:until], exclude_end: opts.fetch(:exclude_end, false) }
11
+ end
12
+
13
+ def initialize(opts)
14
+ @end_time = opts.fetch(:until)
15
+ @exclude_end = opts.fetch(:exclude_end)
16
+ end
17
+
18
+ def include?(time)
19
+ if @exclude_end
20
+ time < @end_time
21
+ else
22
+ time <= @end_time
23
+ end
24
+ end
25
+
26
+ def continue?(_time)
27
+ false
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Rule
3
4
  class WeekOfYear
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  # A schedule represents a group of recurrences
3
4
  #
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "montrose/rule"
2
3
 
3
4
  module Montrose
@@ -10,7 +11,8 @@ module Montrose
10
11
  [
11
12
  Frequency,
12
13
  Rule::After,
13
- Rule::Before,
14
+ Rule::Until,
15
+ Rule::Between,
14
16
  Rule::Except,
15
17
  Rule::Total,
16
18
  Rule::TimeOfDay,
@@ -45,7 +47,7 @@ module Montrose
45
47
  yield time if block_given?
46
48
  true
47
49
  else
48
- no.any?(&:continue?)
50
+ no.any? { |rule| rule.continue?(time) }
49
51
  end
50
52
  end
51
53
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Montrose
2
3
  module Utils
3
4
  module_function
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Montrose
3
- VERSION = "0.6.0".freeze
3
+ VERSION = "0.7.0"
4
4
  end
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
  lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require "montrose/version"
@@ -21,13 +22,13 @@ Gem::Specification.new do |spec|
21
22
 
22
23
  spec.required_ruby_version = ">= 2.1.0"
23
24
 
24
- spec.add_dependency "activesupport", ">= 4.1", "< 5.1"
25
+ spec.add_dependency "activesupport", ">= 4.1", "< 5.2"
25
26
 
26
- spec.add_development_dependency "bundler", "~> 1.12"
27
- spec.add_development_dependency "appraisal", "~> 2.1.0"
27
+ spec.add_development_dependency "bundler", "~> 1.13"
28
+ spec.add_development_dependency "appraisal", "~> 2.2.0"
28
29
  spec.add_development_dependency "rake", "~> 11.0"
29
- spec.add_development_dependency "minitest", "~> 5.9"
30
- spec.add_development_dependency "m", "~> 1.4"
31
- spec.add_development_dependency "rubocop", "0.45.0"
30
+ spec.add_development_dependency "minitest", "~> 5.10"
31
+ spec.add_development_dependency "m", "~> 1.5"
32
+ spec.add_development_dependency "rubocop", "0.46.0"
32
33
  spec.add_development_dependency "timecop"
33
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: montrose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ross Kaffenberger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-05 00:00:00.000000000 Z
11
+ date: 2017-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '4.1'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.1'
22
+ version: '5.2'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,35 +29,35 @@ dependencies:
29
29
  version: '4.1'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.1'
32
+ version: '5.2'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: bundler
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '1.12'
39
+ version: '1.13'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1.12'
46
+ version: '1.13'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: appraisal
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 2.1.0
53
+ version: 2.2.0
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 2.1.0
60
+ version: 2.2.0
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rake
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -78,42 +78,42 @@ dependencies:
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '5.9'
81
+ version: '5.10'
82
82
  type: :development
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '5.9'
88
+ version: '5.10'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: m
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '1.4'
95
+ version: '1.5'
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '1.4'
102
+ version: '1.5'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: rubocop
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - '='
108
108
  - !ruby/object:Gem::Version
109
- version: 0.45.0
109
+ version: 0.46.0
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - '='
115
115
  - !ruby/object:Gem::Version
116
- version: 0.45.0
116
+ version: 0.46.0
117
117
  - !ruby/object:Gem::Dependency
118
118
  name: timecop
119
119
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,7 @@ executables: []
136
136
  extensions: []
137
137
  extra_rdoc_files: []
138
138
  files:
139
+ - ".codeclimate.yml"
139
140
  - ".gitignore"
140
141
  - ".rubocop.yml"
141
142
  - ".travis.yml"
@@ -148,6 +149,7 @@ files:
148
149
  - README.md
149
150
  - Rakefile
150
151
  - bin/_guard-core
152
+ - bin/appraisal
151
153
  - bin/console
152
154
  - bin/guard
153
155
  - bin/m
@@ -157,6 +159,7 @@ files:
157
159
  - gemfiles/activesupport_4.1.gemfile
158
160
  - gemfiles/activesupport_4.2.gemfile
159
161
  - gemfiles/activesupport_5.0.gemfile
162
+ - gemfiles/activesupport_5.1.gemfile
160
163
  - lib/montrose.rb
161
164
  - lib/montrose/chainable.rb
162
165
  - lib/montrose/clock.rb
@@ -174,7 +177,7 @@ files:
174
177
  - lib/montrose/refinements/array_concat.rb
175
178
  - lib/montrose/rule.rb
176
179
  - lib/montrose/rule/after.rb
177
- - lib/montrose/rule/before.rb
180
+ - lib/montrose/rule/between.rb
178
181
  - lib/montrose/rule/day_of_month.rb
179
182
  - lib/montrose/rule/day_of_week.rb
180
183
  - lib/montrose/rule/day_of_year.rb
@@ -186,6 +189,7 @@ files:
186
189
  - lib/montrose/rule/nth_day_of_year.rb
187
190
  - lib/montrose/rule/time_of_day.rb
188
191
  - lib/montrose/rule/total.rb
192
+ - lib/montrose/rule/until.rb
189
193
  - lib/montrose/rule/week_of_year.rb
190
194
  - lib/montrose/schedule.rb
191
195
  - lib/montrose/stack.rb
@@ -212,9 +216,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
216
  version: '0'
213
217
  requirements: []
214
218
  rubyforge_project:
215
- rubygems_version: 2.4.5.1
219
+ rubygems_version: 2.5.1
216
220
  signing_key:
217
221
  specification_version: 4
218
222
  summary: Recurring events in Ruby
219
223
  test_files: []
220
- has_rdoc:
@@ -1,23 +0,0 @@
1
- module Montrose
2
- module Rule
3
- class Before
4
- include Montrose::Rule
5
-
6
- def self.apply_options(opts)
7
- opts[:until]
8
- end
9
-
10
- def initialize(end_time)
11
- @end_time = end_time
12
- end
13
-
14
- def include?(time)
15
- time < @end_time
16
- end
17
-
18
- def continue?
19
- false
20
- end
21
- end
22
- end
23
- end