mmb-seasonal 0.0.2

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 ADDED
@@ -0,0 +1,34 @@
1
+ Create a calendar of date and time events and execute code based on which
2
+ events are currently happening.
3
+
4
+ Example (print holiday greetings):
5
+
6
+ require 'seasonal'
7
+
8
+ holidays = Seasonal::Calendar.new
9
+
10
+ holidays.push(Seasonal::Event.new(
11
+ 'Merry Christmas', 'America/New_York', 'dec 25'))
12
+ holidays.push(Seasonal::Event.new(
13
+ "April Fool's Day", 'America/New_York', 'apr 1'))
14
+
15
+ holidays.going_on { |e| puts e.payload }
16
+
17
+ Example (make text red between 9:00 and 10:00 am):
18
+
19
+ require 'seasonal'
20
+
21
+ colors = Seasonal::Calendar.new
22
+
23
+ colors.push(Seasonal::Event.new(
24
+ '#ff0000', 'America/New_York', nil, '9:00am', nil, '10:00am'))
25
+
26
+ color = '#000000'
27
+ colors.going_on { |e| color = e.payload }
28
+
29
+ puts "<p style=\"background-color : #{color}\">test</p>"
30
+
31
+ Each event has an attached payload which can be any object.
32
+
33
+ Uses the flexible time parsing of Time.parse to be easy to use and the
34
+ timezone and DST handling of tzinfo.
data/lib/seasonal.rb ADDED
@@ -0,0 +1,67 @@
1
+ require 'rubygems'
2
+
3
+ require 'time'
4
+ require 'tzinfo'
5
+
6
+ module Seasonal
7
+
8
+ class Event
9
+ attr_accessor :payload
10
+ attr_accessor :zone
11
+ attr_accessor :start_date
12
+ attr_accessor :start_time
13
+ attr_accessor :end_date
14
+ attr_accessor :end_time
15
+
16
+ def initialize(payload, zone, start_date, start_time=nil, end_date=nil,
17
+ end_time=nil)
18
+ if end_time.nil?
19
+ if start_time.nil?
20
+ end_time = '23:59:59'
21
+ else
22
+ if end_date.nil?
23
+ end_time = start_time
24
+ else
25
+ end_time = '23:59:59'
26
+ end
27
+ end
28
+ end
29
+
30
+ start_time = '00:00:00' if start_time.nil?
31
+
32
+ end_date = start_date if end_date.nil?
33
+
34
+ @payload = payload
35
+ @zone = zone
36
+ @start_date = start_date
37
+ @end_date = end_date
38
+ @start_time = start_time
39
+ @end_time = end_time
40
+ end
41
+
42
+ def start
43
+ tz = TZInfo::Timezone.get(zone)
44
+ tz.local_to_utc(Time.parse("#{start_date} #{start_time}"))
45
+ end
46
+
47
+ def ennd
48
+ tz = TZInfo::Timezone.get(zone)
49
+ tz.local_to_utc(Time.parse("#{end_date} #{end_time}"))
50
+ end
51
+
52
+ def going_on?(test_time=Time.now)
53
+ # puts "#{start} - #{ennd}"
54
+ test_time >= start and test_time <= ennd
55
+ end
56
+
57
+ end
58
+
59
+ class Calendar < Array
60
+
61
+ def going_on(test_time=Time.now)
62
+ each { |event| yield event if event.going_on?(test_time) }
63
+ end
64
+
65
+ end
66
+
67
+ end
data/seasonal.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "seasonal"
3
+ s.version = "0.0.2"
4
+ s.date = "2008-11-07"
5
+ s.summary = "create logic based on defined date and time events"
6
+ s.email = "matthewm@boedicker.org"
7
+ s.homepage = "http://github.com/mmb/seasonal"
8
+ s.description = "Create a calendar of date and time events and execute code based on which events are currently happening."
9
+ s.has_rdoc = false
10
+ s.authors = ["Matthew M. Boedicker"]
11
+ s.files = [
12
+ "lib/seasonal.rb",
13
+ "README",
14
+ "seasonal.gemspec",
15
+ ]
16
+ s.test_files = [
17
+ "test/seasonal_test.rb",
18
+ ]
19
+ s.add_dependency("tzinfo", ["> 0.0.0"])
20
+ end
@@ -0,0 +1,106 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'time'
4
+ require 'seasonal'
5
+ require 'test/unit'
6
+
7
+ class SeasonalTest < Test::Unit::TestCase
8
+
9
+ def test_start_date
10
+ e = Seasonal::Event.new(nil, 'America/New_York', 'jan 1')
11
+
12
+ assert_equal(false,
13
+ e.going_on?(Time.utc(Time.now.utc.year - 1, 12, 30, 23, 59, 59)))
14
+
15
+ assert(e.going_on?(Time.utc(Time.now.utc.year, 1, 1, 17, 0, 0)))
16
+
17
+ assert_equal(false, e.going_on?(Time.utc(Time.now.utc.year, 1, 2, 5, 0, 0)))
18
+ end
19
+
20
+ def test_start_date_end_time
21
+ e = Seasonal::Event.new(nil,
22
+ 'America/New_York', 'feb 22', nil, nil, '5:00pm')
23
+
24
+ assert_equal(false,
25
+ e.going_on?(Time.utc(Time.now.utc.year, 2, 22, 4, 59, 59)))
26
+
27
+ assert(e.going_on?(Time.utc(Time.now.utc.year, 2, 22, 13, 0, 0)))
28
+
29
+ assert_equal(false,
30
+ e.going_on?(Time.utc(Time.now.utc.year, 2, 22, 22, 0, 1)))
31
+ end
32
+
33
+ def test_start_date_end_date
34
+ e = Seasonal::Event.new(nil,
35
+ 'America/New_York', 'mar 3 2003', nil, 'mar 5 2003')
36
+
37
+ assert_equal(false, e.going_on?(Time.utc(2003, 3, 3, 4, 59, 59)))
38
+
39
+ assert(e.going_on?(Time.utc(2003, 3, 4, 0, 0, 0)))
40
+
41
+ assert_equal(false, e.going_on?(Time.utc(2003, 3, 6, 5, 0, 0)))
42
+ end
43
+
44
+ def test_start_date_end_date_end_time
45
+ e = Seasonal::Event.new(nil,
46
+ 'America/New_York', 'apr 20', nil, 'may 1', '00:00')
47
+
48
+ assert_equal(false,
49
+ e.going_on?(Time.utc(Time.now.utc.year, 4, 20, 3, 59, 59)))
50
+
51
+ assert(e.going_on?(Time.utc(Time.now.utc.year, 5, 1, 0, 0, 0)))
52
+
53
+ assert_equal(false, e.going_on?(Time.utc(Time.now.utc.year, 5, 2, 0, 0, 0)))
54
+ end
55
+
56
+ def test_start_date_start_time
57
+ e = Seasonal::Event.new(nil, 'America/New_York', 'may 10', '10:00am')
58
+
59
+ assert_equal(false,
60
+ e.going_on?(Time.utc(Time.now.utc.year, 5, 10, 13, 59, 59)))
61
+
62
+ assert(e.going_on?(Time.utc(Time.now.utc.year, 5, 10, 14, 0, 0)))
63
+
64
+ assert_equal(false,
65
+ e.going_on?(Time.utc(Time.now.utc.year, 5, 10, 14, 0, 1)))
66
+ end
67
+
68
+ def test_start_date_start_time_end_time
69
+ e = Seasonal::Event.new(nil,
70
+ 'America/New_York', 'june 22', '10:00am', nil, '10:30am')
71
+
72
+ assert_equal(false,
73
+ e.going_on?(Time.utc(Time.now.utc.year, 6, 22, 13, 59, 59)))
74
+
75
+ assert(e.going_on?(Time.utc(Time.now.utc.year, 6, 22, 14, 15, 0)))
76
+
77
+ assert_equal(false,
78
+ e.going_on?(Time.utc(Time.now.utc.year, 6, 22, 14, 30, 1)))
79
+ end
80
+
81
+ def test_start_date_start_time_end_date
82
+ e = Seasonal::Event.new(nil,
83
+ 'America/New_York', 'july 4', '11:00pm', 'jul 5')
84
+
85
+ assert_equal(false,
86
+ e.going_on?(Time.utc(Time.now.utc.year, 7, 5, 2, 59, 59)))
87
+
88
+ assert(e.going_on?(Time.utc(Time.now.utc.year, 7, 5, 15, 0, 0)))
89
+
90
+ assert_equal(false, e.going_on?(Time.utc(Time.now.utc.year, 7, 6, 4, 0, 0)))
91
+ end
92
+
93
+ def test_start_date_start_time_end_date_end_time
94
+ e = Seasonal::Event.new(nil,
95
+ 'America/New_York', 'aug 19', '1:00pm', 'aug 21', '2:00pm')
96
+
97
+ assert_equal(false,
98
+ e.going_on?(Time.utc(Time.now.utc.year, 8, 19, 16, 59, 59)))
99
+
100
+ assert(e.going_on?(Time.utc(Time.now.utc.year, 8, 20, 15, 0, 0)))
101
+
102
+ assert_equal(false,
103
+ e.going_on?(Time.utc(Time.now.utc.year, 8, 21, 18, 0, 1)))
104
+ end
105
+
106
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mmb-seasonal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Matthew M. Boedicker
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-11-07 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: tzinfo
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">"
21
+ - !ruby/object:Gem::Version
22
+ version: 0.0.0
23
+ version:
24
+ description: Create a calendar of date and time events and execute code based on which events are currently happening.
25
+ email: matthewm@boedicker.org
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files: []
31
+
32
+ files:
33
+ - lib/seasonal.rb
34
+ - README
35
+ - seasonal.gemspec
36
+ has_rdoc: false
37
+ homepage: http://github.com/mmb/seasonal
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ requirements: []
56
+
57
+ rubyforge_project:
58
+ rubygems_version: 1.2.0
59
+ signing_key:
60
+ specification_version: 2
61
+ summary: create logic based on defined date and time events
62
+ test_files:
63
+ - test/seasonal_test.rb