dateoperations 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []