datebox 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3ee3f21eef1adfc455da526dbbfd037f2b17e1d9
4
+ data.tar.gz: 2760bf9e09bf08a526df3622eeab16f3ada22247
5
+ SHA512:
6
+ metadata.gz: 3cc78e68d9eacec4962e39137bd17df8d64156e2dc888b1a99e9c8f1da20d5742cef5f5a27de94ca43798da466a623836afc38e1853cff4fed8e053d7a6b5d53
7
+ data.tar.gz: 15c4049a449cf389c75adf6c41d2ce17583effb1a12720dc5b6fa7caa685ca4469ad8e13302129c70749c04ee10e80d5b8ae44c5256f6a3af917f509cb1529a6
@@ -0,0 +1,2 @@
1
+ *.db
2
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in disclosure-client.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2013 Forward3D
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ 'Software'), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,32 @@
1
+ # Datebox
2
+
3
+ Provides help with managing dates and periods
4
+
5
+ ## Installation
6
+
7
+ gem install datebox
8
+
9
+ ## Usage
10
+
11
+ Include gem in Gemfile
12
+
13
+ gem 'datebox'
14
+ # or
15
+ gem 'datebox', :git => 'git@github.com:forward3d/datebox'
16
+
17
+ Allows using periods
18
+
19
+ period = Datebox::Period.new("2013-06-10", "2013-06-27")
20
+ period.from
21
+ period.to
22
+
23
+ Allows splitting periods (returns ending dates of periods)
24
+
25
+ Datebox::Period.split_dates(Date.parse("2013-06-14"), Date.parse("2013-06-27"), "week")
26
+
27
+ It's also possible to calculate periods relative to given dates
28
+
29
+ period_month = Datebox::Relative.new.last_month.to('2013-07-09')
30
+ preiod_week = Datebox::Relative.new.last_week.to('2013-07-09')
31
+
32
+ It's best to have a look at code & tests
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'datebox'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "datebox"
8
+ gem.version = Datebox::VERSION
9
+ gem.authors = ["Robert Borkowski"]
10
+ gem.email = ["robert.borkowski@forward3d.com"]
11
+ gem.description = %q{Offers help with managing dates and periods}
12
+ gem.summary = %q{Got fed up with implementing date related functionality everywhere}
13
+ gem.homepage = "https://github.com/forward3d/datebox"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = [] #gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = [] #gem.files.grep(%r{^(test|spec|features)/})
18
+ # gem.test_files = `git grep test`.split(/\n/).map {|f| File.basename(f.split(':').first)}
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.license = 'MIT'
22
+
23
+ end
@@ -0,0 +1,7 @@
1
+ require 'date'
2
+ require_relative 'datebox/period'
3
+ require_relative 'datebox/relative'
4
+ require_relative 'datebox/version'
5
+
6
+ module Datebox
7
+ end
@@ -0,0 +1,55 @@
1
+ module Datebox
2
+ class Period
3
+ attr_reader :from, :to
4
+
5
+ def initialize(from, to)
6
+ @from = from.is_a?(Date) ? from : Date.parse(from)
7
+ @to = to.is_a?(Date) ? to : Date.parse(to)
8
+ raise "FROM date should not be later than TO date" if @to < @from
9
+ end
10
+
11
+ def dates
12
+ (@from..@to).to_a
13
+ end
14
+
15
+ def ==(other)
16
+ @from == other.from && @to == other.to
17
+ end
18
+
19
+ def split_dates(period, options = {})
20
+ self.class.split_dates(from, to, period, options)
21
+ end
22
+
23
+ class << self
24
+ def split_dates(start_date, end_date, period, options = {})
25
+ return (start_date..end_date).to_a if period == "day"
26
+ return split_weekly_dates(start_date, end_date, options) if period == "week"
27
+ return split_monthly_dates(start_date, end_date) if period == "month"
28
+ end
29
+
30
+ def split_weekly_dates(start_date, end_date, options = {})
31
+ last_weekday = options[:last_weekday] || "Sunday"
32
+ end_dates = []
33
+ end_of_week = (end_date.downto end_date - 6).to_a.find { |d| d.strftime("%A") == last_weekday }
34
+ while end_of_week - 6 >= start_date
35
+ end_dates << end_of_week
36
+ end_of_week -= 7
37
+ end
38
+ end_dates.sort
39
+ end
40
+
41
+ def split_monthly_dates(start_date, end_date)
42
+ end_dates = []
43
+ beginning_of_month = ::Date.parse("#{end_date.year}-#{end_date.month}-01").next_month
44
+ end_of_month = (beginning_of_month - 1 == end_date) ? end_date : beginning_of_month.prev_month - 1
45
+ while beginning_of_month.prev_month >= start_date
46
+ end_dates << end_of_month
47
+ beginning_of_month = ::Date.parse("#{end_of_month.year}-#{end_of_month.month}-01")
48
+ end_of_month = beginning_of_month - 1
49
+ end
50
+ end_dates.sort
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,79 @@
1
+ module Datebox
2
+ class Relative
3
+
4
+ @period = nil
5
+ @period_proc = nil
6
+
7
+ def to(relative_to)
8
+ relative_to = (relative_to.is_a?(Date) ? relative_to : Date.parse(relative_to))
9
+ @period_proc.call relative_to
10
+ end
11
+
12
+ def same_day
13
+ @period_proc = Proc.new {|relative_to| Period.new(relative_to, relative_to) }
14
+ self
15
+ end
16
+
17
+ def last_week(last_weekday = "Sunday")
18
+ @period_proc = Proc.new do |relative_to|
19
+ end_date = (relative_to.downto relative_to - 6).to_a.find { |d| d.strftime("%A") == last_weekday }
20
+ Period.new(end_date - 6, end_date)
21
+ end
22
+ self
23
+ end
24
+
25
+ def last_weekdays_between(start_day, end_day)
26
+ @period_proc = Proc.new do |relative_to|
27
+ end_date = (relative_to.downto relative_to - 6).to_a.find { |d| d.strftime("%A") == end_day }
28
+ start_date = (end_date - 7 .. end_date).to_a.find { |d| d.strftime("%A") == start_day }
29
+ Period.new(start_date, end_date)
30
+ end
31
+ self
32
+ end
33
+
34
+ def last_weeks_weekdays_as!(*days) #this one returns array!
35
+ @period_proc = Proc.new do |relative_to|
36
+ days.map do |p|
37
+ (relative_to.downto relative_to - 6).to_a.find { |d| d.strftime("%A") == p }
38
+ end
39
+ end
40
+ self
41
+ end
42
+
43
+ def last_month
44
+ @period_proc = Proc.new do |relative_to|
45
+ previous_month_start = Date.parse("#{relative_to.prev_month.strftime('%Y-%m')}-01")
46
+ previous_month_end = previous_month_start.next_month - 1
47
+ Period.new(previous_month_start, previous_month_end)
48
+ end
49
+ self
50
+ end
51
+
52
+ def month_to_date
53
+ @period_proc = Proc.new do |relative_to|
54
+ month_start = Date.parse("#{relative_to.strftime('%Y-%m')}-01")
55
+ Period.new(month_start, relative_to)
56
+ end
57
+ self
58
+ end
59
+
60
+ def last_year
61
+ @period_proc = Proc.new do |relative_to|
62
+ previous_year_start = Date.parse("#{relative_to.prev_year.year}-01-01")
63
+ previous_year_end = previous_year_start.next_year - 1
64
+ Period.new(previous_year_start, previous_year_end)
65
+ end
66
+ self
67
+ end
68
+
69
+ def year_to_date
70
+ @period_proc = Proc.new do |relative_to|
71
+ year_start = Date.parse("#{relative_to.year}-01-01")
72
+ Period.new(year_start, relative_to)
73
+ end
74
+ self
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,3 @@
1
+ module Datebox
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "test/unit"
2
+
3
+ root = File.join(File.dirname(File.expand_path(__FILE__)), '..')
4
+ require "#{root}/lib/datebox"
5
+
@@ -0,0 +1,23 @@
1
+ require '../test_helper'
2
+
3
+ class TestPeriod < Test::Unit::TestCase
4
+
5
+ def test_splits_periods_correctly
6
+ #day
7
+ assert_equal [Date.today - 1], Datebox::Period.split_dates(Date.today - 1, Date.today - 1, "day")
8
+ assert_equal [Date.today - 3, Date.today - 2, Date.today - 1], Datebox::Period.split_dates(Date.today - 3, Date.today - 1, "day")
9
+ #week
10
+ assert_equal [], Datebox::Period.split_dates(Date.parse("2013-06-15"), Date.parse("2013-06-22"), "week") #sat to sat
11
+ 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
+ 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("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
14
+ #month
15
+ assert_equal [], Datebox::Period.split_dates(Date.parse("2013-01-02"), Date.parse("2013-01-31"), "month")
16
+ assert_equal [Date.parse("2013-01-31")], Datebox::Period.split_dates(Date.parse("2013-01-01"), Date.parse("2013-01-31"), "month")
17
+ assert_equal [Date.parse("2013-01-31")], Datebox::Period.split_dates(Date.parse("2012-12-02"), Date.parse("2013-02-02"), "month")
18
+ 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")
19
+ #instance method test
20
+ 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
21
+ end
22
+
23
+ end
@@ -0,0 +1,23 @@
1
+ require '../test_helper'
2
+
3
+ class TestRelative < Test::Unit::TestCase
4
+
5
+ def test_calculates_correctly
6
+ # day
7
+ assert_equal [Date.parse('2013-07-07')], Datebox::Relative.new.same_day.to('2013-07-07').dates
8
+ # week
9
+ assert_equal Datebox::Period.new('2013-07-01', '2013-07-07'), Datebox::Relative.new.last_week.to('2013-07-09') #tue
10
+ assert_equal Datebox::Period.new('2013-07-01', '2013-07-05'), Datebox::Relative.new.last_weekdays_between("Monday", "Friday").to('2013-07-09') #tue
11
+ assert_equal Datebox::Period.new('2013-07-08', '2013-07-09'), Datebox::Relative.new.last_weekdays_between("Monday", "Tuesday").to('2013-07-09') #tue
12
+ # month
13
+ assert_equal Datebox::Period.new('2013-06-01', '2013-06-30'), Datebox::Relative.new.last_month.to('2013-07-09')
14
+ assert_equal Datebox::Period.new('2013-07-01', '2013-07-09'), Datebox::Relative.new.month_to_date.to('2013-07-09')
15
+ # year
16
+ assert_equal Datebox::Period.new('2012-01-01', '2012-12-31'), Datebox::Relative.new.last_year.to('2013-07-09')
17
+ assert_equal Datebox::Period.new('2013-01-01', '2013-07-09'), Datebox::Relative.new.year_to_date.to('2013-07-09')
18
+
19
+ # the one that's different
20
+ 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
21
+ end
22
+
23
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: datebox
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Robert Borkowski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Offers help with managing dates and periods
14
+ email:
15
+ - robert.borkowski@forward3d.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - .gitignore
21
+ - Gemfile
22
+ - LICENSE
23
+ - README.md
24
+ - Rakefile
25
+ - datebox.gemspec
26
+ - lib/datebox.rb
27
+ - lib/datebox/period.rb
28
+ - lib/datebox/relative.rb
29
+ - lib/datebox/version.rb
30
+ - test/test_helper.rb
31
+ - test/unit/test_period.rb
32
+ - test/unit/test_relative.rb
33
+ homepage: https://github.com/forward3d/datebox
34
+ licenses:
35
+ - MIT
36
+ metadata: {}
37
+ post_install_message:
38
+ rdoc_options: []
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ requirements: []
52
+ rubyforge_project:
53
+ rubygems_version: 2.0.5
54
+ signing_key:
55
+ specification_version: 4
56
+ summary: Got fed up with implementing date related functionality everywhere
57
+ test_files: []