business 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5c69d99c21ef0905de463bc82315c5f3829f6c23
4
- data.tar.gz: 2d333b66d2d26a1cd9664b7415033012ab898339
3
+ metadata.gz: ba9a77c99ec8b8d8d62ce8dd67e03cfbcadf3948
4
+ data.tar.gz: 0e9f3652c8bf6a17ec0200786a0fff9bb99f2a2a
5
5
  SHA512:
6
- metadata.gz: a020144ad1d875fe40df7dfd91d2cec5fe5623134921a40cc45669202bc0c76a43f98cde0f9cf1da3f8334eaabbb245823f8f542ac3a6985b3055b869e8c663e
7
- data.tar.gz: c0ce8a9993aad1a8be8378ae9bdeb77368979be818ca1cca84ccf9ed2eddd0ba2811c81d03dbdfb072da3134e63c9abe75ce9a7ff6e96138105f606439725db7
6
+ metadata.gz: c331e4584c468ff1760ef2d5e355355999eba3d5dbda0ce4ce172072be71e28b7dc98a279163b6b25c47b5aee4fc50a0ef3fabb6cbc47ccfc3b3442fdd7a8685
7
+ data.tar.gz: 625fd8b80ae09a43a4196477560997299f440fa3ddd1f2f6c77ee044c97ea472c8e8dfddba4ecee5ae8e0cea75aaa7f18d025ec51193f9946280f4879c41c3c5
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 GoCardless
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,13 +1,100 @@
1
- # BankTime
1
+ # Business
2
2
 
3
- Date calculations based on bank calendars
3
+ Date calculations based on business calendars.
4
4
 
5
- ## Usage
5
+
6
+ ## But other libraries already do this
7
+
8
+ Another gem, business_time, also exists for this purpose. We previously used
9
+ business_time, but encountered several issues that prompted us to create
10
+ business.
11
+
12
+ Firstly, business_time works by monkey-patching `Date`, `Time`, and `FixNum`.
13
+ While this enables syntax like `Time.now + 1.business_day`, it means that all
14
+ configuration has to be global. GoCardless handles payments across multiple
15
+ geographies, so being able to work with multiple working-day calendars is
16
+ essential for us. Business provides a simple `Calendar` class, that is
17
+ initialized with a configuration that specifies which days of the week are
18
+ considered to be working days, and which dates are holidays.
19
+
20
+ Secondly, business_time supports calculations on times as well as dates. For
21
+ our purposes, date-based calculations are sufficient. Supporting time-based
22
+ calculations as well makes the code significantly more complex. We chose to
23
+ avoid this extra complexity by sticking solely to date-based mathematics.
24
+
25
+
26
+ ## Documentation
27
+
28
+ ### Getting started
29
+
30
+ Get stareted with business by creating an instance of the calendar class,
31
+ passing in a hash that specifies with days of the week are considered working
32
+ days, and which days are holidays.
33
+
34
+ ```ruby
35
+ calendar = Business::Calendar.new(
36
+ working_days: %w( mon tue wed thu fri ),
37
+ holidays: ["01/01/2014", "03/01/2014"]
38
+ )
39
+ ```
40
+
41
+ A few calendar configs are bundled with the gem. Load them by calling the
42
+ `load` class method on `Calendar`. The `load_cached` variant of this method
43
+ caches the calendars by name after loading them, to avoid reading and
44
+ parsing the config file multiple times.
45
+
46
+ ```ruby
47
+ calendar = Business::Calendar.load("weekdays")
48
+ calendar = Business::Calendar.load_cached("weekdays")
49
+ ```
50
+
51
+ ### Checking for business days
52
+
53
+ To check whether a given date is a business day (falls on one of the specified
54
+ working days, and is not a holiday), use the `business_day?` method on
55
+ `Calendar`.
56
+
57
+ ```ruby
58
+ calendar.business_day?(Date.parse("Monday, 9 June 2014"))
59
+ # => true
60
+ calendar.business_day?(Date.parse("Sunday, 8 June 2014"))
61
+ # => false
62
+ ```
63
+
64
+ ### Business day arithmetic
65
+
66
+ The `add_business_days` and `subtract_business_days` are used to perform
67
+ business day arithemtic on dates.
68
+
69
+ ```ruby
70
+ date = Date.parse("Thursday, 12 June 2014")
71
+ calendar.add_business_days(date, 4).strftime("%A, %d %B %Y")
72
+ # => "Wednesday, 18 June 2014"
73
+ calendar.subtract_business_days(date, 4).strftime("%A, %d %B %Y")
74
+ # => "Friday, 06 June 2014"
75
+ ```
76
+
77
+ The `roll_forward` and `roll_backward` methods snap a date to a nearby business
78
+ day. If provided with a business day, they will return that date. Otherwise,
79
+ they will advance (forward for `roll_forward` and backward for `roll_backward`)
80
+ until a business day is found.
81
+
82
+ ```ruby
83
+ date = Date.parse("Saturday, 14 June 2014")
84
+ calendar.roll_forward(date).strftime("%A, %d %B %Y")
85
+ # => "Monday, 16 June 2014"
86
+ calendar.roll_backward(date).strftime("%A, %d %B %Y")
87
+ # => "Friday, 13 June 2014"
88
+ ```
89
+
90
+ To count the number of business days between two dates, pass the dates to
91
+ `business_days_between`. This method counts from start of the first date to
92
+ start of the second date. So, assuming no holidays, there would be two business
93
+ days between a Monday and a Wednesday.
6
94
 
