repeatable 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +8 -3
  3. data/CHANGELOG.md +10 -1
  4. data/Gemfile +2 -1
  5. data/Gemfile.lock +75 -29
  6. data/README.md +17 -0
  7. data/bin/tapioca +29 -0
  8. data/lib/repeatable/conversions.rb +2 -1
  9. data/lib/repeatable/expression/base.rb +6 -0
  10. data/lib/repeatable/expression/biweekly.rb +1 -0
  11. data/lib/repeatable/expression/date.rb +1 -0
  12. data/lib/repeatable/expression/day_in_month.rb +1 -0
  13. data/lib/repeatable/expression/difference.rb +1 -0
  14. data/lib/repeatable/expression/exact_date.rb +1 -0
  15. data/lib/repeatable/expression/intersection.rb +2 -0
  16. data/lib/repeatable/expression/range_in_year.rb +1 -0
  17. data/lib/repeatable/expression/set.rb +3 -2
  18. data/lib/repeatable/expression/union.rb +2 -0
  19. data/lib/repeatable/expression/weekday.rb +1 -0
  20. data/lib/repeatable/expression/weekday_in_month.rb +1 -0
  21. data/lib/repeatable/expression.rb +1 -0
  22. data/lib/repeatable/last_date_of_month.rb +1 -0
  23. data/lib/repeatable/parse_error.rb +1 -0
  24. data/lib/repeatable/parser.rb +1 -0
  25. data/lib/repeatable/schedule.rb +6 -0
  26. data/lib/repeatable/types.rb +1 -0
  27. data/lib/repeatable/version.rb +2 -1
  28. data/lib/repeatable.rb +1 -0
  29. data/rbi/repeatable.rbi +9 -3
  30. data/sorbet/config +2 -1
  31. data/sorbet/rbi/annotations/.gitattributes +1 -0
  32. data/sorbet/rbi/{sorbet-typed/lib/rainbow/all → annotations}/rainbow.rbi +23 -30
  33. data/sorbet/rbi/gems/.gitattributes +1 -0
  34. data/sorbet/rbi/gems/ast@2.4.2.rbi +584 -0
  35. data/sorbet/rbi/gems/coderay@1.1.3.rbi +3426 -0
  36. data/sorbet/rbi/gems/commander@4.6.0.rbi +8 -0
  37. data/sorbet/rbi/gems/diff-lcs@1.4.4.rbi +1082 -0
  38. data/sorbet/rbi/gems/docile@1.4.0.rbi +376 -0
  39. data/sorbet/rbi/gems/erubi@1.12.0.rbi +145 -0
  40. data/sorbet/rbi/gems/highline@2.0.3.rbi +8 -0
  41. data/sorbet/rbi/gems/json@2.7.2.rbi +1561 -0
  42. data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14237 -0
  43. data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +239 -0
  44. data/sorbet/rbi/gems/method_source@1.0.0.rbi +272 -0
  45. data/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
  46. data/sorbet/rbi/gems/parallel@1.24.0.rbi +280 -0
  47. data/sorbet/rbi/gems/parlour@8.1.0.rbi +3053 -0
  48. data/sorbet/rbi/gems/parser@3.3.1.0.rbi +7320 -0
  49. data/sorbet/rbi/gems/prism@0.28.0.rbi +37903 -0
  50. data/sorbet/rbi/gems/pry@0.14.0.rbi +10072 -0
  51. data/sorbet/rbi/gems/racc@1.7.3.rbi +161 -0
  52. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +402 -0
  53. data/sorbet/rbi/gems/rake@13.0.3.rbi +3024 -0
  54. data/sorbet/rbi/gems/rbi@0.1.13.rbi +3071 -0
  55. data/sorbet/rbi/gems/regexp_parser@2.9.0.rbi +3771 -0
  56. data/sorbet/rbi/gems/rexml@3.2.6.rbi +4781 -0
  57. data/sorbet/rbi/gems/rspec-core@3.10.1.rbi +10837 -0
  58. data/sorbet/rbi/gems/rspec-expectations@3.10.1.rbi +7930 -0
  59. data/sorbet/rbi/gems/rspec-mocks@3.10.2.rbi +5247 -0
  60. data/sorbet/rbi/gems/rspec-support@3.10.2.rbi +1594 -0
  61. data/sorbet/rbi/gems/rspec@3.10.0.rbi +76 -0
  62. data/sorbet/rbi/gems/rubocop-ast@1.31.3.rbi +7014 -0
  63. data/sorbet/rbi/gems/rubocop-performance@1.20.2.rbi +8 -0
  64. data/sorbet/rbi/gems/rubocop@1.62.1.rbi +57542 -0
  65. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1317 -0
  66. data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +216 -0
  67. data/sorbet/rbi/gems/simplecov@0.21.2.rbi +2135 -0
  68. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.4.rbi +8 -0
  69. data/sorbet/rbi/gems/spoom@1.3.2.rbi +4420 -0
  70. data/sorbet/rbi/gems/standard-custom@1.0.2.rbi +8 -0
  71. data/sorbet/rbi/gems/standard-performance@1.3.1.rbi +8 -0
  72. data/sorbet/rbi/gems/standard@1.35.1.rbi +850 -0
  73. data/sorbet/rbi/gems/tapioca@0.13.3.rbi +3527 -0
  74. data/sorbet/rbi/gems/thor@1.3.1.rbi +4351 -0
  75. data/sorbet/rbi/gems/unicode-display_width@2.5.0.rbi +65 -0
  76. data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +428 -0
  77. data/sorbet/rbi/gems/yard@0.9.36.rbi +18220 -0
  78. data/sorbet/tapioca/config.yml +13 -0
  79. data/sorbet/tapioca/require.rb +4 -0
  80. metadata +53 -39
  81. data/sorbet/rbi/gems/ast.rbi +0 -49
  82. data/sorbet/rbi/gems/coderay.rbi +0 -285
  83. data/sorbet/rbi/gems/commander.rbi +0 -197
  84. data/sorbet/rbi/gems/docile.rbi +0 -36
  85. data/sorbet/rbi/gems/highline.rbi +0 -577
  86. data/sorbet/rbi/gems/method_source.rbi +0 -64
  87. data/sorbet/rbi/gems/parallel.rbi +0 -83
  88. data/sorbet/rbi/gems/parlour.rbi +0 -840
  89. data/sorbet/rbi/gems/parser.rbi +0 -1950
  90. data/sorbet/rbi/gems/pry.rbi +0 -1898
  91. data/sorbet/rbi/gems/rainbow.rbi +0 -118
  92. data/sorbet/rbi/gems/rake.rbi +0 -646
  93. data/sorbet/rbi/gems/regexp_parser.rbi +0 -926
  94. data/sorbet/rbi/gems/repeatable.rbi +0 -13
  95. data/sorbet/rbi/gems/rexml.rbi +0 -583
  96. data/sorbet/rbi/gems/rspec-core.rbi +0 -1919
  97. data/sorbet/rbi/gems/rspec-expectations.rbi +0 -1150
  98. data/sorbet/rbi/gems/rspec-mocks.rbi +0 -1100
  99. data/sorbet/rbi/gems/rspec-support.rbi +0 -280
  100. data/sorbet/rbi/gems/rspec.rbi +0 -15
  101. data/sorbet/rbi/gems/rubocop-ast.rbi +0 -1356
  102. data/sorbet/rbi/gems/rubocop-performance.rbi +0 -487
  103. data/sorbet/rbi/gems/rubocop.rbi +0 -7923
  104. data/sorbet/rbi/gems/ruby-progressbar.rbi +0 -304
  105. data/sorbet/rbi/gems/simplecov-html.rbi +0 -35
  106. data/sorbet/rbi/gems/simplecov.rbi +0 -419
  107. data/sorbet/rbi/gems/simplecov_json_formatter.rbi +0 -47
  108. data/sorbet/rbi/gems/standard.rbi +0 -130
  109. data/sorbet/rbi/gems/unicode-display_width.rbi +0 -20
  110. data/sorbet/rbi/hidden-definitions/errors.txt +0 -4273
  111. data/sorbet/rbi/hidden-definitions/hidden.rbi +0 -9013
  112. data/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi +0 -645
  113. data/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi +0 -24
  114. data/sorbet/rbi/sorbet-typed/lib/rubocop/>=1.8/rubocop.rbi +0 -12
  115. data/sorbet/rbi/sorbet-typed/lib/rubocop-performance/~>1.6/rubocop-performance.rbi +0 -149
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71a9ecf64d973e0e8298628e5ab19ab4025c9c3281a357efaae330f42c9767a0
4
- data.tar.gz: 190a230b24d32f0df2f6565d35c2da1867d3ae87c82d0e00d98ab16b53baa46c
3
+ metadata.gz: 4b0b02925c282f8d672cff3b6c4683939d5c734f0e682b1a4ea8e5feb931a765
4
+ data.tar.gz: 4446324d2c752fd1f33ef15545f58de7680ae48743d4f9343062c9151569abbc
5
5
  SHA512:
6
- metadata.gz: 8335d2132cd0fc2cdf5d991431bafcec688819b9b2df45090afcdb05886f74632ebb262ae6f014911aa300589a5f1a776d2a5325adb39569824af306cd94bbfc
7
- data.tar.gz: 26a637424b6a64a3a1a6b6db0ed8fb6c0e1ece5040b15499182fd3e45cdb3bf7298634620d1f3284af1a47f00655f7bac7212bea369fbc5f287e154fc3ce45cf
6
+ metadata.gz: daa01ada7a7d30730829bcf01ba053c4dd325923a574cf78af0b8a5531b543752392f239d96f3658f8a2045313e5df50cca92c75d91fc29aa5484e7e16224ccd
7
+ data.tar.gz: '080a67d068f2b4663d0ed106d78371f10c47b576b65a52fb5d43fc19b78b0fc1a3449cb288899b089c1b26b77a039cf29cb9fc5b0e828fdd1b7a9a3154aecebb'
@@ -22,10 +22,13 @@ jobs:
22
22
  - '3.0'
23
23
  - '3.1'
24
24
  include:
25
- - ruby-version: '3.0'
25
+ - ruby-version: '3.1'
26
26
  coverage: 'true'
27
27
  steps:
28
28
  - uses: actions/checkout@v2
29
+ - name: Remove Gemfile.lock for older Ruby versions
30
+ if: ${{ fromJSON(matrix.ruby-version) < 3.1 }}
31
+ run: rm Gemfile.lock
29
32
  - name: Set up Ruby ${{ matrix.ruby-version }}
30
33
  uses: ruby/setup-ruby@v1
31
34
  with:
@@ -55,7 +58,7 @@ jobs:
55
58
  - name: Set up Ruby
56
59
  uses: ruby/setup-ruby@v1
57
60
  with:
58
- ruby-version: '3.0'
61
+ ruby-version: '3.1'
59
62
  bundler-cache: true
60
63
  - name: Run Standard
61
64
  run: bundle exec rake standard
@@ -66,7 +69,9 @@ jobs:
66
69
  - name: Set up Ruby
67
70
  uses: ruby/setup-ruby@v1
68
71
  with:
69
- ruby-version: '3.0'
72
+ ruby-version: '3.1'
70
73
  bundler-cache: true
74
+ - name: Check gem RBI files
75
+ run: bin/tapioca gems --verify
71
76
  - name: Run Sorbet
72
77
  run: bundle exec rake sorbet
data/CHANGELOG.md CHANGED
@@ -2,7 +2,16 @@
2
2
 
3
3
  ### Unreleased
