blackcal 0.3.0 → 0.5.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: db977cf2c574a0e8d76891abfa30a6b8140e5ec07bfc0f2b23a215b03732d166
4
- data.tar.gz: 8b3deb0295ba37f2ff1440cf8e4eed055dcdd77ac728a25e26b48edce491e381
3
+ metadata.gz: 6791c2ac53fda72382a38189234041baf6d19defb4f107ca0c20daf65bec80e2
4
+ data.tar.gz: '0923ab5b74740c318f800252df81f1891351cece635b92390bec242b84f50db3'
5
5
  SHA512:
6
- metadata.gz: f13e108edab2e980c18b9650145b084bf01ec391e007d78612991a4a4337d47040a7dae5bcce4ad61acc8ddcb786809bafbdea3b6cf743d5e4e14c7b26035e03
7
- data.tar.gz: 31e1e04b3929f06519a67a855e276b3771fc360b4e889d3f35b7bc5b3f4e0928617c8dfe2f0edd0cccca671b95e54d9d01c532cbaa4d7f08a145d219ed903271
6
+ metadata.gz: a79edd8fca16b0e38eaf636130c9c9da9c0aada8cd412421bed2e3a61240ac55ac01fda22c59e8f43da62aec41fcf74ced864368cbb48aaa2fba80b68bc6bb31
7
+ data.tar.gz: 2fe7fee65fd27db06e18f38afe536c40e146bb82a97af8da75d150d5200cc6d3d7986989ab9e9ffc0b7836a447f741a6cc0f6fb83ddc9f114fcfee2f167e8b81
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Change Log
2
2
 
3
+ # v0.5.0
4
+
5
+ * Add support for builder/DSL pattern
6
+ * Rename `start_hour` => `start_time_of_day`
7
+ * Rename `finish_hour` => `finish_time_of_day`
8
+ * Add attribute readers for `Schedule` data
9
+ * Support array of ranges in `DayRange` and `WeeksOfMonthRange`.
10
+ * Rename `WeekOfMonthRange` to `WeeksOfMonthRange`
11
+ * Support weekday and month numbers - [Fixes #7](https://github.com/buren/blackcal/issues/7)
12
+
13
+ # v0.4.0
14
+
15
+ * Add support for weeks of month - [PR #6](https://github.com/buren/blackcal/pull/6)
16
+
3
17
  # v0.3.0
4
18
 
5
19
  * Minute level resolution support
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Create blacklist rules for calendars with ease. Supports recurring rules for certain weekdays, date numbers, hour of day.
4
4
 
5
+ Born from the idea of comparing schedules using matrix operations. This gem makes it easy to see whether if a time is covered by a certain schedule and generate a matrix representing what the schedule covers (hour our minute resolution).
6
+
5
7
  ## Installation
6
8
 
7
9
  Add this line to your application's Gemfile:
@@ -20,6 +22,8 @@ Or install it yourself as:
20
22
 
21
23
  ## Usage
22
24
 
25
+ The main parts are `Blackcal#schedule` for generating a schedule, `schedule#cover?` to see whether a time is covered by schedule and finally `schedule#to_matrix` that generates a schedule with given time resolution (hour our minute).
26
+
23
27
  Schedule Mondays and Tuesdays
24
28
  ```ruby
25
29
  schedule = Blackcal.schedule(weekdays: [:monday, :tuesday])
@@ -31,11 +35,15 @@ schedule.cover?('2019-01-02 19:00')
31
35
 
32
36
  Schedule between 6pm and 7am every day
33
37
  ```ruby
34
- schedule = Blackcal.schedule(start_hour: 18, finish_hour: 7)
38
+ schedule = Blackcal.schedule(start_time_of_day: 18, finish_hour_of_day: 7)
35
39
  schedule.cover?('2019-01-01 19:00')
36
40
  # => true
37
41
  schedule.cover?('2019-01-01 11:00')
38
42
  # => false
43
+
44
+ # minutes are supported too
45
+ eighteen_thirty = Blackcal::TimeOfDay.new(18, 30)
46
+ schedule = Blackcal.schedule(start_time_of_day: eighteen_thirty)
39
47
  ```
40
48
 
41
49
  Schedule day 15 and 17 of month
@@ -47,33 +55,62 @@ schedule.cover?('2019-01-01 11:00')
47
55
  # => false
48
56
  ```
49
57
 
50
- All options at once - schedule January, Mondays and Tuesdays, day 15-25, between 18pm and 7am
58
+ Schedule first and third week of every month
59
+ ```ruby
60
+ schedule = Blackcal.schedule(weeks_of_month: [1, 3])
61
+ schedule.cover?('2019-01-03 19:00')
62
+ # => true
63
+ schedule.cover?('2019-01-10 19:00')
64
+ # => false
65
+ ```
66
+
67
+ Define when the schedule is active
68
+ ```ruby
69
+ Blackcal.schedule(start_time: '2018-01-01 11:00', finish_time: '2019-01-01 11:00')
70
+ ```
71
+
72
+ All options at once - schedule January, 3rd week, Mondays and Tuesdays, day 15-25, between 18pm and 7am
51
73
  ```ruby
52
74
  schedule = Blackcal.schedule(
53
75
  months: [:january],
76
+ weeks_of_month: [3],
54
77
  weekdays: [:monday, :tuesday],
55
- start_hour: 18, finish_hour: 7,
56
- days: (15..25).to_a
78
+ start_time_of_day: 18, finish_hour_of_day: 7,
79
+ days: 15..25
57
80
  )
58
- schedule.cover?('2019-01-15 19:00')
81
+ schedule.cover?('2018-01-16 06:00')
59
82
  # => true
60
- schedule.cover?('2019-02-01 11:00')
83
+ schedule.cover?('2018-01-16 08:00')
61
84
  # => false
62
85
  ```
63
86
 
64
- Define when the schedule is active
87
+ _Note_: `#cover?` supports `String` and `Time` objects. `start_time_of_day` and `finish_hour_of_day` supports `Blackcal::TimeOfDay`, `Time` and `Integer` objects.
88
+
89
+ Builder pattern
65
90
  ```ruby
66
- Blackcal.schedule(start_time: '2018-01-01 11:00', finish_time: '2019-01-01 11:00')
91
+ Blackcal.schedule do
92
+ months [:january]
93
+ weeks_of_month [3]
94
+ weekdays [:monday, :tuesday]
95
+ start_time_of_day 18
96
+ finish_hour_of_day 7
97
+ days 15..25
98
+ end
99
+ # you can, though not recommended, mix arguments with the
100
+ # builder data from the builder will override the arguments
101
+ Blackcal.schedule(days: [14, 21]) do
102
+ months [:january]
103
+ end
67
104
  ```
68
105
 
69
106
  Matrix representation
70
107
  ```ruby
71
- schedule = Blackcal.schedule(weekdays: :friday, start_hour: 0, finish_hour: 14)
108
+ schedule = Blackcal.schedule(weekdays: :friday, start_time_of_day: 0, finish_hour_of_day: 14)
72
109
  schedule.to_matrix(start_date: '2018-09-14', finish_date: '2018-09-16')
73
110
  # => [[true, ...], [false, ...]]
74
111
 
75
112
  # defaults to hour resolution, but you can get minute resolution too
76
- schedule = Blackcal.schedule(weekdays: :friday, start_hour: 0, finish_hour: 14)
113
+ schedule = Blackcal.schedule(weekdays: :friday, start_time_of_day: 0, finish_hour_of_day: 14)
77
114
  schedule.to_matrix(resolution: :min, start_date: '2018-09-14', finish_date: '2018-09-16')
78
115
  # => [[true, ...], [false, ...]]
79
116
  ```
data/blackcal.gemspec CHANGED
@@ -24,11 +24,11 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ['lib']
26
26
 
27
- spec.add_development_dependency 'github-markup', '~> 2.0'
28
- spec.add_development_dependency 'redcarpet', '~> 3.4'
29
- spec.add_development_dependency 'simplecov', '~> 0.16'
30
27
  spec.add_development_dependency 'bundler', '~> 1.16'
31
28
  spec.add_development_dependency 'byebug'
29
+ spec.add_development_dependency 'github-markup', '~> 2.0'
32
30
  spec.add_development_dependency 'rake', '~> 10.0'
31
+ spec.add_development_dependency 'redcarpet', '~> 3.4'
33
32
  spec.add_development_dependency 'rspec', '~> 3.0'
33
+ spec.add_development_dependency 'simplecov', '~> 0.16'
34
34
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blackcal
4
+ # Time utils module
5
+ module ArrayUtil
6
+ # @param [Array, Array<#to_a>, Object] data
7
+ # @return [Array]
8
+ def self.flatten(data)
9
+ Array(data).map do |object|
10
+ next object.to_a if object.respond_to?(:to_a)
11
+ object
12
+ end.flatten(1)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blackcal
4
+ # Builder provides a DSL for schedule options
5
+ class Builder
6
+ # Enables a DSL for building schedule options
7
+ # @return [Builder]
8
+ # @example
9
+ # Blackcal.dsl do
10
+ # months [:january]
11
+ # days 15..25
12
+ # end
13
+ def self.dsl(&block)
14
+ new.tap { |b| b.instance_eval(&block) }
15
+ end
16
+
17
+ # Returns a new instance of Builder
18
+ def initialize
19
+ @data = {}
20
+ end
21
+
22
+ # @param [Time, Date, String, nil] start_time
23
+ def start_time(start_time)
24
+ @data[:start_time] = start_time
25
+ end
26
+
27
+ # @param [Time, Date, String, nil] finish_time
28
+ def finish_time(finish_time)
29
+ @data[:finish_time] = finish_time
30
+ end
31
+
32
+ # @param [TimeOfDay, Time, Integer, nil] start_time_of_day
33
+ def start_time_of_day(start_time_of_day)
34
+ @data[:start_time_of_day] = start_time_of_day
35
+ end
36
+
37
+ # @param [TimeOfDay, Time, Integer, nil] finish_hour_of_day
38
+ def finish_hour_of_day(finish_hour_of_day)
39
+ @data[:finish_hour_of_day] = finish_hour_of_day
40
+ end
41
+
42
+ # @param [Array<String>, Array<Symbol>, String, Symbol, nil] months
43
+ def months(*months)
44
+ @data[:months] = flat_array(months)
45
+ end
46
+
47
+ # @param [Array<String>, Array<Symbol>, String, Symbol, nil] weekdays
48
+ def weekdays(*weekdays)
49
+ @data[:weekdays] = flat_array(weekdays)
50
+ end
51
+
52
+ # @param [Array<Integer>, nil] weeks_of_month
53
+ def weeks_of_month(*weeks_of_month)
54
+ @data[:weeks_of_month] = flat_array(weeks_of_month)
55
+ end
56
+
57
+ # @param days [Array<Integer>, Integer, nil]
58
+ def days(*days)
59
+ @data[:days] = flat_array(days)
60
+ end
61
+
62
+ # The builder represented as a hash
63
+ # @return [Hash]
64
+ def to_h
65
+ @data
66
+ end
67
+
68
+ private
69
+
70
+ def flat_array(array)
71
+ Array(array).flatten(1)
72
+ end
73
+ end
74
+ end
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'blackcal/array_util'
4
+
3
5
  module Blackcal
4
- # Number range
6
+ # Day range
5
7
  class DayRange
6
8
  include Enumerable
7
9
 
@@ -9,13 +11,15 @@ module Blackcal
9
11
  attr_reader :numbers
10
12
 
11
13
  # Initialize numbers range
12
- # @param [Array<Integer>, Integer, nil] numbers
14
+ # @param [Array<#to_a>, Array<Integer>, Integer, nil] numbers
15
+ # @example
16
+ # DayRange.new(1)
13
17
  # @example
14
- # NumberRange.new(1)
18
+ # DayRange.new([1, 2])
15
19
  # @example
16
- # NumberRange.new([1, 2])
20
+ # DayRange.new([9..10, 13..14])
17
21
  def initialize(numbers)
18
- @numbers = Array(numbers) if numbers
22
+ @numbers = ArrayUtil.flatten(numbers) if numbers
19
23
  end
20
24
 
21
25
  # Returns true if it covers timestamp
@@ -21,17 +21,26 @@ module Blackcal
21
21
  december: 12,
22
22
  }.freeze
23
23
 
24
+ # Map month number to name
25
+ MONTH_INVERT_MAP = MONTH_MAP.invert.freeze
26
+
24
27
  # @return [Array<Symbol>] months in range
25
28
  attr_reader :months
26
29
 
27
30
  # Initialize month range
28
- # @param [Array<String>, Array<Symbol>, String, Symbol, nil] months
31
+ # @param [Array<String>, Array<Symbol>, Array<Integer>, String, Symbol, Integer, nil] months
29
32
  # @example
30
33
  # MonthRange.new(:january)
31
34
  # @example
32
35
  # MonthRange.new([:december, :january])
33
36
  def initialize(months)
34
- @months = Array(months).map(&:to_sym) if months
37
+ return unless months
38
+
39
+ @months = Array(months).map do |month|
40
+ next MONTH_INVERT_MAP.fetch(month) if month.is_a?(Integer)
41
+
42
+ month.downcase.to_sym
43
+ end
35
44
  end
36
45
 
37
46
  # Returns true if it covers timestamp
@@ -35,7 +35,7 @@ module Blackcal
35
35
  resolution_multiplier = resolution == :hour ? 60 * 60 : 60
36
36
  time_units = ((start - finish) / resolution_multiplier).abs.to_i
37
37
 
38
- time_units.times.map do |time_unit|
38
+ Array.new(time_units) do |time_unit|
39
39
  start + (time_unit * resolution_multiplier)
40
40
  end
41
41
  end
@@ -16,17 +16,26 @@ module Blackcal
16
16
  saturday: 6,
17
17
  }.freeze