7
95
  ```ruby
8
- calendar = BankTime::Calendar.load('bacs')
9
- date = Date.parse("2013-10-18")
10
- calendar.add_business_days(date, 1)
11
- # => 2013-10-21
96
+ date = Date.parse("Saturday, 14 June 2014")
97
+ calendar.business_days_between(date, date + 7)
98
+ # => 5
12
99
  ```
13
100
 
data/business.gemspec CHANGED
@@ -8,9 +8,10 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Business::VERSION
9
9
  spec.authors = ["Harry Marr"]
10
10
  spec.email = ["engineering@gocardless.com"]
11
- spec.description = %q{Date calculations based on business calendars}
12
11
  spec.summary = %q{Date calculations based on business calendars}
12
+ spec.description = %q{Date calculations based on business calendars}
13
13
  spec.homepage = "https://github.com/gocardless/business"
14
+ spec.licenses = ["MIT"]
14
15
 
15
16
  spec.files = `git ls-files`.split($/)
16
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -18,5 +19,5 @@ Gem::Specification.new do |spec|
18
19
  spec.require_paths = ["lib"]
19
20
 
20
21
  spec.add_development_dependency "bundler", "~> 1.3"
21
- spec.add_development_dependency "rspec", "~> 2.14.1"
22
+ spec.add_development_dependency "rspec", "~> 3.0"
22
23
  end
@@ -6,7 +6,7 @@ module Business
6
6
  path = File.join(File.dirname(__FILE__), 'data', "#{calendar}.yml")
7
7
  raise "No such calendar '#{calendar}'" unless File.exists?(path)
8
8
  yaml = YAML.load_file(path)
9
- self.new(holidays: yaml['holidays'], business_days: yaml['business_days'])
9
+ self.new(holidays: yaml['holidays'], working_days: yaml['working_days'])
10
10
  end
11
11
 
12
12
  @lock = Mutex.new
@@ -22,18 +22,18 @@ module Business
22
22
 
23
23
  DAY_NAMES = %( mon tue wed thu fri sat sun )
24
24
 
25
- attr_reader :business_days, :holidays
25
+ attr_reader :working_days, :holidays
26
26
 
27
27
  def initialize(config)
28
- set_business_days(config[:business_days])
28
+ set_working_days(config[:working_days])
29
29
  set_holidays(config[:holidays])
30
30
  end
31
31
 
32
- # Return true if the date given is a business day (typically that means a
32
+ # Return true if the date given is a business day (typically that meanss a
33
33
  # non-weekend day) and not a holiday.
34
34
  def business_day?(date)
35
35
  date = date.to_date
36
- return false unless business_days.include?(date.strftime('%a').downcase)
36
+ return false unless working_days.include?(date.strftime('%a').downcase)
37
37
  return false if holidays.include?(date)
38
38
  true
39
39
  end
@@ -114,13 +114,13 @@ module Business
114
114
  num_full_weeks, remaining_days = (date2 - date1).to_i.divmod(7)
115
115
 
116
116
  # First estimate for full week range based on # biz days in a week
117
- num_biz_days = num_full_weeks * business_days.length
117
+ num_biz_days = num_full_weeks * working_days.length
118
118
 
119
119
  full_weeks_range = (date1...(date2 - remaining_days))
120
120
  num_biz_days -= holidays.count do |holiday|
121
121
  in_range = full_weeks_range.cover?(holiday)
122
122
  # Only pick a holiday if its on a working day (e.g., not a weekend)
123
- on_biz_day = business_days.include?(holiday.strftime('%a').downcase)
123
+ on_biz_day = working_days.include?(holiday.strftime('%a').downcase)
124
124
  in_range && on_biz_day
125
125
  end
126
126
 
@@ -133,9 +133,9 @@ module Business
133
133
  date.is_a?(Date) ? 1 : 3600 * 24
134
134
  end
135
135
 
136
- # Internal method for assigning business days from a calendar config.
137
- def set_business_days(business_days)
138
- @business_days = (business_days || default_business_days).map do |day|
136
+ # Internal method for assigning working days from a calendar config.
137
+ def set_working_days(working_days)
138
+ @working_days = (working_days || default_working_days).map do |day|
139
139
  day.downcase.strip[0..2].tap do |normalised_day|
140
140
  raise "Invalid day #{day}" unless DAY_NAMES.include?(normalised_day)
141
141
  end
@@ -147,8 +147,8 @@ module Business
147
147
  @holidays = (holidays || []).map { |holiday| Date.parse(holiday) }
148
148
  end
149
149
 
150
- # If no business days are provided in the calendar config, these are used.
151
- def default_business_days
150
+ # If no working days are provided in the calendar config, these are used.
151
+ def default_working_days
152
152
  %w( mon tue wed thu fri )
153
153
  end
154
154
  end
@@ -1,4 +1,4 @@
1
- business_days:
1
+ working_days:
2
2
  - monday
3
3
  - tuesday
4
4
  - wednesday
@@ -1,4 +1,4 @@
1
- business_days:
1
+ working_days:
2
2
  - monday
3
3
  - tuesday
4
4
  - wednesday
@@ -1,4 +1,4 @@
1
- business_days:
1
+ working_days:
2
2
  - monday
3
3
  - tuesday
4
4
  - wednesday
@@ -1,3 +1,3 @@
1
1
  module Business
2
- VERSION = "0.1.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -7,51 +7,51 @@ describe Business::Calendar do
7
7
  subject { Business::Calendar.load("weekdays") }
8
8
 
9
9
  it "loads the yaml file" do
10
- YAML.should_receive(:load_file) do |path|
11
- path.should match(/weekdays\.yml$/)
12
- end.and_return({})
10
+ expect(YAML).to receive(:load_file) { |path|
11
+ expect(path).to match(/weekdays\.yml$/)
12
+ }.and_return({})
13
13
  subject
14
14
  end
15
15
 
16
- it { should be_a Business::Calendar }
16
+ it { is_expected.to be_a Business::Calendar }
17
17
  end
18
18
 
19
19
  context "when given an invalid calendar" do
20
20
  subject { Business::Calendar.load("invalid-calendar") }
21
- specify { ->{ subject }.should raise_error }
21
+ specify { expect{ subject }.to raise_error }
22
22
  end
23
23
  end
24
24
 
