hrt_bus 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -25,3 +25,7 @@
25
25
 
26
26
  * Use Haversine to calculate distance between bus and rider
27
27
 
28
+ > 0.0.7
29
+
30
+ * Added adherence attribute to Bus
31
+ * @bus.early? @bus.ontime? @bus.late?
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # hrt_bus
2
2
 
3
- Ruby gem for public HRT bus location data
3
+ Ruby gem for real-time Hampton Roads Transit bus location data
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,7 +8,7 @@ Ruby gem for public HRT bus location data
8
8
 
9
9
  ## Examples
10
10
 
11
- ### HRT bus as a Ruby ActiveModel object
11
+ ### A Bus as a Ruby ActiveModel object
12
12
 
13
13
  HrtBus::Rider.new(:route_id => "20", :direction => "inbound").bus
14
14
 
@@ -21,6 +21,27 @@ Ruby gem for public HRT bus location data
21
21
  attr_accessor :time = Sat, 03 Mar 2012 23:24:28 +0000,
22
22
  >
23
23
 
24
+ ### Is my bus late?
25
+
26
+ HrtBus::Rider.new(:route_id => "20", :direction => "inbound").bus.late?
27
+
28
+ ### Send yourself a SMS or Tweet when your bus is close!
29
+
30
+ (1..15).each do |i|
31
+
32
+ rider = HrtBus::Rider.new(:route_id => "2",
33
+ :direction => "inbound",
34
+ :lat => "36.870347",
35
+ :lon => "-76.301163" )
36
+
37
+ if rider.bus.present? && rider.distance_to_bus <= 3
38
+ # Do something really cool like send a SMS or Tweet!
39
+ end
40
+
41
+ sleep 30
42
+
43
+ end
44
+
24
45
  ### Generate a static Google Map for a bus
25
46
 
26
47
  HrtBus::Rider.new(:route_id => "15", :direction => "outbound").bus.static_map
@@ -55,27 +76,6 @@ Ruby gem for public HRT bus location data
55
76
  ]
56
77
  ...
57
78
 
58
- ### Determine if a bus is valid
59
-
60
- HrtBus::Bus.active_buses.select { |bus| bus.route_id => "2" }.first.valid?
61
-
62
- ### Send yourself a SMS or Tweet when your bus is close!
63
-
64
- (1..15).each do |i|
65
-
66
- rider = HrtBus::Rider.new(:route_id => "2",
67
- :direction => "inbound",
68
- :lat => "36.870347",
69
- :lon => "-76.301163" )
70
-
71
- if rider.bus.present? && rider.distance_to_bus <= 3
72
- # Do something really cool like send a SMS or Tweet!
73
- end
74
-
75
- sleep 30
76
-
77
- end
78
-
79
79
  ## Contributing to hrt_bus
80
80
 
81
81
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
data/hrt_bus.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Brian Douglas Smith"]
9
9
  s.email = ["m.b1205@gmail.com"]
10
10
  s.homepage = "https://github.com/bds/hrt_bus"
11
- s.summary = %q{Ruby gem for real-time public HRT bus location data}
12
- s.description = %q{Ruby gem for real-time public HRT bus location data}
11
+ s.summary = %q{Real-time Hampton Roads Transit bus location data}
12
+ s.description = %q{Bus number, route, GPS coordiantes, early/ontime/late and more}
13
13
 
14
14
  s.rubyforge_project = "hrt_bus"
15
15
 
data/lib/hrt_bus/bus.rb CHANGED
@@ -3,7 +3,7 @@ module HrtBus
3
3
  include ActiveModel::Validations
4
4
  include ActiveModel::Serializers::JSON
5
5
 
6
- ATTRIBUTES = [ :id, :time, :direction, :lat, :lon, :route_id ]
6
+ ATTRIBUTES = [ :id, :time, :direction, :lat, :lon, :route_id, :adherence ]
7
7
 
8
8
  DIRECTIONS = { "1" => "inbound",
9
9
  "2" => "outbound" }.freeze
@@ -13,6 +13,7 @@ module HrtBus
13
13
  validates_numericality_of :route_id, greater_than: 0
14
14
  validates_numericality_of :lat, greater_than: 0
15
15
  validates_numericality_of :lon, less_than: 0
