howard 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --order rand
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.2
4
+ - 2.0.0
5
+ - 1.9.3
6
+ - jruby-19mode
7
+ - rbx-2
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
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
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ begin
4
+ require "rspec/core/rake_task"
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ task :default => :spec
7
+ rescue LoadError; end
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
@@ -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,3 @@
1
+ module Howard
2
+ VERSION = "0.0.1"
3
+ 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
@@ -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
@@ -0,0 +1,5 @@
1
+ require "howard"
2
+
3
+ RSpec.configure do |c|
4
+ c.disable_monkey_patching!
5
+ end
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