25
- describe "#set_business_days" do
25
+ describe "#set_working_days" do
26
26
  let(:calendar) { Business::Calendar.new({}) }
27
- let(:business_days) { [] }
28
- subject { calendar.set_business_days(business_days) }
27
+ let(:working_days) { [] }
28
+ subject { calendar.set_working_days(working_days) }
29
29
 
30
- context "when given valid business days" do
31
- let(:business_days) { %w( mon fri ) }
30
+ context "when given valid working days" do
31
+ let(:working_days) { %w( mon fri ) }
32
32
  before { subject }
33
33
 
34
34
  it "assigns them" do
35
- calendar.business_days.should == business_days
35
+ expect(calendar.working_days).to eq(working_days)
36
36
  end
37
37
 
38
38
  context "that are unnormalised" do
39
- let(:business_days) { %w( Monday Friday ) }
39
+ let(:working_days) { %w( Monday Friday ) }
40
40
  it "normalises them" do
41
- calendar.business_days.should == %w( mon fri )
41
+ expect(calendar.working_days).to eq(%w( mon fri ))
42
42
  end
43
43
  end
44
44
  end
45
45
 
46
46
  context "when given an invalid business day" do
47
- let(:business_days) { %w( Notaday ) }
48
- specify { ->{ subject }.should raise_exception }
47
+ let(:working_days) { %w( Notaday ) }
48
+ specify { expect{ subject }.to raise_exception }
49
49
  end
50
50
 
51
51
  context "when given nil" do
52
- let(:business_days) { nil }
52
+ let(:working_days) { nil }
53
53
  it "uses the default business days" do
54
- calendar.business_days.should == calendar.default_business_days
54
+ expect(calendar.working_days).to eq(calendar.default_working_days)
55
55
  end
56
56
  end
57
57
  end
@@ -65,16 +65,16 @@ describe Business::Calendar do
65
65
  context "when given valid business days" do
66
66
  let(:holidays) { ["1st Jan, 2013"] }
67
67
 
68
- it { should_not be_empty }
68
+ it { is_expected.not_to be_empty }
69
69
 
70
70
  it "converts them to Date objects" do
71
- subject.each { |h| h.should be_a Date }
71
+ subject.each { |h| expect(h).to be_a Date }
72
72
  end
73
73
  end
74
74
 
75
75
  context "when given nil" do
76
76
  let(:holidays) { nil }
77
- it { should be_empty }
77
+ it { is_expected.to be_empty }
78
78
  end
79
79
  end
80
80
 
@@ -90,17 +90,17 @@ describe Business::Calendar do
90
90
 
91
91
  context "when given a business day" do
92
92
  let(:day) { date_class.parse("9am, Wednesday 2nd Jan, 2013") }
93
- it { should be_true }
93
+ it { is_expected.to be_truthy }
94
94
  end
95
95
 
96
96
  context "when given a non-business day" do
97
97
  let(:day) { date_class.parse("9am, Saturday 5th Jan, 2013") }
98
- it { should be_false }
98
+ it { is_expected.to be_falsey }
99
99
  end
100
100
 
101
101
  context "when given a business day that is a holiday" do
102
102
  let(:day) { date_class.parse("9am, Tuesday 1st Jan, 2013") }
103
- it { should be_false }
103
+ it { is_expected.to be_falsey }
104
104
  end
105
105
  end
106
106
 
@@ -112,18 +112,18 @@ describe Business::Calendar do
112
112
 
113
113
  context "given a business day" do
114
114
  let(:date) { date_class.parse("Wednesday 2nd Jan, 2013") }
115
- it { should == date }
115
+ it { is_expected.to eq(date) }
116
116
  end
117
117
 
118
118
  context "given a non-business day" do
119
119
  context "with a business day following it" do
120
120
  let(:date) { date_class.parse("Tuesday 1st Jan, 2013") }
121
- it { should == date + day_interval }
121
+ it { is_expected.to eq(date + day_interval) }
122
122
  end
