russian_workdays 2.5.0 → 2.7.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.
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