cron_calc 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65bbd980a990785461ad8513755d5ef1effc8d14f4dac4205bf0381f4489bbcd
4
- data.tar.gz: 116ac513ff00017a519997d1399748faa95284b2171e6f11c5097a25b10525ee
3
+ metadata.gz: 29ac47b06a1dc188f3fb9ed5c10f9fa1a6ef748e8d15a6783eb7b8f99de85b38
4
+ data.tar.gz: 8f136ff6c1010357acd75942e80bc7d4a2f4b0d1b8555041486f1cc9bdd97f00
5
5
  SHA512:
6
- metadata.gz: 70d5d114af61a0430a52b8ef0fc06caecc693fe8f632472814f4335543b038ba6c94565069f831ee7486a8633e015e8833c65b6f1ba2814832a7bb5e4352c9fb
7
- data.tar.gz: cb5b23e742052e1b76035721214c28c2a9ce162b70d7c1d60bb308e378db36318c3e4ceac9e65b4a7dc779c1cc710109880f8b921f00580df77bf5f1cc8d3539
6
+ metadata.gz: 38f8b7a5a0f80d10f6c4867a8a2e687b9ebb508c5e79031856cbb9bc81a9a97b6f399e0b37f332f5ec5aeb7d2839e29d11b6e76b0fdc5601b675a6a5ed82e806
7
+ data.tar.gz: d1545c32cd0559370fc1778c3517567ee0be5f4fecf41ad32af0a2a3fd3202d52f0b9d5014f202ab736c8174675d2c7692610fa72968f247022082aa7a2b5567
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [0.4.0] - 2023-12-22
2
+
3
+ - Added support for named months and wdays
4
+ - Keyword arguments: before:, after:
5
+
1
6
  ## [0.3.0] - 2023-12-22
2
7
 
3
8
  - Added support for DOWs
data/README.md CHANGED
@@ -22,8 +22,9 @@ Now, you can use one of three methods `#in`, `#next`, `#last` to determine cron
22
22
  ### Using `#in`
23
23
 
24
24
  Calculates cron job occurrences within a given time period.\
25
- @param period [Range] The time period for which to calculate cron job occurrences.\
26
- @return [Array<Time>] An array of Time instances representing each occurrence.
25
+ **Parameters:**
26
+ - `period` - a Range object defining the start and end times for the calculation.\
27
+
27
28
 
28
29
  ```ruby
29
30
  period = Time.new(2024, 1, 1, 0, 0)..Time.new(2024, 1, 4, 0, 0)
@@ -35,10 +36,10 @@ Calculates cron job occurrences within a given time period.\
35
36
  ### Using `#next`
36
37
 
37
38
  Calculates the next 'n' occurrences of the cron job from a given start time.\
38
- @param count [Integer] The number of occurrences to calculate. Defaults to `1`.\
39
- @param period_start [Time] The start time from which to calculate occurrences. Defaults to `Time.now`.\
40
- @param max_years [Integer] The maximum number of years to consider for the period. Defaults to `5`.\
41
- @return [Array<Time>] An array of the next 'n' occurrences.
39
+ **Parameters:**
40
+ - `count` - (optional, Integer) The number of occurrences to calculate. Defaults to 1.
41
+ - `after:` - (optional, Time, keyword argument) The start time from which to calculate occurrences. If not provided, defaults to the current time (Time.now).
42
+ - `max_years` - (optional, Integer, keyword argument) The maximum number of years to search for future occurrences. Defaults to 5.
42
43
 
43
44
  ```ruby
44
45
  cron_calc.next
@@ -47,29 +48,28 @@ Calculates the next 'n' occurrences of the cron job from a given start time.\
47
48
  cron_calc.next(3)
48
49
  # => [2023-12-20 05:05:00 +0100, 2023-12-21 05:05:00 +0100, 2023-12-22 05:05:00 +0100]
49
50
 
50
- cron_calc.next(2, Time.new(2024, 1, 1, 0, 0))
51
+ cron_calc.next(2, after: Time.new(2024, 1, 1, 0, 0))
51
52
  # => [2024-01-01 05:05:00 +0100, 2024-01-02 05:05:00 +0100]
52
53
  ```
53
54
 
54
55
  ### Using `#last`
55
56
 
56
57
  Calculates the last 'n' occurrences of the cron job until a given end time.\
57
- @param count [Integer] The number of past occurrences to calculate.\
58
- @param period_end [Time] The end time until which to calculate occurrences.\
59
- @param max_years [Integer] The maximum number of years to consider for the period.\
60
- @return [Array<Time>] An array of the last 'n' occurrences.
58
+ **Parameters:**
59
+ - `count` - (optional, Integer) The number of occurrences to calculate. Defaults to 1.
60
+ - `before:` - (optional, Time, keyword argument) The end time from which to calculate past occurrences. If not provided, defaults to the current time (Time.now).
61
+ - `max_years` - (optional, Integer, keyword argument) The maximum number of years to search backward for past occurrences. Defaults to 5.
61
62
 
62
63
  ```ruby
63
64
  cron_calc.last
64
65
  # => [2023-12-19 05:05:00 +0100]
65
66
 
66
- cron_calc.last(4, Time.new(2024, 1, 1, 0, 0))
67
+ cron_calc.last(4, before: Time.new(2024, 1, 1, 0, 0))
67
68
  # => [2023-12-31 05:05:00 +0100, 2023-12-30 05:05:00 +0100, 2023-12-29 05:05:00 +0100, 2023-12-28 05:05:00 +0100]
68
69
  ```
69
70
 
70
71
  ## Unsupported features
71
72
 
72
- - Named DOW and months (SUN-SAT, JAN-DEC)
73
73
  - Joining characters , - /
74
74
  - Predefined definitions (@yearly, @monthly, @weekly, @daily, @midnight, @hourly)
