recurring_date 0.0.3
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 +7 -0
- data/lib/recurring_date.rb +15 -0
- data/lib/recurring_date_enumerator.rb +128 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d4cc8eff5210dd36470912daacacd4a4a44f7109
|
4
|
+
data.tar.gz: d339946cc56e30491139b5577a63033e963be901
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4465192a86991d9f4cd3fb2d0d9eede1845ddc690cc39a2c9990d7dd0947c6935fdc2ea4d417e3856a399e15fa327514168f3813a5303aa92a99e11bb168f029
|
7
|
+
data.tar.gz: 31e51294b9b93401ae693aee6d2c61b01ebb25947835f5bd41d6e86bff79cf608dd69a9eba680de394e955459c4431152e788a5c8427a0fdb4d253381184f4e2
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
class RecurringDateEnumerator < Enumerator
|
4
|
+
def initialize(range)
|
5
|
+
super() do |result|
|
6
|
+
begin
|
7
|
+
range.each { |val| block_given? ? yield(result, val) : result << val }
|
8
|
+
rescue StopIteration
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.eternity(from: Date.new(1970))
|
15
|
+
RecurringDateEnumerator.new(infinity(from))
|
16
|
+
end
|
17
|
+
|
18
|
+
def yday(*args)
|
19
|
+
matching(*args, &:yday)
|
20
|
+
end
|
21
|
+
|
22
|
+
def mday(*args)
|
23
|
+
matching(*args, &:mday)
|
24
|
+
end
|
25
|
+
|
26
|
+
def wday(*args)
|
27
|
+
matching(*args, &:wday)
|
28
|
+
end
|
29
|
+
|
30
|
+
def mweek(*args)
|
31
|
+
matching(*args, &:mweek)
|
32
|
+
end
|
33
|
+
|
34
|
+
def month(*args)
|
35
|
+
matching(*args, &:month)
|
36
|
+
end
|
37
|
+
|
38
|
+
def year(*args)
|
39
|
+
matching(*args, &:year)
|
40
|
+
end
|
41
|
+
|
42
|
+
def not_yday(*args)
|
43
|
+
not_matching(*args, &:yday)
|
44
|
+
end
|
45
|
+
|
46
|
+
def not_mday(*args)
|
47
|
+
not_matching(*args, &:mday)
|
48
|
+
end
|
49
|
+
|
50
|
+
def not_wday(*args)
|
51
|
+
not_matching(*args, &:wday)
|
52
|
+
end
|
53
|
+
|
54
|
+
def not_mweek(*args)
|
55
|
+
not_matching(*args, &:mweek)
|
56
|
+
end
|
57
|
+
|
58
|
+
def not_month(*args)
|
59
|
+
not_matching(*args, &:month)
|
60
|
+
end
|
61
|
+
|
62
|
+
def not_year(*args)
|
63
|
+
not_matching(*args, &:year)
|
64
|
+
end
|
65
|
+
|
66
|
+
def matching(*args)
|
67
|
+
select { |date| args.include?(yield(date)) }
|
68
|
+
end
|
69
|
+
|
70
|
+
def not_matching(*args)
|
71
|
+
reject { |date| args.include?(yield(date)) }
|
72
|
+
end
|
73
|
+
|
74
|
+
def pattern(*args)
|
75
|
+
select_with_index do |_, i|
|
76
|
+
args.any? do |arg|
|
77
|
+
((i + 1) % arg).zero?
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def until(arg)
|
83
|
+
take_while { |date| date <= arg.to_date }
|
84
|
+
end
|
85
|
+
|
86
|
+
def select_with_index
|
87
|
+
index = 0
|
88
|
+
RecurringDateEnumerator.new(self) do |result, value|
|
89
|
+
result << value if yield(value, index)
|
90
|
+
index += 1
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def select
|
95
|
+
RecurringDateEnumerator.new(self) { |result, value| result << value if yield(value) }
|
96
|
+
end
|
97
|
+
|
98
|
+
def reject
|
99
|
+
RecurringDateEnumerator.new(self) { |result, value| result << value unless yield(value) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def take(n)
|
103
|
+
taken = n
|
104
|
+
RecurringDateEnumerator.new(self) do |result, value|
|
105
|
+
raise StopIteration if taken.zero?
|
106
|
+
result << value
|
107
|
+
taken -= 1
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def take_while
|
112
|
+
RecurringDateEnumerator.new(self) do |result, value|
|
113
|
+
raise StopIteration unless yield(value)
|
114
|
+
result << value
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def inspect
|
119
|
+
['#<RecurringDateEnumerator: 0x', object_id, '>'].join
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.infinity(date)
|
123
|
+
Enumerator.new do |y|
|
124
|
+
i = date.prev_day
|
125
|
+
loop { y << (i = i.next) }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: recurring_date
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Paweł Placzyński
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-01 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Enumerator for recurring dates with specific patterns
|
14
|
+
email:
|
15
|
+
- should@not-fail.pl
|
16
|
+
- p.placzynski@binarapps.com
|
17
|
+
- placzynski.pawel@gmail.com
|
18
|
+
- silquenarmo@gmail.com
|
19
|
+
executables: []
|
20
|
+
extensions: []
|
21
|
+
extra_rdoc_files: []
|
22
|
+
files:
|
23
|
+
- lib/recurring_date.rb
|
24
|
+
- lib/recurring_date_enumerator.rb
|
25
|
+
homepage: ''
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.6.11
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: Recurring dates enumerator
|
49
|
+
test_files: []
|