18
18
 
19
+ # Map weekday number to name
20
+ WEEKDAY_INVERT_MAP = WEEKDAY_MAP.invert.freeze
21
+
19
22
  # @return [Array<Symbol>] weekdays in range
20
23
  attr_reader :weekdays
21
24
 
22
25
  # Initialize weekday range
23
- # @param [Array<String>, Array<Symbol>, String, Symbol, nil] weekdays
26
+ # @param [Array<String>, Array<Symbol>, Array<Integer>, String, Symbol, Integer, nil] weekdays
24
27
  # @example
25
28
  # WeekdayRange.new(:monday)
26
29
  # @example
27
30
  # WeekdayRange.new([:monday, :thursday])
28
31
  def initialize(weekdays)
29
- @weekdays = Array(weekdays).map(&:to_sym) if weekdays
32
+ return unless weekdays
33
+
34
+ @weekdays = Array(weekdays).map do |week|
35
+ next WEEKDAY_INVERT_MAP.fetch(week) if week.is_a?(Integer)
36
+
37
+ week.downcase.to_sym
38
+ end
30
39
  end
31
40
 
32
41
  # Returns true if it covers timestamp
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'blackcal/time_util'
4
+ require 'blackcal/array_util'
5
+
6
+ module Blackcal
7
+ # Week of month range
8
+ class WeeksOfMonthRange
9
+ include Enumerable
10
+
11
+ # @return [Array<Integer>] numbers in range
12
+ attr_reader :numbers
13
+
14
+ # Initialize numbers range
15
+ # @param [Array<Integer>, Integer, nil] numbers
16
+ # @example
17
+ # WeeksOfMonthRange.new(1)
18
+ # @example
19
+ # WeeksOfMonthRange.new([1, 2])
20
+ def initialize(numbers)
21
+ @numbers = ArrayUtil.flatten(numbers) if numbers
22
+ end
23
+
24
+ # Returns true if it covers timestamp
25
+ # @return [Boolean]
26
+ def cover?(timestamp)
27
+ return false if numbers.nil? || numbers.empty?
28
+
29
+ numbers.include?(TimeUtil.week_of_month(timestamp))
30
+ end
31
+
32
+ # @return [Array<Integer>] numbers in range
33
+ alias_method :to_a, :numbers
34
+
35
+ # Iterate over range
36
+ # @see #to_a
37
+ def each(&block)
38
+ to_a.each(&block)
39
+ end
40
+ end
41
+ end
@@ -4,6 +4,7 @@ require 'time'
4
4
 
