tick_tack 0.1.0 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9225c172ca33abb06528f7c4f31f2fda4e8ce7f1
4
- data.tar.gz: 34f43809643df0284dd534aa90e9b7d1d2a3ce10
3
+ metadata.gz: 754c58f89be99bf3d6205cdc6a1e6de8b3fb7241
4
+ data.tar.gz: 23722a172c09b1678410806560c208a1a7235eb0
5
5
  SHA512:
6
- metadata.gz: 8bf18d94b15f5dfcaea0a596d4bca9c78278ce6a50c4854f718b631392a711b8aa8b01e9c718e28c4107d0b929b1259033c0758cfa81b68496649d0771aae993
7
- data.tar.gz: 087d17b46e899886237d737c75ab8209c56ad5b1f5a536f3363c3eef413d1ddfa43224b519c5153b985be946ccafc7654cae4e9127cadd30d1b05ddeeb6016fd
6
+ metadata.gz: 8da0da836bb99b1024a5bc76adda2b2add3a0973be1aed88f69b9ad069b44f906dc60a16d57d9b3db09e5d04ace78ecdbfabcd688c459599ace2d755e44b8014
7
+ data.tar.gz: 390ed8a0c11dcc465bc49d9dc679aa706310b4ec0cda350c7818e5697735540d28b036f3885e270e22caacfa5f493e5c55a7c99de876b0336b375e097323883c
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  [![Build Status](https://travis-ci.org/tomraithel/tick_tack.svg?branch=master)](https://travis-ci.org/tomraithel/tick_tack)
2
+ [![Gem Version](https://badge.fury.io/rb/tick_tack.svg)](https://badge.fury.io/rb/tick_tack)
2
3
 
3
4
  # TickTack
4
5
 
@@ -1,18 +1,16 @@
1
1
  require 'date'
2
2
 
3
3
  require 'tick_tack/version'
4
+
5
+ require 'tick_tack/scope/year'
6
+ require 'tick_tack/scope/month'
7
+ require 'tick_tack/scope/day'
8
+
9
+ require 'tick_tack/calendar'
4
10
  require 'tick_tack/year'
5
11
  require 'tick_tack/month'
6
12
  require 'tick_tack/day'
7
13
 
8
14
  module TickTack
9
- @now = nil
10
-
11
- def self.now=(now)
12
- @now = now
13
- end
14
15
 
15
- def self.now
16
- @now.nil? ? Date.new : @now
17
- end
18
16
  end
@@ -0,0 +1,43 @@
1
+ module TickTack
2
+ class Calendar
3
+
4
+ attr_reader :conf
5
+
6
+ def initialize(now = nil, conf = {})
7
+ self.now = now
8
+ @conf = {
9
+ dow: 0 # day of week - 0 = sunday, 1 = monday
10
+ }.merge!(conf)
11
+ end
12
+
13
+ def now=(now)
14
+ @now = now
15
+ end
16
+
17
+ def now
18
+ @now.nil? ? DateTime.now.to_date : @now
19
+ end
20
+
21
+ def year(*args)
22
+ self.class.factory(:Year).new(self, *args)
23
+ end
24
+
25
+ def month(*args)
26
+ self.class.factory(:Month).new(self, *args)
27
+ end
28
+
29
+ def day(*args)
30
+ self.class.factory(:Day).new(self, *args)
31
+ end
32
+
33
+ protected
34
+
35
+ def self.factory class_id
36
+ {
37
+ :Year => Year,
38
+ :Month => Month,
39
+ :Day => Day
40
+ }[class_id]
41
+ end
42
+ end
43
+ end
@@ -1,24 +1,53 @@
1
1
  module TickTack
2
2
  class Day
3
- attr_accessor :year
4
- attr_accessor :month
5
- attr_accessor :day
6
-
7
- def initialize(year = nil, month = nil, day = nil)
8
- @year = year || TickTack.now.year
9
- @month = month || TickTack.now.month
10
- @day = day || TickTack.now.day
3
+ include Comparable
4
+ include TickTack::Scope::Day
5
+
6
+ attr_reader :date
7
+
8
+ def initialize(calendar, year_i = nil, month_i = nil, day_i = nil)
9
+ @calendar = calendar
10
+ init_year(year_i)
11
+ init_month(month_i)
12
+ init_day(day_i)
13
+
14
+ @date = Date.new(self.year_i, self.month_i, self.day_i)
15
+ end
16
+
17
+ def week_start
18
+ week_start = date - (date.wday - @calendar.conf[:dow]) % 7
19
+ @calendar.day(week_start.year, week_start.month, week_start.day)
20
+ end
21
+
22
+ def week_end
23
+ week_end = week_start.date + 6
24
+ @calendar.day(week_end.year, week_end.month, week_end.day)
11
25
  end
12
26
 
13
- def date
14
- Date.new(year, month, day)
27
+ def weekdays
28
+ (week_start..week_end).to_a
15
29
  end
16
30
 
17
- def ==(o)
18
- o.class == self.class &&
19
- o.year == year &&
20
- o.month == month &&
21
- o.day == day
31
+ def next
32
+ next_date = @date.next_day
33
+ @calendar.day(next_date.year, next_date.month, next_date.day)
22
34
  end
35
+ alias_method :succ, :next
36
+
37
+ def previous
38
+ prev_date = @date.prev_day
39
+ @calendar.day(prev_date.year, prev_date.month, prev_date.day)
40
+ end
41
+ alias_method :prev, :previous
42
+
43
+ def <=>(other)
44
+ self.date <=> other.date
45
+ end
46
+
47
+ # def inspect
48
+ # "#{year_i}-#{month_i}-#{day_i}"
49
+ # end
50
+
51
+ private
23
52
  end
24
53
  end
@@ -1,30 +1,66 @@
1
1
  module TickTack
2
2
  class Month
3
- attr_accessor :year
4
- attr_accessor :month
3
+ include Comparable
4
+ include TickTack::Scope::Month
5
5
 
6
- def initialize(year = nil, month = nil)
7
- @year = year || TickTack.now.year
8
- @month = month || TickTack.now.month
6
+ def initialize(calendar, year_i = nil, month_i = nil)
7
+ @calendar = calendar
8
+
9
+ init_year(year_i)
10
+ init_month(month_i)
11
+
12
+ @first_day_date = Date.new(self.year_i, self.month_i, 1)
9
13
  end
10
14
 
11
15
  def first_day
12
- TickTack::Day.new(year, month, 1)
16
+ @calendar.day(year_i, month_i, 1)
13
17
  end
14
18
 
15
19
  def last_day
16
- date = (first_day.date >> 1) - 1
17
- TickTack::Day.new(year, month, date.day)
20
+ date = (@first_day_date >> 1) - 1
21
+ @calendar.day(year_i, month_i, date.day)
22
+ end
23
+
24
+ def day(day_i)
25
+ @calendar.day(year_i, month_i, day_i)
26
+ end
27
+
28
+ def weekdays
29
+ first = first_day.week_start
30
+ last = last_day.week_end
31
+ weeks = []
32
+
33
+ while first < last
34
+ weeks << first.weekdays
35
+ first = first.week_end.next
36
+ end
37
+
38
+ weeks
39
+ end
40
+
41
+ def contains?(other)
42
+ range = (first_day.date.jd..last_day.date.jd)
43
+ if other.is_a? Day
44
+ range === other.date.jd
45
+ else
46
+ false
47
+ end
48
+ end
49
+
50
+ def next
51
+ next_date = @first_day_date.next_month
52
+ @calendar.month(next_date.year, next_date.month)
18
53
  end
54
+ alias_method :succ, :next
19
55
 
20
- def day(day)
21
- TickTack::Day.new(year, month, day)
56
+ def previous
57
+ prev_date = @first_day_date.prev_month
58
+ @calendar.month(prev_date.year, prev_date.month)
22
59
  end
60
+ alias_method :prev, :previous
23
61
 
24
- def ==(o)
25
- o.class == self.class &&
26
- o.year == year &&
27
- o.month == month
62
+ def <=>(other)
63
+ self.first_day.date <=> other.first_day.date
28
64
  end
29
65
  end
30
66
  end
@@ -0,0 +1,17 @@
1
+ module TickTack
2
+ module Scope
3
+ module Day
4
+ include TickTack::Scope::Month
5
+
6
+ attr_accessor :day_i
7
+
8
+ def init_day(day_i = nil)
9
+ @day_i = day_i || @calendar.now.day
10
+ end
11
+
12
+ def month
13
+ @calendar.month(year_i, month_i)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module TickTack
2
+ module Scope
3
+ module Month
4
+ include TickTack::Scope::Year
5
+
6
+ attr_accessor :month_i
7
+
8
+ def init_month(month_i = nil)
9
+ @month_i = month_i || @calendar.now.month
10
+ end
11
+
12
+ def year
13
+ @calendar.year(year_i)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ module TickTack
2
+ module Scope
3
+ module Year
4
+ attr_accessor :year_i
5
+
6
+ def init_year(year_i = nil)
7
+ @year_i = year_i || @calendar.now.year
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module TickTack
2
- VERSION = '0.1.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -1,25 +1,59 @@
1
1
  module TickTack
2
2
  class Year
3
- attr_accessor :year
3
+ include Comparable
4
+ include TickTack::Scope::Year
4
5
 
5
- def initialize(year = nil)
6
- @year = year || TickTack.now.year
6
+ def initialize(calendar, year_i = nil)
7
+ @calendar = calendar
8
+ init_year(year_i)
9
+
10
+ @first_day_date = Date.new(self.year_i, 1, 1)
7
11
  end
8
12
 
9
13
  def first_day
10
- TickTack::Day.new(year, 1, 1)
14
+ @calendar.day(year_i, 1, 1)
11
15
  end
12
16
 
13
17
  def last_day
14
- TickTack::Day.new(year, 12, 31)
18
+ date = (@first_day_date >> 12) - 1
19
+ @calendar.day(year_i, date.month, date.day)
20
+ end
21
+
22
+ def month(month_i)
23
+ @calendar.month(year_i, month_i)
24
+ end
25
+
26
+ def months
27
+ (1..12).map do |i|
28
+ month(i)
29
+ end
30
+ end
31
+
32
+ def contains?(other)
33
+ range = (first_day.date.jd..last_day.date.jd)
34
+ if other.is_a? Month
35
+ range === other.first_day.date.jd
36
+ elsif other.is_a? Day
37
+ range === other.date.jd
38
+ else
39
+ false
40
+ end
41
+ end
42
+
43
+ def next
44
+ next_date = @first_day_date.next_year
45
+ @calendar.year(next_date.year)
15
46
  end
47
+ alias_method :succ, :next
16
48
 
17
- def month(month)
18
- Month.new(year, month)
49
+ def previous
50
+ prev_date = @first_day_date.prev_year
51
+ @calendar.year(prev_date.year)
19
52
  end
53
+ alias_method :prev, :previous
20
54
 
21
- def ==(o)
22
- o.class == self.class && o.year == year
55
+ def <=>(other)
56
+ self.first_day.date <=> other.first_day.date
23
57
  end
24
58
  end
25
59
  end
@@ -14,6 +14,9 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/tomraithel/tick_tack"
15
15
  spec.license = "MIT"
16
16
 
17
+ spec.required_ruby_version = '>= 2.2.2'
18
+ spec.required_rubygems_version = '>= 2.0.0'
19
+
17
20
  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
21
  # delete this section to allow pushing this gem to any host.
19
22
  if spec.respond_to?(:metadata)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tick_tack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Raithel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-01-27 00:00:00.000000000 Z
11
+ date: 2016-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,8 +70,12 @@ files:
70
70
  - bin/console
71
71
  - bin/setup
72
72
  - lib/tick_tack.rb
73
+ - lib/tick_tack/calendar.rb
73
74
  - lib/tick_tack/day.rb
74
75
  - lib/tick_tack/month.rb
76
+ - lib/tick_tack/scope/day.rb
77
+ - lib/tick_tack/scope/month.rb
78
+ - lib/tick_tack/scope/year.rb
75
79
  - lib/tick_tack/version.rb
76
80
  - lib/tick_tack/year.rb
77
81
  - tick_tack.gemspec
@@ -88,12 +92,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
92
  requirements:
89
93
  - - ">="
90
94
  - !ruby/object:Gem::Version
91
- version: '0'
95
+ version: 2.2.2
92
96
  required_rubygems_version: !ruby/object:Gem::Requirement
93
97
  requirements:
94
98
  - - ">="
95
99
  - !ruby/object:Gem::Version
96
- version: '0'
100
+ version: 2.0.0
97
101
  requirements: []
98
102
  rubyforge_project:
99
103
  rubygems_version: 2.5.1