datebox 0.0.4 → 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/lib/datebox/period.rb +35 -8
- data/lib/datebox/relative.rb +17 -9
- data/lib/datebox/version.rb +1 -1
- data/test/unit/test_period.rb +4 -1
- data/test/unit/test_relative.rb +7 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 85d1a9e887e9af4219ad6816854c19b3142f70d0
|
4
|
+
data.tar.gz: 62cef3dbe4579ceb7309402f2e6917d6a1044c54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 731f49fc4373398eb10840785606e87b904e923e2a47579da37150200f58c36901440f6a211313b08c1f630e67503986e86599a400fb24f7d3c0e4ba60de7d83
|
7
|
+
data.tar.gz: e26b6327ad42596463a81b8d0e6efabd59c125c1ef5239cf63e8178668981cf8ebabcce597009853b0f21b0daf6675f9d615aa0309bed995e6af3bffd930549f
|
data/lib/datebox/period.rb
CHANGED
@@ -2,6 +2,8 @@ module Datebox
|
|
2
2
|
class Period
|
3
3
|
attr_reader :from, :to
|
4
4
|
|
5
|
+
PREDEFINED = [:day, :n_days, :week, :month, :year]
|
6
|
+
|
5
7
|
def initialize(from, to)
|
6
8
|
@from = from.is_a?(Date) ? from : Date.parse(from)
|
7
9
|
@to = to.is_a?(Date) ? to : Date.parse(to)
|
@@ -17,21 +19,34 @@ module Datebox
|
|
17
19
|
end
|
18
20
|
|
19
21
|
def split_dates(period, options = {})
|
20
|
-
|
22
|
+
raise "Expected one of: #{Period::PREDEFINED}" unless Period::PREDEFINED.include?(period.to_sym)
|
23
|
+
self.class.split_dates(from, to, period.to_sym, options)
|
21
24
|
end
|
22
25
|
|
23
26
|
class << self
|
24
27
|
def split_dates(start_date, end_date, period, options = {})
|
25
|
-
|
26
|
-
|
27
|
-
if period
|
28
|
-
|
29
|
-
|
28
|
+
period = period.to_sym
|
29
|
+
|
30
|
+
return (start_date..end_date).to_a if period == :day
|
31
|
+
return split_days_dates(start_date, end_date, options) if period == :n_days
|
32
|
+
return split_weekly_dates(start_date, end_date, options) if period == :week
|
33
|
+
return split_monthly_dates(start_date, end_date) if period == :month
|
34
|
+
return split_yearly_dates(start_date, end_date) if period == :year
|
35
|
+
end
|
36
|
+
|
37
|
+
def split_days_dates(start_date, end_date, options = {})
|
38
|
+
days = options[:days] || options['days']
|
39
|
+
raise "days must be specified" if days.nil?
|
40
|
+
|
41
|
+
end_dates = []
|
42
|
+
(start_date..end_date).to_a.reverse.each_slice(days) do |range|
|
43
|
+
end_dates << range.first
|
30
44
|
end
|
45
|
+
end_dates.sort
|
31
46
|
end
|
32
47
|
|
33
48
|
def split_weekly_dates(start_date, end_date, options = {})
|
34
|
-
last_weekday = options[:last_weekday] ||
|
49
|
+
last_weekday = options[:last_weekday] || options['last_weekday'] || 'Sunday'
|
35
50
|
end_dates = []
|
36
51
|
end_of_week = (end_date.downto end_date - 6).to_a.find { |d| d.strftime("%A") == last_weekday }
|
37
52
|
while end_of_week - 6 >= start_date
|
@@ -40,7 +55,7 @@ module Datebox
|
|
40
55
|
end
|
41
56
|
end_dates.sort
|
42
57
|
end
|
43
|
-
|
58
|
+
|
44
59
|
def split_monthly_dates(start_date, end_date)
|
45
60
|
end_dates = []
|
46
61
|
beginning_of_month = ::Date.parse("#{end_date.year}-#{end_date.month}-01").next_month
|
@@ -52,6 +67,18 @@ module Datebox
|
|
52
67
|
end
|
53
68
|
end_dates.sort
|
54
69
|
end
|
70
|
+
|
71
|
+
def split_yearly_dates(start_date, end_date)
|
72
|
+
end_dates = []
|
73
|
+
beginning_of_year = ::Date.parse("#{end_date.year}-01-01").next_year
|
74
|
+
end_of_year = (beginning_of_year - 1 == end_date) ? end_date : beginning_of_year.prev_year - 1
|
75
|
+
while beginning_of_year.prev_year >= start_date
|
76
|
+
end_dates << end_of_year
|
77
|
+
beginning_of_year = ::Date.parse("#{end_of_year.year}-01-01")
|
78
|
+
end_of_year = beginning_of_year - 1
|
79
|
+
end
|
80
|
+
end_dates.sort
|
81
|
+
end
|
55
82
|
end
|
56
83
|
|
57
84
|
end
|
data/lib/datebox/relative.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Datebox
|
2
2
|
class Relative
|
3
3
|
|
4
|
-
@period = nil
|
5
4
|
@period_proc = nil
|
6
5
|
|
7
6
|
def to(relative_to)
|
@@ -9,14 +8,12 @@ module Datebox
|
|
9
8
|
@period_proc.call relative_to
|
10
9
|
end
|
11
10
|
|
12
|
-
def last(period)
|
13
|
-
|
14
|
-
|
15
|
-
case period
|
11
|
+
def last(period, options = {})
|
12
|
+
raise "Expected one of: #{Period::PREDEFINED}" unless Period::PREDEFINED.include?(period.to_sym)
|
13
|
+
case period.to_sym
|
16
14
|
when :day then day_before
|
17
|
-
when :
|
18
|
-
when :
|
19
|
-
when :week_ss then last_week("Saturday")
|
15
|
+
when :n_days then last_n_days(options)
|
16
|
+
when :week then last_week(options)
|
20
17
|
when :month then last_month
|
21
18
|
when :year then last_year
|
22
19
|
end
|
@@ -31,8 +28,19 @@ module Datebox
|
|
31
28
|
@period_proc = Proc.new {|relative_to| Period.new(relative_to - 1, relative_to - 1) }
|
32
29
|
self
|
33
30
|
end
|
31
|
+
|
32
|
+
def last_n_days(options = {})
|
33
|
+
days = (options[:days] || options['days']).to_i
|
34
|
+
inclusive = (options[:exclusive] || options['exclusive']) ? false : true # inclusive by default
|
35
|
+
days = 1 if days.nil? || days <= 0 # days should always > 0 since it only return last x days
|
36
|
+
@period_proc = inclusive ?
|
37
|
+
Proc.new {|relative_to| Period.new(relative_to - days + 1, relative_to) } :
|
38
|
+
Proc.new {|relative_to| Period.new(relative_to - days, relative_to - 1) }
|
39
|
+
self
|
40
|
+
end
|
34
41
|
|
35
|
-
def last_week(
|
42
|
+
def last_week(options = {})
|
43
|
+
last_weekday = options[:last_weekday] || options['last_weekday'] || 'Sunday'
|
36
44
|
@period_proc = Proc.new do |relative_to|
|
37
45
|
end_date = (relative_to.downto relative_to - 6).to_a.find { |d| d.strftime("%A") == last_weekday }
|
38
46
|
Period.new(end_date - 6, end_date)
|
data/lib/datebox/version.rb
CHANGED
data/test/unit/test_period.rb
CHANGED
@@ -6,17 +6,20 @@ class TestPeriod < Test::Unit::TestCase
|
|
6
6
|
#day
|
7
7
|
assert_equal [Date.today - 1], Datebox::Period.split_dates(Date.today - 1, Date.today - 1, "day")
|
8
8
|
assert_equal [Date.today - 3, Date.today - 2, Date.today - 1], Datebox::Period.split_dates(Date.today - 3, Date.today - 1, "day")
|
9
|
+
|
9
10
|
#week
|
10
11
|
assert_equal [], Datebox::Period.split_dates(Date.parse("2013-06-15"), Date.parse("2013-06-22"), "week") #sat to sat
|
11
12
|
assert_equal [Date.parse("2013-06-23")], Datebox::Period.split_dates(Date.parse("2013-06-14"), Date.parse("2013-06-27"), "week") #fri to thu
|
12
13
|
assert_equal [Date.parse("2013-06-23")], Datebox::Period.split_dates(Date.parse("2013-06-17"), Date.parse("2013-06-23"), "week") #mon to sun
|
13
|
-
assert_equal [Date.parse("2014-02-15")], Datebox::Period.split_dates(Date.parse("2014-02-09"), Date.parse("2014-02-15"), "
|
14
|
+
assert_equal [Date.parse("2014-02-15")], Datebox::Period.split_dates(Date.parse("2014-02-09"), Date.parse("2014-02-15"), "week", {:last_weekday => "Saturday"}) #sun to sat
|
14
15
|
assert_equal [Date.parse("2013-06-16"), Date.parse("2013-06-23")], Datebox::Period.split_dates(Date.parse("2013-06-10"), Date.parse("2013-06-27"), "week") #mon to thu
|
16
|
+
|
15
17
|
#month
|
16
18
|
assert_equal [], Datebox::Period.split_dates(Date.parse("2013-01-02"), Date.parse("2013-01-31"), "month")
|
17
19
|
assert_equal [Date.parse("2013-01-31")], Datebox::Period.split_dates(Date.parse("2013-01-01"), Date.parse("2013-01-31"), "month")
|
18
20
|
assert_equal [Date.parse("2013-01-31")], Datebox::Period.split_dates(Date.parse("2012-12-02"), Date.parse("2013-02-02"), "month")
|
19
21
|
assert_equal [Date.parse("2013-01-31"), Date.parse("2013-02-28")], Datebox::Period.split_dates(Date.parse("2012-12-10"), Date.parse("2013-03-03"), "month")
|
22
|
+
|
20
23
|
#instance method test
|
21
24
|
assert_equal [Date.parse("2013-06-16"), Date.parse("2013-06-23")], Datebox::Period.new("2013-06-10", "2013-06-27").split_dates("week") #mon to thu
|
22
25
|
end
|
data/test/unit/test_relative.rb
CHANGED
@@ -7,15 +7,20 @@ class TestRelative < Test::Unit::TestCase
|
|
7
7
|
assert_equal [Date.parse('2013-07-07')], Datebox::Relative.new.same_day.to('2013-07-07').dates
|
8
8
|
assert_equal [Date.parse('2013-07-06')], Datebox::Relative.new.day_before.to('2013-07-07').dates
|
9
9
|
|
10
|
+
# n days
|
11
|
+
assert_equal Datebox::Period.new('2014-06-01', '2014-06-30'), Datebox::Relative.new.last(:n_days, {:days => 30}).to('2014-06-30')
|
12
|
+
assert_equal Datebox::Period.new('2014-06-01', '2014-06-30'), Datebox::Relative.new.last(:n_days, {days: 30, exclusive: true}).to('2014-07-01')
|
13
|
+
|
10
14
|
# week
|
11
15
|
assert_equal Datebox::Period.new('2013-07-01', '2013-07-07'), Datebox::Relative.new.last_week.to('2013-07-09') #tue
|
12
|
-
assert_equal Datebox::Period.new('2013-06-30', '2013-07-06'), Datebox::Relative.new.last_week("Saturday").to('2013-07-09') #tue
|
16
|
+
assert_equal Datebox::Period.new('2013-06-30', '2013-07-06'), Datebox::Relative.new.last_week({:last_weekday => "Saturday"}).to('2013-07-09') #tue
|
13
17
|
assert_equal Datebox::Period.new('2013-07-01', '2013-07-05'), Datebox::Relative.new.last_weekdays_between("Monday", "Friday").to('2013-07-09') #tue
|
14
18
|
assert_equal Datebox::Period.new('2013-07-08', '2013-07-09'), Datebox::Relative.new.last_weekdays_between("Monday", "Tuesday").to('2013-07-09') #tue
|
15
19
|
|
16
20
|
# month
|
17
21
|
assert_equal Datebox::Period.new('2013-06-01', '2013-06-30'), Datebox::Relative.new.last_month.to('2013-07-09')
|
18
22
|
assert_equal Datebox::Period.new('2013-07-01', '2013-07-09'), Datebox::Relative.new.month_to_date.to('2013-07-09')
|
23
|
+
assert_equal Datebox::Period.new('2013-02-01', '2013-02-28'), Datebox::Relative.new.last(:month).to('2013-03-02')
|
19
24
|
|
20
25
|
# year
|
21
26
|
assert_equal Datebox::Period.new('2012-01-01', '2012-12-31'), Datebox::Relative.new.last_year.to('2013-07-09')
|
@@ -25,7 +30,7 @@ class TestRelative < Test::Unit::TestCase
|
|
25
30
|
assert_equal Datebox::Period.new('2013-06-01', '2013-06-01'), Datebox::Relative.new.last(:day).to('2013-06-02')
|
26
31
|
assert_equal Datebox::Period.new('2013-06-01', '2013-06-30'), Datebox::Relative.new.last(:month).to('2013-07-09')
|
27
32
|
assert_equal Datebox::Period.new('2014-02-03', '2014-02-09'), Datebox::Relative.new.last(:week).to('2014-02-10')
|
28
|
-
assert_equal Datebox::Period.new('2014-02-02', '2014-02-08'), Datebox::Relative.new.last(:
|
33
|
+
assert_equal Datebox::Period.new('2014-02-02', '2014-02-08'), Datebox::Relative.new.last(:week, {:last_weekday => "Saturday"}).to('2014-02-10')
|
29
34
|
|
30
35
|
# the one that's different
|
31
36
|
assert_equal [Date.parse('2013-07-01'), Date.parse('2013-07-03')], Datebox::Relative.new.last_weeks_weekdays_as!("Monday", "Wednesday").to('2013-07-05') #fri
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datebox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Borkowski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Offers help with managing dates and periods
|
14
14
|
email:
|