holiday 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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in holiday.gemspec
4
+ gemspec
@@ -0,0 +1,80 @@
1
+ # Holiday
2
+
3
+ Holiday is a gem that lets you configure holidays for multiple countries with YAML.
4
+
5
+ ## Default Usage
6
+
7
+ First setup path to a YAML file and set the country code.
8
+
9
+ ```ruby
10
+
11
+ Holiday.yaml_file = "/path/to/yaml/holiday.yml"
12
+ Holiday.country = "US"
13
+
14
+ ```
15
+
16
+ You can query for dates
17
+
18
+ ```ruby
19
+
20
+ # Defaults to current year
21
+ Holiday.find("christmas")
22
+ Holiday.find("labour day")
23
+
24
+ ```
25
+
26
+ Or supply a year
27
+
28
+ ```ruby
29
+
30
+ # Can supply the year as optional argument
31
+ Holiday.find(:christmas, 2005)
32
+ Holiday.find(:thanksgiving, 1999)
33
+
34
+ ```
35
+
36
+ ## YAML
37
+
38
+ The YAML format for Holiday is as follows
39
+
40
+ ```yaml
41
+ holiday:
42
+ US:
43
+ christmas:
44
+ when: december 25th
45
+ as: christmas
46
+ halloween:
47
+ when: october 31st
48
+ as: halloween, all hallows eve
49
+ labor_day:
50
+ when: 1st monday in september
51
+ as: labor day, labour day
52
+ thanksgiving:
53
+ when: 4th thursday in november
54
+ as: thanksgiving, turkey day
55
+ ```
56
+
57
+ Holidays are scoped by country code. Each holiday needs both "when" and "as" keys. The "when" key can either be an exact
58
+ month and day, or the occurrence of the holiday in the given month. E.g., "1st monday in september".
59
+
60
+ The "as" key is used to identify holidays by alternate names and spellings. For instance, "thanksgiving" and "turkey day" should both
61
+ point to the 4th thursday in november.
62
+
63
+ ```ruby
64
+
65
+ Holiday.find("turkey day")
66
+ Holiday.find(:thanksgiving)
67
+
68
+ ```
69
+
70
+ ## Other methods
71
+
72
+ There are a few other methods that may be useful
73
+
74
+ ```ruby
75
+
76
+ Holiday.all # array containing all keys and alternate names of holidays from yaml file
77
+ Holiday.scan("a string containing a holiday by name, like christmas") # => christmas
78
+ Holiday::Query.find("all hallows eve") # => october 31st
79
+
80
+ ```
@@ -0,0 +1,14 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+
5
+ # Run the test with 'rake' or 'rake test'
6
+ desc 'Default: run hashed_attributes unit tests.'
7
+ task :default => :test
8
+
9
+ desc 'Test the hashed_attributes gem.'
10
+ Rake::TestTask.new(:test) do |t|
11
+ t.libs << 'lib' << 'test'
12
+ t.pattern = 'test/*_test.rb'
13
+ t.verbose = true
14
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "holiday/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "holiday"
7
+ s.version = Holiday::VERSION
8
+ s.authors = ["Sean Behan"]
9
+ s.email = ["bseanvt@gmail.com"]
10
+ s.homepage = "https://github.com/bseanvt/holiday"
11
+ s.summary = %q{Holiday is a gem that lets you configure holidays for any country using a simple YAML file format.}
12
+ s.description = %q{Holiday is a gem that lets you configure holidays for any country using a simple YAML file format.}
13
+
14
+ s.rubyforge_project = "holiday"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ s.add_runtime_dependency "activesupport" #, ">= 3.1.0"
24
+ end
@@ -0,0 +1,59 @@
1
+ require 'active_support/time'
2
+ require 'yaml'
3
+
4
+ require "#{File.dirname(__FILE__)}/holiday/builder"
5
+ require "#{File.dirname(__FILE__)}/holiday/parser"
6
+ require "#{File.dirname(__FILE__)}/holiday/query"
7
+
8
+ module Holiday
9
+ class << self
10
+ attr_accessor :yaml_file, :country
11
+
12
+ def find(holiday,year=nil)
13
+ year = year || Time.now.year
14
+
15
+ holiday = holiday.to_s
16
+ occurrs = Query.find(holiday)
17
+ parts = Parser.parse(occurrs)
18
+
19
+ date = if parts.kind_of?(Hash)
20
+ d = Date.parse("#{parts[:month]} 1 #{year}")
21
+ weeks = (d.beginning_of_month..d.end_of_month).group_by{|d| d.wday}
22
+ weeks[parts[:wday]][parts[:occurrence]-1]
23
+ else
24
+ Date.parse([parts, year].join(" "))
25
+ end
26
+ end
27
+
28
+ # Returns all holidays
29
+ def all
30
+ Builder.build.keys
31
+ end
32
+
33
+ # holiday = Holiday.all.map { |h| string.scan(h) }.uniq.flatten # return match
34
+ def scan(string)
35
+ all.map{ |h| string.scan(h) }.uniq.flatten.join
36
+ end
37
+
38
+ def include?(holiday)
39
+ all.keys.include?(holiday)
40
+ end
41
+
42
+ def yaml
43
+ @yaml ||= YAML.load_file(yaml_file)["holiday"]
44
+ end
45
+
46
+ def holidays
47
+ yaml[country].keys
48
+ end
49
+
50
+ def country_holidays
51
+ yaml[country]
52
+ end
53
+
54
+ # TODO add method missing to allow for methods like...
55
+ # Holiday.christmas_2005
56
+ # Holiday.thanksgiving(1999)
57
+ # Holiday.third_thursday_in_march(2005)
58
+ end
59
+ end
@@ -0,0 +1,18 @@
1
+ holiday:
2
+ US:
3
+ christmas:
4
+ when: december 25th
5
+ as: christmas
6
+ halloween:
7
+ when: october 31st
8
+ as: halloween, all hallows eve
9
+ labor_day:
10
+ when: 1st monday in september
11
+ as: labor day, labour day
12
+ thanksgiving:
13
+ when: 4th thursday in november
14
+ as: thanksgiving, turkey day
15
+ CA:
16
+ christmas:
17
+ when: december 25th
18
+ as: christmas, noël
@@ -0,0 +1,18 @@
1
+ module Holiday
2
+ # Sets up a container for holidays based on keys and alternative holiday names from yaml file.
3
+ class Builder
4
+ class << self
5
+ def build
6
+ return @container if defined?(@container)
7
+ @container = {}
8
+ Holiday.holidays.each do |holiday|
9
+ Holiday.country_holidays[holiday]["as"].split(",").each do |other|
10
+ @container[holiday] = holiday # yaml key should be looked against as well
11
+ @container[other.strip] = holiday # natural name, labour day, is a key
12
+ end
13
+ end
14
+ @container
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,41 @@
1
+ module Holiday
2
+ # Extracts the relevant information from strings
3
+ class Parser
4
+ class << self
5
+ def parse(string)
6
+ if string =~ /in/
7
+ w,m,o = weekday(string), month(string), occurrence(string)
8
+ d = wday(w)
9
+
10
+ { :weekday => w, :wday => d, :month => m, :occurrence => o }
11
+ else
12
+ string
13
+ end
14
+ end
15
+
16
+ def weekday(string)
17
+ (string.split(' ').map(&:downcase) & weekdays).join
18
+ end
19
+
20
+ def month(string)
21
+ (string.split(' ').map(&:downcase) & months).join
22
+ end
23
+
24
+ def occurrence(string)
25
+ string.scan(/\d/).join.to_i
26
+ end
27
+
28
+ def wday(which)
29
+ weekdays.index(which)
30
+ end
31
+
32
+ def weekdays
33
+ %W(sunday monday tuesday wednesday thursday friday saturday)
34
+ end
35
+
36
+ def months
37
+ %W(january february march april may june july august september october november december)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,11 @@
1
+ module Holiday
2
+ # Query finds when a holiday occurrs
3
+ class Query
4
+ class << self
5
+ def find(holiday)
6
+ key = Builder.build[holiday]
7
+ Holiday.country_holidays[key]["when"] # => 1st monday in september
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Holiday
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require "#{File.dirname(__FILE__)}/../lib/holiday"
@@ -0,0 +1,18 @@
1
+ holiday:
2
+ US:
3
+ christmas:
4
+ when: december 25th
5
+ as: christmas
6
+ halloween:
7
+ when: october 31st
8
+ as: halloween, all hallows eve
9
+ labor_day:
10
+ when: 1st monday in september
11
+ as: labor day, labour day
12
+ thanksgiving:
13
+ when: 4th thursday in november
14
+ as: thanksgiving, turkey day
15
+ CA:
16
+ christmas:
17
+ when: december 25th
18
+ as: christmas, noël
@@ -0,0 +1,16 @@
1
+ require 'helper.rb'
2
+
3
+ class HolidayTest < Test::Unit::TestCase
4
+ def setup
5
+ Holiday.yaml_file = "#{File.dirname(__FILE__)}/holiday.yml"
6
+ Holiday.country = "US"
7
+ end
8
+
9
+ def test_builder
10
+ assert Holiday::Builder.build
11
+ assert_kind_of Hash, Holiday::Builder.build
12
+
13
+ assert_equal "halloween", Holiday::Builder.build["all hallows eve"]
14
+ assert_equal "labor_day", Holiday::Builder.build["labour day"]
15
+ end
16
+ end
@@ -0,0 +1,41 @@
1
+ require 'helper.rb'
2
+
3
+ class HolidayTest < Test::Unit::TestCase
4
+ def setup
5
+ Holiday.yaml_file = "#{File.dirname(__FILE__)}/holiday.yml"
6
+ Holiday.country = "US"
7
+ end
8
+
9
+ def test_parser_parse
10
+ assert_kind_of Hash, Holiday::Parser.parse("1st monday in june")
11
+ parts = {:weekday => "thursday", :occurrence => 2, :month => "october", :wday=>4}
12
+ assert_equal parts, Holiday::Parser.parse("2nd thursday in october"), Holiday::Parser.parse('2nd thursday in october')
13
+ assert_equal "december 25th", Holiday::Parser.parse("december 25th")
14
+ end
15
+
16
+ def test_parser_wday
17
+ assert_equal 0, Holiday::Parser.wday("sunday")
18
+ assert_equal 1, Holiday::Parser.wday("monday")
19
+ assert_equal 2, Holiday::Parser.wday("tuesday")
20
+ assert_equal 3, Holiday::Parser.wday("wednesday")
21
+ assert_equal 4, Holiday::Parser.wday("thursday")
22
+ assert_equal 5, Holiday::Parser.wday("friday")
23
+ assert_equal 6, Holiday::Parser.wday("saturday")
24
+ end
25
+
26
+ def test_parser_weekday
27
+ assert_equal "monday", Holiday::Parser.weekday("today is monday")
28
+ assert_equal "friday", Holiday::Parser.weekday("thank goodness it's Friday")
29
+ end
30
+
31
+ def test_parser_month
32
+ assert_equal "january", Holiday::Parser.month("january is the first month of the year")
33
+ assert_equal "october", Holiday::Parser.month("halloween is a holiday that occurrs in october")
34
+ assert_equal "december", Holiday::Parser.month("christmas is in December")
35
+ end
36
+
37
+ def test_parser_occurrence
38
+ assert_equal 1, Holiday::Parser.occurrence("i'm looking for the number 1")
39
+ assert_equal 4, Holiday::Parser.occurrence("i love the 4th of july")
40
+ end
41
+ end
@@ -0,0 +1,16 @@
1
+ require 'helper.rb'
2
+
3
+ class HolidayTest < Test::Unit::TestCase
4
+ def setup
5
+ Holiday.yaml_file = "#{File.dirname(__FILE__)}/holiday.yml"
6
+ Holiday.country = "US"
7
+ end
8
+
9
+ def test_query
10
+ assert_kind_of String, Holiday::Query.find("christmas")
11
+ assert_equal "december 25th", Holiday::Query.find("christmas")
12
+ assert_equal "october 31st", Holiday::Query.find("all hallows eve"), Holiday::Query.find("all hallows eve")
13
+ assert_equal "1st monday in september", Holiday::Query.find("labour day"), Holiday::Query.find("labour day")
14
+ assert_equal Holiday::Query.find("labour day"), Holiday::Query.find("labor_day"), Holiday::Query.find("labour day")
15
+ end
16
+ end
@@ -0,0 +1,53 @@
1
+ require 'helper.rb'
2
+
3
+ class HolidayTest < Test::Unit::TestCase
4
+ def setup
5
+ Holiday.yaml_file = "#{File.dirname(__FILE__)}/holiday.yml"
6
+ Holiday.country = "US"
7
+ end
8
+
9
+ def test_config
10
+ assert "holiday.yml", Holiday.yaml_file
11
+ assert "US", Holiday.country
12
+ end
13
+
14
+ def test_yaml_file_loaded
15
+ assert_kind_of Hash, Holiday.yaml
16
+ end
17
+
18
+ def test_country_holidays
19
+ assert Holiday.holidays.include?("christmas"), Holiday.holidays.join(" ")
20
+ assert Holiday.holidays.include?("labor_day"), Holiday.holidays.join(" ")
21
+
22
+ Holiday.country = "CA"
23
+ assert_equal "CA", Holiday.country
24
+ assert Holiday.holidays.include?("christmas")
25
+ assert !Holiday.holidays.include?("labor_day")
26
+ end
27
+
28
+ def test_scan_string
29
+ assert_equal "labour day", Holiday.scan("labour day 2009"), Holiday.scan("hello labour day world")
30
+ assert_equal "turkey day", Holiday.scan("turkey day 2007"), Holiday.scan("turkey day 2007")
31
+ assert_equal false, Holiday.scan("octoberfest 1990").present?, Holiday.scan("octoberfest 1990")
32
+ end
33
+
34
+ def test_holiday_find
35
+ assert_kind_of Date, Holiday.find(:christmas, 2005)
36
+
37
+ # by keys and by alternate names
38
+ assert_equal "2005-12-25", Holiday.find(:christmas, 2005).to_s # symbol
39
+ assert_equal "2005-12-25", Holiday.find("christmas", 2005).to_s # or string
40
+ assert_equal "2004-09-06", Holiday.find("labor_day", 2004).to_s
41
+ assert_equal "2004-09-06", Holiday.find("labor day", 2004).to_s
42
+ assert_equal "2004-09-06", Holiday.find("labour day", 2004).to_s
43
+ assert_equal "1999-11-25", Holiday.find("thanksgiving", 1999).to_s
44
+ assert_equal "1999-11-25", Holiday.find("turkey day", 1999).to_s
45
+
46
+ end
47
+
48
+ def test_year_defaults_to_this_year
49
+ # defaults to current year
50
+ assert_equal "#{Time.now.year}-12-25", Holiday.find("christmas").to_s
51
+ assert_equal "#{Time.now.year}-11-24", Holiday.find("thanksgiving").to_s
52
+ end
53
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: holiday
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Behan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &70225950789700 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70225950789700
25
+ description: Holiday is a gem that lets you configure holidays for any country using
26
+ a simple YAML file format.
27
+ email:
28
+ - bseanvt@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - .gitignore
34
+ - Gemfile
35
+ - README.md
36
+ - Rakefile
37
+ - holiday.gemspec
38
+ - lib/holiday.rb
39
+ - lib/holiday.yml
40
+ - lib/holiday/builder.rb
41
+ - lib/holiday/parser.rb
42
+ - lib/holiday/query.rb
43
+ - lib/holiday/version.rb
44
+ - test/helper.rb
45
+ - test/holiday.yml
46
+ - test/holiday_builder_test.rb
47
+ - test/holiday_parser_test.rb
48
+ - test/holiday_query_test.rb
49
+ - test/holiday_test.rb
50
+ homepage: https://github.com/bseanvt/holiday
51
+ licenses: []
52
+ post_install_message:
53
+ rdoc_options: []
54
+ require_paths:
55
+ - lib
56
+ required_ruby_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubyforge_project: holiday
70
+ rubygems_version: 1.8.7
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Holiday is a gem that lets you configure holidays for any country using a
74
+ simple YAML file format.
75
+ test_files:
76
+ - test/helper.rb
77
+ - test/holiday.yml
78
+ - test/holiday_builder_test.rb
79
+ - test/holiday_parser_test.rb
80
+ - test/holiday_query_test.rb
81
+ - test/holiday_test.rb