5
5
  require 'blackcal/range/time_range'
6
6
  require 'blackcal/range/time_of_day_range'
7
+ require 'blackcal/range/weeks_of_month_range'
7
8
  require 'blackcal/range/weekday_range'
8
9
  require 'blackcal/range/month_range'
9
10
  require 'blackcal/range/day_range'
@@ -12,13 +13,32 @@ require 'blackcal/slot_matrix'
12
13
  module Blackcal
13
14
  # Represents a schedule
14
15
  class Schedule
15
- # Initialize rule
16
+ # @return [TimeRange] the time the schedule is active
17
+ attr_reader :time_range
18
+
19
+ # @return [MonthRange] months when this schedule is active
20
+ attr_reader :months
21
+
22
+ # @return [TimeOfDay] time of day when this schedule is active
23
+ attr_reader :time_of_day
24
+
25
+ # @return [WeeksOfMonthRange] weeks of month when this schedule is active
26
+ attr_reader :weeks_of_month
27
+
28
+ # @return [DayRange] days when this schedule is active
29
+ attr_reader :days
30
+
31
+ # @return [WeekdayRange] weekdays when this schedule is active
32
+ attr_reader :weekdays
33
+
34
+ # Initialize schedule
16
35
  # @param start_time [Time, Date, String, nil]
