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.
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
2
 
3
- gemspec
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
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
- gem install russian_workdays
12
-
13
+ gem install russian_workdays
14
+
13
15
  и подгружаем:
14
16
 
15
17
  ```ruby
16
- require 'russian_workdays'
18
+ require "russian_workdays"
17
19
  ```
18
20
 
19
21
  ## Использование
20
22
 
21
- Получить массив с выходными днями в 2014 году
22
-
23
- ```ruby
24
- RussianWorkdays.holidays(2014)
25
- ```
23
+ #### Класс RussianWorkdays::Collection
26
24
 
27
- Получить массив с короткими днями в 2014 году
25
+ Инициализатор принимает массив или интервал дат.
28
26
 
29
27
  ```ruby
30
- RussianWorkdays.shorts(2014)
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
- Получить массив с рабочими днями в 2014 году
41
+ #### Класс RussianWorkdays::Year
34
42
 
35
- ```ruby
36
- RussianWorkdays.works(2014)
37
- ```
38
-
39
- Является ли дата выходным днем?
43
+ Инициализатор принимает в качестве параметра год. Имеет те же методы что и RussianWorkdays::Collection.
40
44
 
41
45
  ```ruby
42
- RussianWorkdays.holiday?(Date.new 2014, 10, 5)
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.short?(Date.new 2014, 10, 5)
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.work?(Date.new 2014, 10, 5)
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
- require 'bundler/gem_tasks'
2
- require 'rspec/core/rake_task'
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
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ class CollectionPreset
6
+ extend Forwardable
7
+ def_delegators :@dates, :holidays, :preholidays, :works, :work_hours_count
8
+ end