jiff-date_range 0.0.1alpha → 0.0.1
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 +4 -4
- data/.gitignore +1 -0
- data/.story_branch.yml +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +53 -0
- data/lib/jiff/date_range.rb +30 -6
- data/lib/jiff/date_range/version.rb +1 -1
- data/lib/jiff/month_mapper.rb +6 -18
- metadata +5 -5
- data/TODO +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 514fe19ac43c31ae4be5a74b4ef8e73c11bededda9a5b3a692cc1c9c20ad57ed
|
4
|
+
data.tar.gz: de0829c49113b8635d3e6b836b253843133326a10d448399080657b378edbeb0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9df1623edf5db29f8ccfcc54c95f81deadbdb1d98a52b361658275cda9042fccd625551f4b9539ed63154ea3bbb31d3feb6787e155afaedd2d892be4f092980
|
7
|
+
data.tar.gz: 112b44f75f3f495d8f6eed1248040831c85914c65de2d7c9eea7f946cee3af04ca0c5defcf5a6c187299a8a160e8c96f670028395f1541f7c243cdd776f11f31
|
data/.gitignore
CHANGED
data/.story_branch.yml
ADDED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# DateRange
|
2
2
|
|
3
|
+
[](https://travis-ci.com/rpbaltazar/jiff-date_range)
|
4
|
+
|
3
5
|
This gem came up from the need of using date ranges in our reporting tool
|
4
6
|
and the lack of a gem that actually provided date ranges manipulations, such as
|
5
7
|
building arrays of dates.
|
@@ -95,6 +97,57 @@ date_range = Jiff::DateRange.new(d1, d2)
|
|
95
97
|
date_range.by_month # => [31/01/2019, 28/02/2019, 31/03/2019]
|
96
98
|
```
|
97
99
|
|
100
|
+
### include?
|
101
|
+
|
102
|
+
As the name suggests, this method takes in a date or a Jiff::DateRange and
|
103
|
+
checks wether the date range instance used includes the argument.
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
d1 = Date.parse('31/01/2019')
|
107
|
+
d2 = Date.parse('29/04/2019')
|
108
|
+
date_range = Jiff::DateRange.new(d1, d2)
|
109
|
+
d3 = Date.parse('01/02/2019')
|
110
|
+
date_range.include?(d3) # => true
|
111
|
+
|
112
|
+
d4 = Date.parse('28/05/2019')
|
113
|
+
date_range.include?(d4) # => false
|
114
|
+
|
115
|
+
other_date_range = Jiff::DateRange.new(d3, d4)
|
116
|
+
date_range.include?(other_date_range) # => true
|
117
|
+
```
|
118
|
+
|
119
|
+
|
120
|
+
### overlap?
|
121
|
+
|
122
|
+
Once again the method name suggests that this will test if two date ranges
|
123
|
+
overlap
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
d1 = Date.parse('31/01/2019')
|
127
|
+
d2 = Date.parse('29/04/2019')
|
128
|
+
date_range = Jiff::DateRange.new(d1, d2)
|
129
|
+
|
130
|
+
d3 = Date.parse('01/02/2019')
|
131
|
+
d4 = Date.parse('28/05/2019')
|
132
|
+
other_date_range = Jiff::DateRange.new(d3, d4)
|
133
|
+
date_range.overlap?(other_date_range) # => true
|
134
|
+
```
|
135
|
+
|
136
|
+
### overlap
|
137
|
+
|
138
|
+
This method returns the overlapping date range if any, else it'll return nil
|
139
|
+
|
140
|
+
```ruby
|
141
|
+
d1 = Date.parse('31/01/2019')
|
142
|
+
d2 = Date.parse('29/04/2019')
|
143
|
+
date_range = Jiff::DateRange.new(d1, d2)
|
144
|
+
|
145
|
+
d3 = Date.parse('01/02/2019')
|
146
|
+
d4 = Date.parse('28/05/2019')
|
147
|
+
other_date_range = Jiff::DateRange.new(d3, d4)
|
148
|
+
date_range.overlap(other_date_range) # => start_date=2019-02-01, end_date=2019-04-29
|
149
|
+
```
|
150
|
+
|
98
151
|
## Contributing
|
99
152
|
|
100
153
|
Bug reports and pull requests are welcome on GitHub at
|
data/lib/jiff/date_range.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative 'date_range/version'
|
|
4
4
|
require_relative 'month_mapper'
|
5
5
|
|
6
6
|
module Jiff
|
7
|
+
# Implementation of date range relying in ruby dates (no rails helpers/add-ons)
|
7
8
|
class DateRange
|
8
9
|
attr_reader :start_date
|
9
10
|
attr_reader :end_date
|
@@ -14,11 +15,11 @@ module Jiff
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def by_month
|
17
|
-
return month_ends_in_range if date_is_end_of_month(
|
18
|
+
return month_ends_in_range if date_is_end_of_month(start_date)
|
18
19
|
|
19
20
|
dates = []
|
20
|
-
current_date =
|
21
|
-
while current_date <=
|
21
|
+
current_date = start_date
|
22
|
+
while current_date <= end_date
|
22
23
|
dates << current_date
|
23
24
|
current_date = next_date(current_date, dates)
|
24
25
|
end
|
@@ -29,6 +30,29 @@ module Jiff
|
|
29
30
|
date_range.to_a
|
30
31
|
end
|
31
32
|
|
33
|
+
def include?(date)
|
34
|
+
if date.is_a?(Jiff::DateRange)
|
35
|
+
include?(date.start_date) || include?(date.end_date)
|
36
|
+
else
|
37
|
+
date >= start_date && date <= end_date
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def overlap?(other_range)
|
42
|
+
# TODO: Probably should raise 'unsupported type'
|
43
|
+
return unless other_range.is_a? Jiff::DateRange
|
44
|
+
|
45
|
+
other_range.include?(start_date) || other_range.include?(end_date) || include?(other_range)
|
46
|
+
end
|
47
|
+
|
48
|
+
# NOTE: Thank you @chrismytton for the implementation suggestion
|
49
|
+
def overlap(other_range)
|
50
|
+
return unless overlap?(other_range)
|
51
|
+
|
52
|
+
dates = [start_date, end_date, other_range.start_date, other_range.end_date].sort[1, 2]
|
53
|
+
Jiff::DateRange.new(*dates)
|
54
|
+
end
|
55
|
+
|
32
56
|
private
|
33
57
|
|
34
58
|
def days_grouped_by_month
|
@@ -37,7 +61,7 @@ module Jiff
|
|
37
61
|
|
38
62
|
def month_ends_in_range
|
39
63
|
dates = days_grouped_by_month.values.map(&:last)
|
40
|
-
dates.pop unless date_is_end_of_month(
|
64
|
+
dates.pop unless date_is_end_of_month(end_date)
|
41
65
|
dates
|
42
66
|
end
|
43
67
|
|
@@ -52,11 +76,11 @@ module Jiff
|
|
52
76
|
end
|
53
77
|
|
54
78
|
def date_range
|
55
|
-
(
|
79
|
+
(start_date..end_date)
|
56
80
|
end
|
57
81
|
|
58
82
|
def date_is_end_of_month(date)
|
59
|
-
date.day == MonthMapper.days_in_month(date
|
83
|
+
date.day == MonthMapper.days_in_month(date)
|
60
84
|
end
|
61
85
|
end
|
62
86
|
end
|
data/lib/jiff/month_mapper.rb
CHANGED
@@ -1,25 +1,13 @@
|
|
1
1
|
module Jiff
|
2
|
+
# Simple mapper between month and number of days
|
2
3
|
module MonthMapper
|
3
|
-
DAYS_MONTH =
|
4
|
-
1 => 31,
|
5
|
-
2 => nil,
|
6
|
-
3 => 31,
|
7
|
-
4 => 30,
|
8
|
-
5 => 31,
|
9
|
-
6 => 30,
|
10
|
-
7 => 31,
|
11
|
-
8 => 31,
|
12
|
-
9 => 30,
|
13
|
-
10 => 31,
|
14
|
-
11 => 30,
|
15
|
-
12 => 31
|
16
|
-
}.freeze
|
4
|
+
DAYS_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].freeze
|
17
5
|
|
18
|
-
def self.days_in_month(
|
19
|
-
|
20
|
-
return 29 if
|
6
|
+
def self.days_in_month(date)
|
7
|
+
month = date.month
|
8
|
+
return 29 if month == 2 && Date.gregorian_leap?(date.year)
|
21
9
|
|
22
|
-
|
10
|
+
DAYS_MONTH[month - 1]
|
23
11
|
end
|
24
12
|
end
|
25
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jiff-date_range
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rui Baltazar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -75,6 +75,7 @@ extensions: []
|
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
77
|
- ".gitignore"
|
78
|
+
- ".story_branch.yml"
|
78
79
|
- ".travis.yml"
|
79
80
|
- CODE_OF_CONDUCT.md
|
80
81
|
- Gemfile
|
@@ -82,7 +83,6 @@ files:
|
|
82
83
|
- LICENSE.txt
|
83
84
|
- README.md
|
84
85
|
- Rakefile
|
85
|
-
- TODO
|
86
86
|
- bin/console
|
87
87
|
- bin/setup
|
88
88
|
- jiff-date_range.gemspec
|
@@ -105,9 +105,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
105
|
version: '0'
|
106
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: '0'
|
111
111
|
requirements: []
|
112
112
|
rubygems_version: 3.0.3
|
113
113
|
signing_key:
|