mmb-seasonal 0.0.3 → 0.0.4

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.
@@ -3,19 +3,25 @@ events are currently happening.
3
3
 
4
4
  Example (print holiday greetings):
5
5
 
6
+ <pre>
7
+ <code>
6
8
  require 'seasonal'
7
9
 
8
10
  holidays = Seasonal::Calendar.new
9
11
 
10
12
  holidays.push(Seasonal::Event.new('Merry Christmas', 'America/New_York',
11
- :start => 'dec 25 00:00', :end => 'dec 25 23:59:59'))
13
+ :on => 'dec 25'))
12
14
  holidays.push(Seasonal::Event.new("April Fool's Day", 'America/New_York',
13
- :start => 'apr 1 00:00', :end => 'apr 1 23:59:59'))
15
+ :on => 'apr 1'))
14
16
 
15
- holidays.going_on { |e| puts e.payload }
17
+ holidays.going_on { |e| puts e }
18
+ </code>
19
+ </pre>
16
20
 
17
21
  Example (make text red between 9:00 and 10:00 am):
18
22
 
23
+ <pre>
24
+ <code>
19
25
  require 'seasonal'
20
26
 
21
27
  colors = Seasonal::Calendar.new
@@ -23,13 +29,15 @@ colors = Seasonal::Calendar.new
23
29
  colors.push(Seasonal::Event.new('#ff0000', 'America/New_York',
24
30
  :start => '9:00am', :end => '10:00am'))
25
31
 
26
- color = '#000000'
27
- colors.going_on { |e| color = e.payload }
28
-
32
+ color = colors.going_on(:or_if_none => '#000000')
29
33
  puts "<p style=\"background-color : #{color}\">test</p>"
34
+ </code>
35
+ </pre>
30
36
 
31
37
  Example (sale ends Jul 10):
32
38
 
39
+ <pre>
40
+ <code>
33
41
  require 'seasonal'
34
42
 
35
43
  sales = Seasonal::Calendar.new
@@ -37,7 +45,9 @@ sales = Seasonal::Calendar.new
37
45
  sales.push(Seasonal::Event.new('Everything on sale', 'America/New_York',
38
46
  :end => 'jul 10 2009'))
39
47
 
40
- sales.going_on { |e| puts e.payload }
48
+ sales.going_on { |e| puts e }
49
+ </code>
50
+ </pre>
41
51
 
42
52
  Each event has an attached payload which can be any object.
43
53
 
data/lib/seasonal.rb CHANGED
@@ -14,8 +14,13 @@ module Seasonal
14
14
  def initialize(payload, zone, options={})
15
15
  @payload = payload
16
16
  @zone = zone
17
- @start = options[:start]
18
- @ennd = options[:end]
17
+ if options[:on]
18
+ @start = "#{options[:on]} 00:00:00"
19
+ @ennd = "#{options[:on]} 23:59:59"
20
+ else
21
+ @start = options[:start]
22
+ @ennd = options[:end]
23
+ end
19
24
  end
20
25
 
21
26
  def start_utc
@@ -54,8 +59,26 @@ module Seasonal
54
59
 
55
60
  class Calendar < Array
56
61
 
57
- def going_on(test_time=Time.now)
58
- each { |event| yield event if event.going_on?(test_time) }
62
+ def going_on(options={})
63
+ options = { :at => Time.now, :payloads => true }.merge(options)
64
+ if block_given?
65
+ if options[:payloads]
66
+ each { |event| yield event.payload if event.going_on?(options[:at]) }
67
+ else
68
+ each { |event| yield event if event.going_on?(options[:at]) }
69
+ end
70
+ else
71
+ result = reject { |event| !event.going_on?(options[:at]) }
72
+ if options[:payloads]
73
+ if result.empty? and !options[:or_if_none].nil?
74
+ result.push(options[:or_if_none])
75
+ else
76
+ result.collect { |e| e.payload }
77
+ end
78
+ else
79
+ result
80
+ end
81
+ end
59
82
  end