75
75
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CronCalc
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
data/lib/cron_calc.rb CHANGED
@@ -22,7 +22,18 @@ module CronCalc
22
22
  hours: 0..23,
23
23
  days: 1..31,
24
24
  months: 1..12,
25
- dows: 0..7
25
+ wdays: 0..6
26
+ }.freeze
27
+
28
+ WDAYS = {
29
+ 'SUN' => '0', 'MON' => '1', 'TUE' => '2', 'WED' => '3',
30
+ 'THU' => '4', 'FRI' => '5', 'SAT' => '6'
31
+ }.freeze
32
+
33
+ MONTHS = {
34
+ 'JAN' => '1', 'FEB' => '2', 'MAR' => '3', 'APR' => '4',
35
+ 'MAY' => '5', 'JUN' => '6', 'JUL' => '7', 'AUG' => '8',
36
+ 'SEP' => '9', 'OCT' => '10', 'NOV' => '11', 'DEC' => '12'
26
37
  }.freeze
27
38
 
28
39
  def initialize(cron_string)
@@ -42,24 +53,24 @@ module CronCalc
42
53
 
43
54
  # Calculates the next 'n' occurrences of the cron job from a given start time.
44
55
  # @param count [Integer] The number of occurrences to calculate.
45
- # @param period_start [Time] The start time from which to calculate occurrences.
56
+ # @param after [Time] The start time from which to calculate occurrences.
46
57
  # @param max_years [Integer] The maximum number of years to consider for the period.
47
58
  # @return [Array<Time>] An array of the next 'n' occurrences.
48
- def next(count = 1, period_start = Time.now, max_years = 5)
59
+ def next(count = 1, after: Time.now, max_years: 5)
49
60
  occurrences(
50
- period_start..(period_start + (60 * 60 * 24 * 365 * max_years)),
61
+ after..(after + (60 * 60 * 24 * 365 * max_years)),
51
62
  count
52
63
  )
53
64
  end
54
65
 
55
66
  # Calculates the last 'n' occurrences of the cron job until a given end time.
56
67
  # @param count [Integer] The number of past occurrences to calculate.
57
- # @param period_end [Time] The end time until which to calculate occurrences.
68
+ # @param before [Time] The end time until which to calculate occurrences.
58
69
  # @param max_years [Integer] The maximum number of years to consider for the period.
59
70
  # @return [Array<Time>] An array of the last 'n' occurrences.
60
- def last(count = 1, period_end = Time.now, max_years = 5)
71
+ def last(count = 1, before: Time.now, max_years: 5)
61
72
  occurrences(
62
- (period_end - (60 * 60 * 24 * 365 * max_years))..period_end,
73
+ (before - (60 * 60 * 24 * 365 * max_years))..before,
63
74
  count,
64
75
  reverse: true
65
76
  )
@@ -69,7 +80,7 @@ module CronCalc
69
80
 
70
81
  def occurrences(period, count = nil, reverse: false)
71
82
  time_combinations = generate_time_combinations(period, reverse).lazy
72
- wdays = parse_cron_part(:dows)
83
+ wdays = parse_cron_part(:wdays)
73
84
 
74
85
  time_combinations.each_with_object([]) do |(year, month, day, hour, minute), occ|
75
86
  break occ if count && occ.length == count
@@ -94,8 +105,8 @@ module CronCalc
94
105
  minutes: splitted[0],
95
106
  hours: splitted[1],
96
107
  days: splitted[2],
97
- months: splitted[3],
98
- dows: splitted[4]
108
+ months: normalize_with(splitted[3], MONTHS),
109
+ wdays: normalize_with(splitted[4], WDAYS)
99
110
  }
100
111
  end
101
112
 
@@ -123,9 +134,13 @@ module CronCalc
123
134
  end
124
135
  # rubocop:enable Metrics
125
136
 
137
+ def normalize_with(string, mapping)
138
+ mapping.inject(string) { |str, (k, v)| str.gsub(k, v) }
139
+ end
140
+
126
141
  def cron_string_valid?
127
142
  # rubocop:disable Layout/LineLength
128
- regex = %r{\A(\*|([0-5]?\d)(,([0-5]?\d))*|(\*/\d+)|(\d+-\d+)) (\*|([01]?\d|2[0-3])(,([01]?\d|2[0-3]))*|(\*/\d+)|(\d+-\d+)) (\*|([12]?\d|3[01])(,([12]?\d|3[01]))*|(\*/\d+)|(\d+-\d+)) (\*|([1-9]|1[0-2])(,([1-9]|1[0-2]))*|(\*/\d+)|(\d+-\d+)) (\*|([0-6])(,([0-6]))*|(\*/[0-6]+)|([0-6]-[0-6]))\z}
143
+ regex = %r{\A(\*|([0-5]?\d)(,([0-5]?\d))*|(\*/\d+)|(\d+-\d+)) (\*|([01]?\d|2[0-3])(,([01]?\d|2[0-3]))*|(\*/\d+)|(\d+-\d+)) (\*|([12]?\d|3[01])(,([12]?\d|3[01]))*|(\*/\d+)|(\d+-\d+)) (\*|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC|[1-9]|1[0-2])(,(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC|[1-9]|1[0-2])|-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*|(\*/\d+)|(\d+-\d+)) (\*|(SUN|MON|TUE|WED|THU|FRI|SAT|[0-6])(,(SUN|MON|TUE|WED|THU|FRI|SAT|[0-6])|-(SUN|MON|TUE|WED|THU|FRI|SAT))*|(\*/[0-6]+)|([0-6]-[0-6]))\z}
129
144
  # rubocop:enable Layout/LineLength
130
145
  cron_string.match?(regex)
131
146
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cron_calc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jakub Miziński