Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/nextday.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
require 'date'
require 'time'
require 'json'
require 'uri'
require 'open-uri'

require "nextday/version"
require "nextday/exceptions"
require "nextday/config"

require "nextday/holiday"
Expand Down
3 changes: 2 additions & 1 deletion lib/nextday/date_extension.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ def delivery_day
def cut_off_time
hour, minute = Config.cut_off_hour, Config.cut_off_minute

Time.new(year, month, day, hour, minute)
utc_offset = self.utc_offset unless not self.respond_to?(:utc_offset)
Time.new(year, month, day, hour, minute, 0, utc_offset)
end

##
Expand Down
3 changes: 3 additions & 0 deletions lib/nextday/exceptions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module Nextday
class Error < StandardError; end
end
12 changes: 6 additions & 6 deletions lib/nextday/holidays.rb
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
require 'singleton'

module Nextday

class Holidays
include Enumerable
include Singleton

def initialize
@holidays = PUBLIC_HOLIDAYS
@holidays = PublicHolidays.new.fetch
end

def each(&block)
@holidays.each{|holiday| block.call(holiday)}
end

##
# Returning all the dates holidays occur
#
# @return [Array] of holidays as [Date] objects
def self.dates
instance.map(&:date)
end

##
# Find the first holiday for the supplied date
# @param [Date] format the format type, `:text` or `:html`
Expand Down
89 changes: 28 additions & 61 deletions lib/nextday/public_holidays.rb
Original file line number Diff line number Diff line change
@@ -1,62 +1,29 @@
module Nextday
##
# Bank and public holidays in England and Wales
# Includes substitute days if holiday lands on a weekend
# http://www.direct.gov.uk/en/Employment/Employees/Timeoffandholidays/DG_073741
#
# Be careful when adding new holidays, please specify the date as '1' not '01'
#
BANK_AND_PUBLIC_HOLIDAYS_ENGLAND_AND_WALES = [
Holiday.new("Spring Bank Holiday", Date.new(2011, 5, 30)),
Holiday.new("Spring Bank Holiday", Date.new(2012, 6, 4)),
Holiday.new("Spring Bank Holiday", Date.new(2013, 5, 27)),
Holiday.new("Spring Bank Holiday", Date.new(2014, 5, 26)),
Holiday.new("Spring Bank Holiday", Date.new(2015, 5, 25)),

Holiday.new("Early May Bank Holiday", Date.new(2011, 5, 2)),
Holiday.new("Early May Bank Holiday", Date.new(2012, 5, 7)),
Holiday.new("Early May Bank Holiday", Date.new(2013, 5, 6)),
Holiday.new("Early May Bank Holiday", Date.new(2014, 5, 5)),
Holiday.new("Early May Bank Holiday", Date.new(2015, 5, 4)),

Holiday.new("Queen's Diamond Jubilee", Date.new(2012, 6, 5)),

Holiday.new("Good Friday", Date.new(2011, 4, 22)),
Holiday.new("Good Friday", Date.new(2012, 4, 06)),
Holiday.new("Good Friday", Date.new(2013, 3, 29)),
Holiday.new("Good Friday", Date.new(2014, 4, 18)),
Holiday.new("Good Friday", Date.new(2015, 4, 3)),

Holiday.new("Summer Bank Holiday", Date.new(2011, 8, 29)),
Holiday.new("Summer Bank Holiday", Date.new(2012, 8, 27)),
Holiday.new("Summer Bank Holiday", Date.new(2013, 8, 26)),
Holiday.new("Summer Bank Holiday", Date.new(2014, 8, 25)),
Holiday.new("Summer Bank Holiday", Date.new(2015, 8, 31)),

Holiday.new("New Year's Day", Date.new(2011, 1, 3)),
Holiday.new("New Year's Day", Date.new(2012, 1, 2)),
Holiday.new("New Year's Day", Date.new(2013, 1, 1)),
Holiday.new("New Year's Day", Date.new(2014, 1, 1)),
Holiday.new("New Year's Day", Date.new(2015, 1, 1)),

Holiday.new("Christmas Day", Date.new(2011, 12, 26)),
Holiday.new("Christmas Day", Date.new(2012, 12, 25)),
Holiday.new("Christmas Day", Date.new(2013, 12, 25)),
Holiday.new("Christmas Day", Date.new(2014, 12, 25)),
Holiday.new("Christmas Day", Date.new(2015, 12, 25)),

Holiday.new("Easter Monday", Date.new(2011, 4, 25)),
Holiday.new("Easter Monday", Date.new(2012, 4, 9)),
Holiday.new("Easter Monday", Date.new(2013, 4, 1)),
Holiday.new("Easter Monday", Date.new(2014, 4, 21)),
Holiday.new("Easter Monday", Date.new(2015, 4, 6)),

Holiday.new("Boxing Day", Date.new(2011, 12, 27)),
Holiday.new("Boxing Day", Date.new(2012, 12, 26)),
Holiday.new("Boxing Day", Date.new(2013, 12, 26)),
Holiday.new("Boxing Day", Date.new(2014, 12, 26)),
Holiday.new("Boxing Day", Date.new(2015, 12, 28))
]

PUBLIC_HOLIDAYS = BANK_AND_PUBLIC_HOLIDAYS_ENGLAND_AND_WALES
end
class PublicHolidays
attr_reader :raw_data

BASE_URL = 'https://www.gov.uk/bank-holidays.json'
DEFAULT_DIVISION = 'england-and-wales'

def initialize
@raw_data = ::JSON.parse(::URI.parse(BASE_URL).read)
rescue OpenURI::HTTPError, JSON::ParserError
raise Nextday::Error, 'Unable to load any public holidays.'
end

def fetch
@data ||= parse(DEFAULT_DIVISION)
end

private
def parse(division)
div = @raw_data[division]
raise Error, "Unable to find division #{division}" unless div
raise Error, "Unable to find events for division #{division}" unless div['events']

div['events'].map { |e|
Holiday.new(e['title'], Date.parse(e['date']))
}
end
end
end
2 changes: 1 addition & 1 deletion lib/nextday/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module Nextday
VERSION = "0.4.0"
VERSION = "0.5.0"
end