hrt_bus 0.0.6 → 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.
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