repeatable 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +72 -0
  3. data/CHANGELOG.md +18 -1
  4. data/CODE_OF_CONDUCT.md +128 -0
  5. data/Gemfile +2 -0
  6. data/Gemfile.lock +24 -5
  7. data/README.md +27 -8
  8. data/Rakefile +5 -1
  9. data/lib/repeatable/conversions.rb +5 -1
  10. data/lib/repeatable/expression/base.rb +21 -11
  11. data/lib/repeatable/expression/biweekly.rb +14 -6
  12. data/lib/repeatable/expression/date.rb +10 -6
  13. data/lib/repeatable/expression/day_in_month.rb +4 -0
  14. data/lib/repeatable/expression/difference.rb +14 -5
  15. data/lib/repeatable/expression/exact_date.rb +5 -1
  16. data/lib/repeatable/expression/intersection.rb +6 -2
  17. data/lib/repeatable/expression/range_in_year.rb +33 -9
  18. data/lib/repeatable/expression/set.rb +15 -5
  19. data/lib/repeatable/expression/union.rb +5 -1
  20. data/lib/repeatable/expression/weekday.rb +4 -0
  21. data/lib/repeatable/expression/weekday_in_month.rb +14 -1
  22. data/lib/repeatable/expression.rb +1 -0
  23. data/lib/repeatable/last_date_of_month.rb +4 -0
  24. data/lib/repeatable/parse_error.rb +1 -0
  25. data/lib/repeatable/parser.rb +7 -1
  26. data/lib/repeatable/schedule.rb +18 -4
  27. data/lib/repeatable/types.rb +6 -0
  28. data/lib/repeatable/version.rb +2 -1
  29. data/lib/repeatable.rb +4 -0
  30. data/rbi/repeatable.rbi +310 -0
  31. data/repeatable.gemspec +3 -0
  32. data/sorbet/config +3 -0
  33. data/sorbet/rbi/gems/ast.rbi +49 -0
  34. data/sorbet/rbi/gems/coderay.rbi +285 -0
  35. data/sorbet/rbi/gems/commander.rbi +197 -0
  36. data/sorbet/rbi/gems/docile.rbi +36 -0
  37. data/sorbet/rbi/gems/highline.rbi +577 -0
  38. data/sorbet/rbi/gems/method_source.rbi +64 -0
  39. data/sorbet/rbi/gems/parallel.rbi +83 -0
  40. data/sorbet/rbi/gems/parlour.rbi +840 -0
  41. data/sorbet/rbi/gems/parser.rbi +1950 -0
  42. data/sorbet/rbi/gems/pry.rbi +1898 -0
  43. data/sorbet/rbi/gems/rainbow.rbi +118 -0
  44. data/sorbet/rbi/gems/rake.rbi +646 -0
  45. data/sorbet/rbi/gems/regexp_parser.rbi +926 -0
  46. data/sorbet/rbi/gems/repeatable.rbi +13 -0
  47. data/sorbet/rbi/gems/rexml.rbi +583 -0
  48. data/sorbet/rbi/gems/rspec-core.rbi +1919 -0
  49. data/sorbet/rbi/gems/rspec-expectations.rbi +1150 -0
  50. data/sorbet/rbi/gems/rspec-mocks.rbi +1100 -0
  51. data/sorbet/rbi/gems/rspec-support.rbi +280 -0
  52. data/sorbet/rbi/gems/rspec.rbi +15 -0
  53. data/sorbet/rbi/gems/rubocop-ast.rbi +1356 -0
  54. data/sorbet/rbi/gems/rubocop-performance.rbi +487 -0
  55. data/sorbet/rbi/gems/rubocop.rbi +7923 -0
  56. data/sorbet/rbi/gems/ruby-progressbar.rbi +304 -0
  57. data/sorbet/rbi/gems/simplecov-html.rbi +35 -0
  58. data/sorbet/rbi/gems/simplecov.rbi +419 -0
  59. data/sorbet/rbi/gems/simplecov_json_formatter.rbi +47 -0
  60. data/sorbet/rbi/gems/standard.rbi +130 -0
  61. data/sorbet/rbi/gems/unicode-display_width.rbi +20 -0
  62. data/sorbet/rbi/hidden-definitions/errors.txt +4273 -0
  63. data/sorbet/rbi/hidden-definitions/hidden.rbi +9013 -0
  64. data/sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi +276 -0
  65. data/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi +645 -0
  66. data/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi +24 -0
  67. data/sorbet/rbi/sorbet-typed/lib/rubocop/>=1.8/rubocop.rbi +12 -0
  68. data/sorbet/rbi/sorbet-typed/lib/rubocop-performance/~>1.6/rubocop-performance.rbi +149 -0
  69. metadata +61 -6
  70. 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
- other_intersection, not_intersection = elements.partition { |e| e.is_a?(self.class) }
6
- super(other_intersection.flat_map(&:elements) + not_intersection)
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
- attr_reader :start_month, :end_month, :start_day, :end_day
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
- def to_h
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
- super(other_unions.flat_map(&:elements) + not_unions)
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
- attr_reader :weekday, :count
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
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  module Repeatable
2
3
  module Expression
3
4
  end
@@ -1,5 +1,9 @@
1
+ # typed: strict
1
2
  module Repeatable
2
3
  module LastDateOfMonth
4
+ extend T::Sig
5
+
6
+ sig { params(date: ::Date).returns(::Date) }
3
7
  def last_date_of_month(date)
4
8
  ::Date.new(date.next_month.year, date.next_month.month, 1).prev_day
5
9
  end
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  module Repeatable
2
3
  class ParseError < StandardError
3
4
  end
@@ -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].capitalize }
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
@@ -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
- 1.step do |i|
34
+ result = T.let(nil, T.nilable(Date))
35
+ 1.step(limit) do |i|
29
36
  date = date.next_day
30
37
 
31
- break date if include?(date)
32
- break if i == limit.to_i
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
@@ -0,0 +1,6 @@
1
+ # typed: strict
2
+ module Repeatable
3
+ module Types
4
+ SymbolHash = T.type_alias { T::Hash[Symbol, T.untyped] }
5
+ end
6
+ end
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  module Repeatable
2
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
3
4
  end
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
 
@@ -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