opening_hours 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -20,7 +20,7 @@ Or install it yourself as:
20
20
 
21
21
  Init new hours object:
22
22
  ```ruby
23
- hours = OpeningHours.new("9:00 AM", "3:00 PM", "Berlin")
23
+ hours = OpeningHours.new("9:00 AM", "3:00 PM", "Europe/Berlin")
24
24
  ```
25
25
 
26
26
  Methods to set the hours, closed times or holidays:
@@ -34,11 +34,11 @@ Calculate the deadline (next available working hour)
34
34
  ```ruby
35
35
  # offset and time
36
36
  hours.calculate_deadline(4*60*60, "Dec 23, 2010 8:00 PM")
37
- => "Fri, 24 Dec 2010 12:00:00 +0100"
37
+ => "Fri, 24 Dec 2010 13:00:00 +0100"
38
38
 
39
39
  # now with timezone
40
40
  hours.calculate_deadline(0, "Dec 23, 2010 9:00 AM -0400")
41
- => "Thu, 23 Dec 2010 14:00:00 +0100"
41
+ => "Thu, 23 Dec 2010 14:00:00 +0100"
42
42
  ```
43
43
 
44
44
  Check if business is open right now:
@@ -46,6 +46,22 @@ Check if business is open right now:
46
46
  hours.now_open?
