periodoxical 0.1.1 → 0.2.2

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: e68e36720b518a871efe0ea34eb09f94b99880f5ebda37f5123469839b8a6b94
4
- data.tar.gz: 7dd9b4f9e7439c6875dc689bd08fc4b3e145f81a886eaaa5b8f5c879f1839377
3
+ metadata.gz: 86a786f06e166368721d1f0f17d9c702bfc23950f66482f4c2da80fde583d9a5
4
+ data.tar.gz: 65bae069f30ee999ccc99353d03149db0e3414adbb1257b1c163e2d7cfaa5e01
5
5
  SHA512:
6
- metadata.gz: 8f5fd0e511bc2363d7487247b4fe528b5c8bd2e8b05d590b35ecf3d0726cda68b673f6f69dcb5c1e9d66b27998fb702161f8925afbc474e00df19ac13c105d6f
7
- data.tar.gz: f8fc94f6e17ddeba3815c6f5baf4dc1881dd4c0fd8cfd6bf1e5e756cc393499da79c8d11f72b37fd1f3797d18c9bd1e62b95699b2c62ba3b61de524ce91f3308
6
+ metadata.gz: e9f76a36b7a77e326ab999adbda7d59f24f84383f198c260e99b76cfb7c9fe069c10fa3ff46c61c53491e4d6b96f8c23b8378471cd7494cce21e78dbfface58e
7
+ data.tar.gz: 3ad7d053bb777bf3f3dbf403a787447dc77eeab162d185a6e3de79c21a68d468ac30365aa2ad3d5db65525a2678f78e3f0c5e50e728b22cc521c205445696056
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- periodoxical (0.1.0)
5
- tzinfo (>= 2.0.0)
4
+ periodoxical (0.2.2)
5
+ tzinfo (~> 2.0, >= 2.0.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
@@ -24,7 +24,7 @@ GEM
24
24
  pry-stack_explorer (0.6.1)
25
25
  binding_of_caller (~> 1.0)
26
26
  pry (~> 0.13)
27
- rake (10.5.0)
27
+ rake (12.3.3)
28
28
  rspec (3.13.0)
29
29
  rspec-core (~> 3.13.0)
30
30
  rspec-expectations (~> 3.13.0)
@@ -47,9 +47,9 @@ PLATFORMS
47
47
  DEPENDENCIES
48
48
  bundler (~> 2.4)
49
49
  periodoxical!
50
- pry-byebug
51
- pry-stack_explorer
52
- rake (~> 10.0)
50
+ pry-byebug (~> 3.10)
51
+ pry-stack_explorer (~> 0.6)
52
+ rake (~> 12.3.3)
53
53
  rspec (~> 3.0)
54
54
 
55
55
  BUNDLED WITH
data/README.md CHANGED
@@ -23,11 +23,9 @@ Or install it yourself as:
23
23
 
24
24
  ## Usage
25
25
 
26
- ```rb
27
- # generates 9:00AM - 10:30AM and 2:00PM - 2:30PM time blocks
28
- # on Mondays, Wednesdays, and Thursdays, between the dates of
29
- # May 23, 2024 and June 24, 2024
26
+ Generates datetimes blocks of 9:00AM - 10:30AM and 2:00PM - 2:30PM, on Mondays, Wednesdays, and Thursdays, between the dates of May 23, 2024 and June 24, 2024
30
27
 
28
+ ```rb
31
29
  Periodoxical.generate(
32
30
  time_zone: 'America/Los_Angeles',
33
31
  days_of_week: %w[mon wed thu],
@@ -47,24 +45,41 @@ Periodoxical.generate(
47
45
  # returns an array of hashes, each with a :start, :end
48
46
  #=>
49
47
  [
48
+ {
49
+ start: #<DateTime: 2024-05-23T16:00:00+00:00>,
50
+ end: #<DateTime: 2024-05-24T05:30:00+00:00>,
51
+ },
52
+ {
53
+ start: #<DateTime: 2024-05-23T21:00:00+00:00>,
54
+ end: #<DateTime: 2024-05-23T21:30:00+00:00>,
55
+ },
56
+ {
57
+ start: #<DateTime: 2024-05-27T16:00:00+00:00>,
58
+ end: #<DateTime: 2024-05-28T05:30:00+00:00>
59
+ },
60
+ ...
61
+ ]
62
+ ```
63
+
64
+ Generate the next 10 datetime blocks of 3:00PM - 4:30PM, on Sundays, after May 30, 2024
65
+
66
+ ```rb
67
+ Periodoxical.generate(
68
+ time_zone: 'America/Los_Angeles',
69
+ days_of_week: %w[mon wed thu],
70
+ time_blocks: [
50
71
  {
51
- :start=>#<DateTime: 2024-05-23T16:00:00+00:00>,
52
- :end=>#<DateTime: 2024-05-23T16:00:00+00:00>
53
- },
54
- {
55
- :start=>#<DateTime: 2024-05-23T16:00:00+00:00>,
56
- :end=>#<DateTime: 2024-05-23T16:00:00+00:00>
72
+ start_time: '9:00AM',
73
+ end_time: '10:30AM'
57
74
  },
58
75
  {
59
- :start=>#<DateTime: 2024-05-30T16:00:00+00:00>,
60
- :end=>#<DateTime: 2024-05-30T16:00:00+00:00>
61
- },
62
- { :start=>#<DateTime: 2024-05-30T16:00:00+00:00>,
63
- :end=>#<DateTime: 2024-05-30T16:00:00+00:00>
64
- },
65
-
66
- ...
67
- ]
76
+ start_time: '2:00PM',
77
+ end_time: '2:30PM'
78
+ }
79
+ ],
80
+ start_date: Date.parse('2024-05-23'),
81
+ limit: 10
82
+ )
68
83
  ```
69
84
 
70
85
  ## Development
@@ -1,3 +1,3 @@
1
1
  module Periodoxical
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.2"
3
3
  end
data/lib/periodoxical.rb CHANGED
@@ -17,6 +17,17 @@ module Periodoxical
17
17
  # TZInfo::DataTimezone#name from the tzinfo gem (https://github.com/tzinfo/tzinfo)
18
18
  # @param [Date] start_date
19
19
  # @param [Date] end_date
20
+ # @param [Array<Hash>] time_blocks
21
+ # Ex: [
22
+ # {
23
+ # start_time: '9:00AM',
24
+ # end_time: '10:30PM'
25
+ # },
26
+ # {
27
+ # start_time: '2:00PM',
28
+ # end_time: '2:30PM'
29
+ # }
30
+ # ]
20
31
  # @param [Array<String>, nil] days_of_week
21
32
  # Days of the week to generate the times for, if nil, then times are generated
22
33
  # for every day.
@@ -31,7 +42,7 @@ module Periodoxical
31
42
  # fri: { start_time: '7:00PM', end_time: '9:00PM' },
32
43
  # }
33
44
  def initialize(time_zone: 'Etc/UTC', days_of_week: nil,
34
- start_date:, end_date:, time_blocks: nil, day_of_week_hours: nil, limit: nil)
45
+ start_date:, end_date: nil, time_blocks: nil, day_of_week_hours: nil, limit: nil)
35
46
  @time_zone = TZInfo::Timezone.get(time_zone)
36
47
  @days_of_week = days_of_week
37
48
  @time_blocks = time_blocks
@@ -58,21 +69,32 @@ module Periodoxical
58
69
  private
59
70
 
60
71
  def generate_from_days_of_week_time_blocks
61
- times = []
72
+ times_output = []
62
73
  current_date = @start_date
63
- while current_date <= @end_date
74
+ current_count = 0
75
+ keep_generating = true
76
+ while keep_generating
64
77
  day_of_week = day_of_week_long_to_short(current_date.strftime("%A"))
65
78
  if @days_of_week.include?(day_of_week)
66
79
  @time_blocks.each do |tb|
67
- times << {
80
+ times_output << {
68
81
  start: time_str_to_object(current_date, tb[:start_time]),
69
- end: time_str_to_object(current_date, tb[:end_date])
82
+ end: time_str_to_object(current_date, tb[:end_time])
70
83
  }
84
+ current_count = current_count + 1
85
+ if @limit && current_count == @limit
86
+ keep_generating = false
87
+ break
88
+ end
71
89
  end
72
90
  end
73
91
  current_date = current_date + 1
92
+
93
+ if @end_date && (current_date > @end_date)
94
+ keep_generating = false
95
+ end
74
96
  end
75
- times
97
+ times_output
76
98
  end
77
99
 
78
100
  def validate!
@@ -93,13 +115,24 @@ module Periodoxical
93
115
  end
94
116
  end
95
117
 
96
- unless (@days_of_week && @start_time && @end_time) || (@day_of_week_hours)
118
+ unless (@days_of_week && @time_blocks) || (@day_of_week_hours)
119
+ raise "Need to provide either `days_of_week` and `time_blocks` or `day_of_week_hours`"
120
+ end
121
+
122
+ unless( @limit || @end_date)
123
+ raise "Either `limit` or `end_date` must be provided"
97
124
  end
98
125
  end
99
126
 
100
127
  def day_of_week_long_to_short(dow)
101
128
  {
102
- "Thursday" => "thu"
129
+ "Monday" => "mon",
130
+ "Tuesday" => "tue",
131
+ "Wednesday" => "wed",
132
+ "Thursday" => "thu",
133
+ "Friday" => "fri",
134
+ "Saturday" => "sat",
135
+ "Sunday" => "sun",
103
136
  }[dow]
104
137
  end
105
138
 
@@ -107,7 +140,7 @@ module Periodoxical
107
140
  # Ex: '9:00AM'
108
141
  # @param [Date] date
109
142
  def time_str_to_object(date, time_str)
110
- time = Time.strptime("9:00AM", "%I:%M%p")
143
+ time = Time.strptime(time_str, "%I:%M%p")
111
144
  date_time = DateTime.new(
112
145
  date.year,
113
146
  date.month,
data/periodoxical.gemspec CHANGED
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_dependency 'tzinfo', '~> 2.0', '>= 2.0.0'
38
38
 
39
39
  spec.add_development_dependency "bundler", "~> 2.4"
40
- spec.add_development_dependency "rake", "~> 10.0"
40
+ spec.add_development_dependency "rake", "~> 12.3.3"
41
41
  spec.add_development_dependency "rspec", "~> 3.0"
42
42
  spec.add_development_dependency "pry-byebug", "~> 3.10"
43
43
  spec.add_development_dependency "pry-stack_explorer", "~> 0.6"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: periodoxical
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Li
@@ -50,14 +50,14 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '10.0'
53
+ version: 12.3.3
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '10.0'
60
+ version: 12.3.3
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rspec
63
63
  requirement: !ruby/object:Gem::Requirement