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.
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