network_executive 0.0.4 → 0.0.7

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.
Files changed (92) hide show
  1. data/README.md +53 -24
  2. data/app/assets/fonts/network_executive/league_gothic.css +13 -0
  3. data/app/assets/fonts/network_executive/league_gothic.svg +148 -0
  4. data/app/assets/fonts/network_executive/league_gothic.ttf +0 -0
  5. data/app/assets/fonts/network_executive/league_gothic.woff +0 -0
  6. data/app/assets/javascripts/network_executive/components/iframe_notifier.coffee +14 -0
  7. data/app/assets/javascripts/network_executive/components/namespace.coffee +1 -0
  8. data/app/assets/javascripts/network_executive/components/osd.coffee +65 -0
  9. data/app/assets/javascripts/network_executive/components/photo_player.coffee +55 -0
  10. data/app/assets/javascripts/network_executive/components/postman.coffee +23 -0
  11. data/app/assets/javascripts/network_executive/components/set_top_box.coffee +81 -0
  12. data/app/assets/javascripts/network_executive/components/tweet_player.coffee +95 -0
  13. data/app/assets/javascripts/network_executive/components/you_tube_player.coffee +85 -0
  14. data/app/assets/javascripts/network_executive/slideshow.coffee +6 -0
  15. data/app/assets/javascripts/network_executive/twitter.coffee +7 -0
  16. data/app/assets/javascripts/network_executive/you_tube.coffee +8 -0
  17. data/app/assets/javascripts/network_executive.coffee +10 -0
  18. data/app/assets/stylesheets/network_executive/{gui_components.css → components/gui_components.css} +0 -0
  19. data/app/assets/stylesheets/network_executive/{normalize.css → components/normalize.css} +0 -0
  20. data/app/assets/stylesheets/network_executive/{osd.css → components/osd.css} +6 -34
  21. data/app/assets/stylesheets/network_executive/components/osd_guide.css +43 -0
  22. data/app/assets/stylesheets/network_executive/components/photo_player.css +61 -0
  23. data/app/assets/stylesheets/network_executive/{smpte.css → components/smpte.css} +0 -0
  24. data/app/assets/stylesheets/network_executive/components/tweet_player.css +60 -0
  25. data/app/assets/stylesheets/network_executive/components/you_tube_player.css +12 -0
  26. data/app/assets/stylesheets/network_executive/off_air.css +5 -0
  27. data/app/assets/stylesheets/network_executive/slideshow.css +4 -0
  28. data/app/assets/stylesheets/network_executive/twitter.css +5 -0
  29. data/app/assets/stylesheets/network_executive/you_tube.css +3 -0
  30. data/app/assets/stylesheets/{network_executive/application.css → network_executive.css} +5 -5
  31. data/app/controllers/network_executive/components_controller.rb +4 -0
  32. data/app/controllers/network_executive/guide_controller.rb +41 -0
  33. data/app/controllers/network_executive/programs_controller.rb +9 -0
  34. data/app/helpers/network_executive/network_helper.rb +6 -0
  35. data/app/models/network_executive/channel.rb +15 -14
  36. data/app/models/network_executive/guide.rb +65 -0
  37. data/app/models/network_executive/program.rb +69 -5
  38. data/app/models/network_executive/viewer.rb +4 -0
  39. data/app/programs/network_executive/off_air.rb +18 -0
  40. data/app/views/network_executive/components/slideshow.html.erb +20 -0
  41. data/app/views/network_executive/components/twitter.html.erb +16 -0
  42. data/app/views/network_executive/components/you_tube.html.erb +13 -0
  43. data/app/views/network_executive/guide/index.html.erb +30 -0
  44. data/app/views/network_executive/network/index.html.erb +3 -3
  45. data/app/views/network_executive/programs/off_air.html.erb +13 -0
  46. data/config/routes.rb +7 -1
  47. data/lib/network_executive/channel_schedule.rb +65 -0
  48. data/lib/network_executive/components/photo_player.rb +48 -0
  49. data/lib/network_executive/components/tweet_player.rb +48 -0
  50. data/lib/network_executive/components/you_tube_player.rb +15 -0
  51. data/lib/network_executive/components.rb +3 -0
  52. data/lib/network_executive/engine.rb +29 -3
  53. data/lib/network_executive/off_air_schedule.rb +18 -0
  54. data/lib/network_executive/producer.rb +3 -3
  55. data/lib/network_executive/program_schedule.rb +96 -0
  56. data/lib/network_executive/program_schedule_proxy.rb +55 -0
  57. data/lib/network_executive/scheduled_program.rb +26 -0
  58. data/lib/network_executive/scheduling.rb +15 -21
  59. data/lib/network_executive/time_calculations.rb +10 -0
  60. data/lib/network_executive/version.rb +1 -1
  61. data/lib/network_executive.rb +2 -1
  62. data/network_executive.gemspec +5 -0
  63. data/spec/models/channel_spec.rb +30 -12
  64. data/spec/models/{lineup_spec.rb → guide_spec.rb} +28 -6
  65. data/spec/models/program_spec.rb +46 -3
  66. data/spec/models/viewer_spec.rb +9 -1
  67. data/spec/programs/off_air_spec.rb +9 -0
  68. data/spec/spec_helper.rb +3 -2
  69. data/spec/unit/channel_schedule_spec.rb +67 -0
  70. data/spec/unit/components/photo_player_spec.rb +76 -0
  71. data/spec/unit/components/tweet_player_spec.rb +68 -0
  72. data/spec/unit/components/you_tube_player_spec.rb +17 -0
  73. data/spec/unit/off_air_schedule_spec.rb +28 -0
  74. data/spec/unit/producer_spec.rb +2 -4
  75. data/spec/unit/program_schedule_proxy_spec.rb +102 -0
  76. data/spec/unit/program_schedule_spec.rb +191 -0
  77. data/spec/unit/scheduled_program_spec.rb +57 -0
  78. data/spec/unit/scheduling_spec.rb +61 -72
  79. data/vendor/assets/javascripts/bigtext.js +264 -0
  80. metadata +185 -44
  81. data/app/assets/javascripts/application.js +0 -13
  82. data/app/assets/javascripts/network_executive/osd.js +0 -62
  83. data/app/assets/javascripts/network_executive/set_top_box.js +0 -45
  84. data/app/controllers/network_executive/lineup_controller.rb +0 -11
  85. data/app/models/network_executive/channel_schedule.rb +0 -13
  86. data/app/models/network_executive/lineup.rb +0 -74
  87. data/app/models/network_executive/lineup_range.rb +0 -34
  88. data/app/models/network_executive/program_schedule.rb +0 -148
  89. data/app/views/network_executive/lineup/index.html.erb +0 -26
  90. data/spec/models/channel_schedule_spec.rb +0 -29
  91. data/spec/models/lineup_range_spec.rb +0 -65
  92. data/spec/models/program_schedule_spec.rb +0 -399
@@ -1,148 +0,0 @@
1
- # Example
2
- # every :monday, play:'morning_show'
3
- # every :day, play:'stoplight', for_the_first:'15mins', of:'each hour'
4
- # every :day, play:'stoplight', for_the_first:'15mins', of:'each hour', starting_at:'11am'
5
- # every :day, play:'stoplight', for_the_first:'15mins', of:'each hour', ending_at:'11am'
6
- # every :day, play:'stoplight', for_the_first:'15mins', of:'each hour', starting_at:'10am', ending_at:'11am'
7
- # every :day, play:'tweets', for_the_last: '15mins', of:'every hour'
8
- # every :day, play:'sales', for_the_first:'15mins', of:'each hour', between:'2pm and 5pm'
9
- # every :friday, play:'lunch_menu', between:'11am and 13pm', commercial_free:true
10
-
11
- module NetworkExecutive
12
-
13
- class ProgramSchedule
14
- attr_accessor :day, :program_name
15
-
16
- Weekdays = %w{sunday monday tuesday wednesday thursday friday saturday}
17
- BaseDate = { month:2, day:15, year:1978 }
18
-
19
- def initialize( day, options = {} )
20
- options.symbolize_keys!
21
-
22
- raise ProgramNameError unless options[:play]
23
-
24
- if options[:starting_at] || options[:ending_at]
25
- range = []
26
- range << ( options[:starting_at] || '12am' )
27
- range << ( options[:ending_at] || '11:59pm' )
28
- options[:between] = range.join ' and '
29
- end
30
-
31
- self.day = day
32
- self.program_name = options[:play]
33
- @between = options[:between]
34
- @for_the_first = options[:for_the_first]
35
- @for_the_last = options[:for_the_last]
36
- @period = options[:of]
37
- @commercial_free = options[:commercial_free]
38
- end
39
-
40
- def day=( new_day )
41
- new_day = :any if new_day == :day
42
-
43
- @day = new_day
44
- end
45
-
46
- def include?( date )
47
- day_matches? date \
48
- and time_matches? date
49
- end
50
-
51
- def commercials?
52
- @commercial_free.nil? ? true : !@commercial_free
53
- end
54
-
55
- def to_s
56
- inspect
57
- end
58
-
59
- def inspect
60
- range = @between || '12am and 11:59pm'
61
-
62
- %Q{<#{self.class} program_name="#{program_name}" day="#{@day}" between="#{range}" for_the_first="#{@for_the_first || 'nil'}" for_the_last="#{@for_the_last || 'nil'}" commercial_free=#{!commercials?}>}
63
- end
64
-
65
- private
66
-
67
- def day_matches?( date )
68
- if day == :any
69
- true
70
- elsif day.to_s == Weekdays[date.wday]
71
- true
72
- end
73
- end
74
-
75
- def time_matches?( date )
76
- comparator = date.dup.change BaseDate
77
-
78
- validations = []
79
-
80
- validations << time_span.cover?( comparator ) if time_span?
81
-
82
- validations << pattern.cover?( comparator ) if repeating?
83
-
84
- validations.none? { |v| v == false }
85
- end
86
-
87
- def time_span?
88
- @between
89
- end
90
-
91
- def time_span
92
- if matches = @between.match( %r{(?<start>\d+:?\w*)\s*\S+\s*(?<stop>\d+:?\w*)} )
93
- # Normalize the range to an arbitrary date since we only care about Time.
94
- start = Time.parse( matches[:start] ).change BaseDate
95
- stop = Time.parse( matches[:stop] ).change BaseDate
96
-
97
- start...stop
98
- end
99
- end
100
-
101
- def repeating?
102
- @for_the_first || @for_the_last
103
- end
104
-
105
- def pattern
106
- return TimePattern.new @period, first:@for_the_first if @for_the_first
107
- return TimePattern.new @period, last:@for_the_last if @for_the_last
108
-
109
- raise StandardError, 'No parsable time pattern'
110
- end
111
-
112
- end
113
-
114
- class TimePattern
115
- # TODO: Add support for :period
116
- def initialize( period, pattern )
117
- @period = period
118
- @boundary = pattern.keys.first
119
- @pattern = parse pattern
120
- end
121
-
122
- def cover?( date )
123
- range = if @boundary == :first
124
- 0...@pattern[:value]
125
- elsif @boundary == :last
126
- (60 - @pattern[:value])..59
127
- else
128
- raise ArgumentError, 'Missing a valid pattern boundary'
129
- end
130
-
131
- range.include? date.send( @pattern[:unit] )
132
- end
133
-
134
- private
135
-
136
- def parse( p )
137
- value, unit = p[@boundary].split( %r{(\d+)\s*(\w+)} )[1..-1]
138
-
139
- unit = case unit[0]
140
- when 'm' then :min
141
- end
142
-
143
- { value:value.to_i, unit:unit }
144
- end
145
-
146
- end
147
-
148
- end
@@ -1,26 +0,0 @@
1
- <table>
2
- <thead>
3
- <tr>
4
- <td></td>
5
- <% @lineup.times.each do |t| %>
6
- <th class="guide-time">
7
- <%= t.strftime '%l:%M' %>
8
- </th>
9
- <% end %>
10
- </tr>
11
- </thead>
12
- <tbody>
13
- <% @lineup[:channels].each do |ch| %>
14
- <tr>
15
- <th class="guide-channel">
16
- <%= link_to ch[:channel], channel_path(ch[:channel]) %>
17
- </th>
18
- <% ch[:schedule].each do |sch| %>
19
- <td class="guide-program">
20
- <%= sch[:program].program_name.titleize %>
21
- </td>
22
- <% end %>
23
- </tr>
24
- <% end %>
25
- </tbody>
26
- </table>
@@ -1,29 +0,0 @@
1
- describe NetworkExecutive::ChannelSchedule do
2
-
3
- before do
4
- Timecop.freeze Time.now.change hour:12, min:0, sec:0
5
- end
6
-
7
- subject do
8
- schedule = double('schedule')
9
-
10
- schedule.stub(:include?).and_return false, true, false
11
-
12
- described_class.new [ schedule, schedule, schedule ]
13
- end
14
-
15
- describe '#add' do
16
- before { subject.add( 'foo' ) }
17
-
18
- it 'should prefix the collection' do
19
- subject.first.should == 'foo'
20
- end
21
- end
22
-
23
- describe '#find_by_showtime' do
24
- it 'should check if the schedule includes the given time' do
25
- subject.find_by_showtime( Time.now ).should == subject[1]
26
- end
27
- end
28
-
29
- end
@@ -1,65 +0,0 @@
1
- describe NetworkExecutive::LineupRange do
2
-
3
- before do
4
- Timecop.freeze Time.now.change hour:12, min:0, sec:0
5
- end
6
-
7
- let(:start) { Time.now }
8
-
9
- let(:stop) { 1.5.hours.from_now }
10
-
11
- describe '#each' do
12
- subject do
13
- times = []
14
-
15
- described_class.new(start, stop).each { |st| times << st }
16
-
17
- times
18
- end
19
-
20
- it 'should yield a showtime for each segment' do
21
- subject.size.should == 6
22
- end
23
-
24
- it 'should yield the start time' do
25
- subject.first.should == start
26
- end
27
-
28
- it 'should yield a rounded stop time' do
29
- subject.last.should == stop - 15.minutes
30
- end
31
- end
32
-
33
- describe '#each_with_object' do
34
- subject do
35
- my_obj = []
36
-
37
- described_class.new( start, stop ).each_with_object( my_obj ) do |st, o|
38
- o << st
39
- end
40
-
41
- my_obj
42
- end
43
-
44
- it 'should yield the specified object for each segment' do
45
- subject.size.should == 6
46
- end
47
- end
48
-
49
- describe '#segments' do
50
- subject { described_class.new( start, stop, interval:interval).segments }
51
-
52
- context 'with a default interval' do
53
- let(:interval) { nil }
54
-
55
- it { should == 6 }
56
- end
57
-
58
- context 'with a half-hour interval' do
59
- let(:interval) { 30 }
60
-
61
- it { should == 3 }
62
- end
63
- end
64
-
65
- end
@@ -1,399 +0,0 @@
1
- describe NetworkExecutive::ProgramSchedule do
2
-
3
- describe 'without a program name' do
4
- it 'should raise a ProgramNameError' do
5
- expect{ described_class.new(:day) }.to raise_error NetworkExecutive::ProgramNameError
6
- end
7
- end
8
-
9
- describe 'a 24-7 program' do
10
- subject { described_class.new(:day, play:'my_show') }
11
-
12
- its(:commercials?) { should be_true }
13
-
14
- it 'should run at the beginning of the day' do
15
- Timecop.freeze Time.now.beginning_of_day
16
-
17
- subject.should include Time.now
18
- end
19
-
20
- it 'should run at the middle of the day' do
21
- Timecop.freeze Time.now.change hours:12
22
-
23
- subject.should include Time.now
24
- end
25
-
26
- it 'should run at the end of the day' do
27
- Timecop.freeze Time.now.end_of_day
28
-
29
- subject.should include Time.now
30
- end
31
- end
32
-
33
- describe 'a weekly, 24-hour program' do
34
- subject { described_class.new(:thursday, play:'my_show') }
35
-
36
- it 'should run at the beginning of Thursday' do
37
- Timecop.freeze Time.now.beginning_of_week + 3.days
38
-
39
- subject.should include Time.now
40
- end
41
-
42
- it 'should run at the middle of Thursday' do
43
- Timecop.freeze( (Time.now.beginning_of_week + 3.days).change hour:12 )
44
-
45
- subject.should include Time.now
46
- end
47
-
48
- it 'should run at the end of Thursday' do
49
- Timecop.freeze Time.now.end_of_week - 3.days
50
-
51
- subject.should include Time.now
52
- end
53
-
54
- it 'should not run on Monday' do
55
- Timecop.freeze Time.now.beginning_of_week
56
-
57
- subject.should_not include Time.now
58
- end
59
- end
60
-
61
- describe 'a show between 11am and 1pm' do
62
- describe 'continuously' do
63
- subject { described_class.new(:day, play:'my_show', between:'11am and 1pm') }
64
-
65
- it 'should run at 11am' do
66
- Timecop.freeze Time.now.change hour:11, min:0, sec:0
67
-
68
- subject.should include Time.now
69
- end
70
-
71
- it 'should run at 12pm' do
72
- Timecop.freeze Time.now.change hour:12
73
-
74
- subject.should include Time.now
75
- end
76
-
77
- it 'should run at 12:59:59pm' do
78
- Timecop.freeze Time.now.change hour:12, min:59, sec:59
79
-
80
- subject.should include Time.now
81
- end
82
-
83
- it 'should not run at 1pm' do
84
- Timecop.freeze Time.now.change hour:13
85
-
86
- subject.should_not include Time.now
87
- end
88
-
89
- it 'should not run before 11am' do
90
- Timecop.freeze Time.now.change hour:10, min:59, sec:59
91
-
92
- subject.should_not include Time.now
93
- end
94
-
95
- it 'should not run after 1pm' do
96
- Timecop.freeze Time.now.change hour:13, min:0, sec:1
97
-
98
- subject.should_not include Time.now
99
- end
100
- end
101
-
102
- describe 'for the first 20mins of each hour' do
103
- subject { described_class.new(:day, play:'my_show', between:'11am and 1pm', for_the_first: '20mins', of:'each hour') }
104
-
105
- it 'should run at 11am' do
106
- Timecop.freeze Time.now.change hour:11, min:0, sec:0
107
-
108
- subject.should include Time.now
109
- end
110
-
111
- it 'should run at 11:19:59am' do
112
- Timecop.freeze Time.now.change hour:11, min:19, sec:59
113
-
114
- subject.should include Time.now
115
- end
116
-
117
- it 'should not run at 11:20pm' do
118
- Timecop.freeze Time.now.change hour:11, min:20, sec:0
119
-
120
- subject.should_not include Time.now
121
- end
122
-
123
- it 'should run at 12pm' do
124
- Timecop.freeze Time.now.change hour:12, min:0, sec:0
125
-
126
- subject.should include Time.now
127
- end
128
-
129
- it 'should run at 12:19:59am' do
130
- Timecop.freeze Time.now.change hour:12, min:19, sec:59
131
-
132
- subject.should include Time.now
133
- end
134
-
135
- it 'should not run at 12:20pm' do
136
- Timecop.freeze Time.now.change hour:12, min:20, sec:0
137
-
138
- subject.should_not include Time.now
139
- end
140
- end
141
-
142
- describe 'the last 20mins of each hour' do
143
- subject { described_class.new(:day, play:'my_show', between:'11am and 1pm', for_the_last: '20mins', of:'each hour') }
144
-
145
- it 'should not run at 11am' do
146
- Timecop.freeze Time.now.change hour:11, min:0, sec:0
147
-
148
- subject.should_not include Time.now
149
- end
150
-
151
- it 'should run at 11:40am' do
152
- Timecop.freeze Time.now.change hour:11, min:40, sec:0
153
-
154
- subject.should include Time.now
155
- end
156
-
157
- it 'should run at 11:59:59am' do
158
- Timecop.freeze Time.now.change hour:11, min:59, sec:59
159
-
160
- subject.should include Time.now
161
- end
162
-
163
- it 'should not run at 12pm' do
164
- Timecop.freeze Time.now.change hour:12, min:0, sec:0
165
-
166
- subject.should_not include Time.now
167
- end
168
-
169
- it 'should run at 12:40pm' do
170
- Timecop.freeze Time.now.change hour:12, min:40, sec:0
171
-
172
- subject.should include Time.now
173
- end
174
-
175
- it 'should not run at 12:59:59pm' do
176
- Timecop.freeze Time.now.change hour:12, min:59, sec:59
177
-
178
- subject.should include Time.now
179
- end
180
-
181
- it 'should not run at 1pm' do
182
- Timecop.freeze Time.now.change hour:13, min:0, sec:0
183
-
184
- subject.should_not include Time.now
185
- end
186
- end
187
- end
188
-
189
- describe 'a show that runs for' do
190
- describe 'the first' do
191
- describe '15mins' do
192
- describe 'of each hour' do
193
- describe 'continuously' do
194
- subject { described_class.new(:day, play:'my_show', for_the_first:'15mins', of:'each hour') }
195
-
196
- it 'should not run at 12:59:59am' do
197
- Timecop.freeze Time.now.change hour:12, min:59, sec:59
198
-
199
- subject.should_not include Time.now
200
- end
201
-
202
- it 'should run at 1:00am' do
203
- Timecop.freeze Time.now.change hour:1, min:0, sec:0
204
-
205
- subject.should include Time.now
206
- end
207
-
208
- it 'should run at 1:14:59am' do
209
- Timecop.freeze Time.now.change hour:1, min:14, sec:59
210
-
211
- subject.should include Time.now
212
- end
213
-
214
- it 'should not run at 1:15am' do
215
- Timecop.freeze Time.now.change hour:1, min:15, sec:0
216
-
217
- subject.should_not include Time.now
218
- end
219
- end
220
-
221
- describe 'starting at 2pm' do
222
- subject { described_class.new(:day, play:'my_show', for_the_first:'15mins', of:'each hour', starting_at:'2pm') }
223
-
224
- it 'should not run at 1pm' do
225
- Timecop.freeze Time.now.change hour:13, min:0, sec:0
226
-
227
- subject.should_not include Time.now
228
- end
229
-
230
- it 'should run at 2pm' do
231
- Timecop.freeze Time.now.change hour:14, min:0, sec:0
232
-
233
- subject.should include Time.now
234
- end
235
-
236
- it 'should run at 2:14:59pm' do
237
- Timecop.freeze Time.now.change hour:14, min:14, sec:59
238
-
239
- subject.should include Time.now
240
- end
241
-
242
- it 'should not run at 2:15pm' do
243
- Timecop.freeze Time.now.change hour:14, min:15, sec:0
244
-
245
- subject.should_not include Time.now
246
- end
247
-
248
- it 'should not run at 10:59:59pm' do
249
- Timecop.freeze Time.now.change hour:22, min:59, sec:59
250
-
251
- subject.should_not include Time.now
252
- end
253
-
254
- it 'should run at 11pm' do
255
- Timecop.freeze Time.now.change hour:23, min:0, sec:0
256
-
257
- subject.should include Time.now
258
- end
259
-
260
- it 'should not run at 11:15pm' do
261
- Timecop.freeze Time.now.change hour:23, min:15, sec:0
262
-
263
- subject.should_not include Time.now
264
- end
265
- end
266
-
267
- describe 'ending at 2pm' do
268
- subject { described_class.new(:day, play:'my_show', for_the_first:'15mins', of:'each hour', ending_at:'2pm') }
269
-
270
- it 'should run at 12am' do
271
- Timecop.freeze Time.now.change hour:0, min:0, sec:0
272
-
273
- subject.should include Time.now
274
- end
275
-
276
- it 'should run at 12:14:59am' do
277
- Timecop.freeze Time.now.change hour:0, min:14, sec:59
278
-
279
- subject.should include Time.now
280
- end
281
-
282
- it 'should not run at 12:15am' do
283
- Timecop.freeze Time.now.change hour:0, min:15, sec:0
284
-
285
- subject.should_not include Time.now
286
- end
287
-
288
- it 'should run at 1am' do
289
- Timecop.freeze Time.now.change hour:1, min:0, sec:0
290
-
291
- subject.should include Time.now
292
- end
293
-
294
- it 'should not run at 2pm' do
295
- Timecop.freeze Time.now.change hour:14, min:0, sec:0
296
-
297
- subject.should_not include Time.now
298
- end
299
- end
300
- end
301
-
302
- describe 'of every hour' do
303
- subject { described_class.new(:day, play:'my_show', for_the_first:'15mins', of:'every hour') }
304
-
305
- it 'should not run at 12:59:59am' do
306
- Timecop.freeze Time.now.change hour:12, min:59, sec:59
307
-
308
- subject.should_not include Time.now
309
- end
310
-
311
- it 'should run at 1:00am' do
312
- Timecop.freeze Time.now.change hour:1, min:0, sec:0
313
-
314
- subject.should include Time.now
315
- end
316
-
317
- it 'should run at 1:14:59am' do
318
- Timecop.freeze Time.now.change hour:1, min:14, sec:59
319
-
320
- subject.should include Time.now
321
- end
322
-
323
- it 'should not run at 1:15am' do
324
- Timecop.freeze Time.now.change hour:1, min:15, sec:0
325
-
326
- subject.should_not include Time.now
327
- end
328
- end
329
- end
330
- end
331
-
332
- describe 'the last' do
333
- describe '15mins' do
334
- describe 'of each hour' do
335
- subject { described_class.new(:day, play:'my_show', for_the_last:'15mins', of:'each hour') }
336
-
337
- it 'should not run at 1:44:59am' do
338
- Timecop.freeze Time.now.change hour:1, min:44, sec:59
339
-
340
- subject.should_not include Time.now
341
- end
342
-
343
- it 'should run at 1:45am' do
344
- Timecop.freeze Time.now.change hour:1, min:45, sec:0
345
-
346
- subject.should include Time.now
347
- end
348
-
349
- it 'should run at 1:59:59am' do
350
- Timecop.freeze Time.now.change hour:1, min:59, sec:59
351
-
352
- subject.should include Time.now
353
- end
354
-
355
- it 'should not run at 2am' do
356
- Timecop.freeze Time.now.change hour:2, min:0, sec:0
357
-
358
- subject.should_not include Time.now
359
- end
360
- end
361
-
362
- describe 'of every hour' do
363
- subject { described_class.new(:day, play:'my_show', for_the_last:'15mins', of:'every hour') }
364
-
365
- it 'should not run at 1:44:59am' do
366
- Timecop.freeze Time.now.change hour:1, min:44, sec:59
367
-
368
- subject.should_not include Time.now
369
- end
370
-
371
- it 'should run at 1:45am' do
372
- Timecop.freeze Time.now.change hour:1, min:45, sec:0
373
-
374
- subject.should include Time.now
375
- end
376
-
377
- it 'should run at 1:59:59am' do
378
- Timecop.freeze Time.now.change hour:1, min:59, sec:59
379
-
380
- subject.should include Time.now
381
- end
382
-
383
- it 'should not run at 2am' do
384
- Timecop.freeze Time.now.change hour:2, min:0, sec:0
385
-
386
- subject.should_not include Time.now
387
- end
388
- end
389
- end
390
- end
391
- end
392
-
393
- describe 'a commercial-free show' do
394
- subject { described_class.new(:day, play:'my_show', commercial_free:true) }
395
-
396
- its(:commercials?) { should be_false }
397
- end
398
-
399
- end