repeatable 1.0.0 → 1.1.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 (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