60
83
 
61
84
  end
data/seasonal.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "seasonal"
3
- s.version = "0.0.3"
3
+ s.version = "0.0.4"
4
4
  s.date = "2008-11-10"
5
5
  s.summary = "create logic based on defined date and time events"
6
6
  s.email = "matthewm@boedicker.org"
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.authors = ["Matthew M. Boedicker"]
11
11
  s.files = [
12
12
  "lib/seasonal.rb",
13
- "README",
13
+ "README.textile",
14
14
  "seasonal.gemspec",
15
15
  ]
16
16
  s.test_files = [
@@ -6,13 +6,24 @@ require 'test/unit'
6
6
 
7
7
  class SeasonalTest < Test::Unit::TestCase
8
8
 
9
- def test_none
9
+ def test_event_none
10
10
  e = Seasonal::Event.new(nil, 'America/New_York')
11
11
 
12
12
  assert_equal(false, e.going_on?)
13
13
  end
14
14
 
15
- def test_end
15
+ def test_event_start
16
+ ss = 'jan 2'
17
+ start = Time.parse(ss).utc
18
+
19
+ e = Seasonal::Event.new(nil, 'America/New_York', :start => ss)
20
+
21
+ assert_equal(false, e.going_on?(start - 1))
22
+ assert(e.going_on?(start))
23
+ assert(e.going_on?(start + 1))
24
+ end
25
+
26
+ def test_event_end
16
27
  es = 'mar 17'
17
28
  ennd = Time.parse(es).utc
18
29
 
@@ -23,36 +34,103 @@ class SeasonalTest < Test::Unit::TestCase
23
34
  assert_equal(false, e.going_on?(ennd + 1))
24
35
  end
25
36
 
26
- def test_start
27
- ss = 'jan 2'
37
+ def test_event_start_end
38
+ ss = 'aug 29'
39
+ es = 'sep 1'
28
40
  start = Time.parse(ss).utc
41
+ ennd = Time.parse(es).utc
29
42
 
30
- e = Seasonal::Event.new(nil, 'America/New_York', :start => ss)
43
+ e = Seasonal::Event.new(nil, 'America/New_York', :start => ss, :end => es)
31
44
 
32
45
  assert_equal(false, e.going_on?(start - 1))
33
46
  assert(e.going_on?(start))
34
- assert(e.going_on?(start + 1))
47
+ assert(e.going_on?(ennd))
48
+ assert_equal(false, e.going_on?(ennd + 1))
35
49
  end
36
50
 
37
- def test_start_end
38
- ss = 'aug 29'
39
- es = 'sep 1'
40
- start = Time.parse(ss).utc
41
- ennd = Time.parse(es).utc
51
+ def test_calendar_going_on
52
+ calendar = Seasonal::Calendar.new
53
+ calendar.push(Seasonal::Event.new(nil, 'America/New_York',
54
+ :start => 'June 22, 1978 10:00pm', :end => 'June 28, 1978 10:00am'))
55
+ assert_equal(1, calendar.going_on(
56
+ :at => Time.utc(1978, 6, 23, 2, 0, 0)).size)
57
+ end
42
58
 
43
- e = Seasonal::Event.new(nil, 'America/New_York', :start => ss, :end => es)
59
+ def test_calendar_going_on_or_if_none_some
60
+ calendar = Seasonal::Calendar.new
61
+ calendar.push(Seasonal::Event.new(nil, 'America/New_York',
62
+ :start => 'Sep 14, 1999 1:10pm', :end => 'Sep 15, 1999 12:00am'))
63
+ assert_equal(1, calendar.going_on(
64
+ :at => Time.utc(1999, 9, 14, 18, 11, 1)).size)
65
+ end
44
66
 
45
- assert_equal(false, e.going_on?(start - 1))
67
+ def test_calendar_going_on_or_if_none_none
68
+ calendar = Seasonal::Calendar.new
69
+ calendar.push(Seasonal::Event.new(nil, 'America/New_York',
70
+ :start => '05/01/2007', :end => '05/03/2007'))
71
+ or_if_none = 'default'
72
+ assert_equal(1, calendar.going_on(:at => Time.utc(2007, 5, 5, 0, 0, 0),
73
+ :or_if_none => or_if_none).size)
74
+ assert_equal(or_if_none, calendar.going_on(
75
+ :at => Time.utc(2007, 5, 5, 0, 0, 0), :or_if_none => or_if_none).first)
76
+ end
46
77
 
47
- if start <= ennd
48
- assert(e.going_on?(start))
49
- assert(e.going_on?(ennd))
50
- else
51
- assert_equal(false, e.going_on?(start))
52
- assert_equal(false, e.going_on?(ennd))
78
+ def test_calendar_going_on_block
79
+ calendar = Seasonal::Calendar.new
80
+ payload = 'test'
81
+ calendar.push(Seasonal::Event.new(payload, 'America/New_York',
82
+ :start => 'apr 11', :end => 'may 5'))
83
+ result = false
84
+ calendar.going_on(:at => Time.utc(Time.now.utc.year, 4, 16, 1, 2, 3)) do |e|
85
+ assert(payload, e)
86
+ result = true
53
87
  end
88
+ assert(result)
89
+ end
54
90
 
55
- assert_equal(false, e.going_on?(ennd + 1))
91
+ def test_calendar_going_on_block_whole_event
92
+ calendar = Seasonal::Calendar.new
93
+ payload = 'test'
94
+ calendar.push(Seasonal::Event.new(payload, 'America/New_York',
95
+ :start => 'apr 11', :end => 'may 5'))
96
+ result = false
97
+ calendar.going_on(:at => Time.utc(Time.now.utc.year, 4, 16, 1, 2, 3),
98
+ :payloads => false) do |e|
99
+ assert(payload, e.payload)
100
+ result = true
101
+ end
102
+ assert(result)
103
+ end
104
+
105
+ def test_calendar_on
106
+ calendar = Seasonal::Calendar.new
107
+ on = Time.now
108
+ calendar.push(Seasonal::Event.new(nil, 'America/New_York',
109
+ :on => on.strftime('%b %d')))
110
+ assert_equal(1, calendar.going_on(:at => on).size)
111
+ end
112
+
113
+ def test_calendar_payload
114
+ calendar = Seasonal::Calendar.new
115
+ payload = 'test'
116
+ on = Time.now
117
+ calendar.push(Seasonal::Event.new(payload, 'America/New_York',
118
+ :on => on.strftime('%b %d')))
119
+ assert_equal(1, calendar.going_on(:at => on).size)
120
+ assert_equal(payload, calendar.going_on(:at => on).first)
121
+ end
122
+
123
+ def test_calendar_whole_event
124
+ calendar = Seasonal::Calendar.new
125
+ payload = 'test'
126
+ on = Time.now
127
+ calendar.push(Seasonal::Event.new(payload, 'America/New_York',
128
+ :on => on.strftime('%b %d')))
129
+ assert_equal(1, calendar.going_on(:at => on, :payloads => false).size)
130
+ assert_kind_of(Seasonal::Event, calendar.going_on(:at => on,
131
+ :payloads => false).first)
132
+ assert_equal(payload, calendar.going_on(:at => on,
133
+ :payloads => false).first.payload)
56
134
  end
57
135
 
58
136
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mmb-seasonal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew M. Boedicker
@@ -31,7 +31,7 @@ extra_rdoc_files: []
31
31
 
32
32
  files:
33
33
  - lib/seasonal.rb
34
- - README
34
+ - README.textile
35
35
  - seasonal.gemspec
36
36
  has_rdoc: false
37
37
  homepage: http://github.com/mmb/seasonal