17
36
  # @param finish_time [Time, Date, String, nil]
18
- # @param start_hour [TimeOfDay, Time, Integer, nil]
19
- # @param finish_hour [TimeOfDay, Time, Integer, nil]
37
+ # @param start_time_of_day [TimeOfDay, Time, Integer, nil]
38
+ # @param finish_hour_of_day [TimeOfDay, Time, Integer, nil]
20
39
  # @param months [Array<String>, Array<Symbol>, String, Symbol, nil]
21
40
  # @param weekdays [Array<String>, Array<Symbol>, String, Symbol, nil]
41
+ # @param weeks_of_month [Array<Integer>, nil]
22
42
  # @param days [Array<Integer>, Integer, nil]
23
43
  # @see TimeRange#initialize
24
44
  # @see TimeOfDayRange#initialize
@@ -28,25 +48,29 @@ module Blackcal
28
48
  def initialize(
29
49
  start_time: nil,
30
50
  finish_time: nil,
31
- start_hour: nil,
32
- finish_hour: nil,
51
+ start_time_of_day: nil,
52
+ finish_hour_of_day: nil,
33
53
  months: nil,
34
54
  weekdays: nil,
35
- # weeks_of_month: nil, # TODO
55
+ weeks_of_month: nil,
36
56
  days: nil
37
57
  )
38
58
  if start_time || finish_time
39
- @rule_range = TimeRange.new(parse_time(start_time), parse_time(finish_time))
59
+ @time_range = TimeRange.new(parse_time(start_time), parse_time(finish_time))
40
60
  end
41
61
 
42
- if start_hour || finish_hour
43
- @time_of_day = TimeOfDayRange.new(start_hour, finish_hour)
62
+ if start_time_of_day || finish_hour_of_day
63
+ @time_of_day = TimeOfDayRange.new(start_time_of_day, finish_hour_of_day)
44
64
  end
45
65
 
46
66
  if months
47
67
  @months = MonthRange.new(months)
48
68
  end
49
69
 
70
+ if weeks_of_month
71
+ @weeks_of_month = WeeksOfMonthRange.new(weeks_of_month)
72
+ end
73
+
50
74
  if weekdays
51
75
  @weekdays = WeekdayRange.new(weekdays)
52
76
  end
@@ -61,9 +85,9 @@ module Blackcal
61
85
  # @return [Boolean]
62
86
  def cover?(timestamp)
63
87
  timestamp = parse_time(timestamp)
64
- return false if @rule_range && !@rule_range.cover?(timestamp)
88
+ return false if @time_range && !@time_range.cover?(timestamp)
65
89
 
66
- ranges = [@months, @weekdays, @days, @time_of_day].compact
90
+ ranges = [@months, @weekdays, @days, @time_of_day, @weeks_of_month].compact
67
91
  return false if ranges.empty?
68
92
 
69
93
  ranges.all? { |range| range.cover?(timestamp) }
@@ -92,6 +116,7 @@ module Blackcal
92
116
 
93
117
  def parse_time(time)
94
118
  return Time.parse(time) if time.is_a?(String)
119
+
95
120
  time
96
121
  end
