recurring_date 0.1.4 → 0.1.5

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.
@@ -0,0 +1,112 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.9.24
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+
41
+
42
+ <span class="title">Top Level Namespace</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Top Level Namespace
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ </div>
80
+
81
+ <h2>Defined Under Namespace</h2>
82
+ <p class="children">
83
+
84
+
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="RecurringDate.html" title="RecurringDate (module)">RecurringDate</a></span>
86
+
87
+
88
+
89
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="Date.html" title="Date (class)">Date</a></span>
90
+
91
+
92
+ </p>
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+ </div>
103
+
104
+ <div id="footer">
105
+ Generated on Tue Mar 24 07:23:15 2020 by
106
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
107
+ 0.9.24 (ruby-2.6.5).
108
+ </div>
109
+
110
+ </div>
111
+ </body>
112
+ </html>
@@ -2,11 +2,14 @@
2
2
 
3
3
  require 'recurring_date/enumerator'
4
4
 
5
+ # The RecurringDate module is extension to Date class.
5
6
  module RecurringDate
7
+ # The week number of the month.
6
8
  def mweek
7
9
  (mday - 1) / 7 + 1
8
10
  end
9
11
 
12
+ # Initiate a lazy, perpetual enumerator over all dates, day by day, after +self+ (including +self+).
10
13
  def to_enum
11
14
  RecurringDate::Enumerator.from(self)
12
15
  end
@@ -3,7 +3,9 @@
3
3
  require 'date'
4
4
 
5
5
  module RecurringDate
6
+ # The enumerator over the dates.
6
7
  class Enumerator < ::Enumerator
8
+ # Initiate the enumerator.
7
9
  def initialize(range)
8
10
  super() do |result|
9
11
  range.each { |val| block_given? ? yield(result, val) : result << val }
@@ -12,80 +14,144 @@ module RecurringDate
12
14
  end
13
15
  end
14
16
 
17
+ # Returns a lazy, perpetual enumerator over dates, day by day, from 1st January 1970.
15
18
  def self.eternity
16
19
  from(Date.new(1970))
17
20
  end
18
21
 
22
+ # Returns a lazy, perpetual enumerator over dates, day by day, from +date+.
23
+ # @param date [Date]
19
24
  def self.from(date)
25
+ raise ::ArgumentError, 'not a date' unless date.is_a?(::Date)
26
+
20
27
  RecurringDate::Enumerator.new(infinity(date))
21
28
  end
22
29
 
30
+ # Filter dates by a +yday+ of a date.
31
+ # @param args [Array] +yday+s
23
32
  def yday(*args)
33
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
34
+
24
35
  matching(*args, &:yday)
25
36
  end
26
37
 
38
+ # Filter dates by a +mday+ of a date.
39
+ # @param args [Array] +mday+s
27
40
  def mday(*args)
41
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
42
+
28
43
  matching(*args, &:mday)
29
44
  end
30
45
 
46
+ # Filter dates by a +wday+ of a date.
47
+ # @param args [Array] +wday+s
31
48
  def wday(*args)
49
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
50
+
32
51
  matching(*args, &:wday)
33
52
  end
34
53
 
54
+ # Filter dates by a +mweek+ of a date.
55
+ # @param args [Array] +mweek+s
35
56
  def mweek(*args)
57
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
58
+
36
59
  matching(*args, &:mweek)
37
60
  end
38
61
 
62
+ # Filter dates by a +month+ of a date.
63
+ # @param args [Array] +month+s
39
64
  def month(*args)
65
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
66
+
40
67
  matching(*args, &:month)
41
68
  end
42
69
 
70
+ # Filter dates by a +year+ of a date.
71
+ # @param args [Array] +year+s
43
72
  def year(*args)
73
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
74
+
44
75
  matching(*args, &:year)
45
76
  end
46
77
 
78
+ # Filter dates not maching +yday+.
79
+ # @param args [Array] +yday+s
47
80
  def not_yday(*args)
81
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
82
+
48
83
  not_matching(*args, &:yday)
49
84
  end
50
85
 
86
+ # Filter dates not maching +mday+.
87
+ # @param args [Array] +mday+s
51
88
  def not_mday(*args)
89
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
90
+
52
91
  not_matching(*args, &:mday)
53
92
  end
54
93
 
94
+ # Filter dates not maching +wday+.
95
+ # @param args [Array] +wday+s
55
96
  def not_wday(*args)
97
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
98
+
56
99
  not_matching(*args, &:wday)
57
100
  end
58
101
 
102
+ # Filter dates not maching +mweek+.
103
+ # @param args [Array] +mweek+s
59
104
  def not_mweek(*args)
105
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
106
+
60
107
  not_matching(*args, &:mweek)
61
108
  end
62
109
 
110
+ # Filter dates not maching +month+.
111
+ # @param args [Array] +month+s
63
112
  def not_month(*args)
113
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
114
+
64
115
  not_matching(*args, &:month)
65
116
  end
66
117
 
118
+ # Filter dates not maching +year+.
119
+ # @param args [Array] +year+s
67
120
  def not_year(*args)
121
+ raise ::ArgumentError, 'not an integer' unless args.all? { |arg| arg.is_a?(::Integer) }
122
+
68
123
  not_matching(*args, &:year)
69
124
  end
70
125
 
126
+ # Filter dates that matches +args+ with yielded block.
127
+ # @param args [Array] arguments that are compared to the expession in given block.
71
128
  def matching(*args)
72
129
  select { |date| args.include?(yield(date)) }
73
130
  end
74
131
 
132
+ # Filter dates that do not match +args+ with yielded block.
133
+ # @param args [Array] arguments that are compared to the expession in given block.
75
134
  def not_matching(*args)
76
135
  reject { |date| args.include?(yield(date)) }
77
136
  end
78
137
 
138
+ # Filter dates by the sequence of occurences.
139
+ # @param args [Array] occurence schema
79
140
  def pattern(*args)
80
141
  select_with_index do |_, i|
81
142
  args.any? { |arg| ((i + 1) % arg).zero? }
82
143
  end
83
144
  end
84
145
 
85
- def until(arg)
86
- take_while { |date| date <= arg.to_date }
146
+ # Set upper bound of the date range (make the enumerator finite).
147
+ # @param date [Date]
148
+ def until(date)
149
+ raise ::ArgumentError, 'not a date' unless date.is_a?(::Date)
150
+
151
+ take_while { |obj| obj <= date }
87
152
  end
88
153
 
154
+ # Filter dates by condition in given block. Yields a date and its index.
89
155
  def select_with_index
90
156
  index = 0
91
157
  RecurringDate::Enumerator.new(self) do |result, value|
@@ -94,15 +160,21 @@ module RecurringDate
94
160
  end
95
161
  end
96
162
 
163
+ # Filter dates by condition in given block.
97
164
  def select
98
165
  RecurringDate::Enumerator.new(self) { |result, value| result << value if yield(value) }
99
166
  end
100
167
 
168
+ # Filter dates by condition in given block. Opposite to +select+.
101
169
  def reject
102
170
  RecurringDate::Enumerator.new(self) { |result, value| result << value unless yield(value) }
103
171
  end
104
172
 
173
+ # Take only +number+ of dates.
174
+ # @param number [Integer]
105
175
  def take(number)
176
+ raise ::ArgumentError, 'not an integer' unless number.is_a?(::Integer)
177
+
106
178
  taken = number
107
179
  RecurringDate::Enumerator.new(self) do |result, value|
108
180
  raise ::StopIteration if taken.zero?
@@ -112,6 +184,7 @@ module RecurringDate
112
184
  end
113
185
  end
114
186
 
187
+ # Take only dates until the expression in given block has been met.
115
188
  def take_while
116
189
  RecurringDate::Enumerator.new(self) do |result, value|
117
190
  raise ::StopIteration unless yield(value)
@@ -120,11 +193,17 @@ module RecurringDate
120
193
  end
121
194
  end
122
195
 
196
+ # Dummy inspect for enumerator.
123
197
  def inspect
124
198
  ['#<RecurringDate::Enumerator:0x', object_id, '>'].join
125
199
  end
126
200
 
201
+ # The actual enumerator.
202
+ # The +infinity+ method returns an Enumerator that iterates over a dates, day by day, starting from +date+.
203
+ # @param date [Date] starting date
127
204
  def self.infinity(date)
205
+ raise ::ArgumentError, 'not a date' unless date.is_a?(::Date)
206
+
128
207
  ::Enumerator.new do |y|
129
208
  i = date.prev_day
130
209
  loop { y << (i = i.next) }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RecurringDate
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: recurring_date
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paweł Placzyński
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-23 00:00:00.000000000 Z
11
+ date: 2020-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,11 @@ files:
94
94
  - ".ruby-gemset"
95
95
  - ".ruby-version"
96
96
  - ".travis.yml"
97
+ - ".yardoc/checksums"
98
+ - ".yardoc/complete"
99
+ - ".yardoc/object_types"
100
+ - ".yardoc/objects/root.dat"
101
+ - ".yardoc/proxy_types"
97
102
  - Gemfile
98
103
  - Gemfile.lock
99
104
  - LICENSE
@@ -101,6 +106,23 @@ files:
101
106
  - Rakefile
102
107
  - bin/console
103
108
  - bin/setup
109
+ - doc/Date.html
110
+ - doc/RecurringDate.html
111
+ - doc/RecurringDate/Enumerator.html
112
+ - doc/_index.html
113
+ - doc/class_list.html
114
+ - doc/css/common.css
115
+ - doc/css/full_list.css
116
+ - doc/css/style.css
117
+ - doc/file.README.html
118
+ - doc/file_list.html
119
+ - doc/frames.html
120
+ - doc/index.html
121
+ - doc/js/app.js
122
+ - doc/js/full_list.js
123
+ - doc/js/jquery.js
124
+ - doc/method_list.html
125
+ - doc/top-level-namespace.html
104
126
  - lib/recurring_date.rb
105
127
  - lib/recurring_date/enumerator.rb
106
128
  - lib/recurring_date/version.rb