russian_workdays 1.4.0 → 2.0.0

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,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+
5
+ module RussianWorkdays
6
+ DATES = YAML.load_file(File.join(__dir__, "dates.yml")).freeze
7
+
8
+ class Day
9
+ def initialize(date)
10
+ @date = date
11
+ raise ArgumentError, "Must be a Date object" unless @date.is_a?(::Date)
12
+ raise ArgumentError, "Data missing for that year" unless DATES.key?(@date.year)
13
+ end
14
+
15
+ def holiday?
16
+ !preholiday? && (weekend? || DATES[@date.year][:holidays].include?(@date))
17
+ end
18
+
19
+ def preholiday?
20
+ DATES[@date.year][:preholidays].include?(@date)
21
+ end
22
+
23
+ def work?
24
+ !holiday?
25
+ end
26
+
27
+ def type
28
+ return :holiday if holiday?
29
+ return :preholiday if preholiday?
30
+ return :work if work?
31
+ end
32
+
33
+ private
34
+
35
+ def weekend?
36
+ @date.sunday? || @date.saturday?
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "collection_preset"
4
+
5
+ module RussianWorkdays
6
+ class Month < CollectionPreset
7
+ def initialize(year = Date.today.year, month = 1)
8
+ raise ArgumentError, "Must be a number between 1 and 12" unless (1..12).include?(month)
9
+ @dates = Collection.new(Date.new(year, month, 1)..Date.new(year, month, -1))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RussianWorkdays
4
+ VERSION = "2.0.0".freeze
5
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "collection_preset"
4
+
5
+ module RussianWorkdays
6
+ class Year < CollectionPreset
7
+ def initialize(year = Date.today.year)
8
+ @dates = Collection.new(Date.new(year, 1, 1)..Date.new(year, 12, -1))
9
+ end
10
+ end
11
+ end
@@ -1,36 +1,6 @@
1
- require 'yaml'
1
+ # frozen_string_literal: true
2
2
 
3
- class RussianWorkdays
4
- class << self
5
- %w(holiday short).each do |method|
6
- define_method("#{method}?") do |date|
7
- raise ArgumentError.new('Argument must be Date object') unless date.is_a?(Date)
8
- dates[date.year][method].include?(date)
9
- end
10
-
11
- define_method("#{method}s") do |year|
12
- has_data_for_year?(year)
13
- dates[year][method]
14
- end
15
- end
16
-
17
- def work?(date)
18
- raise ArgumentError unless date.is_a?(Date)
19
- !holidays(date.year).include?(date) && !shorts(date.year).include?(date)
20
- end
21
-
22
- def works(year)
23
- has_data_for_year?(year)
24
- (Date.new(year, 1, 1)..Date.new(year, 12, 31)).to_a - holidays(year) - shorts(year)
25
- end
26
-
27
- private
28
- def has_data_for_year?(year)
29
- raise ArgumentError.new('Data missing for that year') unless dates.keys.include?(year)
30
- end
31
-
32
- def dates
33
- @@dates ||= YAML.load_file(File.expand_path('../russian_workdays/dates.yml', __FILE__))
34
- end
35
- end
36
- end
3
+ require_relative "russian_workdays/collection"
4
+ require_relative "russian_workdays/day"
5
+ require_relative "russian_workdays/month"
6
+ require_relative "russian_workdays/year"
@@ -1,23 +1,24 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
 
5
6
  Gem::Specification.new do |spec|
6
- spec.name = 'russian_workdays'
7
- spec.version = '1.4.0'
8
- spec.authors = ['heckfy']
9
- spec.email = ['heckfyoz@gmail.com']
10
- spec.summary = 'Russian workdays'
11
- spec.description = 'Производственный календарь РФ'
12
- spec.homepage = 'https://github.com/heckfy/russian_workdays'
13
- spec.license = 'MIT'
7
+ spec.name = "russian_workdays"
8
+ spec.version = "2.0.0"
9
+ spec.authors = ["heckfy"]
10
+ spec.email = ["heckfyoz@gmail.com"]
11
+ spec.summary = "Russian workdays"
12
+ spec.description = "Производственный календарь РФ"
13
+ spec.homepage = "https://github.com/heckfy/russian_workdays"
14
+ spec.license = "MIT"
14
15
 