47
47
  ```
48
48
 
49
+ And get all week days with values:
50
+ ```ruby
51
+ hours.week.each do |day|
52
+ puts day[1].open
53
+ end
54
+ ```
55
+
56
+ Get human readable opening/close hours
57
+ ```ruby
58
+ hours.week[:mon].open.to_human_readable_hours
59
+ => "09:00 AM"
60
+
61
+ hours.week[:mon].close.to_human_readable_hours
62
+ => "03:00 PM"
63
+ ```
64
+
49
65
  ## Contributing
50
66
 
51
67
  1. Fork it
data/lib/opening_hours.rb CHANGED
@@ -20,9 +20,9 @@ class OpeningHours
20
20
  CLOSED = new(0, 0)
21
21
 
22
22
  def self.parse(open, close)
23
- open = Time.parse(open)
24
- close = Time.parse(close)
25
-
23
+ open = Time.zone.parse(open)
24
+ close = Time.zone.parse(close)
25
+
26
26
  open = TimeUtils::seconds_from_midnight(open)
27
27
  close = TimeUtils::seconds_from_midnight(close)
28
28
 
@@ -58,10 +58,10 @@ class OpeningHours
58
58
 
59
59
  WEEK_DAYS = Time::RFC2822_DAY_NAME.map { |m| m.downcase.to_sym }
60
60
 
61
- def initialize(start_time, end_time, time_zone = Time.now.gmt_offset)
62
- open_hours = OpenHours.parse(start_time, end_time)
61
+ def initialize(start_time, end_time, time_zone = 'Europe/London')
62
+ Time.zone = time_zone
63
63
 
64
- @time_zone = time_zone
64
+ open_hours = OpenHours.parse(start_time, end_time)
65
65
 
66
66
  @week = {}
67
67
  WEEK_DAYS.each do |day|
@@ -71,10 +71,7 @@ class OpeningHours
71
71
  @specific_days = {}
72
72
  end
73
73
 
74
- def update(day, start_time, end_time, time_zone = Time.now.zone)
75
-
76
- @time_zone = time_zone
77
-
74
+ def update(day, start_time, end_time)
78
75
  set_open_hours day, OpenHours.parse(start_time, end_time)
79
76
  end
80
77
 
@@ -89,7 +86,6 @@ class OpeningHours
89
86
  end
90
87
 
91
88
  def calculate_deadline(job_duration, start_date_time)
92
- Time.zone = @time_zone
93
89
  start_date_time = Time.zone.parse(start_date_time)
94
90
 
95
91
  today = Date.civil(start_date_time.year, start_date_time.month, start_date_time.day)
@@ -124,10 +120,10 @@ class OpeningHours
124
120
 
125
121
  end
126
122
 
127
- class Time
128
- class << self
129
- def parse_rfc822(date, now=self.now)
130
- parse(date, now).to_formatted_s(:rfc822)
131
- end
123
+ class Fixnum
124
+ def to_human_readable_hours
125
+ t = Time.local(Date.today.year, Date.today.month, Date.today.day)
126
+ t += self.seconds
127
+ t.strftime("%I:%M %p")
132
128
  end
133
- end
129
+ end
@@ -1,3 +1,3 @@
1
1
  class OpeningHours
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -14,30 +14,30 @@ describe OpeningHours do
14
14
  it { should respond_to(:week) }
15
15
 
16
16
  context "schedule without exceptions" do
17
- before { @hours = OpeningHours.new("9:00 AM", "3:00 PM") }
17
+ before { @hours = OpeningHours.new("9:00 AM", "3:00 PM", "Europe/Berlin") }
18
18
 
19
19
  it "should handle start time during open hours" do
20
- @hours.calculate_deadline(1*60*60, "Jun 7, 2010 9:10 AM").should == Time.parse_rfc822("Jun 7, 2010 10:10 AM")
20
+ @hours.calculate_deadline(1*60*60, "Jun 7, 2010 9:10 AM").should == Time.zone.parse("Jun 7, 2010 10:10 AM").to_formatted_s(:rfc822)
21
21
  end
22
22
 
23
23
  it "should handle start time before open hours" do
24
- @hours.calculate_deadline(2*60*60, "Jun 7, 2010 8:45 AM").should == Time.parse_rfc822("Jun 7, 2010 11:00 AM")
24
+ @hours.calculate_deadline(2*60*60, "Jun 7, 2010 8:45 AM").should == Time.zone.parse("Jun 7, 2010 11:00 AM").to_formatted_s(:rfc822)
25
25
  end
26
26
 
27
27
  it "should handle start time after open hours" do
28
- @hours.calculate_deadline(2*60*60, "Jun 7, 2010 10:45 PM").should == Time.parse_rfc822("Jun 8, 2010 11:00 AM")
28
+ @hours.calculate_deadline(2*60*60, "Jun 7, 2010 10:45 PM").should == Time.zone.parse("Jun 8, 2010 11:00 AM").to_formatted_s(:rfc822)
29
29
  end
30
30
 
31
31
  it "should finish job next day if not enough time left" do
32
- @hours.calculate_deadline(2*60*60, "Jun 7, 2010 2:45 PM").should == Time.parse_rfc822("Jun 8, 2010 10:45 AM")
32
+ @hours.calculate_deadline(2*60*60, "Jun 7, 2010 2:45 PM").should == Time.zone.parse("Jun 8, 2010 10:45 AM").to_formatted_s(:rfc822)
33
33
  end
34
34
 
35
35
  it "should process huge job for several days" do
36
- @hours.calculate_deadline(20*60*60, "Jun 7, 2010 10:45 AM").should == Time.parse_rfc822("Jun 10, 2010 12:45 PM")
36
+ @hours.calculate_deadline(20*60*60, "Jun 7, 2010 10:45 AM").should == Time.zone.parse("Jun 10, 2010 12:45 PM").to_formatted_s(:rfc822)
37
37
  end
38
38
 
39
39
  it "should flip the edge" do
40
- @hours.calculate_deadline(6*60*60, "Jun 7, 2010 9:00 AM").should == Time.parse_rfc822("Jun 8, 2010 9:00 AM")
40
+ @hours.calculate_deadline(6*60*60, "Jun 7, 2010 9:00 AM").should == Time.zone.parse("Jun 8, 2010 9:00 AM").to_formatted_s(:rfc822)
41
41
  end
42
42
 
43
43
  # this is also possible, but I prefer previous variant
@@ -49,19 +49,19 @@ describe OpeningHours do
49
49
  context "on dst changes" do
50
50
 
51
51
  it "should respect changing to dst" do
52
- @hours.calculate_deadline(8*60*60, "March 27, 2010 2:00 PM").should == Time.parse_rfc822("March 29, 2010 10:00 AM")
52
+ @hours.calculate_deadline(8*60*60, "March 27, 2010 2:00 PM").should == Time.zone.parse("March 29, 2010 10:00 AM").to_formatted_s(:rfc822)
53
53
  end
54
54
 
55
55
  it "should respect changing to dst" do
56
- @hours.calculate_deadline(2*60*60, "March 27, 2010 2:00 PM").should == Time.parse_rfc822("March 28, 2010 10:00 AM")
56
+ @hours.calculate_deadline(2*60*60, "March 27, 2010 2:00 PM").should == Time.zone.parse("March 28, 2010 10:00 AM").to_formatted_s(:rfc822)
57
57
  end
58
58
 
59
59
  it "should respect changing from dst" do
60
- @hours.calculate_deadline(8*60*60, "October 31, 2010 2:00 PM").should == Time.parse_rfc822("November 2, 2010 10:00 AM")
60
+ @hours.calculate_deadline(8*60*60, "October 31, 2010 2:00 PM").should == Time.zone.parse("November 2, 2010 10:00 AM").to_formatted_s(:rfc822)
61
61
  end
62
62
 
63
63
  it "should respect changing from dst" do
64
- @hours.calculate_deadline(2*60*60, "October 31, 2010 2:00 PM").should == Time.parse_rfc822("November 1, 2010 10:00 AM")
64
+ @hours.calculate_deadline(2*60*60, "October 31, 2010 2:00 PM").should == Time.zone.parse("November 1, 2010 10:00 AM").to_formatted_s(:rfc822)
65
65
  end
66
66
 
67
67
  end
@@ -75,11 +75,11 @@ describe OpeningHours do
75
75
  end
76
76
 
77
77
  it "should skip closed days" do
78
- @hours.calculate_deadline(2*60*60, "Jun 5, 2010 2:45 PM").should == Time.parse_rfc822("Jun 7, 2010 10:45 AM")
78
+ @hours.calculate_deadline(2*60*60, "Jun 5, 2010 2:45 PM").should == Time.zone.parse("Jun 7, 2010 10:45 AM").to_formatted_s(:rfc822)
79
79
  end
80
80
 
81
81
  it "should skip closed days even if work scheduled to closed day" do
82
- @hours.calculate_deadline(2*60*60, "Jun 6, 2010 11:45 AM").should == Time.parse_rfc822("Jun 7, 2010 11:00 AM")
82
+ @hours.calculate_deadline(2*60*60, "Jun 6, 2010 11:45 AM").should == Time.zone.parse("Jun 7, 2010 11:00 AM").to_formatted_s(:rfc822)
83
83
  end
84
84
  end
85
85
 
@@ -91,11 +91,11 @@ describe OpeningHours do
91
91
  end
92
92
 
93
93
  it "should skip closed days" do
94
- @hours.calculate_deadline(2*60*60, "Dec 24, 2010 2:45 PM").should == Time.parse_rfc822("Dec 26, 2010 10:45 AM")
94
+ @hours.calculate_deadline(2*60*60, "Dec 24, 2010 2:45 PM").should == Time.zone.parse("Dec 26, 2010 10:45 AM").to_formatted_s(:rfc822)
95
95
  end
96
96
 
97
97
  it "should skip closed days even if work scheduled to closed day" do
98
- @hours.calculate_deadline(2*60*60, "Dec 25, 2010 11:45 AM").should == Time.parse_rfc822("Dec 26, 2010 11:00 AM")
98
+ @hours.calculate_deadline(2*60*60, "Dec 25, 2010 11:45 AM").should == Time.zone.parse("Dec 26, 2010 11:00 AM").to_formatted_s(:rfc822)
99
99
  end
100
100
 
101
101
  end
@@ -108,7 +108,7 @@ describe OpeningHours do
108
108
  end
109
109
 
110
110
  it "should skip closed days" do
111
- @hours.calculate_deadline(2*60*60, "Dec 24, 2010 2:45 PM").should == Time.parse_rfc822("Dec 27, 2010 10:45 AM")
111
+ @hours.calculate_deadline(2*60*60, "Dec 24, 2010 2:45 PM").should == Time.zone.parse("Dec 27, 2010 10:45 AM").to_formatted_s(:rfc822)
112
112
  end
113
113
  end
114
114
 
@@ -119,7 +119,7 @@ describe OpeningHours do
119
119
  end
120
120
 
121
121
  it "should spend open hours" do
122
- @hours.calculate_deadline(14*60*60, "Jun 3, 2010 9:00 AM").should == Time.parse_rfc822("Jun 5, 2010 10:00 AM")
122
+ @hours.calculate_deadline(14*60*60, "Jun 3, 2010 9:00 AM").should == Time.zone.parse("Jun 5, 2010 10:00 AM").to_formatted_s(:rfc822)
123
123
  end
124
124
 
125
125
  end
@@ -131,11 +131,11 @@ describe OpeningHours do
131
131
  end
132
132
 
133
133
  it "should spend open hours" do
134
- @hours.calculate_deadline(12*60*60, "Dec 23, 2010 9:00 AM").should == Time.parse_rfc822("Dec 25, 2010 10:00 AM")
134
+ @hours.calculate_deadline(12*60*60, "Dec 23, 2010 9:00 AM").should == Time.zone.parse("Dec 25, 2010 10:00 AM").to_formatted_s(:rfc822)
135
135
  end
136
136
 
137
137
  it "should spend open hours if started at the day" do
138
- @hours.calculate_deadline(6*60*60, "Dec 24, 2010 12:00 PM").should == Time.parse_rfc822("Dec 25, 2010 2:00 PM")
138
+ @hours.calculate_deadline(6*60*60, "Dec 24, 2010 12:00 PM").should == Time.zone.parse("Dec 25, 2010 2:00 PM").to_formatted_s(:rfc822)
139
139
  end
140
140
 
141
141
  end
@@ -150,29 +150,32 @@ describe OpeningHours do
150
150
  end
151
151
 
152
152
  it "should pass test #1" do
153
- @hours.calculate_deadline(2*60*60, "Jun 7, 2010 9:10 AM").should == Time.parse_rfc822("Mon Jun 07 11:10:00 2010")
153
+ @hours.calculate_deadline(2*60*60, "Jun 7, 2010 9:10 AM").should == Time.zone.parse("Mon Jun 07 11:10:00 2010").to_formatted_s(:rfc822)
154
154
  end
155
155
 
156
156
  it "should pass test #2" do
157
- @hours.calculate_deadline(15*60, "Jun 8, 2010 2:48 PM").should == Time.parse_rfc822("Thu Jun 10 09:03:00 2010")
157
+ @hours.calculate_deadline(15*60, "Jun 8, 2010 2:48 PM").should == Time.zone.parse("Thu Jun 10 09:03:00 2010").to_formatted_s(:rfc822)
158
158
  end
159
159
 
160
160
  it "should pass test #3" do
161
- @hours.calculate_deadline(7*60*60, "Dec 24, 2010 6:45 AM").should == Time.parse_rfc822("Mon Dec 27 11:00:00 2010")
161
+ @hours.calculate_deadline(7*60*60, "Dec 24, 2010 6:45 AM").should == Time.zone.parse("Mon Dec 27 11:00:00 2010").to_formatted_s(:rfc822)
162
162
  end
163
163
 
164
164
  end
165
165
 
166
166
  context "timezone checks" do
167
167
  before do
168
- Time.zone = "Moscow"
169
- @hours = OpeningHours.new("9:00 AM", "3:00 PM", "Moscow")
168
+ @hours = OpeningHours.new("9:00 AM", "3:00 PM", "Europe/Moscow")
170
169
  end
171
170
 
172
171
  it "should spend open hours in the right time zone" do
173
172
  @hours.calculate_deadline(2*60*60, "Dec 23, 2010 9:00 AM").should == Time.zone.parse("Dec 23, 2010 11:00 AM").to_formatted_s(:rfc822)
174
173
  end
175
174
 
175
+ it "should spend open hours in the right time zone" do
176
+ @hours.calculate_deadline(2*60*60, "Dec 23, 2010 2:00 PM").should == Time.zone.parse("Dec 24, 2010 10:00 AM").to_formatted_s(:rfc822)
177
+ end
178
+
176
179
  it "should spend open hours in the right time zone" do
177
180
  @hours.calculate_deadline(4*60*60, "Dec 23, 2010 8:00 PM -0900").should == Time.zone.parse("Dec 24, 2010 01:00 PM").to_formatted_s(:rfc822)
178
181
  end
@@ -183,4 +186,15 @@ describe OpeningHours do
183
186
 
184
187
  end
185
188
 
189
+ context "check accessors" do
190
+ before do
191
+ @hours = OpeningHours.new("9:00 AM", "3:00 PM", "Europe/Moscow")
192
+ end
193
+
194
+ it "should respond to human readable times" do
195
+ @hours.week[:mon].open.to_human_readable_hours == "09:00 AM"
196
+ @hours.week[:mon].close.to_human_readable_hours == "03:00 PM"
197
+ end
198
+ end
199
+
186
200
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opening_hours
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: