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 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
@@ -0,0 +1,3 @@
1
+ vendor/*
2
+ bin/*
3
+ .bundle/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.1.2
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'rspec'
7
+ gem 'rspec-mocks'
8
+ end
9
+
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
@@ -0,0 +1,10 @@
1
+ class Location
2
+
3
+ attr_reader :lat, :long
4
+
5
+ def initialize(lat, long)
6
+ @lat = lat
7
+ @long = long
8
+ end
9
+
10
+ end
@@ -0,0 +1,12 @@
1
+ class Platform
2
+
3
+ require 'model/stop'
4
+ require 'model/direction'
5
+
6
+ attr_reader :stop, :direction
7
+
8
+ def initialize platform
9
+ @stop = Stop.new(platform["stop"])
10
+ @direction = Direction.new(platform["direction"])
11
+ end
12
+ 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