portera 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.markdown CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.4 / 2012-03-11
4
+
5
+ - Allow M,Tu,W,Th,F,Sa,Su day of week symbols
6
+ - Add input validation for days of week
7
+
3
8
  ## 0.1.3 / 2012-02-21
4
9
 
5
10
  - Draft simple presenter
data/lib/portera/event.rb CHANGED
@@ -107,24 +107,30 @@ module Portera
107
107
  # Note assumes timeslots are appended in ascending order by range.begin
108
108
  # TODO could use some refactoring
109
109
  def coalesced
110
- accum = self.class.new
111
- inject(nil) do |last_slot, this_slot|
110
+ last_slot = nil
111
+ coales = inject(self.class.new) do |accum, this_slot|
112
112
  if last_slot
113
113
  rng = this_slot.range
114
114
  last_rng = last_slot.range
115
115
  if (rng.intersects?(last_rng) || rng.succeeds?(last_rng)) &&
116
116
  (this_slot.participants == last_slot.participants)
117
- Timeslot.new(last_rng.begin...rng.end,
118
- this_slot.participants)
117
+ last_slot = Timeslot.new(
118
+ (last_rng.begin...rng.end),
119
+ this_slot.participants
120
+ )
119
121
  else
120
122
  accum << last_slot
121
- this_slot
123
+ last_slot = this_slot
122
124
  end
123
125
  else
124
- this_slot
126
+ last_slot = this_slot
125
127
  end
128
+ accum
126
129
  end
127
- accum
130
+ if last_slot
131
+ coales << last_slot
132
+ end
133
+ coales
128
134
  end
129
135
 
130
136
  # sort timeslot availability by
@@ -59,6 +59,13 @@ module Portera
59
59
  :thu => 4,
60
60
  :fri => 5,
61
61
  :sat => 6,
62
+ :su => 0,
63
+ :m => 1,
64
+ :tu => 2,
65
+ :w => 3,
66
+ :th => 4,
67
+ :f => 5,
68
+ :sa => 6,
62
69
  :Sunday => 0,
63
70
  :Monday => 1,
64
71
  :Tuesday => 2,
@@ -72,7 +79,14 @@ module Portera
72
79
  :Wed => 3,
73
80
  :Thu => 4,
74
81
  :Fri => 5,
75
- :Sat => 6
82
+ :Sat => 6,
83
+ :Su => 0,
84
+ :M => 1,
85
+ :Tu => 2,
86
+ :W => 3,
87
+ :Th => 4,
88
+ :F => 5,
89
+ :Sa => 6
76
90
  }
77
91
 
78
92
  def initialize(collect,utc_offset=nil)
@@ -107,7 +121,8 @@ module Portera
107
121
  private
108
122
 
109
123
  def to_weekday(day)
110
- Days[day] || day
124
+ return day if (0..6).include?(day)
125
+ Days[day] or raise ArgumentError, "Unknown day: #{day}"
111
126
  end
112
127
 
113
128
  end
@@ -2,7 +2,7 @@ module Portera
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 3
5
+ TINY = 4
6
6
  STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
7
7
  end
8
8
  end
data/test/coalesced.rb ADDED
@@ -0,0 +1,163 @@
1
+ require File.expand_path('test_helper',File.dirname(__FILE__))
2
+
3
+ module CoalescedTests
4
+
5
+ module Helpers
6
+
7
+ def new_participants
8
+ ('A'..'Z').map {|name| Portera::Participant.new(name) }
9
+ end
10
+
11
+ def participant_set(partic, indexes)
12
+ indexes = Array(indexes)
13
+ ::Set.new( indexes.map {|i| partic[i]} )
14
+ end
15
+
16
+ def new_timeslot(range, partic)
17
+ range.extend(Tempr::DateTimeRange)
18
+ Portera::Timeslot.new( range , partic )
19
+ end
20
+
21
+ def assert_timeslot(exp_range, exp_partic, act)
22
+ assert exp_range == act.range &&
23
+ exp_partic == act.participants,
24
+ "Timeslot expected to be for range #{exp_range} "+
25
+ "with participants #{exp_partic.to_a}, instead was " +
26
+ "#{act}"
27
+ end
28
+
29
+ end
30
+
31
+ describe 'coalescing' do
32
+ include Helpers
33
+
34
+ before do
35
+ @subject = Portera::TimeslotEnum.new
36
+ @all_partic = new_participants
37
+
38
+ [ new_timeslot(
39
+ ( Time.utc(2012,01,02,03,00,00)...
40
+ Time.utc(2012,01,02,03,30,00)),
41
+ participant_set(@all_partic, (0..5))
42
+ ),
43
+ new_timeslot( # coalesce
44
+ ( Time.utc(2012,01,02,03,15,00)...
45
+ Time.utc(2012,01,02,03,45,00)),
46
+ participant_set(@all_partic, (0..5))
47
+ ),
48
+ new_timeslot( # coalesce
49
+ ( Time.utc(2012,01,02,03,44,59)...
50
+ Time.utc(2012,01,02,04,00,00)),
51
+ participant_set(@all_partic, (0..5))
52
+ ),
53
+ new_timeslot( # not coalesce
54
+ ( Time.utc(2012,01,02,03,45,00)...
55
+ Time.utc(2012,01,02,04,00,00)),
56
+ participant_set(@all_partic, (4..9))
57
+ ),
58
+ new_timeslot( # not coalesce
59
+ ( Time.utc(2012,01,02,03,45,00)...
60
+ Time.utc(2012,01,02,04,00,00)),
61
+ participant_set(@all_partic, (10..15))
62
+ ),
63
+ new_timeslot( # coalesce
64
+ ( Time.utc(2012,01,02,04,00,00)...
65
+ Time.utc(2012,01,02,04,15,00)),
66
+ participant_set(@all_partic, (10..15))
67
+ ),
68
+ new_timeslot( # coalesce
69
+ ( Time.utc(2012,01,02,04,15,00)...
70
+ Time.utc(2012,01,02,04,30,00)),
71
+ participant_set(@all_partic, (10..15))
72
+ ),
73
+ new_timeslot( # not coalesce
74
+ ( Time.utc(2012,01,02,04,30,00)...
75
+ Time.utc(2012,01,02,05,00,00)),
76
+ participant_set(@all_partic, (15..16))
77
+ ),
78
+ new_timeslot( # not coalesce
79
+ ( Time.utc(2012,01,02,05,30,00)...
80
+ Time.utc(2012,01,02,06,00,00)),
81
+ participant_set(@all_partic, (15..16))
82
+ ),
83
+ new_timeslot( # not coalesce
84
+ ( Time.utc(2012,01,02,06,30,00)...
85
+ Time.utc(2012,01,02,07,00,00)),
86
+ participant_set(@all_partic, (16..17))
87
+ ),
88
+ ].each do |slot|
89
+ @subject << slot
90
+ end
91
+
92
+ end
93
+
94
+ it 'should have the correct number of coalesced timeslots' do
95
+ actual = @subject.coalesced.to_a
96
+ puts actual
97
+ assert_equal 6, actual.count
98
+ end
99
+
100
+ it 'should coalesce overlapping ranges with same participants' do
101
+ actual = @subject.coalesced.to_a
102
+ assert_timeslot ( Time.utc(2012,01,02,03,00,00)...
103
+ Time.utc(2012,01,02,04,00,00)),
104
+ participant_set(@all_partic, (0..5)),
105
+ actual[0]
106
+ end
107
+
108
+ it 'should not coalesce overlapping ranges with different participants' do
109
+ actual = @subject.coalesced.to_a
110
+ assert_timeslot ( Time.utc(2012,01,02,03,45,00)...
111
+ Time.utc(2012,01,02,04,00,00)),
112
+ participant_set(@all_partic, (4..9)),
113
+ actual[1]
114
+ end
115
+
116
+ it 'should coalesce adjacent ranges with same participants' do
117
+ actual = @subject.coalesced.to_a
118
+ assert_timeslot ( Time.utc(2012,01,02,03,45,00)...
119
+ Time.utc(2012,01,02,04,30,00)),
120
+ participant_set(@all_partic, (10..15)),
121
+ actual[2]
122
+ end
123
+
124
+ it 'should not coalesce adjacent ranges with different participants' do
125
+ actual = @subject.coalesced.to_a
126
+ assert_timeslot ( Time.utc(2012,01,02,04,30,00)...
127
+ Time.utc(2012,01,02,05,00,00)),
128
+ participant_set(@all_partic, (15..16)),
129
+ actual[3]
130
+ end
131
+
132
+ it 'should not coalesce non-overlapping non-adjacent ranges with same participants' do
133
+ actual = @subject.coalesced.to_a
134
+ assert_timeslot ( Time.utc(2012,01,02,05,30,00)...
135
+ Time.utc(2012,01,02,06,00,00)),
136
+ participant_set(@all_partic, (15..16)),
137
+ actual[4]
138
+ end
139
+
140
+ it 'should not coalesce non-overlapping non-adjacent ranges with different participants' do
141
+ actual = @subject.coalesced.to_a
142
+ assert_timeslot ( Time.utc(2012,01,02,06,30,00)...
143
+ Time.utc(2012,01,02,07,00,00)),
144
+ participant_set(@all_partic, (16..17)),
145
+ actual[5]
146
+ end
147
+
148
+ end
149
+
150
+ describe "nil case" do
151
+ before do
152
+ @subject = Portera::TimeslotEnum.new
153
+ end
154
+
155
+ it 'should have zero timeslots' do
156
+ actual = @subject.coalesced
157
+ assert actual.none?,
158
+ "Expected coalesced to return no timeslots; was #{actual.to_a.count}"
159
+ end
160
+
161
+ end
162
+
163
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path('test_helper',File.dirname(__FILE__))
2
+
3
+ describe 'invalid days' do
4
+
5
+ let(:malcolm) do
6
+ Portera::Participant.new('Malcolm Reynolds').available do
7
+ on(:Mon, :from => "15:00", :to => "18:00" )
8
+ on(:Wed, :from => "20:00", :to => "23:00" )
9
+ on(:Fs, :from => "16:00", :to => "19:00" )
10
+ end
11
+ end
12
+
13
+ let(:hoban) do
14
+ Portera::Participant.new('Hoban Washburne').available do
15
+ on(:monday, :from => "15:00", :to => "18:00" )
16
+ on(:wednesday, :from => "20:00", :to => "23:00" )
17
+ on(7, :from => "15:00", :to => "18:30" )
18
+ end
19
+ end
20
+
21
+ let(:zoe) do
22
+ Portera::Participant.new('Zoe Washburne').available do
23
+ on([1, 2, -1], :from => "15:00", :to => "18:00" )
24
+ end
25
+ end
26
+
27
+ it 'should raise ArgumentError when unknown symbol' do
28
+ assert_raises(ArgumentError) { malcolm }
29
+ end
30
+
31
+ it 'should raise ArgumentError when day > 6' do
32
+ assert_raises(ArgumentError) { hoban }
33
+ end
34
+
35
+ it 'should raise ArgumentError when day < 0' do
36
+ assert_raises(ArgumentError) { zoe }
37
+ end
38
+
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: portera
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-24 00:00:00.000000000Z
12
+ date: 2012-03-09 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: tempr
16
- requirement: &10133680 !ruby/object:Gem::Requirement
16
+ requirement: &18516760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.1.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *10133680
24
+ version_requirements: *18516760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: erubis
27
- requirement: &10133300 !ruby/object:Gem::Requirement
27
+ requirement: &18516220 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *10133300
35
+ version_requirements: *18516220
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: tilt
38
- requirement: &10132840 !ruby/object:Gem::Requirement
38
+ requirement: &18515680 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *10132840
46
+ version_requirements: *18515680
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: minitest
49
- requirement: &10132420 !ruby/object:Gem::Requirement
49
+ requirement: &18515240 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *10132420
57
+ version_requirements: *18515240
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &10132000 !ruby/object:Gem::Requirement
60
+ requirement: &18514820 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *10132000
68
+ version_requirements: *18514820
69
69
  description: ''
70
70
  email:
71
71
  - ericgj72@gmail.com
@@ -85,6 +85,8 @@ files:
85
85
  - lib/portera/version.rb
86
86
  - lib/portera/views/simple.erb
87
87
  - test/acceptance.rb
88
+ - test/coalesced.rb
89
+ - test/invalid_days.rb
88
90
  - test/test_helper.rb
89
91
  homepage: http://github.com/ericgj/portera
90
92
  licenses: []