dateoperations 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3f19df6a25abae9ad889b538a8433e6d9042e11e
4
+ data.tar.gz: 840efdbbcf12b5890d2784614c6d0d36c6db6d91
5
+ SHA512:
6
+ metadata.gz: f60650e26a01faf2548077cd813bfb403d1b6de0d833e16d7c8a6844eb72e896192699ed98cf70ae994d523eb6d4ee12d8e640b5aeeca8b1eb3bfce219770bd9
7
+ data.tar.gz: 78f138ee77cdffb4a455c46999782cf042629b38a113e1111aec1919ddb2dfbb4fc88ba37c79e9d4861be63498650292e2213f12c3195dd4f33cdca230201738
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # DateOperations
2
+ Different date operations, primarily around business days; based on the [Holidays Gem](https://github.com/holidays/holidays).
3
+
4
+ ## Synopsis
5
+ DateOperations.[...]
6
+
7
+ ## Installation
8
+ Download the gem, then install it:
9
+
10
+ gem install dateoperations.gemspec
11
+
12
+ ## Examples
13
+ require 'dateoperations'
14
+ ...
15
+ DateOperations.country #=> :de
16
+ DateOperations.holiday?(Date.new(2016, 10, 3)) #=> true
17
+ DateOperations.country = :us #=> :us
18
+ DateOperations.holiday?(Date.new(2016, 10, 3)) # => false
19
+ DateOperations.country = :de #=> :de
20
+ DateOperations.number_of_business_days_between(Date.new(2016, 10, 1), Date.new(2016, 10, -1)) #=> 20
21
+ DateOperations.country = :au #=> :au
22
+ DateOperations.number_of_business_days_between(Date.new(2016, 10, 1), Date.new(2016, 10, -1)) #=> 21
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require 'rake/testtask'
2
+ require 'rubocop/rake_task'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = 'test/*_test.rb'
6
+ end
7
+
8
+ RuboCop::RakeTask.new
9
+
10
+ desc 'test'
11
+
12
+ task default: :test
13
+ task default: :rubocop
@@ -0,0 +1,40 @@
1
+ require 'date'
2
+ require 'holidays'
3
+
4
+ # Class: DateOperations -- Different date operations, primarily around business days
5
+ class DateOperations
6
+ @country = :de
7
+
8
+ class << self
9
+ attr_accessor :country
10
+ end
11
+
12
+ def self.week_days_between(start_date, end_date)
13
+ week_day_nbrs = (1..5)
14
+ (start_date..end_date).select { |w| week_day_nbrs.include?(w.wday) }
15
+ end
16
+
17
+ def self.number_of_week_days_between(start_date, end_date)
18
+ week_days = week_days_between(start_date, end_date)
19
+ week_days.length
20
+ end
21
+
22
+ def self.business_days_between(start_date, end_date)
23
+ week_days = week_days_between(start_date, end_date)
24
+ week_days.reject { |b| holiday?(b) }
25
+ end
26
+
27
+ def self.number_of_business_days_between(start_date, end_date)
28
+ business_days = business_days_between(start_date, end_date)
29
+ business_days.length
30
+ end
31
+
32
+ def self.weekend?(date)
33
+ date.saturday? || date.sunday?
34
+ end
35
+
36
+ def self.holiday?(date)
37
+ return false if Holidays.on(date, DateOperations.country, :informal).empty?
38
+ true
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative 'test_helper'
4
+
5
+ # Test class for Minitest Unit Tests for class DateOperations
6
+ class DateOperationsTest < Minitest::Test
7
+ def test_december_2016_has_22_week_days
8
+ d1 = Date.new(2016, 12, 1)
9
+ d2 = Date.new(2016, 12, -1)
10
+ assert_equal 22, DateOperations.number_of_week_days_between(d1, d2)
11
+ end
12
+
13
+ def test_december_2016_has_21_business_days
14
+ d1 = Date.new(2016, 12, 1)
15
+ d2 = Date.new(2016, 12, -1)
16
+ assert_equal 21, DateOperations.number_of_business_days_between(d1, d2)
17
+ end
18
+
19
+ def test_24th_of_december_2016_is_a_holiday
20
+ assert DateOperations.holiday?(Date.new(2016, 12, 24))
21
+ end
22
+
23
+ def test_23th_of_december_2016_is_not_a_holiday
24
+ assert !DateOperations.holiday?(Date.new(2016, 12, 23))
25
+ end
26
+
27
+ def test_11th_of_june_2016_is_weekend
28
+ assert DateOperations.weekend?(Date.new(2016, 6, 11))
29
+ end
30
+
31
+ def test_10th_of_june_2016_is_not_weekend
32
+ assert !DateOperations.weekend?(Date.new(2016, 6, 10))
33
+ end
34
+
35
+ def test_june_2016_has_22_week_days
36
+ d1 = Date.new(2016, 6, 1)
37
+ d2 = Date.new(2016, 6, 30)
38
+ assert_equal 22, DateOperations.number_of_week_days_between(d1, d2)
39
+ end
40
+
41
+ def test_startdate_greater_enddate_returns_0_week_days
42
+ d1 = Date.new(2016, 6, 1)
43
+ d2 = Date.new(2016, 6, 30)
44
+ assert_equal 0, DateOperations.number_of_week_days_between(d2, d1)
45
+ end
46
+ end
@@ -0,0 +1,8 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter '/test/'
4
+ end
5
+
6
+ require 'minitest/autorun'
7
+
8
+ require_relative '../lib/dateoperations'
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dateoperations
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael Schwarze
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-16 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Different date operations, primarily around business days.
14
+ email: michael@schwarze-web.de
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - README.md
20
+ - Rakefile
21
+ - lib/dateoperations.rb
22
+ - test/dateoperations_test.rb
23
+ - test/test_helper.rb
24
+ homepage: http://rubygems.org/gems/dateoperations
25
+ licenses:
26
+ - MIT
27
+ metadata: {}
28
+ post_install_message:
29
+ rdoc_options: []
30
+ require_paths:
31
+ - lib
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
37
+ required_rubygems_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 2.5.1
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Date Operations
48
+ test_files: []