dayset 0.0.1

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