dayset 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.
- data/README.md +58 -0
- data/dayset.gemspec +15 -0
- data/lib/day_set.rb +52 -0
- data/spec/day_set_spec.rb +48 -0
- metadata +52 -0
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
DaySet
|
2
|
+
======
|
3
|
+
|
4
|
+
With this gem you can generate a set of any number of days for a month
|
5
|
+
or year, is useful for example when you have to divide a month
|
6
|
+
in a fixed number of days, to create table partitions based on a date:
|
7
|
+
|
8
|
+
|
9
|
+
Generating sets of 2 days January of 2012
|
10
|
+
--------------------------------------
|
11
|
+
|
12
|
+
gem install dayset
|
13
|
+
|
14
|
+
require 'day_set'
|
15
|
+
|
16
|
+
DaySet.new(:date => Date.new(2012, 1), :group_number => 2).sets.first
|
17
|
+
|
18
|
+
#=> [#<Date: 2012-01-01 ((2455928j,0s,0n),+0s,2299161j)>, #<Date: 2012-01-02 ((2455929j,0s,0n),+0s,2299161j)>]
|
19
|
+
|
20
|
+
Generating sets of 6 days January of 2012
|
21
|
+
--------------------------------------
|
22
|
+
|
23
|
+
require 'day_set'
|
24
|
+
|
25
|
+
DaySet.new(:date => Date.new(2012, 1), :group_number => 6).sets.last
|
26
|
+
|
27
|
+
# The last set has only one day because January has 31 days
|
28
|
+
# 31 % 6 is 1, I have named this set "residue set"
|
29
|
+
|
30
|
+
=> [#<Date: 2012-01-31 ((2455958j,0s,0n),+0s,2299161j)>]
|
31
|
+
|
32
|
+
# It generates set of 6 days but if there is a 'residue set' with
|
33
|
+
# a number of days lower than group_number / 2 it will be moved to
|
34
|
+
# the previous set.
|
35
|
+
|
36
|
+
# Take a look that Date: 2012-01-31 was moved.
|
37
|
+
|
38
|
+
DaySet.new(:date => Date.new(2012, 1), :group_number => 6,
|
39
|
+
:move_residue => true).sets.last
|
40
|
+
|
41
|
+
=> [#<Date: 2012-01-25 ((2455952j,0s,0n),+0s,2299161j)>, #<Date: 2012-01-26 ((2455953j,0s,0n),+0s,2299161j)>, #<Date: 2012-01-27 ((2455954j,0s,0n),+0s,2299161j)>, #<Date: 2012-01-28 ((2455955j,0s,0n),+0s,2299161j)>, #<Date: 2012-01-29 ((2455956j,0s,0n),+0s,2299161j)>, #<Date: 2012-01-30 ((2455957j,0s,0n),+0s,2299161j)>, #<Date: 2012-01-31 ((2455958j,0s,0n),+0s,2299161j)>]
|
42
|
+
|
43
|
+
|
44
|
+
Generating labels of 6 days for year 2012
|
45
|
+
--------------------------------------
|
46
|
+
|
47
|
+
# it will generate an array of labels with this format:
|
48
|
+
# YYYY-MM--(first_day_of_the_set)-(last_day_of_the_set)
|
49
|
+
|
50
|
+
@args = { :group_number => 6, :move_residue => true }
|
51
|
+
|
52
|
+
labels = DaySet.gen_for_year(2012, @args).map do |s|
|
53
|
+
date = s.first
|
54
|
+
"#{date.year}-#{date.month}--#{date.day}-#{s.last.day}"
|
55
|
+
end
|
56
|
+
|
57
|
+
["2012-1--1-6", "2012-1--7-12", "2012-1--13-18", "2012-1--19-24", "2012-1--25-31", "2012-2--1-6", "2012-2--7-12", "2012-2--13-18", "2012-2--19-24", "2012-2--25-29", "2012-3--1-6", "2012-3--7-12", "2012-3--13-18", "2012-3--19-24", "2012-3--25-31", "2012-4--1-6", "2012-4--7-12", "2012-4--13-18", "2012-4--19-24", "2012-4--25-30", "2012-5--1-6", "2012-5--7-12", "2012-5--13-18", "2012-5--19-24", "2012-5--25-31", "2012-6--1-6", "2012-6--7-12", "2012-6--13-18", "2012-6--19-24", "2012-6--25-30", "2012-7--1-6", "2012-7--7-12", "2012-7--13-18", "2012-7--19-24", "2012-7--25-31", "2012-8--1-6", "2012-8--7-12", "2012-8--13-18", "2012-8--19-24", "2012-8--25-31", "2012-9--1-6", "2012-9--7-12", "2012-9--13-18", "2012-9--19-24", "2012-9--25-30", "2012-10--1-6", "2012-10--7-12", "2012-10--13-18", "2012-10--19-24", "2012-10--25-31", "2012-11--1-6", "2012-11--7-12", "2012-11--13-18", "2012-11--19-24", "2012-11--25-30", "2012-12--1-6", "2012-12--7-12", "2012-12--13-18", "2012-12--19-24", "2012-12--25-31"]
|
58
|
+
|
data/dayset.gemspec
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'dayset'
|
3
|
+
s.version = "0.0.1"
|
4
|
+
s.date = Date.today.to_s
|
5
|
+
s.summary = "With this gem you can generate a set of any number of days for a month or for a year."
|
6
|
+
s.description = "With this gem you can generate a set of any number of days for a month or for a year, is useful for example when you have to divide a month in a fixed number of days, to create table partitions based on a date."
|
7
|
+
s.authors = ["Gastón Ramos"]
|
8
|
+
s.email = 'ramos.gaston@gmail.com'
|
9
|
+
s.files = Dir.glob("**/*").delete_if do |item|
|
10
|
+
item.include?("~") or item =~ /\.log$/ or
|
11
|
+
item =~ /~$/
|
12
|
+
end
|
13
|
+
s.required_ruby_version = '>= 1.9.3'
|
14
|
+
s.homepage = "https://github.com/gramos/dayset"
|
15
|
+
end
|
data/lib/day_set.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'date'
|
2
|
+
class DaySet < Array
|
3
|
+
|
4
|
+
attr_reader :sets
|
5
|
+
|
6
|
+
def last_day_of_the_month
|
7
|
+
d = Date.new @date.year, @date.month
|
8
|
+
d += 42
|
9
|
+
last_d = Date.new(d.year, d.month) - 1
|
10
|
+
last_d.day
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(args)
|
14
|
+
@date = args[:date]
|
15
|
+
@group_number = args[:group_number]
|
16
|
+
@move_residue = args[:move_residue]
|
17
|
+
@sets = gen_range!.each_slice(@group_number).to_a
|
18
|
+
move_residue! if @move_residue
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.gen_for_year(year, options)
|
22
|
+
sets = []
|
23
|
+
|
24
|
+
(1..12).each do |month|
|
25
|
+
date = Date.new year, month
|
26
|
+
self.new(options.merge(:date => date)).sets.each do |s|
|
27
|
+
sets << s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
sets
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def gen_range!
|
37
|
+
last_day = last_day_of_the_month
|
38
|
+
low_limit = Date.new @date.year, @date.month, 1
|
39
|
+
high_limit = Date.new @date.year, @date.month, last_day
|
40
|
+
low_limit..high_limit
|
41
|
+
end
|
42
|
+
|
43
|
+
def move_residue!
|
44
|
+
if @sets.last.size < (@group_number / 2)
|
45
|
+
last = @sets.pop
|
46
|
+
@sets.last << last.first
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'minitest/spec'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'day_set'
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
describe "DaySet group in set of 7 days" do
|
7
|
+
|
8
|
+
before do
|
9
|
+
@date = Date.new(2012, 1)
|
10
|
+
@args = { :date => @date, :group_number => 7 }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should get first set of 7 days" do
|
14
|
+
expected = (Date.new(2012, 1, 1)..Date.new(2012, 1, 7)).to_a
|
15
|
+
|
16
|
+
DaySet.new(@args).sets[0].must_equal expected
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should get the second set of 7 days" do
|
20
|
+
expected = (Date.new(2012, 1, 8)..Date.new(2012, 1, 14)).to_a
|
21
|
+
|
22
|
+
DaySet.new(@args).sets[1].must_equal expected
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "DaySet group in set of 6 days" do
|
28
|
+
|
29
|
+
before do
|
30
|
+
@date = Date.new(2012, 1)
|
31
|
+
@args = { :date => @date, :group_number => 6,
|
32
|
+
:move_residue => true }
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should move the residue to the previous week" do
|
36
|
+
expected = (Date.new(2012, 1, 25)..Date.new(2012, 1, 31)).to_a
|
37
|
+
|
38
|
+
DaySet.new(@args).sets.last.must_equal expected
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should generate set of days for a year" do
|
42
|
+
@args.delete(:date)
|
43
|
+
expected = (Date.new(2012, 12, 25)..Date.new(2012, 12, 31)).to_a
|
44
|
+
|
45
|
+
DaySet.gen_for_year(2012, @args).last.must_equal expected
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dayset
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Gastón Ramos
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-26 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: With this gem you can generate a set of any number of days for a month
|
15
|
+
or for a year, is useful for example when you have to divide a month in a fixed
|
16
|
+
number of days, to create table partitions based on a date.
|
17
|
+
email: ramos.gaston@gmail.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- spec/day_set_spec.rb
|
23
|
+
- dayset.gemspec
|
24
|
+
- README.md
|
25
|
+
- lib/day_set.rb
|
26
|
+
homepage: https://github.com/gramos/dayset
|
27
|
+
licenses: []
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.9.3
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.23
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: With this gem you can generate a set of any number of days for a month or
|
50
|
+
for a year.
|
51
|
+
test_files: []
|
52
|
+
has_rdoc:
|