123
123
 
124
124
  context "followed by another non-business day" do
125
125
  let(:date) { date_class.parse("Saturday 5th Jan, 2013") }
126
- it { should == date + 2 * day_interval }
126
+ it { is_expected.to eq(date + 2 * day_interval) }
127
127
  end
128
128
  end
129
129
  end
@@ -136,18 +136,18 @@ describe Business::Calendar do
136
136
 
137
137
  context "given a business day" do
138
138
  let(:date) { date_class.parse("Wednesday 2nd Jan, 2013") }
139
- it { should == date }
139
+ it { is_expected.to eq(date) }
140
140
  end
141
141
 
142
142
  context "given a non-business day" do
143
143
  context "with a business day preceeding it" do
144
144
  let(:date) { date_class.parse("Tuesday 1st Jan, 2013") }
145
- it { should == date - day_interval }
145
+ it { is_expected.to eq(date - day_interval) }
146
146
  end
147
147
 
148
148
  context "preceeded by another non-business day" do
149
149
  let(:date) { date_class.parse("Sunday 6th Jan, 2013") }
150
- it { should == date - 2 * day_interval }
150
+ it { is_expected.to eq(date - 2 * day_interval) }
151
151
  end
152
152
  end
153
153
  end
@@ -160,18 +160,18 @@ describe Business::Calendar do
160
160
 
161
161
  context "given a business day" do
162
162
  let(:date) { date_class.parse("Wednesday 2nd Jan, 2013") }
163
- it { should == date + day_interval }
163
+ it { is_expected.to eq(date + day_interval) }
164
164
  end
165
165
 
166
166
  context "given a non-business day" do
167
167
  context "with a business day following it" do
168
168
  let(:date) { date_class.parse("Tuesday 1st Jan, 2013") }
169
- it { should == date + day_interval }
169
+ it { is_expected.to eq(date + day_interval) }
170
170
  end
171
171
 
172
172
  context "followed by another non-business day" do
173
173
  let(:date) { date_class.parse("Saturday 5th Jan, 2013") }
174
- it { should == date + 2 * day_interval }
174
+ it { is_expected.to eq(date + 2 * day_interval) }
175
175
  end
176
176
  end
177
177
  end
@@ -186,23 +186,23 @@ describe Business::Calendar do
186
186
  context "given a business day" do
187
187
  context "and a period that includes only business days" do
188
188
  let(:date) { date_class.parse("Wednesday 2nd Jan, 2013") }
189
- it { should == date + delta * day_interval }
189
+ it { is_expected.to eq(date + delta * day_interval) }
190
190
  end
191
191
 
192
192
  context "and a period that includes a weekend" do
193
193
  let(:date) { date_class.parse("Friday 4th Jan, 2013") }
194
- it { should == date + (delta + 2) * day_interval }
194
+ it { is_expected.to eq(date + (delta + 2) * day_interval) }
195
195
  end
196
196
 
197
197
  context "and a period that includes a holiday day" do
198
198
  let(:date) { date_class.parse("Monday 31st Dec, 2012") }
199
- it { should == date + (delta + 1) * day_interval }
199
+ it { is_expected.to eq(date + (delta + 1) * day_interval) }
200
200
  end
201
201
  end
202
202
 
203
203
  context "given a non-business day" do
204
204
  let(:date) { date_class.parse("Tuesday 1st Jan, 2013") }
205
- it { should == date + (delta + 1) * day_interval }
205
+ it { is_expected.to eq(date + (delta + 1) * day_interval) }
206
206
  end
207
207
  end
208
208
 
@@ -216,23 +216,23 @@ describe Business::Calendar do
216
216
  context "given a business day" do
217
217
  context "and a period that includes only business days" do
218
218
  let(:date) { date_class.parse("Wednesday 2nd Jan, 2013") }
219
- it { should == date - delta * day_interval }
219
+ it { is_expected.to eq(date - delta * day_interval) }
220
220
  end
221
221
 
