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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 983cb28bf546134178793220406d8fb38b946e56216afe3f624e6ba43c14108f
4
- data.tar.gz: 96eb20e723693e4a2edbbe7787a8c79f51b5d9e379e159b2bf41713069573ce1
3
+ metadata.gz: 514fe19ac43c31ae4be5a74b4ef8e73c11bededda9a5b3a692cc1c9c20ad57ed
4
+ data.tar.gz: de0829c49113b8635d3e6b836b253843133326a10d448399080657b378edbeb0
5
5
  SHA512:
6
- metadata.gz: 55841617464abdae0f2a812f62978f35770ba0391698d3d99d36737a5aab7875b5a070fee2356e79aeb7ef13c0057a240fb05a32f65b76da11bc9259d278ae40
7
- data.tar.gz: d10456e8f540f4fea44a8c53c40b90842d2cbaa96f6b34add990f797af811157e1f2ad81afa36c8ef705fa3d6d97e60942f7358e33c95f609a63a0f6c51bf3d0
6
+ metadata.gz: e9df1623edf5db29f8ccfcc54c95f81deadbdb1d98a52b361658275cda9042fccd625551f4b9539ed63154ea3bbb31d3feb6787e155afaedd2d892be4f092980
7
+ data.tar.gz: 112b44f75f3f495d8f6eed1248040831c85914c65de2d7c9eea7f946cee3af04ca0c5defcf5a6c187299a8a160e8c96f670028395f1541f7c243cdd776f11f31
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ jiff-date_range*.gem
@@ -0,0 +1,5 @@
1
+ ---
2
+ project_id:
3
+ - rpbaltazar/jiff-date_range
4
+ tracker: github
5
+ finish_tag: 'Resolves'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- jiff-date_range (0.0.1alpha)
4
+ jiff-date_range (0.0.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # DateRange
2
2
 
3
+ [![Build Status](https://travis-ci.com/rpbaltazar/jiff-date_range.svg?branch=master)](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
@@ -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(@start_date)
18
+ return month_ends_in_range if date_is_end_of_month(start_date)
18
19
 
19
20
  dates = []
20
- current_date = @start_date
21
- while current_date <= @end_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(@end_date)
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
- (@start_date..@end_date)
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.month)
83
+ date.day == MonthMapper.days_in_month(date)
60
84
  end
61
85
  end
62
86
  end
@@ -1,5 +1,5 @@
1
1
  module Jiff
2
2
  class DateRange
3
- VERSION = '0.0.1alpha'
3
+ VERSION = '0.0.1'.freeze
4
4
  end
5
5
  end
@@ -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(month, leap = false)
19
- return DAYS_MONTH[month] unless month == 2
20
- return 29 if leap
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
- 28
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.1alpha
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-06 00:00:00.000000000 Z
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: 1.3.1
110
+ version: '0'
111
111
  requirements: []
112
112
  rubygems_version: 3.0.3
113
113
  signing_key:
data/TODO DELETED
@@ -1 +0,0 @@
1
- https://github.com/everypolitician/date_range/blob/master/test/date_range_test.rb