15
16
  spec.files = `git ls-files -z`.split("\x0")
16
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
- spec.require_paths = ['lib']
19
+ spec.require_paths = ["lib"]
19
20
 
20
- spec.add_development_dependency 'bundler', '~> 1.6'
21
- spec.add_development_dependency 'rake'
22
- spec.add_development_dependency 'rspec'
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
23
24
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe RussianWorkdays::Collection do
6
+ before(:all) do
7
+ @collection = RussianWorkdays::Collection.new((Date.new(2014, 1, 1)..Date.new(2014, 12, -1)))
8
+ @holidays = %w[2014-01-01 2014-03-22 2014-07-12 2014-09-06 2014-10-26 2014-12-28]
9
+ @preholidays = %w[2014-02-24 2014-03-07 2014-04-30 2014-05-08 2014-06-11 2014-12-31]
10
+ @works = %w[2014-01-09 2014-02-03 2014-05-27 2014-07-22 2014-11-11 2014-12-30]
11
+ end
12
+
13
+ it "should return the right preholiday days" do
14
+ preholidays = @collection.preholidays.map(&:to_s)
15
+ expect(preholidays).to eq(@preholidays)
16
+ end
17
+
18
+ it "should return the right holydays" do
19
+ holidays = @collection.holidays.map(&:to_s)
20
+ expect(holidays).to include(*@holidays)
21
+ end
22
+
23
+ it "should return the right preholiday works" do
24
+ works = @collection.works.map(&:to_s)
25
+ expect(works).to include(*@works)
26
+ end
27
+ end
data/spec/day_spec.rb ADDED
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+ require "date"
5
+
6
+ describe RussianWorkdays::Year do
7
+ before(:all) do
8
+ @year = RussianWorkdays::Year.new(2014)
9
+ @holidays = %w[2014-05-01 2014-05-02 2014-05-03 2014-05-04]
10
+ @preholidays = %w[2014-02-24 2014-03-07 2014-04-30 2014-05-08 2014-06-11 2014-12-31]
11
+ @works = %w[2014-05-05 2014-05-06 2014-05-06]
12
+ end
13
+
14
+ it "should return true if date is preholiday day" do
15
+ @preholidays.each do |date|
16
+ expect(RussianWorkdays::Day.new(Date.parse(date)).preholiday?).to eq(true)
17
+ end
18
+ end
19
+
20
+ it "should return true if date is holiday day" do
21
+ @holidays.each do |date|
22
+ expect(RussianWorkdays::Day.new(Date.parse(date)).holiday?).to eq(true)
23
+ end
24
+ end
25
+
26
+ it "should return true if date is work day" do
27
+ @works.each do |date|
28
+ expect(RussianWorkdays::Day.new(Date.parse(date)).work?).to eq(true)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe RussianWorkdays::Month do
6
+ before(:all) do
7
+ @month = RussianWorkdays::Month.new(2014, 5)
8
+ @holidays = %w[2014-05-01 2014-05-02 2014-05-03 2014-05-04]
9
+ @preholidays = %w[2014-05-08]
10
+ @works = %w[2014-05-05 2014-05-06 2014-05-06]
11
+ end
12
+
13
+ it "should return the right preholiday days" do
14
+ preholidays = @month.preholidays.map(&:to_s)
15
+ expect(preholidays).to eq(@preholidays)
16
+ end
17
+
18
+ it "should return the right holydays" do
19
+ holidays = @month.holidays.map(&:to_s)
20
+ expect(holidays).to include(*@holidays)
21
+ end
22
+
23
+ it "should return the right preholiday works" do
24
+ works = @month.works.map(&:to_s)
25
+ expect(works).to include(*@works)
26
+ end
27
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
- require 'bundler/setup'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/setup"
2
4
  Bundler.setup
3
5
 
4
- require 'russian_workdays'
6
+ require "russian_workdays"
data/spec/year_spec.rb ADDED
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ describe RussianWorkdays::Year do
6
+ before(:all) do
7
+ @year = RussianWorkdays::Year.new(2014)
8
+ @holidays = %w[2014-05-01 2014-05-02 2014-05-03 2014-05-04]
9
+ @preholidays = %w[2014-02-24 2014-03-07 2014-04-30 2014-05-08 2014-06-11 2014-12-31]
10
+ @works = %w[2014-05-05 2014-05-06 2014-05-06]
11
+ end
12
+
13
+ it "should return the right preholiday days" do
14
+ preholidays = @year.preholidays.map(&:to_s)
15
+ expect(preholidays).to eq(@preholidays)
16
+ end
17
+
18
+ it "should return the right holydays" do
19
+ holidays = @year.holidays.map(&:to_s)
20
+ expect(holidays).to include(*@holidays)
21
+ end
22
+
23
+ it "should return the right preholiday works" do
24
+ works = @year.works.map(&:to_s)
25
+ expect(works).to include(*@works)
26
+ end
27
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: russian_workdays
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - heckfy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-28 00:00:00.000000000 Z
11
+ date: 2019-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -68,10 +68,19 @@ files:
68
68
  - README.md
69
69
  - Rakefile
70
70
  - lib/russian_workdays.rb
71
+ - lib/russian_workdays/collection.rb
72
+ - lib/russian_workdays/collection_preset.rb
71
73
  - lib/russian_workdays/dates.yml
74
+ - lib/russian_workdays/day.rb
75
+ - lib/russian_workdays/month.rb
76
+ - lib/russian_workdays/version.rb
77
+ - lib/russian_workdays/year.rb
72
78
  - russian_workdays.gemspec
73
- - spec/russian_workdays_spec.rb
79
+ - spec/collection_spec.rb
80
+ - spec/day_spec.rb
81
+ - spec/month_spec.rb
74
82
  - spec/spec_helper.rb
83
+ - spec/year_spec.rb
75
84
  homepage: https://github.com/heckfy/russian_workdays
76
85
  licenses:
77
86
  - MIT
@@ -96,5 +105,8 @@ signing_key:
96
105
  specification_version: 4
97
106
  summary: Russian workdays
98
107
  test_files:
99
- - spec/russian_workdays_spec.rb
108
+ - spec/collection_spec.rb
109
+ - spec/day_spec.rb
110
+ - spec/month_spec.rb
100
111
  - spec/spec_helper.rb
112
+ - spec/year_spec.rb
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe RussianWorkdays do
4
- before(:all) do
5
- @shorts = %w(2014-02-24 2014-03-07 2014-04-30 2014-05-08 2014-06-11 2014-12-31)
6
- @holidays = %w(2014-01-01 2014-03-22 2014-07-12 2014-09-06 2014-10-26 2014-12-28)
7
- @works = %w(2014-01-09 2014-02-03 2014-05-27 2014-07-22 2014-11-11 2014-12-30)
8
- end
9
-
10
- it 'should return the right short days' do
11
- expect(RussianWorkdays.shorts(2014).map(&:to_s)).to eq(@shorts)
12
- end
13
-
14
- it 'should return the right holydays' do
15
- expect(RussianWorkdays.holidays(2014).map(&:to_s)).to include(*@holidays)
16
- end
17
-
18
- it 'should return the right short works' do
19
- expect(RussianWorkdays.works(2014).map(&:to_s)).to include(*@works)
20
- end
21
-
22
- it 'should return true if date is short day' do
23
- @shorts.each do |date|
24
- expect(RussianWorkdays.short?(Date.parse(date))).to eq(true)
25
- end
26
- end
27
-
28
- it 'should return true if date is holiday day' do
29
- @holidays.each do |date|
30
- expect(RussianWorkdays.holiday?(Date.parse(date))).to eq(true)
31
- end
32
- end
33
-
34
- it 'should return true if date is work day' do
35
- @works.each do |date|
36
- expect(RussianWorkdays.work?(Date.parse(date))).to eq(true)
37
- end
38
- end
39
- end