jiff-date_range 0.0.1alpha → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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