nextday 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .yardoc
6
+ doc/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in nextday.gemspec
4
+ gemspec
5
+
6
+ gem 'rake'
7
+
8
+ require 'rbconfig'
9
+
10
+ if RbConfig::CONFIG['target_os'] =~ /darwin/i
11
+ gem 'rb-fsevent', '>= 0.4.0', :require => false
12
+ gem 'growl_notify', :require => false
13
+ gem 'guard', '~> 0.6.0', :require => false
14
+ gem 'guard-rspec', '~> 0.4.0', :require => false
15
+ end
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard 'rspec', :version => 2 do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^spec/support/.+\.rb$}) { "spec/" }
4
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
5
+ watch('spec/spec_helper.rb') { "spec/" }
6
+ end
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Nextday
2
+
3
+ Finds the Next Working Day even if holidays are in the way.
4
+
5
+ Extends ```Date``` to allow you to find the next working day
6
+
7
+ Nextday only checks for English public holidays at the moment, I aim to extend it to support locales in the near future.
8
+
9
+ ## Usage
10
+
11
+ ```ruby
12
+ Date.today.next_working_day
13
+ ```
14
+
15
+ To use this with ```DateTime``` and ```Time``` convert to ```Date``` first, for instance.
16
+
17
+ ```ruby
18
+ Time.now.to_date.next_working_day
19
+ DateTime.new(2030,11,30).to_date.next_working_day
20
+ ```
21
+
22
+
23
+ ## Installation
24
+
25
+ To use with bundler just add nextday to your gem file.
26
+
27
+ ```ruby
28
+ gem 'nextday'
29
+ ```
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ class Date
2
+ include Nextday::DateExtension
3
+ end
@@ -0,0 +1,59 @@
1
+ module Nextday
2
+
3
+ module DateExtension
4
+ ##
5
+ # The next working day after the current date
6
+ #
7
+ # @return [Date] Next Working Day
8
+ def next_working_day
9
+ next_day = self + 1
10
+
11
+ # keep going until the next day is a working day
12
+ while !next_day.working_day?
13
+ next_day = next_day + 1
14
+ end
15
+
16
+ next_day
17
+ end
18
+
19
+ ##
20
+ # Is the current date a working day?
21
+ #
22
+ # @return [Boolean]
23
+ def working_day?
24
+ !weekend? and !public_holiday?
25
+ end
26
+
27
+ ##
28
+ # Is the current date a public holiday?
29
+ #
30
+ # @return [Boolean]
31
+ def public_holiday?
32
+ Holidays.dates.include?(self)
33
+ end
34
+
35
+ ##
36
+ # Is the current date on the weekend?
37
+ #
38
+ # @return [Boolean]
39
+ def weekend?
40
+ saturday? or sunday?
41
+ end
42
+
43
+ ##
44
+ # Is the current date a saturday?
45
+ #
46
+ # @return [Boolean]
47
+ def saturday?
48
+ self.wday == 6
49
+ end if RUBY_VERSION < '1.9'
50
+
51
+ ##
52
+ # Is the current date a saturday?
53
+ #
54
+ # @return [Boolean]
55
+ def sunday?
56
+ self.wday == 0
57
+ end if RUBY_VERSION < '1.9'
58
+ end
59
+ end
@@ -0,0 +1,11 @@
1
+ module Nextday
2
+ class Holiday
3
+
4
+ attr_reader :name, :date
5
+
6
+ def initialize(name, date)
7
+ @name = name
8
+ @date = date
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ require 'singleton'
2
+
3
+ module Nextday
4
+
5
+ class Holidays
6
+ include Enumerable
7
+ include Singleton
8
+
9
+ def initialize
10
+ @holidays = PUBLIC_HOLIDAYS
11
+ end
12
+
13
+ def each(&block)
14
+ @holidays.each{|holiday| block.call(holiday)}
15
+ end
16
+
17
+ ##
18
+ # Returning all the dates holidays occur
19
+ #
20
+ # @return [Array] of holidays as [Date] objects
21
+ def self.dates
22
+ instance.map(&:date)
23
+ end
24
+
25
+ ##
26
+ # Find the first holiday for the supplied date
27
+ # @param [Date] format the format type, `:text` or `:html`
28
+ # @return [Holiday] the first matching holiday for the supplied date
29
+ def self.find(date)
30
+ instance.find{ |holiday| holiday.date == date }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,62 @@
1
+ module Nextday
2
+ ##
3
+ # Bank and public holidays in England and Wales
4
+ # Includes substitute days if holiday lands on a weekend
5
+ # http://www.direct.gov.uk/en/Employment/Employees/Timeoffandholidays/DG_073741
6
+ #
7
+ # Be careful when adding new holidays, please specify the date as '1' not '01'
8
+ #
9
+ BANK_AND_PUBLIC_HOLIDAYS_ENGLAND_AND_WALES = [
10
+ Holiday.new("Spring Bank Holiday", Date.new(2011, 5, 30)),
11
+ Holiday.new("Spring Bank Holiday", Date.new(2012, 6, 4)),
12
+ Holiday.new("Spring Bank Holiday", Date.new(2013, 5, 27)),
13
+ Holiday.new("Spring Bank Holiday", Date.new(2014, 5, 26)),
14
+ Holiday.new("Spring Bank Holiday", Date.new(2015, 5, 25)),
15
+
16
+ Holiday.new("Early May Bank Holiday", Date.new(2011, 5, 2)),
17
+ Holiday.new("Early May Bank Holiday", Date.new(2012, 5, 7)),
18
+ Holiday.new("Early May Bank Holiday", Date.new(2013, 5, 6)),
19
+ Holiday.new("Early May Bank Holiday", Date.new(2014, 5, 5)),
20
+ Holiday.new("Early May Bank Holiday", Date.new(2015, 5, 4)),
21
+
22
+ Holiday.new("Queen's Diamond Jubilee", Date.new(2012, 6, 5)),
23
+
24
+ Holiday.new("Good Friday", Date.new(2011, 4, 22)),
25
+ Holiday.new("Good Friday", Date.new(2012, 4, 06)),
26
+ Holiday.new("Good Friday", Date.new(2013, 3, 29)),
27
+ Holiday.new("Good Friday", Date.new(2014, 4, 18)),
28
+ Holiday.new("Good Friday", Date.new(2015, 4, 3)),
29
+
30
+ Holiday.new("Summer Bank Holiday", Date.new(2011, 8, 29)),
31
+ Holiday.new("Summer Bank Holiday", Date.new(2012, 8, 27)),
32
+ Holiday.new("Summer Bank Holiday", Date.new(2013, 8, 26)),
33
+ Holiday.new("Summer Bank Holiday", Date.new(2014, 8, 25)),
34
+ Holiday.new("Summer Bank Holiday", Date.new(2015, 8, 31)),
35
+
36
+ Holiday.new("New Year's Day", Date.new(2011, 1, 3)),
37
+ Holiday.new("New Year's Day", Date.new(2012, 1, 2)),
38
+ Holiday.new("New Year's Day", Date.new(2013, 1, 1)),
39
+ Holiday.new("New Year's Day", Date.new(2014, 1, 1)),
40
+ Holiday.new("New Year's Day", Date.new(2015, 1, 1)),
41
+
42
+ Holiday.new("Christmas Day", Date.new(2011, 12, 26)),
43
+ Holiday.new("Christmas Day", Date.new(2012, 12, 25)),
44
+ Holiday.new("Christmas Day", Date.new(2013, 12, 25)),
45
+ Holiday.new("Christmas Day", Date.new(2014, 12, 25)),
46
+ Holiday.new("Christmas Day", Date.new(2015, 12, 25)),
47
+
48
+ Holiday.new("Easter Monday", Date.new(2011, 4, 25)),
49
+ Holiday.new("Easter Monday", Date.new(2012, 4, 9)),
50
+ Holiday.new("Easter Monday", Date.new(2013, 4, 1)),
51
+ Holiday.new("Easter Monday", Date.new(2014, 4, 21)),
52
+ Holiday.new("Easter Monday", Date.new(2015, 4, 6)),
53
+
54
+ Holiday.new("Boxing Day", Date.new(2011, 12, 27)),
55
+ Holiday.new("Boxing Day", Date.new(2012, 12, 26)),
56
+ Holiday.new("Boxing Day", Date.new(2013, 12, 26)),
57
+ Holiday.new("Boxing Day", Date.new(2014, 12, 26)),
58
+ Holiday.new("Boxing Day", Date.new(2015, 12, 28))
59
+ ]
60
+
61
+ PUBLIC_HOLIDAYS = BANK_AND_PUBLIC_HOLIDAYS_ENGLAND_AND_WALES
62
+ end
@@ -0,0 +1,3 @@
1
+ module Nextday
2
+ VERSION = "0.0.1"
3
+ end
data/lib/nextday.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "nextday/version"
2
+ require "nextday/holiday"
3
+ require "nextday/public_holidays"
4
+ require "nextday/holidays"
5
+
6
+ require "nextday/date_extension"
7
+ require "nextday/core_ext/date"
data/nextday.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "nextday/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "nextday"
7
+ s.version = Nextday::VERSION
8
+ s.authors = ["Robert Williams"]
9
+ s.email = ["rob@r-williams.com"]
10
+ s.homepage = "https://github.com/robwilliams/nextday"
11
+ s.summary = %q{Finds the Next Working Day even if holidays are in the way.}
12
+ s.description = %q{
13
+ Finds the Next Working Day even if holidays are in the way.
14
+ Extends Date with a .next_working_day instance method.
15
+ }
16
+
17
+ s.rubyforge_project = "nextday"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+
24
+ # specify any dependencies here; for example:
25
+ s.add_development_dependency('rspec', '~> 2.6.0')
26
+ s.add_development_dependency('yard')
27
+ # s.add_runtime_dependency "rest-client"
28
+ end
@@ -0,0 +1,52 @@
1
+ require_relative '../../../spec_helper.rb'
2
+
3
+ describe Date do
4
+
5
+ describe "#working_day?" do
6
+
7
+ describe "on a saturday" do
8
+ it {
9
+ saturdays.each { |date| date.should_not be_a_working_day }
10
+ }
11
+ end
12
+
13
+ describe "on a sunday" do
14
+ it {
15
+ sundays.each { |date| date.should_not be_a_working_day }
16
+ }
17
+ end
18
+
19
+ describe "on a public holiday" do
20
+ it {
21
+ Nextday::Holidays.dates.each { |date| date.should_not be_a_working_day }
22
+ }
23
+ end
24
+ end
25
+
26
+ describe "#next_working_day" do
27
+
28
+ subject {Date.today.next_working_day}
29
+
30
+ it {should be_kind_of(Date)}
31
+ it {should_not eql(Date.today)}
32
+ it {should be_a_working_day }
33
+
34
+ describe "on a saturday" do
35
+ it {
36
+ saturdays.each { |date| date.next_working_day.should be_a_working_day }
37
+ }
38
+ end
39
+
40
+ describe "on a sunday" do
41
+ it {
42
+ sundays.each { |date| date.next_working_day.should be_a_working_day }
43
+ }
44
+ end
45
+
46
+ describe "on a public holiday" do
47
+ it {
48
+ Nextday::Holidays.dates.each { |date| date.next_working_day.should be_a_working_day }
49
+ }
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,9 @@
1
+ require_relative '../../spec_helper.rb'
2
+
3
+ describe Nextday::Holiday do
4
+
5
+ subject { Nextday::Holiday.new("Christmas Day", Date.new(2012, 12, 25)) }
6
+
7
+ it { subject.name.should eql("Christmas Day")}
8
+ it { subject.date.should eql(Date.new(2012, 12, 25))}
9
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../spec_helper.rb'
2
+
3
+ describe Nextday::Holidays do
4
+
5
+ describe "#find" do
6
+
7
+ Nextday::Holidays.dates.each do |date|
8
+ describe "when the date is a holiday (#{date})" do
9
+ subject {Nextday::Holidays.find(date)}
10
+
11
+ it { should be_kind_of(Nextday::Holiday) }
12
+ it { subject.date.should eql(date) }
13
+ end
14
+ end
15
+ end
16
+
17
+ describe "#dates" do
18
+
19
+ subject { Nextday::Holidays.dates }
20
+
21
+ it { should be_kind_of(Array) }
22
+ it { subject.should have_at_least(1).holiday }
23
+ it { subject.each {|date| date.should be_a_kind_of(Date)} }
24
+ end
25
+ end
@@ -0,0 +1,23 @@
1
+ require 'nextday'
2
+
3
+ def weekends
4
+ saturdays + sundays
5
+ end
6
+
7
+ def saturdays
8
+ today = Date.today
9
+
10
+ today += 1 while (today.wday != 6) # step forward until it's saturday
11
+ saturday = today
12
+
13
+ saturday.step(saturday + 365, 7).to_a
14
+ end
15
+
16
+ def sundays
17
+ today = Date.today
18
+
19
+ today += 1 while (today.wday != 0) # step forward until it's sunday
20
+ sunday = today
21
+
22
+ sunday.step(sunday + 365, 7).to_a
23
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nextday
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Robert Williams
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-01 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2151822900 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.6.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2151822900
25
+ - !ruby/object:Gem::Dependency
26
+ name: yard
27
+ requirement: &2152545660 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2152545660
36
+ description: ! "\n Finds the Next Working Day even if holidays are in the way.\n
37
+ \ Extends Date with a .next_working_day instance method.\n "
38
+ email:
39
+ - rob@r-williams.com
40
+ executables: []
41
+ extensions: []
42
+ extra_rdoc_files: []
43
+ files:
44
+ - .gitignore
45
+ - .rspec
46
+ - Gemfile
47
+ - Guardfile
48
+ - README.md
49
+ - Rakefile
50
+ - lib/nextday.rb
51
+ - lib/nextday/core_ext/date.rb
52
+ - lib/nextday/date_extension.rb
53
+ - lib/nextday/holiday.rb
54
+ - lib/nextday/holidays.rb
55
+ - lib/nextday/public_holidays.rb
56
+ - lib/nextday/version.rb
57
+ - nextday.gemspec
58
+ - spec/lib/nextday/core_ext/date_spec.rb
59
+ - spec/lib/nextday/holiday_spec.rb
60
+ - spec/lib/nextday/holidays_spec.rb
61
+ - spec/spec_helper.rb
62
+ homepage: https://github.com/robwilliams/nextday
63
+ licenses: []
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project: nextday
82
+ rubygems_version: 1.8.10
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Finds the Next Working Day even if holidays are in the way.
86
+ test_files:
87
+ - spec/lib/nextday/core_ext/date_spec.rb
88
+ - spec/lib/nextday/holiday_spec.rb
89
+ - spec/lib/nextday/holidays_spec.rb
90
+ - spec/spec_helper.rb