repeatable 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +72 -0
- data/CHANGELOG.md +18 -1
- data/CODE_OF_CONDUCT.md +128 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +24 -5
- data/README.md +27 -8
- data/Rakefile +5 -1
- data/lib/repeatable/conversions.rb +5 -1
- data/lib/repeatable/expression/base.rb +21 -11
- data/lib/repeatable/expression/biweekly.rb +14 -6
- data/lib/repeatable/expression/date.rb +10 -6
- data/lib/repeatable/expression/day_in_month.rb +4 -0
- data/lib/repeatable/expression/difference.rb +14 -5
- data/lib/repeatable/expression/exact_date.rb +5 -1
- data/lib/repeatable/expression/intersection.rb +6 -2
- data/lib/repeatable/expression/range_in_year.rb +33 -9
- data/lib/repeatable/expression/set.rb +15 -5
- data/lib/repeatable/expression/union.rb +5 -1
- data/lib/repeatable/expression/weekday.rb +4 -0
- data/lib/repeatable/expression/weekday_in_month.rb +14 -1
- data/lib/repeatable/expression.rb +1 -0
- data/lib/repeatable/last_date_of_month.rb +4 -0
- data/lib/repeatable/parse_error.rb +1 -0
- data/lib/repeatable/parser.rb +7 -1
- data/lib/repeatable/schedule.rb +18 -4
- data/lib/repeatable/types.rb +6 -0
- data/lib/repeatable/version.rb +2 -1
- data/lib/repeatable.rb +4 -0
- data/rbi/repeatable.rbi +310 -0
- data/repeatable.gemspec +3 -0
- data/sorbet/config +3 -0
- data/sorbet/rbi/gems/ast.rbi +49 -0
- data/sorbet/rbi/gems/coderay.rbi +285 -0
- data/sorbet/rbi/gems/commander.rbi +197 -0
- data/sorbet/rbi/gems/docile.rbi +36 -0
- data/sorbet/rbi/gems/highline.rbi +577 -0
- data/sorbet/rbi/gems/method_source.rbi +64 -0
- data/sorbet/rbi/gems/parallel.rbi +83 -0
- data/sorbet/rbi/gems/parlour.rbi +840 -0
- data/sorbet/rbi/gems/parser.rbi +1950 -0
- data/sorbet/rbi/gems/pry.rbi +1898 -0
- data/sorbet/rbi/gems/rainbow.rbi +118 -0
- data/sorbet/rbi/gems/rake.rbi +646 -0
- data/sorbet/rbi/gems/regexp_parser.rbi +926 -0
- data/sorbet/rbi/gems/repeatable.rbi +13 -0
- data/sorbet/rbi/gems/rexml.rbi +583 -0
- data/sorbet/rbi/gems/rspec-core.rbi +1919 -0
- data/sorbet/rbi/gems/rspec-expectations.rbi +1150 -0
- data/sorbet/rbi/gems/rspec-mocks.rbi +1100 -0
- data/sorbet/rbi/gems/rspec-support.rbi +280 -0
- data/sorbet/rbi/gems/rspec.rbi +15 -0
- data/sorbet/rbi/gems/rubocop-ast.rbi +1356 -0
- data/sorbet/rbi/gems/rubocop-performance.rbi +487 -0
- data/sorbet/rbi/gems/rubocop.rbi +7923 -0
- data/sorbet/rbi/gems/ruby-progressbar.rbi +304 -0
- data/sorbet/rbi/gems/simplecov-html.rbi +35 -0
- data/sorbet/rbi/gems/simplecov.rbi +419 -0
- data/sorbet/rbi/gems/simplecov_json_formatter.rbi +47 -0
- data/sorbet/rbi/gems/standard.rbi +130 -0
- data/sorbet/rbi/gems/unicode-display_width.rbi +20 -0
- data/sorbet/rbi/hidden-definitions/errors.txt +4273 -0
- data/sorbet/rbi/hidden-definitions/hidden.rbi +9013 -0
- data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +276 -0
- data/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi +645 -0
- data/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi +24 -0
- data/sorbet/rbi/sorbet-typed/lib/rubocop/>=1.8/rubocop.rbi +12 -0
- data/sorbet/rbi/sorbet-typed/lib/rubocop-performance/~>1.6/rubocop-performance.rbi +149 -0
- metadata +61 -6
- data/.travis.yml +0 -18
@@ -1,11 +1,15 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module Repeatable
|
2
3
|
module Expression
|
3
4
|
class Intersection < Set
|
5
|
+
sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
|
4
6
|
def initialize(*elements)
|
5
|
-
|
6
|
-
|
7
|
+
other_intersections, not_intersections = elements.partition { |e| e.is_a?(self.class) }
|
8
|
+
other_intersections = T.cast(other_intersections, T::Array[Expression::Intersection])
|
9
|
+
super(other_intersections.flat_map(&:elements).concat(not_intersections))
|
7
10
|
end
|
8
11
|
|
12
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
9
13
|
def include?(date)
|
10
14
|
elements.all? { |e| e.include?(date) }
|
11
15
|
end
|
@@ -1,6 +1,15 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module Repeatable
|
2
3
|
module Expression
|
3
4
|
class RangeInYear < Date
|
5
|
+
sig do
|
6
|
+
params(
|
7
|
+
start_month: Integer,
|
8
|
+
end_month: Integer,
|
9
|
+
start_day: Integer,
|
10
|
+
end_day: Integer
|
11
|
+
).void
|
12
|
+
end
|
4
13
|
def initialize(start_month:, end_month: start_month, start_day: 0, end_day: 0)
|
5
14
|
@start_month = start_month
|
6
15
|
@end_month = end_month
|
@@ -8,6 +17,7 @@ module Repeatable
|
|
8
17
|
@end_day = end_day
|
9
18
|
end
|
10
19
|
|
20
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
11
21
|
def include?(date)
|
12
22
|
return true if months_include?(date)
|
13
23
|
|
@@ -18,29 +28,43 @@ module Repeatable
|
|
18
28
|
end
|
19
29
|
end
|
20
30
|
|
21
|
-
def to_h
|
22
|
-
args = {start_month: start_month}
|
23
|
-
args[:end_month] = end_month unless end_month == start_month
|
24
|
-
args[:start_day] = start_day unless start_day.zero?
|
25
|
-
args[:end_day] = end_day unless end_day.zero?
|
26
|
-
{range_in_year: args}
|
27
|
-
end
|
28
|
-
|
29
31
|
private
|
30
32
|
|
31
|
-
|
33
|
+
sig { returns(Integer) }
|
34
|
+
attr_reader :start_month
|
35
|
+
|
36
|
+
sig { returns(Integer) }
|
37
|
+
attr_reader :end_month
|
32
38
|
|
39
|
+
sig { returns(Integer) }
|
40
|
+
attr_reader :start_day
|
41
|
+
|
42
|
+
sig { returns(Integer) }
|
43
|
+
attr_reader :end_day
|
44
|
+
|
45
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
33
46
|
def months_include?(date)
|
34
47
|
date.month > start_month && date.month < end_month
|
35
48
|
end
|
36
49
|
|
50
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
37
51
|
def start_month_include?(date)
|
38
52
|
date.month == start_month && (start_day == 0 || date.day >= start_day)
|
39
53
|
end
|
40
54
|
|
55
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
41
56
|
def end_month_include?(date)
|
42
57
|
date.month == end_month && (end_day == 0 || date.day <= end_day)
|
43
58
|
end
|
59
|
+
|
60
|
+
sig { override.returns(T::Hash[Symbol, Integer]) }
|
61
|
+
def hash_value
|
62
|
+
args = {start_month: start_month}
|
63
|
+
args[:end_month] = end_month unless end_month == start_month
|
64
|
+
args[:start_day] = start_day unless start_day.zero?
|
65
|
+
args[:end_day] = end_day unless end_day.zero?
|
66
|
+
args
|
67
|
+
end
|
44
68
|
end
|
45
69
|
end
|
46
70
|
end
|
@@ -1,26 +1,36 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module Repeatable
|
2
3
|
module Expression
|
3
4
|
class Set < Base
|
5
|
+
abstract!
|
6
|
+
|
7
|
+
sig { returns(T::Array[Expression::Base]) }
|
4
8
|
attr_reader :elements
|
5
9
|
|
10
|
+
sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
|
6
11
|
def initialize(*elements)
|
7
|
-
@elements = elements.flatten.uniq
|
12
|
+
@elements = T.let(elements.flatten.uniq, T::Array[Expression::Base])
|
8
13
|
end
|
9
14
|
|
15
|
+
sig { params(element: T.untyped).returns(Repeatable::Expression::Set) }
|
10
16
|
def <<(element)
|
11
17
|
elements << element unless elements.include?(element)
|
12
18
|
self
|
13
19
|
end
|
14
20
|
|
15
|
-
|
16
|
-
Hash[hash_key, elements.map(&:to_h)]
|
17
|
-
end
|
18
|
-
|
21
|
+
sig { params(other: Object).returns(T::Boolean) }
|
19
22
|
def ==(other)
|
20
23
|
other.is_a?(self.class) &&
|
21
24
|
elements.size == other.elements.size &&
|
22
25
|
other.elements.all? { |e| elements.include?(e) }
|
23
26
|
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
sig { override.returns(T::Array[Types::SymbolHash]) }
|
31
|
+
def hash_value
|
32
|
+
elements.map(&:to_h)
|
33
|
+
end
|
24
34
|
end
|
25
35
|
end
|
26
36
|
end
|
@@ -1,11 +1,15 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module Repeatable
|
2
3
|
module Expression
|
3
4
|
class Union < Set
|
5
|
+
sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
|
4
6
|
def initialize(*elements)
|
5
7
|
other_unions, not_unions = elements.partition { |e| e.is_a?(self.class) }
|
6
|
-
|
8
|
+
other_unions = T.cast(other_unions, T::Array[Expression::Union])
|
9
|
+
super(other_unions.flat_map(&:elements).concat(not_unions))
|
7
10
|
end
|
8
11
|
|
12
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
9
13
|
def include?(date)
|
10
14
|
elements.any? { |e| e.include?(date) }
|
11
15
|
end
|
@@ -1,16 +1,20 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module Repeatable
|
2
3
|
module Expression
|
3
4
|
class Weekday < Date
|
5
|
+
sig { params(weekday: Integer).void }
|
4
6
|
def initialize(weekday:)
|
5
7
|
@weekday = weekday
|
6
8
|
end
|
7
9
|
|
10
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
8
11
|
def include?(date)
|
9
12
|
date.wday == weekday
|
10
13
|
end
|
11
14
|
|
12
15
|
private
|
13
16
|
|
17
|
+
sig { returns(Integer) }
|
14
18
|
attr_reader :weekday
|
15
19
|
end
|
16
20
|
end
|
@@ -1,25 +1,34 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module Repeatable
|
2
3
|
module Expression
|
3
4
|
class WeekdayInMonth < Date
|
4
5
|
include LastDateOfMonth
|
5
6
|
|
7
|
+
sig { params(weekday: Integer, count: Integer).void }
|
6
8
|
def initialize(weekday:, count:)
|
7
9
|
@weekday = weekday
|
8
10
|
@count = count
|
9
11
|
end
|
10
12
|
|
13
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
11
14
|
def include?(date)
|
12
15
|
day_matches?(date) && week_matches?(date)
|
13
16
|
end
|
14
17
|
|
15
18
|
private
|
16
19
|
|
17
|
-
|
20
|
+
sig { returns(Integer) }
|
21
|
+
attr_reader :weekday
|
18
22
|
|
23
|
+
sig { returns(Integer) }
|
24
|
+
attr_reader :count
|
25
|
+
|
26
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
19
27
|
def day_matches?(date)
|
20
28
|
date.wday == weekday
|
21
29
|
end
|
22
30
|
|
31
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
23
32
|
def week_matches?(date)
|
24
33
|
if negative_count?
|
25
34
|
week_from_end(date) == count
|
@@ -28,18 +37,22 @@ module Repeatable
|
|
28
37
|
end
|
29
38
|
end
|
30
39
|
|
40
|
+
sig { params(date: ::Date).returns(Integer) }
|
31
41
|
def week_from_beginning(date)
|
32
42
|
week_in_month(date.day - 1)
|
33
43
|
end
|
34
44
|
|
45
|
+
sig { params(date: ::Date).returns(Integer) }
|
35
46
|
def week_from_end(date)
|
36
47
|
-week_in_month(last_date_of_month(date).day - date.day)
|
37
48
|
end
|
38
49
|
|
50
|
+
sig { params(zero_indexed_day: Integer).returns(Integer) }
|
39
51
|
def week_in_month(zero_indexed_day)
|
40
52
|
(zero_indexed_day / 7) + 1
|
41
53
|
end
|
42
54
|
|
55
|
+
sig { returns(T::Boolean) }
|
43
56
|
def negative_count?
|
44
57
|
count < 0
|
45
58
|
end
|
data/lib/repeatable/parser.rb
CHANGED
@@ -1,13 +1,19 @@
|
|
1
|
+
# typed: false
|
1
2
|
module Repeatable
|
2
3
|
class Parser
|
4
|
+
extend T::Sig
|
5
|
+
|
6
|
+
sig { params(hash: T::Hash[T.any(String, Symbol), T.untyped]).void }
|
3
7
|
def initialize(hash)
|
4
8
|
@hash = hash
|
5
9
|
end
|
6
10
|
|
11
|
+
sig { params(hash: T::Hash[T.any(String, Symbol), T.untyped]).returns(Expression::Base) }
|
7
12
|
def self.call(hash)
|
8
13
|
new(hash).call
|
9
14
|
end
|
10
15
|
|
16
|
+
sig { returns(Expression::Base) }
|
11
17
|
def call
|
12
18
|
build_expression(hash)
|
13
19
|
end
|
@@ -50,7 +56,7 @@ module Repeatable
|
|
50
56
|
def expression_klass(string)
|
51
57
|
camel_cased_string = string
|
52
58
|
.capitalize
|
53
|
-
.gsub(/(?:_)(?<word>[a-z\d]+)/i) { Regexp.last_match[:word]
|
59
|
+
.gsub(/(?:_)(?<word>[a-z\d]+)/i) { T.must(Regexp.last_match)[:word]&.capitalize }
|
54
60
|
Repeatable::Expression.const_get(camel_cased_string)
|
55
61
|
rescue NameError => e
|
56
62
|
raise if e.name && e.name.to_s != camel_cased_string
|
data/lib/repeatable/schedule.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
+
# typed: strict
|
1
2
|
module Repeatable
|
2
3
|
class Schedule
|
4
|
+
extend T::Sig
|
5
|
+
|
6
|
+
sig { params(arg: Object).void }
|
3
7
|
def initialize(arg)
|
4
8
|
case arg
|
5
9
|
when Repeatable::Expression::Base
|
6
|
-
@expression = arg
|
10
|
+
@expression = T.let(arg, Expression::Base)
|
7
11
|
when Hash
|
8
12
|
@expression = Parser.call(arg)
|
9
13
|
else
|
@@ -11,6 +15,7 @@ module Repeatable
|
|
11
15
|
end
|
12
16
|
end
|
13
17
|
|
18
|
+
sig { params(start_date: Object, end_date: Object).returns(T::Array[::Date]) }
|
14
19
|
def occurrences(start_date, end_date)
|
15
20
|
start_date = Conversions::Date(start_date)
|
16
21
|
end_date = Conversions::Date(end_date)
|
@@ -20,34 +25,43 @@ module Repeatable
|
|
20
25
|
(start_date..end_date).select { |date| include?(date) }
|
21
26
|
end
|
22
27
|
|
28
|
+
sig { params(start_date: Object, include_start: T::Boolean, limit: Integer).returns(T.nilable(::Date)) }
|
23
29
|
def next_occurrence(start_date = Date.today, include_start: false, limit: 36525)
|
24
30
|
date = Conversions::Date(start_date)
|
25
31
|
|
26
32
|
return date if include_start && include?(date)
|
27
33
|
|
28
|
-
|
34
|
+
result = T.let(nil, T.nilable(Date))
|
35
|
+
1.step(limit) do |i|
|
29
36
|
date = date.next_day
|
30
37
|
|
31
|
-
|
32
|
-
|
38
|
+
if include?(date)
|
39
|
+
result = date
|
40
|
+
break
|
41
|
+
end
|
33
42
|
end
|
43
|
+
result
|
34
44
|
end
|
35
45
|
|
46
|
+
sig { params(date: Object).returns(T::Boolean) }
|
36
47
|
def include?(date = Date.today)
|
37
48
|
date = Conversions::Date(date)
|
38
49
|
expression.include?(date)
|
39
50
|
end
|
40
51
|
|
52
|
+
sig { returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
|
41
53
|
def to_h
|
42
54
|
expression.to_h
|
43
55
|
end
|
44
56
|
|
57
|
+
sig { params(other: Object).returns(T::Boolean) }
|
45
58
|
def ==(other)
|
46
59
|
other.is_a?(self.class) && expression == other.expression
|
47
60
|
end
|
48
61
|
|
49
62
|
protected
|
50
63
|
|
64
|
+
sig { returns(Expression::Base) }
|
51
65
|
attr_reader :expression
|
52
66
|
end
|
53
67
|
end
|
data/lib/repeatable/version.rb
CHANGED
data/lib/repeatable.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
+
# typed: strict
|
1
2
|
require "date"
|
3
|
+
require "sorbet-runtime"
|
2
4
|
|
3
5
|
require "repeatable/version"
|
4
6
|
|
@@ -7,6 +9,8 @@ end
|
|
7
9
|
|
8
10
|
require "repeatable/parse_error"
|
9
11
|
|
12
|
+
require "repeatable/types"
|
13
|
+
|
10
14
|
require "repeatable/conversions"
|
11
15
|
require "repeatable/last_date_of_month"
|
12
16
|
|
data/rbi/repeatable.rbi
ADDED
@@ -0,0 +1,310 @@
|
|
1
|
+
# typed: strong
|
2
|
+
module Repeatable
|
3
|
+
VERSION = "1.1.0"
|
4
|
+
|
5
|
+
module Conversions
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
sig { params(arg: Object).returns(::Date) }
|
9
|
+
def Date(arg); end
|
10
|
+
end
|
11
|
+
|
12
|
+
module LastDateOfMonth
|
13
|
+
extend T::Sig
|
14
|
+
|
15
|
+
sig { params(date: ::Date).returns(::Date) }
|
16
|
+
def last_date_of_month(date); end
|
17
|
+
end
|
18
|
+
|
19
|
+
class ParseError < StandardError
|
20
|
+
end
|
21
|
+
|
22
|
+
class Parser
|
23
|
+
extend T::Sig
|
24
|
+
|
25
|
+
sig { params(hash: T::Hash[T.any(String, Symbol), T.untyped]).void }
|
26
|
+
def initialize(hash); end
|
27
|
+
|
28
|
+
sig { params(hash: T::Hash[T.any(String, Symbol), T.untyped]).returns(Expression::Base) }
|
29
|
+
def self.call(hash); end
|
30
|
+
|
31
|
+
sig { returns(Expression::Base) }
|
32
|
+
def call; end
|
33
|
+
|
34
|
+
sig { returns(T.untyped) }
|
35
|
+
attr_reader :hash
|
36
|
+
|
37
|
+
sig { params(hash: T.untyped).returns(T.untyped) }
|
38
|
+
def build_expression(hash); end
|
39
|
+
|
40
|
+
sig { params(key: T.untyped, value: T.untyped).returns(T.untyped) }
|
41
|
+
def expression_for(key, value); end
|
42
|
+
|
43
|
+
sig { params(hash: T.untyped).returns(T.untyped) }
|
44
|
+
def symbolize_keys(hash); end
|
45
|
+
|
46
|
+
sig { params(string: T.untyped).returns(T.untyped) }
|
47
|
+
def expression_klass(string); end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Schedule
|
51
|
+
extend T::Sig
|
52
|
+
|
53
|
+
sig { params(arg: Object).void }
|
54
|
+
def initialize(arg); end
|
55
|
+
|
56
|
+
sig { params(start_date: Object, end_date: Object).returns(T::Array[::Date]) }
|
57
|
+
def occurrences(start_date, end_date); end
|
58
|
+
|
59
|
+
sig { params(start_date: Object, include_start: T::Boolean, limit: Integer).returns(T.nilable(::Date)) }
|
60
|
+
def next_occurrence(start_date = Date.today, include_start: false, limit: 36525); end
|
61
|
+
|
62
|
+
sig { params(date: Object).returns(T::Boolean) }
|
63
|
+
def include?(date = Date.today); end
|
64
|
+
|
65
|
+
sig { returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
|
66
|
+
def to_h; end
|
67
|
+
|
68
|
+
sig { params(other: Object).returns(T::Boolean) }
|
69
|
+
def ==(other); end
|
70
|
+
|
71
|
+
sig { returns(Expression::Base) }
|
72
|
+
attr_reader :expression
|
73
|
+
end
|
74
|
+
|
75
|
+
module Types
|
76
|
+
SymbolHash = T.type_alias { T::Hash[Symbol, T.untyped] }
|
77
|
+
end
|
78
|
+
|
79
|
+
module Expression
|
80
|
+
class Base
|
81
|
+
abstract!
|
82
|
+
|
83
|
+
extend T::Sig
|
84
|
+
extend T::Helpers
|
85
|
+
|
86
|
+
sig { params(other: Object).returns(T::Boolean) }
|
87
|
+
def self.===(other); end
|
88
|
+
|
89
|
+
sig { abstract.params(date: ::Date).returns(T::Boolean) }
|
90
|
+
def include?(date); end
|
91
|
+
|
92
|
+
sig { returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
|
93
|
+
def to_h; end
|
94
|
+
|
95
|
+
sig { params(other: Expression::Base).returns(Expression::Union) }
|
96
|
+
def union(other); end
|
97
|
+
|
98
|
+
sig { params(other: Expression::Base).returns(Expression::Intersection) }
|
99
|
+
def intersection(other); end
|
100
|
+
|
101
|
+
sig { params(other: T.untyped).returns(Expression::Difference) }
|
102
|
+
def difference(other); end
|
103
|
+
|
104
|
+
sig { returns(Symbol) }
|
105
|
+
def hash_key; end
|
106
|
+
|
107
|
+
sig { abstract.returns(T.any(Types::SymbolHash, T::Array[Types::SymbolHash])) }
|
108
|
+
def hash_value; end
|
109
|
+
end
|
110
|
+
|
111
|
+
class Biweekly < Date
|
112
|
+
sig { params(weekday: Integer, start_after: Object).void }
|
113
|
+
def initialize(weekday:, start_after: ::Date.today); end
|
114
|
+
|
115
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
116
|
+
def include?(date); end
|
117
|
+
|
118
|
+
sig { returns(Integer) }
|
119
|
+
attr_reader :weekday
|
120
|
+
|
121
|
+
sig { returns(::Date) }
|
122
|
+
attr_reader :start_after
|
123
|
+
|
124
|
+
sig { returns(::Date) }
|
125
|
+
attr_reader :_first_occurrence
|
126
|
+
|
127
|
+
sig { returns(::Date) }
|
128
|
+
def find_first_occurrence; end
|
129
|
+
end
|
130
|
+
|
131
|
+
class Date < Base
|
132
|
+
abstract!
|
133
|
+
|
134
|
+
sig { params(other: Object).returns(T::Boolean) }
|
135
|
+
def ==(other); end
|
136
|
+
|
137
|
+
sig { returns(Integer) }
|
138
|
+
def hash; end
|
139
|
+
|
140
|
+
sig { returns(Types::SymbolHash) }
|
141
|
+
def attributes; end
|
142
|
+
|
143
|
+
sig { params(value: BasicObject).returns(T.untyped) }
|
144
|
+
def normalize_attribute_value(value); end
|
145
|
+
end
|
146
|
+
|
147
|
+
class DayInMonth < Date
|
148
|
+
include LastDateOfMonth
|
149
|
+
|
150
|
+
sig { params(day: Integer).void }
|
151
|
+
def initialize(day:); end
|
152
|
+
|
153
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
154
|
+
def include?(date); end
|
155
|
+
|
156
|
+
sig { returns(Integer) }
|
157
|
+
attr_reader :day
|
158
|
+
end
|
159
|
+
|
160
|
+
class Difference < Base
|
161
|
+
sig { params(included: Expression::Base, excluded: Expression::Base).void }
|
162
|
+
def initialize(included:, excluded:); end
|
163
|
+
|
164
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
165
|
+
def include?(date); end
|
166
|
+
|
167
|
+
sig { params(other: Object).returns(T::Boolean) }
|
168
|
+
def ==(other); end
|
169
|
+
|
170
|
+
sig { returns(Expression::Base) }
|
171
|
+
attr_reader :included
|
172
|
+
|
173
|
+
sig { returns(Expression::Base) }
|
174
|
+
attr_reader :excluded
|
175
|
+
|
176
|
+
sig { override.returns(Types::SymbolHash) }
|
177
|
+
def hash_value; end
|
178
|
+
end
|
179
|
+
|
180
|
+
class ExactDate < Date
|
181
|
+
sig { params(date: Object).void }
|
182
|
+
def initialize(date:); end
|
183
|
+
|
184
|
+
sig { override.params(other_date: ::Date).returns(T::Boolean) }
|
185
|
+
def include?(other_date); end
|
186
|
+
|
187
|
+
sig { returns(::Date) }
|
188
|
+
attr_reader :date
|
189
|
+
end
|
190
|
+
|
191
|
+
class Intersection < Set
|
192
|
+
sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
|
193
|
+
def initialize(*elements); end
|
194
|
+
|
195
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
196
|
+
def include?(date); end
|
197
|
+
end
|
198
|
+
|
199
|
+
class RangeInYear < Date
|
200
|
+
sig do
|
201
|
+
params(
|
202
|
+
start_month: Integer,
|
203
|
+
end_month: Integer,
|
204
|
+
start_day: Integer,
|
205
|
+
end_day: Integer
|
206
|
+
).void
|
207
|
+
end
|
208
|
+
def initialize(start_month:, end_month: start_month, start_day: 0, end_day: 0); end
|
209
|
+
|
210
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
211
|
+
def include?(date); end
|
212
|
+
|
213
|
+
sig { returns(Integer) }
|
214
|
+
attr_reader :start_month
|
215
|
+
|
216
|
+
sig { returns(Integer) }
|
217
|
+
attr_reader :end_month
|
218
|
+
|
219
|
+
sig { returns(Integer) }
|
220
|
+
attr_reader :start_day
|
221
|
+
|
222
|
+
sig { returns(Integer) }
|
223
|
+
attr_reader :end_day
|
224
|
+
|
225
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
226
|
+
def months_include?(date); end
|
227
|
+
|
228
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
229
|
+
def start_month_include?(date); end
|
230
|
+
|
231
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
232
|
+
def end_month_include?(date); end
|
233
|
+
|
234
|
+
sig { override.returns(T::Hash[Symbol, Integer]) }
|
235
|
+
def hash_value; end
|
236
|
+
end
|
237
|
+
|
238
|
+
class Set < Base
|
239
|
+
abstract!
|
240
|
+
|
241
|
+
sig { returns(T::Array[Expression::Base]) }
|
242
|
+
attr_reader :elements
|
243
|
+
|
244
|
+
sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
|
245
|
+
def initialize(*elements); end
|
246
|
+
|
247
|
+
sig { params(element: T.untyped).returns(Repeatable::Expression::Set) }
|
248
|
+
def <<(element); end
|
249
|
+
|
250
|
+
sig { params(other: Object).returns(T::Boolean) }
|
251
|
+
def ==(other); end
|
252
|
+
|
253
|
+
sig { override.returns(T::Array[Types::SymbolHash]) }
|
254
|
+
def hash_value; end
|
255
|
+
end
|
256
|
+
|
257
|
+
class Union < Set
|
258
|
+
sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
|
259
|
+
def initialize(*elements); end
|
260
|
+
|
261
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
262
|
+
def include?(date); end
|
263
|
+
end
|
264
|
+
|
265
|
+
class Weekday < Date
|
266
|
+
sig { params(weekday: Integer).void }
|
267
|
+
def initialize(weekday:); end
|
268
|
+
|
269
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
270
|
+
def include?(date); end
|
271
|
+
|
272
|
+
sig { returns(Integer) }
|
273
|
+
attr_reader :weekday
|
274
|
+
end
|
275
|
+
|
276
|
+
class WeekdayInMonth < Date
|
277
|
+
include LastDateOfMonth
|
278
|
+
|
279
|
+
sig { params(weekday: Integer, count: Integer).void }
|
280
|
+
def initialize(weekday:, count:); end
|
281
|
+
|
282
|
+
sig { override.params(date: ::Date).returns(T::Boolean) }
|
283
|
+
def include?(date); end
|
284
|
+
|
285
|
+
sig { returns(Integer) }
|
286
|
+
attr_reader :weekday
|
287
|
+
|
288
|
+
sig { returns(Integer) }
|
289
|
+
attr_reader :count
|
290
|
+
|
291
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
292
|
+
def day_matches?(date); end
|
293
|
+
|
294
|
+
sig { params(date: ::Date).returns(T::Boolean) }
|
295
|
+
def week_matches?(date); end
|
296
|
+
|
297
|
+
sig { params(date: ::Date).returns(Integer) }
|
298
|
+
def week_from_beginning(date); end
|
299
|
+
|
300
|
+
sig { params(date: ::Date).returns(Integer) }
|
301
|
+
def week_from_end(date); end
|
302
|
+
|
303
|
+
sig { params(zero_indexed_day: Integer).returns(Integer) }
|
304
|
+
def week_in_month(zero_indexed_day); end
|
305
|
+
|
306
|
+
sig { returns(T::Boolean) }
|
307
|
+
def negative_count?; end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|