howard 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +50 -0
- data/Rakefile +7 -0
- data/howard.gemspec +25 -0
- data/lib/howard.rb +27 -0
- data/lib/howard/arrival.rb +46 -0
- data/lib/howard/arrivals_resource.rb +36 -0
- data/lib/howard/time_to_arrival.rb +23 -0
- data/lib/howard/train.rb +23 -0
- data/lib/howard/train_tracker_gateway.rb +16 -0
- data/lib/howard/version.rb +3 -0
- data/spec/howard/arrival_spec.rb +134 -0
- data/spec/howard/arrivals_resource_spec.rb +22 -0
- data/spec/howard/time_to_arrival_spec.rb +67 -0
- data/spec/howard/train_spec.rb +31 -0
- data/spec/howard_spec.rb +24 -0
- data/spec/spec_helper.rb +5 -0
- metadata +128 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b93ca32d3707f8669c83c4ed074b2fecf9eb397a
|
4
|
+
data.tar.gz: 590de621e247af17ed39da0935723a4b87564508
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fcf0862b0049593f9e9deb6fb95435025d6f7e2735ef9edcb9a8eea0f465e2e4916395ae80120cc06e3008043eaf7aa1cad7962a7876f6201e8284f13e436969
|
7
|
+
data.tar.gz: 897d4764deca4845249bb855288e5270175d46a7ee01a1b394b6ab2030b7a69a42fd600b069f047b75dc915291721a2d07da9d01dc5453c4f6ea1486dbba06d0
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Matthew Patterson
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Howard
|
2
|
+
|
3
|
+
Unofficial client library for the Chicago Transit Authority's Train Tracker API
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'howard'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install howard
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
### Train Tracker API Key
|
24
|
+
|
25
|
+
In order to use the Train Tracker API, you will need to [apply for an API key](http://www.transitchicago.com/developers/traintracker.aspx).
|
26
|
+
|
27
|
+
Once you have your API key, configure it like so:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
Howard.api_keys do |key|
|
31
|
+
key.train_tracker = "your API key here"
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
### Train Arrivals
|
36
|
+
|
37
|
+
See train arrivals for a given station or stop.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
arrivals = Howard.arrivals(stop: 41400, max: 5)
|
41
|
+
arrivals.first.route.full_name # => "Brown Line"
|
42
|
+
arrivals.first.train.run # => "419"
|
43
|
+
arrivals.first.train.latitude # => 41.97776
|
44
|
+
arrivals.first.delayed? # => false
|
45
|
+
arrivals.first.eta.to_s # => "2 min"
|
46
|
+
```
|
47
|
+
|
48
|
+
## Fine Print
|
49
|
+
|
50
|
+
This library is not affiliated with or endorsed by the Chicago Transit Authority.
|
data/Rakefile
ADDED
data/howard.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'howard/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "howard"
|
8
|
+
spec.version = Howard::VERSION
|
9
|
+
spec.authors = ["Matthew Patterson"]
|
10
|
+
spec.email = ["matthew.s.patterson@gmail.com"]
|
11
|
+
spec.summary = %q{Unofficial client for the CTA Train Tracker API}
|
12
|
+
spec.description = %q{Unofficial client library for the Chicago Transit Authority's Train Tracker API}
|
13
|
+
spec.homepage = "https://github.com/matthewpatterson/howard"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.test_files = spec.files.grep(%r{^spec/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency "httparty", "~> 0.13"
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.1"
|
25
|
+
end
|
data/lib/howard.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require "howard/arrival"
|
2
|
+
require "howard/arrivals_resource"
|
3
|
+
require "howard/time_to_arrival"
|
4
|
+
require "howard/train"
|
5
|
+
require "howard/train_tracker_gateway"
|
6
|
+
require "howard/version"
|
7
|
+
|
8
|
+
module Howard
|
9
|
+
def self.api_keys
|
10
|
+
keys = key_struct.new
|
11
|
+
yield keys
|
12
|
+
@@train_tracker_api_key = keys.train_tracker
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.train_tracker_api_key
|
16
|
+
@@train_tracker_api_key
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.arrivals(params={})
|
20
|
+
Howard::ArrivalsResource.new(params)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def self.key_struct
|
25
|
+
Struct.new(:train_tracker)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "time"
|
2
|
+
|
3
|
+
module Howard
|
4
|
+
class Arrival
|
5
|
+
def initialize(api_response)
|
6
|
+
@api_response = api_response
|
7
|
+
end
|
8
|
+
|
9
|
+
def train
|
10
|
+
@train ||= Train.new(@api_response)
|
11
|
+
end
|
12
|
+
|
13
|
+
def prediction_time
|
14
|
+
Time.strptime(@api_response["prdt"], "%Y%m%d %H:%M:%S")
|
15
|
+
end
|
16
|
+
|
17
|
+
def arrival_time
|
18
|
+
Time.strptime(@api_response["arrT"], "%Y%m%d %H:%M:%S")
|
19
|
+
end
|
20
|
+
|
21
|
+
def eta
|
22
|
+
@eta ||= TimeToArrival.new(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def approaching?
|
26
|
+
@api_response.fetch("isApp", "0") == "1"
|
27
|
+
end
|
28
|
+
alias_method :due?, :approaching?
|
29
|
+
|
30
|
+
def scheduled?
|
31
|
+
@api_response.fetch("isSch", "0") == "1"
|
32
|
+
end
|
33
|
+
|
34
|
+
def live?
|
35
|
+
!scheduled?
|
36
|
+
end
|
37
|
+
|
38
|
+
def fault?
|
39
|
+
@api_response.fetch("isFlt", "0") == "1"
|
40
|
+
end
|
41
|
+
|
42
|
+
def delayed?
|
43
|
+
@api_response.fetch("isDly", "0") == "1"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Howard
|
2
|
+
class ArrivalsResource
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :params
|
6
|
+
|
7
|
+
def initialize(params={})
|
8
|
+
@params = arrivals_params(params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def each
|
12
|
+
Array(xml_response["ctatt"]["eta"])
|
13
|
+
.map { |eta| Arrival.new(eta) }
|
14
|
+
.each { |arrival| yield arrival }
|
15
|
+
end
|
16
|
+
|
17
|
+
def gateway
|
18
|
+
@gateway ||= TrainTrackerGateway.new(Howard.train_tracker_api_key)
|
19
|
+
end
|
20
|
+
|
21
|
+
def xml_response
|
22
|
+
@xml_resonse ||= gateway
|
23
|
+
.arrivals(query: params)
|
24
|
+
.parsed_response
|
25
|
+
end
|
26
|
+
|
27
|
+
def arrivals_params(params)
|
28
|
+
{
|
29
|
+
mapid: params[:mapid] || params[:station],
|
30
|
+
stpid: params[:stpid] || params[:stop],
|
31
|
+
max: params[:max],
|
32
|
+
rt: params[:rt] || params[:route],
|
33
|
+
}.reject { |_, val| val.nil? }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Howard
|
2
|
+
class TimeToArrival
|
3
|
+
attr_reader :arrival
|
4
|
+
|
5
|
+
def initialize(arrival)
|
6
|
+
@arrival = arrival
|
7
|
+
end
|
8
|
+
|
9
|
+
def minutes
|
10
|
+
(arrival.arrival_time.to_i - arrival.prediction_time.to_i) / 60
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s(format = "%d min")
|
14
|
+
if arrival.delayed?
|
15
|
+
"Delayed"
|
16
|
+
elsif arrival.approaching?
|
17
|
+
"Due"
|
18
|
+
else
|
19
|
+
format % minutes
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/howard/train.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Howard
|
2
|
+
class Train
|
3
|
+
def initialize(api_response)
|
4
|
+
@api_response = api_response
|
5
|
+
end
|
6
|
+
|
7
|
+
def heading
|
8
|
+
@api_response.fetch("heading", "").to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def latitude
|
12
|
+
@api_response.fetch("lat", "").to_f
|
13
|
+
end
|
14
|
+
|
15
|
+
def longitude
|
16
|
+
@api_response.fetch("lon", "").to_f
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
@api_response["rn"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "httparty"
|
2
|
+
|
3
|
+
module Howard
|
4
|
+
class TrainTrackerGateway
|
5
|
+
include HTTParty
|
6
|
+
base_uri "http://lapi.transitchicago.com"
|
7
|
+
|
8
|
+
def initialize(api_key)
|
9
|
+
self.class.default_params(key: api_key)
|
10
|
+
end
|
11
|
+
|
12
|
+
def arrivals(params)
|
13
|
+
self.class.get("/api/1.0/ttarrivals.aspx", params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Howard::Arrival do
|
4
|
+
describe "#train" do
|
5
|
+
it "returns a Howard::Train instance" do
|
6
|
+
arrival = Howard::Arrival.new("rn" => "419")
|
7
|
+
expect(arrival.train).to be_a(Howard::Train)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "provides the train run number" do
|
11
|
+
arrival = Howard::Arrival.new("rn" => "419")
|
12
|
+
expect(arrival.train.run).to eq("419")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "provides the latitude of the train" do
|
16
|
+
arrival = Howard::Arrival.new("lat" => "41.97776")
|
17
|
+
expect(arrival.train.latitude).to eq(41.97776)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "provides the longitude of the train" do
|
21
|
+
arrival = Howard::Arrival.new("lon" => "-87.77567")
|
22
|
+
expect(arrival.train.longitude).to eq(-87.77567)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "provides the heading of the train" do
|
26
|
+
arrival = Howard::Arrival.new("heading" => "299")
|
27
|
+
expect(arrival.train.heading).to eq(299)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#prediction_time" do
|
32
|
+
it "returns the date/time of the prediction" do
|
33
|
+
arrival = Howard::Arrival.new("prdt" => "20110618 23:26:12")
|
34
|
+
expect(arrival.prediction_time.year).to eq(2011)
|
35
|
+
expect(arrival.prediction_time.month).to eq(6)
|
36
|
+
expect(arrival.prediction_time.day).to eq(18)
|
37
|
+
expect(arrival.prediction_time.hour).to eq(23)
|
38
|
+
expect(arrival.prediction_time.min).to eq(26)
|
39
|
+
expect(arrival.prediction_time.sec).to eq(12)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#arrival_time" do
|
44
|
+
it "returns the date/time of the predicted arrival" do
|
45
|
+
arrival = Howard::Arrival.new("arrT" => "20110618 23:26:12")
|
46
|
+
expect(arrival.arrival_time.year).to eq(2011)
|
47
|
+
expect(arrival.arrival_time.month).to eq(6)
|
48
|
+
expect(arrival.arrival_time.day).to eq(18)
|
49
|
+
expect(arrival.arrival_time.hour).to eq(23)
|
50
|
+
expect(arrival.arrival_time.min).to eq(26)
|
51
|
+
expect(arrival.arrival_time.sec).to eq(12)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#eta" do
|
56
|
+
it "returns a Howard::TimeToArrival instance" do
|
57
|
+
arrival = Howard::Arrival.new(
|
58
|
+
"prdt" => "20110618 23:26:12",
|
59
|
+
"arrT" => "20110618 23:28:12",
|
60
|
+
)
|
61
|
+
|
62
|
+
expect(arrival.eta).to be_a(Howard::TimeToArrival)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "shows the number time until the train arrives" do
|
66
|
+
arrival = Howard::Arrival.new(
|
67
|
+
"prdt" => "20110618 23:26:12",
|
68
|
+
"arrT" => "20110618 23:28:12",
|
69
|
+
)
|
70
|
+
|
71
|
+
expect(arrival.eta.to_s).to eq("2 min")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#approaching?" do
|
76
|
+
it "is true when the train is approaching" do
|
77
|
+
arrival = Howard::Arrival.new("isApp" => "1")
|
78
|
+
expect(arrival.approaching?).to be_truthy
|
79
|
+
end
|
80
|
+
|
81
|
+
it "is false when the train is not approaching" do
|
82
|
+
arrival = Howard::Arrival.new("isApp" => "0")
|
83
|
+
expect(arrival.approaching?).to be_falsey
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#scheduled?" do
|
88
|
+
it "is true when the train arrival is based on the schedule" do
|
89
|
+
arrival = Howard::Arrival.new("isSch" => "1")
|
90
|
+
expect(arrival.scheduled?).to be_truthy
|
91
|
+
end
|
92
|
+
|
93
|
+
it "is false when the train arrival is based on a live prediction" do
|
94
|
+
arrival = Howard::Arrival.new("isSch" => "0")
|
95
|
+
expect(arrival.scheduled?).to be_falsey
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#live?" do
|
100
|
+
it "is true when the train arrival is based on a live prediction" do
|
101
|
+
arrival = Howard::Arrival.new("isSch" => "0")
|
102
|
+
expect(arrival.live?).to be_truthy
|
103
|
+
end
|
104
|
+
|
105
|
+
it "is false when the train arrival is based on the schedule" do
|
106
|
+
arrival = Howard::Arrival.new("isSch" => "1")
|
107
|
+
expect(arrival.live?).to be_falsey
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "#fault?" do
|
112
|
+
it "is true when a fault has been detected" do
|
113
|
+
arrival = Howard::Arrival.new("isFlt" => "1")
|
114
|
+
expect(arrival.fault?).to be_truthy
|
115
|
+
end
|
116
|
+
|
117
|
+
it "is false when a fault has not been detected" do
|
118
|
+
arrival = Howard::Arrival.new("isFlt" => "0")
|
119
|
+
expect(arrival.fault?).to be_falsey
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "#delayed?" do
|
124
|
+
it "is true when a train is delayed" do
|
125
|
+
arrival = Howard::Arrival.new("isDly" => "1")
|
126
|
+
expect(arrival.delayed?).to be_truthy
|
127
|
+
end
|
128
|
+
|
129
|
+
it "is false when a train is not delayed" do
|
130
|
+
arrival = Howard::Arrival.new("isDly" => "0")
|
131
|
+
expect(arrival.delayed?).to be_falsey
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Howard::ArrivalsResource do
|
4
|
+
let(:arrivals) { Howard::ArrivalsResource.new }
|
5
|
+
|
6
|
+
describe "#each" do
|
7
|
+
before(:each) do
|
8
|
+
@api_response = {"ctatt" => {"eta" => [{"rn" => "419"}, {"rn" => "519"}]}}
|
9
|
+
allow(arrivals).to receive(:xml_response) { @api_response }
|
10
|
+
end
|
11
|
+
|
12
|
+
it "can iterate over arrivals" do
|
13
|
+
expect(arrivals.count).to eq(2)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns Howard::Arrival objects" do
|
17
|
+
arrivals.each do |arrival|
|
18
|
+
expect(arrival).to be_a(Howard::Arrival)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Howard::TimeToArrival do
|
4
|
+
describe "#to_s" do
|
5
|
+
it "shows minutes to arrival" do
|
6
|
+
arrival = Howard::Arrival.new(
|
7
|
+
"prdt" => "20110618 23:26:12",
|
8
|
+
"arrT" => "20110618 23:28:47",
|
9
|
+
"isDly" => "0",
|
10
|
+
"isApp" => "0",
|
11
|
+
)
|
12
|
+
eta = Howard::TimeToArrival.new(arrival)
|
13
|
+
|
14
|
+
expect(eta.to_s).to eq("2 min")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "respects the format provided" do
|
18
|
+
arrival = Howard::Arrival.new(
|
19
|
+
"prdt" => "20110618 23:26:12",
|
20
|
+
"arrT" => "20110618 23:28:47",
|
21
|
+
"isDly" => "0",
|
22
|
+
"isApp" => "0",
|
23
|
+
)
|
24
|
+
eta = Howard::TimeToArrival.new(arrival)
|
25
|
+
|
26
|
+
expect(eta.to_s("about %d minutes")).to eq("about 2 minutes")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "shows 'Delayed' when a train is delayed" do
|
30
|
+
arrival = Howard::Arrival.new(
|
31
|
+
"prdt" => "20110618 23:26:12",
|
32
|
+
"arrT" => "20110618 23:28:47",
|
33
|
+
"isDly" => "1",
|
34
|
+
"isApp" => "0",
|
35
|
+
)
|
36
|
+
eta = Howard::TimeToArrival.new(arrival)
|
37
|
+
|
38
|
+
expect(eta.to_s).to eq("Delayed")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "shows 'Due' when a train is arriving" do
|
42
|
+
arrival = Howard::Arrival.new(
|
43
|
+
"prdt" => "20110618 23:26:12",
|
44
|
+
"arrT" => "20110618 23:28:47",
|
45
|
+
"isDly" => "0",
|
46
|
+
"isApp" => "1",
|
47
|
+
)
|
48
|
+
eta = Howard::TimeToArrival.new(arrival)
|
49
|
+
|
50
|
+
expect(eta.to_s).to eq("Due")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#minutes" do
|
55
|
+
it "returns the number of minutes until a train arrives as an integer" do
|
56
|
+
arrival = Howard::Arrival.new(
|
57
|
+
"prdt" => "20110618 23:26:12",
|
58
|
+
"arrT" => "20110618 23:28:47",
|
59
|
+
"isDly" => "0",
|
60
|
+
"isApp" => "0",
|
61
|
+
)
|
62
|
+
eta = Howard::TimeToArrival.new(arrival)
|
63
|
+
|
64
|
+
expect(eta.minutes).to eq(2)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Howard::Train do
|
4
|
+
describe "#heading" do
|
5
|
+
it "returns the heading of the train" do
|
6
|
+
train = Howard::Train.new("heading" => "299")
|
7
|
+
expect(train.heading).to eq(299)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#latitude" do
|
12
|
+
it "returns the latitudinal position of the train" do
|
13
|
+
train = Howard::Train.new("lat" => "41.97776")
|
14
|
+
expect(train.latitude).to eq(41.97776)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#longitude" do
|
19
|
+
it "returns the longitudinal position of the train" do
|
20
|
+
train = Howard::Train.new("lon" => "-87.77567")
|
21
|
+
expect(train.longitude).to eq(-87.77567)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#run" do
|
26
|
+
it "returns the train run number" do
|
27
|
+
train = Howard::Train.new("rn" => "419")
|
28
|
+
expect(train.run).to eq("419")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/howard_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "securerandom"
|
3
|
+
|
4
|
+
RSpec.describe Howard do
|
5
|
+
describe ".api_keys" do
|
6
|
+
it "sets the Train Tracker API key" do
|
7
|
+
api_key = SecureRandom.hex(8)
|
8
|
+
Howard.api_keys { |key| key.train_tracker = api_key }
|
9
|
+
expect(Howard.train_tracker_api_key).to eq(api_key)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ".arrivals" do
|
14
|
+
it "returns an ArrivalsResource" do
|
15
|
+
expect(Howard.arrivals).to be_a(Howard::ArrivalsResource)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "does not make any HTTP calls" do
|
19
|
+
Howard.api_keys { |key| key.train_tracker = SecureRandom.hex(8) }
|
20
|
+
expect(Howard::TrainTrackerGateway).to receive(:get).never
|
21
|
+
Howard.arrivals
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: howard
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matthew Patterson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.13'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.1'
|
69
|
+
description: Unofficial client library for the Chicago Transit Authority's Train Tracker
|
70
|
+
API
|
71
|
+
email:
|
72
|
+
- matthew.s.patterson@gmail.com
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- ".rspec"
|
79
|
+
- ".travis.yml"
|
80
|
+
- Gemfile
|
81
|
+
- LICENSE.txt
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- howard.gemspec
|
85
|
+
- lib/howard.rb
|
86
|
+
- lib/howard/arrival.rb
|
87
|
+
- lib/howard/arrivals_resource.rb
|
88
|
+
- lib/howard/time_to_arrival.rb
|
89
|
+
- lib/howard/train.rb
|
90
|
+
- lib/howard/train_tracker_gateway.rb
|
91
|
+
- lib/howard/version.rb
|
92
|
+
- spec/howard/arrival_spec.rb
|
93
|
+
- spec/howard/arrivals_resource_spec.rb
|
94
|
+
- spec/howard/time_to_arrival_spec.rb
|
95
|
+
- spec/howard/train_spec.rb
|
96
|
+
- spec/howard_spec.rb
|
97
|
+
- spec/spec_helper.rb
|
98
|
+
homepage: https://github.com/matthewpatterson/howard
|
99
|
+
licenses:
|
100
|
+
- MIT
|
101
|
+
metadata: {}
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
require_paths:
|
105
|
+
- lib
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project:
|
118
|
+
rubygems_version: 2.2.2
|
119
|
+
signing_key:
|
120
|
+
specification_version: 4
|
121
|
+
summary: Unofficial client for the CTA Train Tracker API
|
122
|
+
test_files:
|
123
|
+
- spec/howard/arrival_spec.rb
|
124
|
+
- spec/howard/arrivals_resource_spec.rb
|
125
|
+
- spec/howard/time_to_arrival_spec.rb
|
126
|
+
- spec/howard/train_spec.rb
|
127
|
+
- spec/howard_spec.rb
|
128
|
+
- spec/spec_helper.rb
|