ptv_api 0.0.2
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 +3 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +29 -0
- data/README.md +1 -0
- data/lib/model/departure.rb +14 -0
- data/lib/model/direction.rb +14 -0
- data/lib/model/line.rb +14 -0
- data/lib/model/location.rb +10 -0
- data/lib/model/platform.rb +12 -0
- data/lib/model/run.rb +14 -0
- data/lib/model/stop.rb +16 -0
- data/lib/model/transport_type.rb +37 -0
- data/lib/ptv_api.rb +46 -0
- data/ptv_api.gemspec +19 -0
- data/spec/ptv_api_spec.rb +64 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 12962ad93bc802a6ee52543a74783a9b86f164f5
|
4
|
+
data.tar.gz: 2c3fa04a09385c9b9f7c20730aa5b8d5058321fa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a96a3c1f8b12dbd3408533a6d0983f70eea1b694ee11ae4ac989bce367a0140c12a14a397c270c782763e8dd57f7b6ca02d726c18cdc11c65162a5b8dd6a6055
|
7
|
+
data.tar.gz: 56b9f454baf4cce225bf455056d8286bc1d12882a0ed3c4295b815b3a62840c466fe7d9e6609f6c2c67ce7c2c80346faf8363773610cf77ff52c2760ff387f8b
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.1.2
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
ptv_api (0.01)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
diff-lcs (1.2.5)
|
10
|
+
rspec (3.1.0)
|
11
|
+
rspec-core (~> 3.1.0)
|
12
|
+
rspec-expectations (~> 3.1.0)
|
13
|
+
rspec-mocks (~> 3.1.0)
|
14
|
+
rspec-core (3.1.7)
|
15
|
+
rspec-support (~> 3.1.0)
|
16
|
+
rspec-expectations (3.1.2)
|
17
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
18
|
+
rspec-support (~> 3.1.0)
|
19
|
+
rspec-mocks (3.1.3)
|
20
|
+
rspec-support (~> 3.1.0)
|
21
|
+
rspec-support (3.1.2)
|
22
|
+
|
23
|
+
PLATFORMS
|
24
|
+
ruby
|
25
|
+
|
26
|
+
DEPENDENCIES
|
27
|
+
ptv_api!
|
28
|
+
rspec
|
29
|
+
rspec-mocks
|
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
In all its ugly glory - Level 3 REST it aint.
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Departure
|
2
|
+
|
3
|
+
require 'model/platform'
|
4
|
+
require 'model/run'
|
5
|
+
|
6
|
+
attr_reader :platform, :run, :time
|
7
|
+
|
8
|
+
def initialize departure
|
9
|
+
@platform = Platform.new(departure["platform"])
|
10
|
+
@run = Run.new(departure["run"])
|
11
|
+
@time = Time.parse(departure["time_timetable_utc"])
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Direction
|
2
|
+
|
3
|
+
require 'model/line'
|
4
|
+
|
5
|
+
attr_reader :line, :linedir_id, :direction_name
|
6
|
+
|
7
|
+
def initialize direction
|
8
|
+
@line = Line.new(direction.delete("line"))
|
9
|
+
direction.each do |k,v|
|
10
|
+
instance_variable_set("@#{k}", v) unless v.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/lib/model/line.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class Line
|
2
|
+
|
3
|
+
require 'model/transport_type'
|
4
|
+
|
5
|
+
attr_reader :transport_type, :line_id, :line_name, :line_number
|
6
|
+
|
7
|
+
def initialize args
|
8
|
+
@transport_type = TransportType.from_s args.delete("transport_type")
|
9
|
+
args.each do |k,v|
|
10
|
+
instance_variable_set("@#{k}", v) unless v.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/lib/model/run.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class Run
|
2
|
+
|
3
|
+
require 'model/transport_type'
|
4
|
+
|
5
|
+
attr_reader :transport_type, :run_id, :destination_id, :destination_name
|
6
|
+
|
7
|
+
def initialize run
|
8
|
+
@transport_type = TransportType.from_s run.delete("transport_type")
|
9
|
+
run.each do |k,v|
|
10
|
+
instance_variable_set("@#{k}", v) unless v.nil?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
data/lib/model/stop.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class Stop
|
2
|
+
|
3
|
+
require 'model/transport_type'
|
4
|
+
require 'model/location'
|
5
|
+
|
6
|
+
attr_reader :suburb, :transport_type, :location_name, :location, :stop_id
|
7
|
+
|
8
|
+
def initialize(args)
|
9
|
+
@transport_type = TransportType.from_s args.delete("transport_type")
|
10
|
+
@location = Location.new(args.delete("lat"), args.delete("long"))
|
11
|
+
args.each do |k,v|
|
12
|
+
instance_variable_set("@#{k}", v) unless v.nil?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class TransportType
|
2
|
+
|
3
|
+
class Train
|
4
|
+
def id
|
5
|
+
0
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Tram
|
10
|
+
def id
|
11
|
+
1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Bus
|
16
|
+
def id
|
17
|
+
2
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Vline
|
22
|
+
def id
|
23
|
+
3
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Nightrider
|
28
|
+
def id
|
29
|
+
4
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.from_s transport_type
|
34
|
+
const_get("TransportType::#{[transport_type.slice(0).capitalize, transport_type.slice(1..-1)].join}").new
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/ptv_api.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
class PTVApi
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'openssl'
|
5
|
+
require 'json'
|
6
|
+
require 'model/stop'
|
7
|
+
require 'model/departure'
|
8
|
+
|
9
|
+
attr_reader :dev_id, :key
|
10
|
+
|
11
|
+
def initialize dev_id, key
|
12
|
+
@dev_id = dev_id
|
13
|
+
@key = key
|
14
|
+
end
|
15
|
+
|
16
|
+
def healthcheck
|
17
|
+
send_request "/v2/healthcheck"
|
18
|
+
end
|
19
|
+
|
20
|
+
def stops_near_me location
|
21
|
+
response = send_request "/v2/nearme/latitude/#{location.lat}/longitude/#{location.long}"
|
22
|
+
response.map { |result| Stop.new(result["result"]) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def broad_next_departures stop, number_of_results
|
26
|
+
response = send_request "/v2/mode/#{stop.transport_type.id}/stop/#{stop.stop_id}/departures/by-destination/limit/#{number_of_results}"
|
27
|
+
response["values"].map { |departure| Departure.new(departure) }
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_writer :dev_id, :key
|
33
|
+
|
34
|
+
def send_request path
|
35
|
+
uri = URI::HTTP.build({
|
36
|
+
:scheme => "http",
|
37
|
+
:host => "timetableapi.ptv.vic.gov.au",
|
38
|
+
:path => path,
|
39
|
+
:query => "devid=#{@dev_id}"})
|
40
|
+
|
41
|
+
signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, @key, uri.path + "?" + uri.query)
|
42
|
+
uri.query = uri.query + "&signature=#{signature}"
|
43
|
+
JSON.parse(open(uri).read)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/ptv_api.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "ptv_api"
|
5
|
+
s.version = '0.0.2'
|
6
|
+
s.authors = ["algrimes"]
|
7
|
+
s.email = [""]
|
8
|
+
s.homepage = "http://www.github.com/algrimes/ptv-api-ruby"
|
9
|
+
s.summary = %q{Ruby client for PTV Timetable API}
|
10
|
+
s.description = %q{ }
|
11
|
+
|
12
|
+
s.rubyforge_project = "ptv_api"
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'ptv_api'
|
2
|
+
require 'json'
|
3
|
+
require 'model/location'
|
4
|
+
require 'model/stop'
|
5
|
+
require 'open-uri'
|
6
|
+
|
7
|
+
describe "ptv api" do
|
8
|
+
|
9
|
+
before do
|
10
|
+
@devid = "my-devid"
|
11
|
+
@key = "my-key"
|
12
|
+
@api = PTVApi.new(@devid, @key)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "can perform the healthcheck" do
|
16
|
+
response = @api.healthcheck
|
17
|
+
expect response.include? "securityTokenOK"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "can get stops near you" do
|
21
|
+
response = double("Object", :read => [
|
22
|
+
{"result" => { "stop_id" => 123, "transport_type" => "tram" }},
|
23
|
+
{"result" => { "stop_id" => 456, "transport_type" => "train" }}
|
24
|
+
].to_json)
|
25
|
+
|
26
|
+
expect(OpenURI).to receive(:open_uri).and_return(response)
|
27
|
+
|
28
|
+
stops = @api.stops_near_me Location.new("123.2443", "-64.432")
|
29
|
+
|
30
|
+
expect(stops[0].transport_type).to be_a(TransportType::Tram)
|
31
|
+
expect(stops[0].stop_id).to be(123)
|
32
|
+
expect(stops[1].transport_type).to be_a(TransportType::Train)
|
33
|
+
expect(stops[1].stop_id).to be(456)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "can get broad next departures" do
|
37
|
+
response = double("Object", :read => {"values" => [
|
38
|
+
"platform" => {
|
39
|
+
"stop" => {
|
40
|
+
"transport_type" => "train"
|
41
|
+
},
|
42
|
+
"direction" => {
|
43
|
+
"line" => {
|
44
|
+
"transport_type" => "train" #WTF...
|
45
|
+
}
|
46
|
+
}
|
47
|
+
},
|
48
|
+
"run" => {
|
49
|
+
"transport_type" => "train"
|
50
|
+
},
|
51
|
+
"time_timetable_utc" => "2020-01-10T14:30Z"
|
52
|
+
]}.to_json)
|
53
|
+
|
54
|
+
expect(OpenURI).to receive(:open_uri).and_return(response)
|
55
|
+
|
56
|
+
departures = @api.broad_next_departures Stop.new({"stop_id" => 123, "transport_type" => "tram" }), 5
|
57
|
+
|
58
|
+
expect(departures[0].platform.stop.transport_type).to be_a(TransportType::Train)
|
59
|
+
expect(departures[0].platform.direction.line.transport_type).to be_a(TransportType::Train)
|
60
|
+
expect(departures[0].run.transport_type).to be_a(TransportType::Train)
|
61
|
+
expect(departures[0].time.year).to be(2020)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ptv_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- algrimes
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-10 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: " "
|
14
|
+
email:
|
15
|
+
- ''
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- ".gitignore"
|
21
|
+
- ".rspec"
|
22
|
+
- ".ruby-version"
|
23
|
+
- Gemfile
|
24
|
+
- Gemfile.lock
|
25
|
+
- README.md
|
26
|
+
- lib/model/departure.rb
|
27
|
+
- lib/model/direction.rb
|
28
|
+
- lib/model/line.rb
|
29
|
+
- lib/model/location.rb
|
30
|
+
- lib/model/platform.rb
|
31
|
+
- lib/model/run.rb
|
32
|
+
- lib/model/stop.rb
|
33
|
+
- lib/model/transport_type.rb
|
34
|
+
- lib/ptv_api.rb
|
35
|
+
- ptv_api.gemspec
|
36
|
+
- spec/ptv_api_spec.rb
|
37
|
+
homepage: http://www.github.com/algrimes/ptv-api-ruby
|
38
|
+
licenses: []
|
39
|
+
metadata: {}
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubyforge_project: ptv_api
|
56
|
+
rubygems_version: 2.2.2
|
57
|
+
signing_key:
|
58
|
+
specification_version: 4
|
59
|
+
summary: Ruby client for PTV Timetable API
|
60
|
+
test_files:
|
61
|
+
- spec/ptv_api_spec.rb
|