222
222
  context "and a period that includes a weekend" do
223
223
  let(:date) { date_class.parse("Monday 31st Dec, 2012") }
224
- it { should == date - (delta + 2) * day_interval }
224
+ it { is_expected.to eq(date - (delta + 2) * day_interval) }
225
225
  end
226
226
 
227
227
  context "and a period that includes a holiday day" do
228
228
  let(:date) { date_class.parse("Friday 4th Jan, 2013") }
229
- it { should == date - (delta + 1) * day_interval }
229
+ it { is_expected.to eq(date - (delta + 1) * day_interval) }
230
230
  end
231
231
  end
232
232
 
233
233
  context "given a non-business day" do
234
234
  let(:date) { date_class.parse("Thursday 3rd Jan, 2013") }
235
- it { should == date - (delta + 1) * day_interval }
235
+ it { is_expected.to eq(date - (delta + 1) * day_interval) }
236
236
  end
237
237
  end
238
238
 
@@ -250,35 +250,35 @@ describe Business::Calendar do
250
250
  context "ending on a business day" do
251
251
  context "including only business days" do
252
252
  let(:date_2) { date_class.parse("Thu 5/6/2014") }
253
- it { should == 3 }
253
+ it { is_expected.to eq(3) }
254
254
  end
255
255
 
256
256
  context "including only business days & weekend days" do
257
257
  let(:date_2) { date_class.parse("Mon 9/6/2014") }
258
- it { should == 5 }
258
+ it { is_expected.to eq(5) }
259
259
  end
260
260
 
261
261
  context "including only business days & holidays" do
262
262
  let(:date_1) { date_class.parse("Mon 9/6/2014") }
263
263
  let(:date_2) { date_class.parse("Fri 13/6/2014") }
264
- it { should == 3 }
264
+ it { is_expected.to eq(3) }
265
265
  end
266
266
 
267
267
  context "including business, weekend days, and holidays" do
268
268
  let(:date_2) { date_class.parse("Fri 13/6/2014") }
269
- it { should == 8 }
269
+ it { is_expected.to eq(8) }
270
270
  end
271
271
  end
272
272
 
273
273
  context "ending on a weekend day" do
274
274
  context "including only business days & weekend days" do
275
275
  let(:date_2) { date_class.parse("Sun 8/6/2014") }
276
- it { should == 5 }
276
+ it { is_expected.to eq(5) }
277
277
  end
278
278
 
279
279
  context "including business, weekend days, and holidays" do
280
280
  let(:date_2) { date_class.parse("Sat 14/6/2014") }
281
- it { should == 9 }
281
+ it { is_expected.to eq(9) }
282
282
  end
283
283
  end
284
284
 
@@ -286,12 +286,12 @@ describe Business::Calendar do
286
286
  context "including only business days & holidays" do
287
287
  let(:date_1) { date_class.parse("Mon 9/6/2014") }
288
288
  let(:date_2) { date_class.parse("Thu 12/6/2014") }
289
- it { should == 3 }
289
+ it { is_expected.to eq(3) }
290
290
  end
291
291
 
292
292
  context "including business, weekend days, and holidays" do
293
293
  let(:date_2) { date_class.parse("Thu 12/6/2014") }
294
- it { should == 8 }
294
+ it { is_expected.to eq(8) }
295
295
  end
296
296
  end
297
297
  end
@@ -303,31 +303,31 @@ describe Business::Calendar do
303
303
 
304
304
  context "including only business days & weekend days" do
305
305
  let(:date_2) { date_class.parse("Mon 9/6/2014") }
306
- it { should == 0 }
306
+ it { is_expected.to eq(0) }
307
307
  end
308
308
 
309
309
  context "including business, weekend days, and holidays" do
310
310
  let(:date_2) { date_class.parse("Fri 13/6/2014") }
311
- it { should == 3 }
311
+ it { is_expected.to eq(3) }
312
312
  end
313
313
  end
314
314
 
315
315
  context "ending on a weekend day" do