97
122
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blackcal
4
+ # Time utils module
5
+ module TimeUtil
6
+ # Returns the week of month
7
+ # @return [Integer] week of month
8
+ # @see https://stackoverflow.com/a/30470158/955366
9
+ def self.week_of_month(date_or_time, start_day = :sunday)
10
+ date = date_or_time.to_date
11
+ week_start_format = start_day == :sunday ? '%U' : '%W'
12
+
13
+ week_of_month_start = Date.new(date.year, date.month, 1)
14
+ week_of_month_start_num = week_of_month_start.strftime(week_start_format).to_i
15
+ # Skip first week if doesn't contain a Thursday
16
+ week_of_month_start_num += 1 if week_of_month_start.wday > 4
17
+
18
+ month_week_index = date.strftime(week_start_format).to_i - week_of_month_start_num
19
+ month_week_index + 1 # Add 1 so that first week is 1 and not 0
20
+ end
21
+ end
22
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Blackcal
4
4
  # Gem version
5
- VERSION = '0.3.0'.freeze
5
+ VERSION = '0.5.0'.freeze
6
6
  end
data/lib/blackcal.rb CHANGED
@@ -2,13 +2,35 @@
2
2
 
3
3
  require 'blackcal/version'
4
4
  require 'blackcal/schedule'
5
+ require 'blackcal/builder'
5
6
 
6
7
  # Main module
7
8
  module Blackcal
8
9
  # Initialize schedule
9
10
  # @return [Schedule]
11
+ # @example All options – using method arguments
12
+ # schedule = Blackcal.schedule(
13
+ # months: [:january],
14
+ # weeks_of_month: [3],
15
+ # weekdays: [:monday, :tuesday],
16
+ # start_time_of_day: 18,
17
+ # finish_hour_of_day: 7,
18
+ # days: (15..25).to_a
19
+ # )
20
+ # @example All options – using block builder
21
+ # schedule = Blackcal.schedule do
22
+ # months [:january]
23
+ # weeks_of_month [3]
24
+ # weekdays [:monday, :tuesday]
25
+ # start_time_of_day 18
26
+ # finish_hour_of_day 7
27
+ # days (15..25).to_a
28
+ # end
10
29
  # @see Schedule#initialize
11
- def self.schedule(**keyword_args)
12
- Schedule.new(**keyword_args)
30
+ # @see Builder::dsl
31
+ def self.schedule(**keyword_args, &block)
32
+ schedule_args = keyword_args
33
+ schedule_args.merge!(Builder.dsl(&block).to_h) if block
34
+ Schedule.new(schedule_args)
13
35
  end
14
36
  end
metadata CHANGED
@@ -1,113 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blackcal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Burenstam
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-16 00:00:00.000000000 Z
11
+ date: 2018-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: github-markup
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '1.16'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '1.16'
27
27
  - !ruby/object:Gem::Dependency
28
- name: redcarpet
28
+ name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3.4'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '3.4'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: simplecov
42
+ name: github-markup
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.16'
47
+ version: '2.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.16'
54
+ version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.16'
61
+ version: '10.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.16'
68
+ version: '10.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: byebug
70
+ name: redcarpet
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '3.4'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '3.4'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake
84
+ name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '10.0'
89
+ version: '3.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '10.0'
96
+ version: '3.0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rspec
98
+ name: simplecov
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.0'
103
+ version: '0.16'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.0'
110
+ version: '0.16'
111
111
  description: Create blacklist rules for calendars with ease. Supports recurring rules
112
112
  for certain weekdays, date numbers, hour of day.
113
113
  email:
@@ -131,14 +131,18 @@ files:
131
131
  - bin/setup
132
132
  - blackcal.gemspec
133
133
  - lib/blackcal.rb
134
+ - lib/blackcal/array_util.rb
135
+ - lib/blackcal/builder.rb
134
136
  - lib/blackcal/range/day_range.rb
135
137
  - lib/blackcal/range/month_range.rb
136
138
  - lib/blackcal/range/time_of_day_range.rb
137
139
  - lib/blackcal/range/time_range.rb
138
140
  - lib/blackcal/range/weekday_range.rb
141
+ - lib/blackcal/range/weeks_of_month_range.rb
139
142
  - lib/blackcal/schedule.rb
140
143
  - lib/blackcal/slot_matrix.rb
141
144
  - lib/blackcal/time_of_day.rb
145
+ - lib/blackcal/time_util.rb
142
146
  - lib/blackcal/version.rb
143
147
  homepage: https://github.com/buren/blackcal
144
148
  licenses: