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.
- checksums.yaml +4 -4
- data/.rubocop.yml +74 -1075
- data/Gemfile +4 -2
- data/README.md +39 -21
- data/Rakefile +5 -3
- data/lib/russian_workdays/collection.rb +34 -0
- data/lib/russian_workdays/collection_preset.rb +8 -0
- data/lib/russian_workdays/dates.yml +333 -1984
- data/lib/russian_workdays/day.rb +39 -0
- data/lib/russian_workdays/month.rb +12 -0
- data/lib/russian_workdays/version.rb +5 -0
- data/lib/russian_workdays/year.rb +11 -0
- data/lib/russian_workdays.rb +5 -35
- data/russian_workdays.gemspec +15 -14
- data/spec/collection_spec.rb +27 -0
- data/spec/day_spec.rb +31 -0
- data/spec/month_spec.rb +27 -0
- data/spec/spec_helper.rb +4 -2
- data/spec/year_spec.rb +27 -0
- metadata +16 -4
- data/spec/russian_workdays_spec.rb +0 -39
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# russian_workdays
|
2
|
+
|
2
3
|
[](https://badge.fury.io/rb/russian_workdays)
|
3
4
|
[](https://travis-ci.org/heckfy/russian_workdays)
|
4
5
|
[](https://codeclimate.com/github/heckfy/russian_workdays)
|
@@ -6,52 +7,69 @@
|
|
6
7
|
Производственный календарь РФ
|
7
8
|
|
8
9
|
## Установка
|
10
|
+
|
9
11
|
Выполняем в терминале:
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
+
gem install russian_workdays
|
14
|
+
|
13
15
|
и подгружаем:
|
14
16
|
|
15
17
|
```ruby
|
16
|
-
require
|
18
|
+
require "russian_workdays"
|
17
19
|
```
|
18
20
|
|
19
21
|
## Использование
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
```ruby
|
24
|
-
RussianWorkdays.holidays(2014)
|
25
|
-
```
|
23
|
+
#### Класс RussianWorkdays::Collection
|
26
24
|
|
27
|
-
|
25
|
+
Инициализатор принимает массив или интервал дат.
|
28
26
|
|
29
27
|
```ruby
|
30
|
-
RussianWorkdays.
|
28
|
+
collection = RussianWorkdays::Collection.new((Date.new(2014, 2, 10)..Date.new(2014, 3, 10)))
|
29
|
+
# Получить массив с выходными днями c 10 февраля 2014 по 10 марта 2014:
|
30
|
+
collection.holidays
|
31
|
+
# Получить массив с предпраздничными днями:
|
32
|
+
collection.preholidays
|
33
|
+
# Получить массив с рабочими днями:
|
34
|
+
collection.works
|
35
|
+
# Получить количество рабочих часов:
|
36
|
+
collection.work_hours_count
|
37
|
+
# В качестве аргумента метод work_hours_count принимает количество рабочих часов в неделю, по умолчанию это 40 часов. Получить количество рабочих часов при 36-часовой рабочей неделе:
|
38
|
+
collection.work_hours_count(36)
|
31
39
|
```
|
32
40
|
|
33
|
-
|
41
|
+
#### Класс RussianWorkdays::Year
|
34
42
|
|
35
|
-
|
36
|
-
RussianWorkdays.works(2014)
|
37
|
-
```
|
38
|
-
|
39
|
-
Является ли дата выходным днем?
|
43
|
+
Инициализатор принимает в качестве параметра год. Имеет те же методы что и RussianWorkdays::Collection.
|
40
44
|
|
41
45
|
```ruby
|
42
|
-
RussianWorkdays.
|
46
|
+
collection = RussianWorkdays::Year.new(2014)
|
47
|
+
# Получить массив с выходными днями в 2014 году:
|
48
|
+
collection.holidays
|
43
49
|
```
|
44
50
|
|
45
|
-
|
51
|
+
#### Класс RussianWorkdays::Month
|
52
|
+
|
53
|
+
Инициализатор принимает первым параметром год, вторым - номер месяца. Имеет те же методы что и RussianWorkdays::Collection.
|
46
54
|
|
47
55
|
```ruby
|
48
|
-
RussianWorkdays.
|
56
|
+
collection = RussianWorkdays::Month.new(2014, 2)
|
57
|
+
# Получить массив с выходными днями в феврале 2014 года:
|
58
|
+
collection.holidays
|
49
59
|
```
|
50
60
|
|
51
|
-
|
61
|
+
#### Класс RussianWorkdays::Day
|
62
|
+
|
63
|
+
Предназначен для работы с одной датой. В качестве параметра принимает объект класса Date.
|
52
64
|
|
53
65
|
```ruby
|
54
|
-
RussianWorkdays.
|
66
|
+
date = RussianWorkdays::Day.new(Date.new(2014, 10, 5))
|
67
|
+
# Является ли дата выходным днем?
|
68
|
+
date.holiday?
|
69
|
+
# Является ли дата предпраздничным днем?
|
70
|
+
date.preholiday?
|
71
|
+
# Является ли дата рабочим днем?
|
72
|
+
date.work?
|
55
73
|
```
|
56
74
|
|
57
75
|
## Contributing
|
data/Rakefile
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rspec/core/rake_task"
|
3
5
|
|
4
6
|
# Default directory to look in is `/specs`
|
5
7
|
# Run with `rake spec`
|
6
8
|
RSpec::Core::RakeTask.new(:spec)
|
7
9
|
|
8
|
-
task default: :spec
|
10
|
+
task default: :spec
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RussianWorkdays
|
4
|
+
class Collection
|
5
|
+
include Enumerable
|
6
|
+
AVAILABLE_WORK_HOURS_PER_WEEK = [24, 36, 40].freeze
|
7
|
+
|
8
|
+
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
|
13
|
+
end
|
14
|
+
|
15
|
+
def each
|
16
|
+
@collection.each { |i| yield(i) }
|
17
|
+
end
|
18
|
+
|
19
|
+
%w[holiday preholiday work].each do |type|
|
20
|
+
define_method "#{type}s" do
|
21
|
+
@collection.select { |date| Day.new(date).send("#{type}?") }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
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}"
|
28
|
+
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
|
+
end
|
33
|
+
end
|
34
|
+
end
|