316
316
  context "including only business days & weekend days" do
317
317
  let(:date_2) { date_class.parse("Sun 8/6/2014") }
318
- it { should == 0 }
318
+ it { is_expected.to eq(0) }
319
319
  end
320
320
 
321
321
  context "including business, weekend days, and holidays" do
322
322
  let(:date_2) { date_class.parse("Sat 14/6/2014") }
323
- it { should == 4 }
323
+ it { is_expected.to eq(4) }
324
324
  end
325
325
  end
326
326
 
327
327
  context "ending on a holiday" do
328
328
  context "including business, weekend days, and holidays" do
329
329
  let(:date_2) { date_class.parse("Thu 12/6/2014") }
330
- it { should == 3 }
330
+ it { is_expected.to eq(3) }
331
331
  end
332
332
  end
333
333
  end
@@ -339,19 +339,19 @@ describe Business::Calendar do
339
339
 
340
340
  context "including only business days & holidays" do
341
341
  let(:date_2) { date_class.parse("Fri 13/6/2014") }
342
- it { should == 0 }
342
+ it { is_expected.to eq(0) }
343
343
  end
344
344
 
345
345
  context "including business, weekend days, and holidays" do
346
346
  let(:date_2) { date_class.parse("Thu 19/6/2014") }
347
- it { should == 3 }
347
+ it { is_expected.to eq(3) }
348
348
  end
349
349
  end
350
350
 
351
351
  context "ending on a weekend day" do
352
352
  context "including business, weekend days, and holidays" do
353
353
  let(:date_2) { date_class.parse("Sun 15/6/2014") }
354
- it { should == 1 }
354
+ it { is_expected.to eq(1) }
355
355
  end
356
356
  end
357
357
 
@@ -359,12 +359,12 @@ describe Business::Calendar do
359
359
  context "including only business days & holidays" do
360
360
  let(:date_1) { date_class.parse("Wed 18/6/2014") }
361
361
  let(:date_2) { date_class.parse("Fri 20/6/2014") }
362
- it { should == 1 }
362
+ it { is_expected.to eq(1) }
363
363
  end
364
364
 
365
365
  context "including business, weekend days, and holidays" do
366
366
  let(:date_2) { date_class.parse("Wed 18/6/2014") }
367
- it { should == 3 }
367
+ it { is_expected.to eq(3) }
368
368
  end
369
369
  end
370
370
  end
@@ -373,12 +373,12 @@ describe Business::Calendar do
373
373
  context "for a range less than a week long" do
374
374
  let(:date_1) { date_class.parse("Thu 19/6/2014") }
375
375
  let(:date_2) { date_class.parse("Tue 24/6/2014") }
376
- it { should == 2 }
376
+ it { is_expected.to eq(2) }
377
377
  end
378
378
  context "for a range more than a week long" do
379
379
  let(:date_1) { date_class.parse("Mon 16/6/2014") }
380
380
  let(:date_2) { date_class.parse("Tue 24/6/2014") }
381
- it { should == 4 }
381
+ it { is_expected.to eq(4) }
382
382
  end
383
383
  end
384
384
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: business
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry Marr
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 2.14.1
33
+ version: '3.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: 2.14.1
40
+ version: '3.0'
41
41
  description: Date calculations based on business calendars
42
42
  email:
43
43
  - engineering@gocardless.com
@@ -47,6 +47,7 @@ extra_rdoc_files: []
47
47
  files:
48
48
  - .gitignore
49
49
  - Gemfile
50
+ - LICENSE
50
51
  - README.md
51
52
  - business.gemspec
52
53
  - lib/business.rb
@@ -57,7 +58,8 @@ files:
57
58
  - lib/business/version.rb
58
59
  - spec/calendar_spec.rb
59
60
  homepage: https://github.com/gocardless/business
60
- licenses: []
61
+ licenses:
62
+ - MIT
61
63
  metadata: {}
62
64
  post_install_message:
63
65
  rdoc_options: []