russian_workdays 1.4.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/russian_workdays.svg)](https://badge.fury.io/rb/russian_workdays)
|
3
4
|
[![Build Status](https://travis-ci.org/heckfy/russian_workdays.svg?branch=master)](https://travis-ci.org/heckfy/russian_workdays)
|
4
5
|
[![Code Climate](https://codeclimate.com/github/heckfy/russian_workdays/badges/gpa.svg)](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
|