4
4
 
5
- [Commits](https://github.com/molawson/repeatable/compare/v1.1.0...main)
5
+ [Commits](https://github.com/molawson/repeatable/compare/v1.2.0...main)
6
+
7
+ ### 1.2.0 (2024-04-25)
8
+
9
+ Changes:
10
+
11
+ * Support pattern matching for `Expression` and `Schedule`
12
+ * Support more recent versions of sorbet
13
+
14
+ [Commits](https://github.com/molawson/repeatable/compare/v1.1.0...v1.2.0)
6
15
 
7
16
  ### 1.1.0 (2022-02-25)
8
17
 
data/Gemfile CHANGED
@@ -6,8 +6,9 @@ gemspec
6
6
  gem "parlour"
7
7
  gem "pry", "~> 0.13"
8
8
  gem "rake", ">= 12.3.3"
9
- gem "sorbet"
9
+ gem "sorbet-static-and-runtime"
10
10
  gem "standard", "~> 1.0"
11
+ gem "tapioca"
11
12
 
12
13
  group :test do
13
14
  gem "rspec", "~> 3.0"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- repeatable (1.1.0)
4
+ repeatable (1.2.0)
5
5
  sorbet-runtime
6
6
 
7
7
  GEM
@@ -13,23 +13,34 @@ GEM
13
13
  highline (~> 2.0.0)
14
14
  diff-lcs (1.4.4)
15
15
  docile (1.4.0)
16
+ erubi (1.12.0)
16
17
  highline (2.0.3)
18
+ json (2.7.2)
19
+ language_server-protocol (3.17.0.3)
20
+ lint_roller (1.1.0)
17
21
  method_source (1.0.0)
18
- parallel (1.20.1)
19
- parlour (6.0.1)
22
+ netrc (0.11.0)
23
+ parallel (1.24.0)
24
+ parlour (8.1.0)
20
25
  commander (~> 4.5)
21
26
  parser
22
27
  rainbow (~> 3.0)
23
28
  sorbet-runtime (>= 0.5)
24
- parser (3.0.0.0)
29
+ parser (3.3.1.0)
25
30
  ast (~> 2.4.1)
31
+ racc
32
+ prism (0.28.0)
26
33
  pry (0.14.0)
27
34
  coderay (~> 1.1)
28
35
  method_source (~> 1.0)
29
- rainbow (3.0.0)
36
+ racc (1.7.3)
37
+ rainbow (3.1.1)
30
38
  rake (13.0.3)
31
- regexp_parser (2.1.1)
32
- rexml (3.2.5)
39
+ rbi (0.1.13)
40
+ prism (>= 0.18.0, < 1.0.0)
41
+ sorbet-runtime (>= 0.5.9204)
42
+ regexp_parser (2.9.0)
43
+ rexml (3.2.6)
33
44
  rspec (3.10.0)
34
45
  rspec-core (~> 3.10.0)
35
46
  rspec-expectations (~> 3.10.0)
@@ -43,40 +54,74 @@ GEM
43
54
  diff-lcs (>= 1.2.0, < 2.0)
44
55
  rspec-support (~> 3.10.0)
45
56
  rspec-support (3.10.2)
46
- rubocop (1.11.0)
57
+ rubocop (1.62.1)
58
+ json (~> 2.3)
59
+ language_server-protocol (>= 3.17.0)
47
60
  parallel (~> 1.10)
48
- parser (>= 3.0.0.0)
61
+ parser (>= 3.3.0.2)
49
62
  rainbow (>= 2.2.2, < 4.0)
50
63
  regexp_parser (>= 1.8, < 3.0)
51
- rexml
52
- rubocop-ast (>= 1.2.0, < 2.0)
64
+ rexml (>= 3.2.5, < 4.0)
65
+ rubocop-ast (>= 1.31.1, < 2.0)
53
66
  ruby-progressbar (~> 1.7)
54
- unicode-display_width (>= 1.4.0, < 3.0)
55
- rubocop-ast (1.4.1)
56
- parser (>= 2.7.1.5)
57
- rubocop-performance (1.10.1)
58
- rubocop (>= 0.90.0, < 2.0)
59
- rubocop-ast (>= 0.4.0)
60
- ruby-progressbar (1.11.0)
67
+ unicode-display_width (>= 2.4.0, < 3.0)
68
+ rubocop-ast (1.31.3)
69
+ parser (>= 3.3.1.0)
70
+ rubocop-performance (1.20.2)
71
+ rubocop (>= 1.48.1, < 2.0)
72
+ rubocop-ast (>= 1.30.0, < 2.0)
73
+ ruby-progressbar (1.13.0)
61
74
  simplecov (0.21.2)
62
75
  docile (~> 1.1)
63
76
  simplecov-html (~> 0.11)
64
77
  simplecov_json_formatter (~> 0.1)
65
78
  simplecov-html (0.12.3)
66
79
  simplecov_json_formatter (0.1.4)
67
- sorbet (0.5.9672)
68
- sorbet-static (= 0.5.9672)
69
- sorbet-runtime (0.5.6357)
70
- sorbet-static (0.5.9672-universal-darwin-19)
71
- sorbet-static (0.5.9672-universal-darwin-21)
72
- sorbet-static (0.5.9672-x86_64-linux)
73
- standard (1.0.4)
74
- rubocop (= 1.11.0)
75
- rubocop-performance (= 1.10.1)
76
- unicode-display_width (2.0.0)
80
+ sorbet (0.5.11370)
81
+ sorbet-static (= 0.5.11370)
82
+ sorbet-runtime (0.5.11370)
83
+ sorbet-static (0.5.11370-aarch64-linux)
84
+ sorbet-static (0.5.11370-universal-darwin)
85
+ sorbet-static (0.5.11370-x86_64-linux)
86
+ sorbet-static-and-runtime (0.5.11370)
87
+ sorbet (= 0.5.11370)
88
+ sorbet-runtime (= 0.5.11370)
89
+ spoom (1.3.2)
90
+ erubi (>= 1.10.0)
91
+ prism (>= 0.19.0)
92
+ sorbet-static-and-runtime (>= 0.5.10187)
93
+ thor (>= 0.19.2)
94
+ standard (1.35.1)
95
+ language_server-protocol (~> 3.17.0.2)
96
+ lint_roller (~> 1.0)
97
+ rubocop (~> 1.62.0)
98
+ standard-custom (~> 1.0.0)
99
+ standard-performance (~> 1.3)
100
+ standard-custom (1.0.2)
101
+ lint_roller (~> 1.0)
102
+ rubocop (~> 1.50)
103
+ standard-performance (1.3.1)
104
+ lint_roller (~> 1.1)
105
+ rubocop-performance (~> 1.20.2)
106
+ tapioca (0.13.3)
107
+ bundler (>= 2.2.25)
108
+ netrc (>= 0.11.0)
109
+ parallel (>= 1.21.0)
110
+ rbi (>= 0.1.4, < 0.2)
111
+ sorbet-static-and-runtime (>= 0.5.11087)
112
+ spoom (>= 1.2.0)
113
+ thor (>= 1.2.0)
114
+ yard-sorbet
115
+ thor (1.3.1)
116
+ unicode-display_width (2.5.0)
117
+ yard (0.9.36)
118
+ yard-sorbet (0.8.1)
119
+ sorbet-runtime (>= 0.5)
120
+ yard (>= 0.9)
77
121
 
78
122
  PLATFORMS
79
123
  arm64-darwin-21
124
+ arm64-darwin-23
80
125
  linux
81
126
  x86_64-darwin-19
82
127
  x86_64-linux
@@ -88,8 +133,9 @@ DEPENDENCIES
88
133
  repeatable!
89
134
  rspec (~> 3.0)
90
135
  simplecov (~> 0.18)
91
- sorbet
136
+ sorbet-static-and-runtime
92
137
  standard (~> 1.0)
138
+ tapioca
93
139
 
94
140
  BUNDLED WITH
95
141
  2.3.6
data/README.md CHANGED
@@ -159,6 +159,21 @@ schedule.to_h
159
159
  # can be used to recreate an identical Schedule object at a later time
160
160
  ```
161
161
 
162
+ #### Pattern Matching
163
+
164
+ Both `Repeatable::Schedule` and all `Repeatable::Expression` classes support Ruby 2.7+ [pattern matching][ruby-pattern-matching] which is particularly useful for parsing or presenting an existing schedule.
165
+
166
+ ```ruby
167
+ case schedule
168
+ in weekday: { weekday: }
169
+ "Weekly on #{Date::DAYNAMES[weekday]}"
170
+ in day_in_month: { day: }
171
+ "Every month on the #{day.ordinalize}"
172
+ in weekday_in_month: { weekday:, count: }
173
+ "Every month on the #{count.ordinalize} #{Date::DAYNAMES[weekday]}"
174
+ end
175
+ ```
176
+
162
177
  #### Equivalence
163
178
 
164
179
  Both `Repeatable::Schedule` and all `Repeatable::Expression` classes have equivalence `#==` defined according to what's appropriate for each class, so regardless of the order of arguments passed to each, you can tell whether one object is equivalent to the other in terms of whether or not, when asked the same questions, you'd receive the same results from each.
@@ -218,3 +233,5 @@ The gem is available as open source under the terms of the [MIT License](https:/
218
233
  ## Code of Conduct
219
234
 
220
235
  Everyone interacting in the Repeatable project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/molawson/repeatable/blob/main/CODE_OF_CONDUCT.md).
236
+
237
+ [ruby-pattern-matching]: https://docs.ruby-lang.org/en/3.0/syntax/pattern_matching_rdoc.html
data/bin/tapioca ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'tapioca' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("tapioca", "tapioca")
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Conversions
4
5
  extend T::Sig
@@ -11,7 +12,7 @@ module Repeatable
11
12
  when Date, Time
12
13
  arg.to_date
13
14
  else
14
- Date.parse(arg)
15
+ Date.parse(T.let(arg, T.untyped))
15
16
  end
16
17
  rescue ArgumentError
17
18
  Kernel.raise TypeError, "Cannot convert #{arg.inspect} to Date"
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Base
@@ -26,6 +27,11 @@ module Repeatable
26
27
  {hash_key => hash_value}
27
28
  end
28
29
 
30
+ sig { params(_keys: T.nilable(T::Array[Symbol])).returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
31
+ def deconstruct_keys(_keys)
32
+ to_h
33
+ end
34
+
29
35
  sig { params(other: Expression::Base).returns(Expression::Union) }
30
36
  def union(other)
31
37
  Union.new(self, other)
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Biweekly < Date
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Date < Base
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class DayInMonth < Date
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Difference < Base
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class ExactDate < Date
@@ -1,9 +1,11 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Intersection < Set
5
6
  sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
6
7
  def initialize(*elements)
8
+ elements = Array(elements).flatten
7
9
  other_intersections, not_intersections = elements.partition { |e| e.is_a?(self.class) }
8
10
  other_intersections = T.cast(other_intersections, T::Array[Expression::Intersection])
9
11
  super(other_intersections.flat_map(&:elements).concat(not_intersections))
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class RangeInYear < Date
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Set < Base
@@ -7,8 +8,8 @@ module Repeatable
7
8
  sig { returns(T::Array[Expression::Base]) }
8
9
  attr_reader :elements
9
10
 
10
- sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
11
- def initialize(*elements)
11
+ sig { params(elements: T::Array[Expression::Base]).void }
12
+ def initialize(elements)
12
13
  @elements = T.let(elements.flatten.uniq, T::Array[Expression::Base])
13
14
  end
14
15
 
@@ -1,9 +1,11 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Union < Set
5
6
  sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
6
7
  def initialize(*elements)
8
+ elements = Array(elements).flatten
7
9
  other_unions, not_unions = elements.partition { |e| e.is_a?(self.class) }
8
10
  other_unions = T.cast(other_unions, T::Array[Expression::Union])
9
11
  super(other_unions.flat_map(&:elements).concat(not_unions))
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class Weekday < Date
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  class WeekdayInMonth < Date
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Expression
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module LastDateOfMonth
4
5
  extend T::Sig
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  class ParseError < StandardError
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # typed: false
2
+
2
3
  module Repeatable
3
4
  class Parser
4
5
  extend T::Sig
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  class Schedule
4
5
  extend T::Sig
@@ -54,6 +55,11 @@ module Repeatable
54
55
  expression.to_h
55
56
  end
56
57
 
58
+ sig { params(_keys: T.nilable(T::Array[Symbol])).returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
59
+ def deconstruct_keys(_keys)
60
+ to_h
61
+ end
62
+
57
63
  sig { params(other: Object).returns(T::Boolean) }
58
64
  def ==(other)
59
65
  other.is_a?(self.class) && expression == other.expression
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
4
  module Types
4
5
  SymbolHash = T.type_alias { T::Hash[Symbol, T.untyped] }
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  module Repeatable
3
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
4
5
  end
data/lib/repeatable.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # typed: strict
2
+
2
3
  require "date"
3
4
  require "sorbet-runtime"
4
5
 
data/rbi/repeatable.rbi CHANGED
@@ -1,6 +1,6 @@
1
1
  # typed: strong
2
2
  module Repeatable
3
- VERSION = "1.1.0"
3
+ VERSION = "1.2.0"
4
4
 
5
5
  module Conversions
6
6
  extend T::Sig
@@ -65,6 +65,9 @@ module Repeatable
65
65
  sig { returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
66
66
  def to_h; end
67
67
 
68
+ sig { params(_keys: T.nilable(T::Array[Symbol])).returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
69
+ def deconstruct_keys(_keys); end
70
+
68
71
  sig { params(other: Object).returns(T::Boolean) }
69
72
  def ==(other); end
70
73
 
@@ -92,6 +95,9 @@ module Repeatable
92
95
  sig { returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
93
96
  def to_h; end
94
97
 
98
+ sig { params(_keys: T.nilable(T::Array[Symbol])).returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
99
+ def deconstruct_keys(_keys); end
100
+
95
101
  sig { params(other: Expression::Base).returns(Expression::Union) }
96
102
  def union(other); end
97
103
 
@@ -241,8 +247,8 @@ module Repeatable
241
247
  sig { returns(T::Array[Expression::Base]) }
242
248
  attr_reader :elements
243
249
 
244
- sig { params(elements: T.any(Expression::Base, T::Array[Expression::Base])).void }
245
- def initialize(*elements); end
250
+ sig { params(elements: T::Array[Expression::Base]).void }
251
+ def initialize(elements); end
246
252
 
247
253
  sig { params(element: T.untyped).returns(Repeatable::Expression::Set) }
248
254
  def <<(element); end
data/sorbet/config CHANGED
@@ -1,3 +1,4 @@
1
1
  --dir
2
2
  .
3
- --ignore=/vendor/bundle
3
+ --ignore=tmp/
4
+ --ignore=vendor/
@@ -0,0 +1 @@
1
+ **/*.rbi linguist-vendored=true
@@ -1,13 +1,11 @@
1
- # This file is autogenerated. Do not edit it by hand. Regenerate it with:
2
- # srb rbi sorbet-typed
3
- #
4
- # If you would like to make changes to this file, great! Please upstream any changes you make here:
5
- #
6
- # https://github.com/sorbet/sorbet-typed/edit/master/lib/rainbow/all/rainbow.rbi
7
- #
8
- # typed: strong
1
+ # typed: true
2
+
3
+ # DO NOT EDIT MANUALLY
4
+ # This file was pulled from a central RBI files repository.
5
+ # Please run `bin/tapioca annotations` to update it.
9
6
 
10
7
  module Rainbow
8
+ # @shim: https://github.com/sickill/rainbow/blob/master/lib/rainbow.rb#L10-L12
11
9
  sig { returns(T::Boolean) }
12
10
  attr_accessor :enabled
13
11
 
@@ -15,18 +13,13 @@ module Rainbow
15
13
  sig { returns(Symbol) }
16
14
  attr_reader :ground
17
15
 
18
- sig do
19
- params(
20
- ground: Symbol,
21
- values: T.any([Integer], [Integer, Integer, Integer])
22
- ).returns(Color)
23
- end
16
+ sig { params(ground: Symbol, values: T.any([Integer], [Integer, Integer, Integer])).returns(Color) }
24
17
  def self.build(ground, values); end
25
18
 
26
19
  sig { params(hex: String).returns([Integer, Integer, Integer]) }
27
20
  def self.parse_hex_color(hex); end
28
21
 
29
- class Indexed < Color
22
+ class Indexed < Rainbow::Color
30
23
  sig { returns(Integer) }
31
24
  attr_reader :num
32
25
 
@@ -37,44 +30,44 @@ module Rainbow
37
30
  def codes; end
38
31
  end
39
32
 
40
- class Named < Indexed
33
+ class Named < Rainbow::Color::Indexed
41
34
  NAMES = T.let(nil, T::Hash[Symbol, Integer])
42
35
 
36
+ sig { params(ground: Symbol, name: Symbol).void }
37
+ def initialize(ground, name); end
38
+
43
39
  sig { returns(T::Array[Symbol]) }
44
40
  def self.color_names; end
45
41
 
46
42
  sig { returns(String) }
47
43
  def self.valid_names; end
48
-
49
- sig { params(ground: Symbol, name: Symbol).void }
50
- def initialize(ground, name); end
51
44
  end
52
45
 
53
- class RGB < Indexed
46
+ class RGB < Rainbow::Color::Indexed
54
47
  sig { returns(Integer) }
55
- attr_accessor :r, :g, :b
56
-
57
- sig { params(value: Numeric).returns(Integer) }
58
- def to_ansi_domain(value); end
48
+ attr_reader :r, :g, :b
59
49
 
60
50
  sig { params(ground: Symbol, values: Integer).void }
61
51
  def initialize(ground, *values); end
62
52
 
63
53
  sig { returns(T::Array[Integer]) }
64
54
  def codes; end
55
+
56
+ sig { params(value: Numeric).returns(Integer) }
57
+ def self.to_ansi_domain(value); end
65
58
  end
66
59
 
67
- class X11Named < RGB
68
- include X11ColorNames
60
+ class X11Named < Rainbow::Color::RGB
61
+ include Rainbow::X11ColorNames
62
+
63
+ sig { params(ground: Symbol, name: Symbol).void }
64
+ def initialize(ground, name); end
69
65
 
70
66
  sig { returns(T::Array[Symbol]) }
71
67
  def self.color_names; end
72
68
 
73
69
  sig { returns(String) }
74
70
  def self.valid_names; end
75
-
76
- sig { params(ground: Symbol, name: Symbol).void }
77
- def initialize(ground, name); end
78
71
  end
79
72
  end
80
73
 
@@ -251,7 +244,7 @@ module Rainbow
251
244
  def self.wrap_with_sgr(string, codes); end
252
245
 
253
246
  sig { params(string: String).returns(String) }
254
- def uncolor(string); end
247
+ def self.uncolor(string); end
255
248
  end
256
249
 
257
250
  VERSION = T.let(nil, String)
@@ -0,0 +1 @@
1
+ **/*.rbi linguist-generated=true