16
+ validates_numericality_of :adherence
16
17
  validates :direction, :inclusion => { :in => DIRECTIONS.values }
17
18
 
18
19
  validates :id, :time, :direction, :lat, :lon, :route_id, :presence => true
@@ -38,6 +39,18 @@ module HrtBus
38
39
  send(key)
39
40
  end
40
41
 
42
+ def early?
43
+ self.adherence < 0
44
+ end
45
+
46
+ def ontime?
47
+ self.adherence == 0
48
+ end
49
+
50
+ def late?
51
+ self.adherence > 0
52
+ end
53
+
41
54
  def static_map
42
55
  map = GoogleStaticMap.new(:width => 960, :height => 640)
43
56
  map.markers << MapMarker.new(:color => "blue",
@@ -60,18 +73,26 @@ module HrtBus
60
73
  parsed = ::CSV.new(curl.body_str, { :headers => true, :skip_blanks => true })
61
74
 
62
75
  parsed.each do |row|
63
- time, date, id, lat_lon, valid, route_id, direction = row[0],
76
+ time, date, id, lat_lon, valid, adherence, route_id, direction = row[0],
64
77
  row[1],
65
78
  row[2],
66
79
  row[3],
67
80
  row[4],
81
+ row[5],
68
82
  row[7],
69
83
  DIRECTIONS[row[8]]
70
84
 
71
85
  time = HrtBus::Parse.time(time, date)
72
86
  lat, lon = HrtBus::Parse.geo(lat_lon)
73
87
 
74
- bus = new(:id => id, :time => time, :direction => direction, :route_id => route_id, :lat => lat, :lon => lon)
88
+ bus = new(:time => time,
89
+ :id => id,
90
+ :lat => lat,
91
+ :lon => lon,
92
+ :adherence => adherence,
93
+ :route_id => route_id,
94
+ :route_id => route_id,
95
+ :direction => direction)
75
96
 
76
97
  buses << bus if bus.valid?
77
98
  end
@@ -91,18 +112,30 @@ module HrtBus
91
112
  parsed = ::CSV.new(curl.body_str, { :headers => true, :skip_blanks => true })
92
113
 
93
114
  parsed.each do |row|
94
- time, date, id, lat_lon, valid, route_id, direction = row[0],
115
+
116
+ time, date, id, lat_lon, valid, adherence, route_id, direction = row[0],
95
117
  row[1],
96
118
  row[2],
97
119
  row[3],
98
120
  row[4],
121
+ row[5],
99
122
  row[7],
100
123
  DIRECTIONS[row[8]]
101
124
 
125
+
102
126
  time = HrtBus::Parse.time(time, date)
103
127
  lat, lon = HrtBus::Parse.geo(lat_lon)
104
128
 
105
- buses << new(:id => id, :time => time, :direction => direction, :route_id => route_id, :lat => lat, :lon => lon)
129
+ bus = new(:time => time,
130
+ :id => id,
131
+ :lat => lat,
132
+ :lon => lon,
133
+ :adherence => adherence,
134
+ :route_id => route_id,
135
+ :route_id => route_id,
136
+ :direction => direction)
137
+
138
+ buses << bus
106
139
  end
107
140
  buses
108
141
  end
@@ -110,4 +143,3 @@ module HrtBus
110
143
  end
111
144
 
112
145
  end
113
-
@@ -1,3 +1,3 @@
1
1
  module HrtBus
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -6,6 +6,7 @@ FactoryGirl.define do
6
6
  time { Time.now }
7
7
  lat { 36.8642501 }
8
8
  lon { -76.2818951 }
9
+ adherence { Forgery(:basic).number(:at_least => -15, :at_most => 15) }
9
10
  route_id { SecureRandom.random_number(1e9.to_i) }
10
11
  direction { %w(inbound outbound).sample }
11
12
  end
@@ -7,4 +7,5 @@ describe HrtBus::Bus do
7
7
  it { should respond_to(:time) }
8
8
  it { should respond_to(:lat) }
9
9
  it { should respond_to(:lon) }
10
+ it { should respond_to(:adherence) }
10
11
  end
@@ -11,6 +11,7 @@ describe HrtBus::Bus do
11
11
 
12
12
  it "should return a collection of valid buses" do
13
13
  buses.should be_a_kind_of(Enumerable)
14
+ buses.should_not be_empty
14
15
  buses.each { |bus| bus.should be_valid }
15
16
  buses.first.should be_a_kind_of(HrtBus::Bus)
16
17
  end
@@ -44,4 +45,80 @@ describe HrtBus::Bus do
44
45
  end
45
46
 
46
47
  end
48
+
49
+ describe "early?" do
50
+
51
+ context "the bus is early" do
52
+ it "should return true" do
53
+ bus = Factory.build(:bus, :adherence => -2)
54
+ bus.early?.should be_true
55
+ end
56
+ end
57
+
58
+ context "the bus is on time" do
59
+ it "should return false" do
60
+ bus = Factory.build(:bus, :adherence => 0)
61
+ bus.early?.should be_false
62
+ end
63
+ end
64
+
65
+ context "the bus is late" do
66
+ it "should return false" do
67
+ bus = Factory.build(:bus, :adherence => 4)
68
+ bus.early?.should be_false
69
+ end
70
+ end
71
+
72
+ end
73
+
74
+ describe "ontime?" do
75
+
76
+ context "the bus is early" do
77
+ it "should return false" do
78
+ bus = Factory.build(:bus, :adherence => -2)
79
+ bus.ontime?.should be_false
80
+ end
81
+ end
82
+
83
+ context "the bus is on time" do
84
+ it "should return true" do
85
+ bus = Factory.build(:bus, :adherence => 0)
86
+ bus.ontime?.should be_true
87
+ end
88
+ end
89
+
90
+ context "the bus is late" do
91
+ it "should return false" do
92
+ bus = Factory.build(:bus, :adherence => 4)
93
+ bus.ontime?.should be_false
94
+ end
95
+ end
96
+
97
+ end
98
+
99
+ describe "late?" do
100
+
101
+ context "the bus is early" do
102
+ it "should return false" do
103
+ bus = Factory.build(:bus, :adherence => -2)
104
+ bus.late?.should be_false
105
+ end
106
+ end
107
+
108
+ context "the bus is on time" do
109
+ it "should return true" do
110
+ bus = Factory.build(:bus, :adherence => 0)
111
+ bus.late?.should be_false
112
+ end
113
+ end
114
+
115
+ context "the bus is late" do
116
+ it "should return false" do
117
+ bus = Factory.build(:bus, :adherence => 4)
118
+ bus.late?.should be_true
119
+ end
120
+ end
121
+
122
+ end
123
+
47
124
  end
@@ -72,6 +72,20 @@ describe HrtBus::Bus do
72
72
  bus.errors.messages[:route_id].first.should match(/is not a number/)
73
73
  end
74
74
 
75
+ it "should validate_presence_of :adherence" do
76
+ bus.should be_valid
77
+ bus.adherence = nil
78
+ bus.should_not be_valid
79
+ bus.errors.messages[:adherence].first.should match(/is not a number/)
80
+ end
81
+
82
+ it "should validate_numericality :adherence" do
83
+ bus.should be_valid
84
+ bus.adherence = "late"
85
+ bus.should_not be_valid
86
+ bus.errors.messages[:adherence].first.should match(/is not a number/)
87
+ end
88
+
75
89
  end
76
90
 
77
91
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: hrt_bus
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6
5
+ version: 0.0.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Brian Douglas Smith
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-03-04 00:00:00 Z
13
+ date: 2012-03-10 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activemodel
@@ -155,7 +155,7 @@ dependencies:
155
155
  version: "0"
156
156
  type: :development
157
157
  version_requirements: *id013
158
- description: Ruby gem for real-time public HRT bus location data
158
+ description: Bus number, route, GPS coordiantes, early/ontime/late and more
159
159
  email:
160
160
  - m.b1205@gmail.com
161
161
  executables: []
@@ -223,7 +223,7 @@ rubyforge_project: hrt_bus
223
223
  rubygems_version: 1.8.17
224
224
  signing_key:
225
225
  specification_version: 3
226
- summary: Ruby gem for real-time public HRT bus location data
226
+ summary: Real-time Hampton Roads Transit bus location data
227
227
  test_files:
228
228
  - spec/factories/bus.rb
229
229
  - spec/factories/rider.rb