russian_workdays 2.5.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77d756d31ba85d4d09a36690b10855a72b6ec9cc1f50d4ad4d3e8632ee1ce95e
4
- data.tar.gz: 1feec99816452ec603ad8ad93602817cc67c4b2ea5e27facb0fd3b1bde83f2c4
3
+ metadata.gz: 202f95e7558fdf25ad74f1c2b22af5802bb0e2c44c51a6522f262127a7a13179
4
+ data.tar.gz: e025d8cd63eb3c63f8b34d6209c1470fce148f4f5af64155399777e9244f4563
5
5
  SHA512:
6
- metadata.gz: e03ac919260e654a9154cf9ed37818bd57a3d3c2826dfcfb9254884a8d36c37e3cc3f4546da77d6ea8c596ad949e34539ee6c17fc39c50811ce3a8857511a356
7
- data.tar.gz: e844e85e0756b30015aaba2fdf4172cee586809005e871a11aa6c697a0063b73b76ee922f4f93d5cf25aab5dfb3ca6502608d072780c6fefc978edcd38ce955b
6
+ metadata.gz: d2d0c957efda7da66731790c28931ae96d693089dbb1ce4a0c810b6e37f026e06ab1b98351762199eb76207a36a789694b2385c24226c653297cede860b9ad28
7
+ data.tar.gz: 7a96dfcaebb479bfe423121ba739178897b5ddf7a8f1309d5a40169f0dcfe8cf9e2d4f862b42dc48168b1302b41fb2c957740ca96a69b58ccd5915a0bd9cc960
data/.rubocop.yml CHANGED
@@ -1,155 +1,8 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.5
3
- # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
4
- # to ignore them, so only the ones explicitly set in this file are enabled.
5
- DisabledByDefault: true
6
-
7
- # Prefer &&/|| over and/or.
8
- Style/AndOr:
9
- Enabled: true
10
-
11
- # Do not use braces for hash literals when they are the last argument of a
12
- # method call.
13
- Style/BracesAroundHashParameters:
14
- Enabled: true
15
- EnforcedStyle: context_dependent
16
-
17
- # Align `when` with `case`.
18
- Layout/CaseIndentation:
19
- Enabled: true
20
-
21
- # Align comments with method definitions.
22
- Layout/CommentIndentation:
23
- Enabled: true
24
-
25
- Layout/ElseAlignment:
26
- Enabled: true
27
-
28
- # Align `end` with the matching keyword or starting expression except for
29
- # assignments, where it should be aligned with the LHS.
30
- Layout/EndAlignment:
31
- Enabled: true
32
- EnforcedStyleAlignWith: variable
33
- AutoCorrect: true
34
-
35
- Layout/EmptyLineAfterMagicComment:
36
- Enabled: true
37
-
38
- # In a regular class definition, no empty lines around the body.
39
- Layout/EmptyLinesAroundClassBody:
40
- Enabled: true
41
-
42
- # In a regular method definition, no empty lines around the body.
43
- Layout/EmptyLinesAroundMethodBody:
44
- Enabled: true
45
-
46
- # In a regular module definition, no empty lines around the body.
47
- Layout/EmptyLinesAroundModuleBody:
48
- Enabled: true
49
-
50
- Layout/FirstParameterIndentation:
51
- Enabled: true
52
-
53
- # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
54
- Style/HashSyntax:
55
- Enabled: true
56
-
57
- # Method definitions after `private` or `protected` isolated calls need one
58
- # extra level of indentation.
59
- Layout/IndentationConsistency:
60
- Enabled: true
61
- EnforcedStyle: rails
62
-
63
- # Two spaces, no tabs (for indentation).
64
- Layout/IndentationWidth:
65
- Enabled: true
66
-
67
- Layout/LeadingCommentSpace:
68
- Enabled: true
69
-
70
- Layout/SpaceAfterColon:
71
- Enabled: true
72
-
73
- Layout/SpaceAfterComma:
74
- Enabled: true
75
-
76
- Layout/SpaceAroundEqualsInParameterDefault:
77
- Enabled: true
78
-
79
- Layout/SpaceAroundKeyword:
80
- Enabled: true
81
-
82
- Layout/SpaceAroundOperators:
83
- Enabled: true
84
-
85
- Layout/SpaceBeforeComma:
86
- Enabled: true
87
-
88
- Layout/SpaceBeforeFirstArg:
89
- Enabled: true
90
-
91
- Style/DefWithParentheses:
92
- Enabled: true
93
-
94
- # Defining a method with parameters needs parentheses.
95
- Style/MethodDefParentheses:
96
- Enabled: true
97
-
98
- Style/FrozenStringLiteralComment:
99
- Enabled: true
100
- EnforcedStyle: always
101
-
102
- # Use `foo {}` not `foo{}`.
103
- Layout/SpaceBeforeBlockBraces:
104
- Enabled: true
105
-
106
- # Use `foo { bar }` not `foo {bar}`.
107
- Layout/SpaceInsideBlockBraces:
108
- Enabled: true
109
-
110
- # Use `{ a: 1 }` not `{a:1}`.
111
- Layout/SpaceInsideHashLiteralBraces:
112
- Enabled: true
113
-
114
- Layout/SpaceInsideParens:
115
- Enabled: true
116
-
117
- # Check quotes usage according to lint rule below.
118
- Style/StringLiterals:
119
- Enabled: true
120
- EnforcedStyle: double_quotes
121
-
122
- # Detect hard tabs, no hard tabs.
123
- Layout/Tab:
124
- Enabled: true
125
-
126
- # Blank lines should not have any spaces.
127
- Layout/TrailingBlankLines:
128
- Enabled: true
129
-
130
- # No trailing whitespace.
131
- Layout/TrailingWhitespace:
132
- Enabled: true
133
-
134
- # Use quotes for string literals when they are enough.
135
- Style/UnneededPercentQ:
136
- Enabled: true
137
-
138
- # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
139
- Lint/RequireParentheses:
140
- Enabled: true
141
-
142
- Lint/StringConversionInInterpolation:
143
- Enabled: true
144
-
145
- Style/RedundantReturn:
146
- Enabled: true
147
- AllowMultipleReturnValues: true
148
-
149
- Style/Semicolon:
150
- Enabled: true
151
- AllowAsExpressionSeparator: true
152
-
153
- # Prefer Foo.method over Foo::method
154
- Style/ColonMethodCall:
155
- Enabled: true
2
+ TargetRubyVersion: 2.6
3
+ Documentation:
4
+ Enabled: false
5
+ Lint/MissingSuper:
6
+ Enabled: false
7
+ Metrics/BlockLength:
8
+ AllowedMethods: ['describe', 'context']
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ ## [2.7.0] - 2025-02-03
2
+
3
+ - Исправлены ошибки данных для 2023 года
4
+ - Добавлены данные для 2024 года
5
+ - Добавлены данные для 2025 года
6
+ - Отрефакторен код гема
data/Gemfile CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
5
  gemspec
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
- require "rspec/core/rake_task"
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
5
 
6
6
  # Default directory to look in is `/specs`
7
7
  # Run with `rake spec`
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'russian_workdays'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -435,4 +435,71 @@
435
435
  :preholidays:
436
436
  - 2022-02-22
437
437
  - 2022-03-05
438
- - 2022-11-03
438
+ - 2022-11-03
439
+ ---
440
+ 2023:
441
+ :holidays:
442
+ - 2023-01-02
443
+ - 2023-01-03
444
+ - 2023-01-04
445
+ - 2023-01-05
446
+ - 2023-01-06
447
+ - 2023-02-23
448
+ - 2023-02-24
449
+ - 2023-03-08
450
+ - 2023-05-01
451
+ - 2023-05-08
452
+ - 2023-05-09
453
+ - 2023-06-12
454
+ - 2023-11-06
455
+ :preholidays:
456
+ - 2023-02-22
457
+ - 2023-03-07
458
+ - 2023-11-03
459
+ 2024:
460
+ :holidays:
461
+ - 2024-01-01
462
+ - 2024-01-02
463
+ - 2024-01-03
464
+ - 2024-01-04
465
+ - 2024-01-05
466
+ - 2024-01-08
467
+ - 2024-02-23
468
+ - 2024-03-08
469
+ - 2024-04-29
470
+ - 2024-04-30
471
+ - 2024-05-01
472
+ - 2024-05-09
473
+ - 2024-05-10
474
+ - 2024-06-12
475
+ - 2024-11-04
476
+ - 2024-12-30
477
+ - 2024-12-31
478
+ :preholidays:
479
+ - 2024-02-22
480
+ - 2024-03-07
481
+ - 2024-05-08
482
+ - 2024-06-11
483
+ - 2024-11-02
484
+ 2025:
485
+ :holidays:
486
+ - 2025-01-01
487
+ - 2025-01-02
488
+ - 2025-01-03
489
+ - 2025-01-06
490
+ - 2025-01-07
491
+ - 2025-01-08
492
+ - 2025-05-01
493
+ - 2025-05-02
494
+ - 2025-05-08
495
+ - 2025-05-09
496
+ - 2025-06-12
497
+ - 2025-06-13
498
+ - 2025-11-03
499
+ - 2025-11-04
500
+ - 2025-12-31
501
+ :preholidays:
502
+ - 2025-03-07
503
+ - 2025-04-30
504
+ - 2025-06-11
505
+ - 2025-11-01
@@ -3,32 +3,52 @@
3
3
  module RussianWorkdays
4
4
  class Collection
5
5
  include Enumerable
6
- AVAILABLE_WORK_HOURS_PER_WEEK = [24, 36, 40].freeze
6
+
7
+ WORK_HOURS_PER_DAY = {
8
+ 24 => 4.8,
9
+ 36 => 7.2,
10
+ 40 => 8.0
11
+ }.freeze
12
+
13
+ attr_reader :collection
7
14
 
8
15
  def initialize(collection)
9
- unless %w[Array Range].include? collection.class.name
10
- raise ArgumentError, "Must be a Array or Range object"
11
- end
12
- @collection = collection.to_a
16
+ raise ArgumentError, 'Must be a Array or Range object' unless [Array, Range].include?(collection.class)
17
+
18
+ collection.each { |date| raise MissingYearError, date.year unless DATES.key?(date.year) }
19
+
20
+ @collection = collection.map { |day| Day.new(day) }
13
21
  end
14
22
 
15
- def each
16
- @collection.each { |i| yield(i) }
23
+ def each(&block)
24
+ collection.each(&block)
17
25
  end
18
26
 
19
27
  %w[holiday preholiday work].each do |type|
20
28
  define_method "#{type}s" do
21
- @collection.select { |date| Day.new(date).send("#{type}?") }
29
+ collection.select { |day| day.send("#{type}?") }.map(&:to_date)
22
30
  end
23
31
  end
24
32
 
25
- def work_hours_count(work_hours_per_week = 40)
26
- unless AVAILABLE_WORK_HOURS_PER_WEEK.include?(work_hours_per_week)
27
- raise ArgumentError, "Unknown work hours count. Must be one of #{AVAILABLE_WORK_HOURS_PER_WEEK}"
33
+ def work_hours_count(work_hours_per_week = WORK_HOURS_PER_DAY.keys.last)
34
+ unless WORK_HOURS_PER_DAY.keys.include?(work_hours_per_week)
35
+ raise ArgumentError, "Unknown work hours count. Must be one of: #{WORK_HOURS_PER_DAY.keys.join(', ')}"
36
+ end
37
+
38
+ collection.sum { |day| calculate_work_hours(day, work_hours_per_week) }.ceil(1)
39
+ end
40
+
41
+ private
42
+
43
+ def calculate_work_hours(day, work_hours_per_week)
44
+ case day.type
45
+ when :work
46
+ WORK_HOURS_PER_DAY[work_hours_per_week]
47
+ when :preholiday
48
+ WORK_HOURS_PER_DAY[work_hours_per_week] - 1
49
+ else
50
+ 0
28
51
  end
29
- work_hours_per_day = (work_hours_per_week / 5.to_f)
30
- mapping = { work: work_hours_per_day, preholiday: work_hours_per_day - 1 }
31
- @collection.map { |i| mapping.fetch(Day.new(i).type, 0) }.sum.ceil(1)
32
52
  end
33
53
  end
34
54
  end
@@ -1,8 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "forwardable"
3
+ require 'forwardable'
4
4
 
5
- class CollectionPreset
6
- extend Forwardable
7
- def_delegators :@dates, :holidays, :preholidays, :works, :work_hours_count
5
+ module RussianWorkdays
6
+ class CollectionPreset
7
+ extend Forwardable
8
+ def_delegators :dates, :holidays, :preholidays, :works, :work_hours_count
9
+
10
+ private
11
+
12
+ def dates
13
+ Collection.new(range)
14
+ end
15
+ end
8
16
  end
@@ -1,23 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "yaml"
3
+ require_relative 'missing_year_error'
4
4
 
5
5
  module RussianWorkdays
6
- DATES = YAML.load_file(File.join(__dir__, "dates.yml")).freeze
7
-
8
6
  class Day
7
+ attr_reader :date
8
+
9
9
  def initialize(date)
10
+ raise ArgumentError, 'Must be a Date object' unless date.is_a?(::Date)
11
+ raise MissingYearError, date.year unless DATES.key?(date.year)
12
+
10
13
  @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
14
  end
14
15
 
15
16
  def holiday?
16
- !preholiday? && (weekend? || DATES[@date.year][:holidays].include?(@date))
17
+ return true if DATES[date.year][:holidays].include?(date)
18
+
19
+ !preholiday? && weekend?
17
20
  end
18
21
 
19
22
  def preholiday?
20
- DATES[@date.year][:preholidays].include?(@date)
23
+ DATES[date.year][:preholidays].include?(date)
21
24
  end
22
25
 
23
26
  def work?
@@ -27,13 +30,18 @@ module RussianWorkdays
27
30
  def type
28
31
  return :holiday if holiday?
29
32
  return :preholiday if preholiday?
30
- return :work if work?
33
+
34
+ :work if work?
35
+ end
36
+
37
+ def to_date
38
+ date
31
39
  end
32
40
 
33
41
  private
34
42
 
35
- def weekend?
36
- @date.sunday? || @date.saturday?
37
- end
43
+ def weekend?
44
+ date.sunday? || date.saturday?
45
+ end
38
46
  end
39
47
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RussianWorkdays
4
+ class MissingYearError < ArgumentError
5
+ attr_reader :year
6
+
7
+ def initialize(year)
8
+ super
9
+ @year = year
10
+ end
11
+
12
+ def to_s
13
+ "Data missing for that year: #{year}"
14
+ end
15
+ end
16
+ end
@@ -1,12 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "collection_preset"
3
+ require_relative 'missing_year_error'
4
+ require_relative 'collection_preset'
4
5
 
5
6
  module RussianWorkdays
6
7
  class Month < CollectionPreset
8
+ attr_reader :year, :month
9
+
7
10
  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))
11
+ raise MissingYearError, year unless DATES.key?(year)
12
+ raise ArgumentError, 'Must be a number between 1 and 12' unless (1..12).include?(month)
13
+
14
+ @year = year
15
+ @month = month
16
+ end
17
+
18
+ private
19
+
20
+ def range
21
+ Date.new(year, month, 1)..Date.new(year, month, -1)
10
22
  end
11
23
  end
12
24
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RussianWorkdays
4
- VERSION = "2.5.0".freeze
4
+ VERSION = '2.7.0'
5
5
  end
@@ -1,11 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "collection_preset"
3
+ require_relative 'missing_year_error'
4
+ require_relative 'collection_preset'
4
5
 
5
6
  module RussianWorkdays
6
7
  class Year < CollectionPreset
8
+ attr_reader :year
9
+
7
10
  def initialize(year = Date.today.year)
8
- @dates = Collection.new(Date.new(year, 1, 1)..Date.new(year, 12, -1))
11
+ raise MissingYearError, year unless DATES.key?(year)
12
+
13
+ @year = year
14
+ end
15
+
16
+ private
17
+
18
+ def range
19
+ Date.new(year, 1, 1)..Date.new(year, 12, -1)
9
20
  end
10
21
  end
11
22
  end
@@ -1,6 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "russian_workdays/collection"
4
- require_relative "russian_workdays/day"
5
- require_relative "russian_workdays/month"
6
- require_relative "russian_workdays/year"
3
+ require 'yaml'
4
+ require 'date'
5
+ require_relative 'russian_workdays/collection'
6
+ require_relative 'russian_workdays/day'
7
+ require_relative 'russian_workdays/month'
8
+ require_relative 'russian_workdays/year'
9
+
10
+ module RussianWorkdays
11
+ YAML_FILE = File.read(File.join(__dir__, 'dates.yml')).freeze
12
+ DATES = YAML.safe_load(YAML_FILE, permitted_classes: [::Date, Symbol]).freeze
13
+
14
+ private_constant :YAML_FILE
15
+ end
@@ -1,24 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path("lib", __dir__)
3
+ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require_relative 'lib/russian_workdays/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "russian_workdays"
8
- spec.version = "2.5.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"
8
+ spec.name = 'russian_workdays'
9
+ spec.version = RussianWorkdays::VERSION
10
+ spec.authors = ['heckfy']
11
+ spec.email = ['heckfyoz@gmail.com']
12
+ spec.summary = 'Russian workdays'
13
+ spec.description = 'Производственный календарь РФ'
14
+ spec.homepage = 'https://github.com/heckfy/russian_workdays'
15
+ spec.license = 'MIT'
16
+ spec.required_ruby_version = '>= 2.6.0'
15
17
 
16
18
  spec.files = `git ls-files -z`.split("\x0")
17
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
20
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
21
+ spec.require_paths = ['lib']
20
22
 
21
- spec.add_development_dependency "bundler", "~> 1.6"
22
- spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency 'bundler', '~> 2.4'
24
+ spec.add_development_dependency 'rake', '~> 13.2'
25
+ spec.add_development_dependency 'rspec', '~> 3.1'
26
+ spec.add_development_dependency 'rubocop', '~> 1.71.1'
24
27
  end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RussianWorkdays::Collection do
6
+ subject(:instance_of_collection) { described_class.new(range) }
7
+
8
+ let(:year) { 2014 }
9
+ let(:month) { 2 }
10
+ let(:range) { (Date.new(year, month, 20)..Date.new(year, month, -1)) }
11
+
12
+ describe '#initialize' do
13
+ context 'when missing data for that year' do
14
+ let(:year) { 1990 }
15
+
16
+ it 'raise MissingYearError' do
17
+ expect { instance_of_collection }
18
+ .to raise_error(RussianWorkdays::MissingYearError, /Data missing for that year: 1990/)
19
+ end
20
+ end
21
+
22
+ context 'when range is not Array or Range object' do
23
+ let(:range) { 0 }
24
+
25
+ it 'raise ArgumentError' do
26
+ expect { instance_of_collection }
27
+ .to raise_error(ArgumentError, /Must be a Array or Range object/)
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '#holidays' do
33
+ let(:expected_array) do
34
+ [22, 23].map { |day| Date.new(year, month, day) }
35
+ end
36
+
37
+ it 'array of holidays Date' do
38
+ expect(instance_of_collection.holidays).to eq(expected_array)
39
+ end
40
+ end
41
+
42
+ describe '#preholidays' do
43
+ let(:expected_array) do
44
+ [Date.new(year, month, 24)]
45
+ end
46
+
47
+ it 'array of preholidays Date' do
48
+ expect(instance_of_collection.preholidays).to eq(expected_array)
49
+ end
50
+ end
51
+
52
+ describe '#works' do
53
+ let(:expected_array) do
54
+ [20, 21, 24, 25, 26, 27, 28].map do |day|
55
+ Date.new(year, month, day)
56
+ end
57
+ end
58
+
59
+ it 'array of works Date' do
60
+ expect(instance_of_collection.works).to eq(expected_array)
61
+ end
62
+ end
63
+
64
+ describe '#work_hours_count' do
65
+ context 'when work_hours_per_week is not one of: 24, 36, 40' do
66
+ it 'raise ArgumentError' do
67
+ expect { instance_of_collection.work_hours_count(10) }
68
+ .to raise_error(ArgumentError, /Unknown work hours count. Must be one of: 24, 36, 40/)
69
+ end
70
+ end
71
+
72
+ context 'when week have 24 work hours' do
73
+ it { expect(instance_of_collection.work_hours_count(24)).to eq(32.6) }
74
+ end
75
+
76
+ context 'when week have 36 work hours' do
77
+ it { expect(instance_of_collection.work_hours_count(36)).to eq(49.4) }
78
+ end
79
+
80
+ context 'when week have 40 work hours' do
81
+ it { expect(instance_of_collection.work_hours_count).to eq(55) }
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'date'
5
+
6
+ describe RussianWorkdays::Day do
7
+ subject(:work?) { described_class.new(date).work? }
8
+
9
+ let(:work_date) { Date.new(2014, 5, 5) }
10
+ let(:preholiday_date) { Date.new(2014, 2, 24) }
11
+ let(:holiday_date) { Date.new(2014, 5, 1) }
12
+
13
+ describe '#initialize' do
14
+ context 'when date is not Date object' do
15
+ let(:date) { 'string' }
16
+
17
+ it 'raise ArgumentError' do
18
+ expect { described_class.new(date) }.to raise_error(ArgumentError, /Must be a Date object/)
19
+ end
20
+ end
21
+
22
+ context 'when missing data for that year' do
23
+ let(:date) { Date.new(1990, 1, 1) }
24
+
25
+ it 'raise MissingYearError' do
26
+ expect { described_class.new(date) }
27
+ .to raise_error(RussianWorkdays::MissingYearError, /Data missing for that year: 1990/)
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '#work?' do
33
+ context 'when date is work day' do
34
+ let(:date) { work_date }
35
+
36
+ it 'return true' do
37
+ is_expected.to eq(true)
38
+ end
39
+ end
40
+
41
+ context 'when date is preholiday' do
42
+ let(:date) { preholiday_date }
43
+
44
+ it 'return true' do
45
+ is_expected.to eq(true)
46
+ end
47
+ end
48
+
49
+ context 'when date is holiday' do
50
+ let(:date) { holiday_date }
51
+
52
+ it 'return false' do
53
+ is_expected.to eq(false)
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '#preholiday?' do
59
+ context 'when date is work day' do
60
+ let(:date) { work_date }
61
+
62
+ it 'return true' do
63
+ expect(RussianWorkdays::Day.new(date).preholiday?).to eq(false)
64
+ end
65
+ end
66
+
67
+ context 'when date is preholiday' do
68
+ let(:date) { preholiday_date }
69
+
70
+ it 'return true' do
71
+ expect(RussianWorkdays::Day.new(date).preholiday?).to eq(true)
72
+ end
73
+ end
74
+
75
+ context 'when date is holiday' do
76
+ let(:date) { holiday_date }
77
+
78
+ it 'return false' do
79
+ expect(RussianWorkdays::Day.new(date).preholiday?).to eq(false)
80
+ end
81
+ end
82
+ end
83
+
84
+ describe '#holiday?' do
85
+ context 'when date is work day' do
86
+ let(:date) { work_date }
87
+
88
+ it 'return true' do
89
+ expect(RussianWorkdays::Day.new(date).holiday?).to eq(false)
90
+ end
91
+ end
92
+
93
+ context 'when date is preholiday' do
94
+ let(:date) { preholiday_date }
95
+
96
+ it 'return true' do
97
+ expect(RussianWorkdays::Day.new(date).holiday?).to eq(false)
98
+ end
99
+ end
100
+
101
+ context 'when date is holiday' do
102
+ let(:date) { holiday_date }
103
+
104
+ it 'return false' do
105
+ expect(RussianWorkdays::Day.new(date).holiday?).to eq(true)
106
+ end
107
+ end
108
+ end
109
+
110
+ describe '#type' do
111
+ context 'when date is work day' do
112
+ let(:date) { work_date }
113
+
114
+ it 'return :work' do
115
+ expect(RussianWorkdays::Day.new(date).type).to eq(:work)
116
+ end
117
+ end
118
+
119
+ context 'when date is preholiday' do
120
+ let(:date) { preholiday_date }
121
+
122
+ it 'return :preholiday' do
123
+ expect(RussianWorkdays::Day.new(date).type).to eq(:preholiday)
124
+ end
125
+ end
126
+
127
+ context 'when date is holiday' do
128
+ let(:date) { holiday_date }
129
+
130
+ it 'return :holiday' do
131
+ expect(RussianWorkdays::Day.new(date).type).to eq(:holiday)
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RussianWorkdays::Month do
6
+ subject(:instance_of_month) { described_class.new(year, month) }
7
+
8
+ let(:year) { 2014 }
9
+ let(:month) { 2 }
10
+
11
+ describe '#initialize' do
12
+ context 'when missing data for that year' do
13
+ let(:year) { 1990 }
14
+
15
+ it 'raise MissingYearError' do
16
+ expect { instance_of_month }
17
+ .to raise_error(RussianWorkdays::MissingYearError, /Data missing for that year: 1990/)
18
+ end
19
+ end
20
+
21
+ context 'when month is not in 1..12' do
22
+ let(:month) { 0 }
23
+
24
+ it 'raise ArgumentError' do
25
+ expect { instance_of_month }
26
+ .to raise_error(ArgumentError, /Must be a number between 1 and 12/)
27
+ end
28
+ end
29
+ end
30
+
31
+ describe '#holidays' do
32
+ let(:expected_array) do
33
+ [1, 2, 8, 9, 15, 16, 22, 23].map { |day| Date.new(year, month, day) }
34
+ end
35
+
36
+ it 'array of holidays Date' do
37
+ expect(instance_of_month.holidays).to eq(expected_array)
38
+ end
39
+ end
40
+
41
+ describe '#preholidays' do
42
+ let(:expected_array) do
43
+ [Date.new(year, month, 24)]
44
+ end
45
+
46
+ it 'array of preholidays Date' do
47
+ expect(instance_of_month.preholidays).to eq(expected_array)
48
+ end
49
+ end
50
+
51
+ describe '#works' do
52
+ let(:expected_array) do
53
+ [3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28].map do |day|
54
+ Date.new(year, month, day)
55
+ end
56
+ end
57
+
58
+ it 'array of works Date' do
59
+ expect(instance_of_month.works).to eq(expected_array)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RussianWorkdays::Year do
6
+ subject(:instance_of_year) { described_class.new(year) }
7
+
8
+ let(:year) { 2014 }
9
+
10
+ describe '#initialize' do
11
+ context 'when missing data for that year' do
12
+ let(:year) { 1990 }
13
+
14
+ it 'raise MissingYearError' do
15
+ expect { instance_of_year }
16
+ .to raise_error(RussianWorkdays::MissingYearError, /Data missing for that year: 1990/)
17
+ end
18
+ end
19
+ end
20
+
21
+ describe '#holidays' do
22
+ let(:expected_array) do
23
+ (1..12).flat_map { |month| RussianWorkdays::Month.new(year, month).holidays }
24
+ end
25
+
26
+ it 'array of holidays Date' do
27
+ expect(instance_of_year.holidays).to eq(expected_array)
28
+ end
29
+ end
30
+
31
+ describe '#preholidays' do
32
+ let(:expected_array) do
33
+ (1..12).flat_map { |month| RussianWorkdays::Month.new(year, month).preholidays }
34
+ end
35
+
36
+ it 'array of preholidays Date' do
37
+ expect(instance_of_year.preholidays).to eq(expected_array)
38
+ end
39
+ end
40
+
41
+ describe '#works' do
42
+ let(:expected_array) do
43
+ (1..12).flat_map { |month| RussianWorkdays::Month.new(year, month).works }
44
+ end
45
+
46
+ it 'array of works Date' do
47
+ expect(instance_of_year.works).to eq(expected_array)
48
+ end
49
+ end
50
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/setup"
3
+ require 'bundler/setup'
4
4
  Bundler.setup
5
5
 
6
- require "russian_workdays"
6
+ require 'russian_workdays'
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: 2.5.0
4
+ version: 2.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - heckfy
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-05 00:00:00.000000000 Z
11
+ date: 2025-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,76 +16,94 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.6'
19
+ version: '2.4'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.6'
26
+ version: '2.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '13.2'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '13.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '0'
61
+ version: 1.71.1
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - ">="
66
+ - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '0'
68
+ version: 1.71.1
55
69
  description: Производственный календарь РФ
56
70
  email:
57
71
  - heckfyoz@gmail.com
58
- executables: []
72
+ executables:
73
+ - console
74
+ - setup
59
75
  extensions: []
60
76
  extra_rdoc_files: []
61
77
  files:
62
- - ".codeclimate.yml"
63
78
  - ".gitignore"
64
79
  - ".rubocop.yml"
65
- - ".travis.yml"
80
+ - CHANGELOG.md
66
81
  - Gemfile
67
82
  - LICENSE.txt
68
83
  - README.md
69
84
  - Rakefile
85
+ - bin/console
86
+ - bin/setup
87
+ - lib/dates.yml
70
88
  - lib/russian_workdays.rb
71
89
  - lib/russian_workdays/collection.rb
72
90
  - lib/russian_workdays/collection_preset.rb
73
- - lib/russian_workdays/dates.yml
74
91
  - lib/russian_workdays/day.rb
92
+ - lib/russian_workdays/missing_year_error.rb
75
93
  - lib/russian_workdays/month.rb
76
94
  - lib/russian_workdays/version.rb
77
95
  - lib/russian_workdays/year.rb
78
96
  - russian_workdays.gemspec
79
- - spec/collection_spec.rb
80
- - spec/day_spec.rb
81
- - spec/month_spec.rb
97
+ - spec/lib/collection_spec.rb
98
+ - spec/lib/day_spec.rb
99
+ - spec/lib/month_spec.rb
100
+ - spec/lib/year_spec.rb
82
101
  - spec/spec_helper.rb
83
- - spec/year_spec.rb
84
102
  homepage: https://github.com/heckfy/russian_workdays
85
103
  licenses:
86
104
  - MIT
87
105
  metadata: {}
88
- post_install_message:
106
+ post_install_message:
89
107
  rdoc_options: []
90
108
  require_paths:
91
109
  - lib
@@ -93,21 +111,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
93
111
  requirements:
94
112
  - - ">="
95
113
  - !ruby/object:Gem::Version
96
- version: '0'
114
+ version: 2.6.0
97
115
  required_rubygems_version: !ruby/object:Gem::Requirement
98
116
  requirements:
99
117
  - - ">="
100
118
  - !ruby/object:Gem::Version
101
119
  version: '0'
102
120
  requirements: []
103
- rubyforge_project:
104
- rubygems_version: 2.7.6
105
- signing_key:
121
+ rubygems_version: 3.4.10
122
+ signing_key:
106
123
  specification_version: 4
107
124
  summary: Russian workdays
108
125
  test_files:
109
- - spec/collection_spec.rb
110
- - spec/day_spec.rb
111
- - spec/month_spec.rb
126
+ - spec/lib/collection_spec.rb
127
+ - spec/lib/day_spec.rb
128
+ - spec/lib/month_spec.rb
129
+ - spec/lib/year_spec.rb
112
130
  - spec/spec_helper.rb
113
- - spec/year_spec.rb
data/.codeclimate.yml DELETED
@@ -1,16 +0,0 @@
1
- ---
2
- engines:
3
- duplication:
4
- enabled: true
5
- config:
6
- languages:
7
- - ruby
8
- fixme:
9
- enabled: true
10
- rubocop:
11
- enabled: true
12
- ratings:
13
- paths:
14
- - "**.rb"
15
- exclude_paths:
16
- - spec/
data/.travis.yml DELETED
@@ -1,3 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.1
@@ -1,27 +0,0 @@
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 DELETED
@@ -1,31 +0,0 @@
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
data/spec/month_spec.rb DELETED
@@ -1,27 +0,0 @@
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/year_spec.rb DELETED
@@ -1,27 +0,0 @@
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