tripspark_api 0.0.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c07a79f3d18eba3c2055dc745f72c4487c03aa0a
4
- data.tar.gz: 47b9b0e10c955389d140a79876b2678245714063
3
+ metadata.gz: ce1db8d390b3759ead6003e38195fdc40245a746
4
+ data.tar.gz: c76c01fd63b9db6042640dfda5b426ebbf957a70
5
5
  SHA512:
6
- metadata.gz: 177342e70259b1061fd788542ff6b97192167eefa83aeae3d8a9fb91549b2d176431a069d0ad4ce3bc7f1656e65e02acafa63bf2a6d1da12a33c3d74f390bf71
7
- data.tar.gz: 0f6861ceafb77db62e9aba725e7ef3e8aee7b924d26345c151720ca7ad993ac80b18297b672685154a397b391d4eb5856509421e1294da63d5f6d526f6131964
6
+ metadata.gz: 3837c3875c6d8f56b4109754ca747583b0b4a8e03a750440f474ceff9caaa68d6e640c16b3ab84da5d69f6045066f67986b6c832958e7db827c751fa115c88dc
7
+ data.tar.gz: 0b4a78bc31fb43b1bfa2b22bc5eff2f96e15d9ba27b0646d5b894054574c95dc56f4c32713a27a909ce8f1f179e61a7a0c6ebf98d3d6441cbd63c11b38541aa9
@@ -0,0 +1,32 @@
1
+ require_relative 'tripspark_api/core_ext/string'
2
+
3
+ require_relative 'tripspark_api/version'
4
+ require_relative 'tripspark_api/configuration'
5
+ require_relative 'tripspark_api/connection'
6
+ require_relative 'tripspark_api/models'
7
+ require_relative 'tripspark_api/api'
8
+ require_relative 'tripspark_api/client'
9
+
10
+ module TripSpark
11
+ class << self
12
+ # Alias for `TripSpark::Client.new`
13
+ def new
14
+ Client.new
15
+ end
16
+
17
+ # The current client configuration
18
+ def configuration
19
+ @configuration ||= Configuration.new
20
+ end
21
+
22
+ # Allow users to set configuration options via a block. By default, the
23
+ # configuration will be validated after the block returns. This will raise
24
+ # an exception if any required configurations are not provided. This
25
+ # behavior can be skipped by passing `validate: false` as a parameter.
26
+ def configure validate: true
27
+ yield configuration
28
+ configuration.validate! if validate
29
+ configuration
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,52 @@
1
+ require 'memoist'
2
+
3
+ module TripSpark
4
+ # A base class implementing common API operations
5
+ class API
6
+ include Connection
7
+
8
+ class << self
9
+ extend Memoist
10
+
11
+ # Include another API's functionality via a new method on this API.
12
+ # For example, `include_api :routes` would include the "Routes" API into
13
+ # the "Client" API, accessible as `Client#routes`.
14
+ def include_api name
15
+ klass = self.const_get(name.to_s.constantize)
16
+ define_method(name) do
17
+ klass.new
18
+ end
19
+ self.memoize name
20
+ end
21
+
22
+ # Require all the files given in `names` that exist in the given folder
23
+ def require_all folder, *libs
24
+ libs.each do |lib|
25
+ require_relative "#{File.join(folder, lib)}"
26
+ end
27
+ end
28
+
29
+ # Return a singleton instance of this API
30
+ def singleton
31
+ @singleton ||= self.new
32
+ end
33
+ end
34
+
35
+
36
+ # Perform a GET request over the connection to the given endpoint.
37
+ def get_request endpoint, opts={}, &block
38
+ connection.get endpoint, opts, &block
39
+ end
40
+
41
+ # Perform a POST request over the connection to the given endpoint.
42
+ def post_request endpoint, opts={}, &block
43
+ connection.post endpoint, opts, &block
44
+ end
45
+
46
+ # For APIs that extend Memoist, allow the user to call `refresh` as an
47
+ # alias for `flush_cache`.
48
+ def refresh
49
+ send(:flush_cache) if respond_to?(:flush_cache)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,17 @@
1
+ require 'memoist'
2
+
3
+ module TripSpark
4
+ class Client < API
5
+ extend Memoist
6
+
7
+ require_all 'client',
8
+ 'routes',
9
+ 'patterns',
10
+ 'vehicles'
11
+
12
+ include_api :routes
13
+ include_api :patterns
14
+ include_api :vehicles
15
+ end
16
+ end
17
+
@@ -0,0 +1,25 @@
1
+ module TripSpark
2
+ class Client::Patterns < API
3
+ extend Memoist
4
+
5
+ # Return a list of all patterns belonging to the given route. Currently,
6
+ # there is no direct way to retrieve all patterns for all routes.
7
+ def list route_key
8
+ params = {
9
+ body: {
10
+ routeKey: route_key
11
+ }
12
+ }
13
+ post_request('/RouteMap/GetPatternPoints/', params).map{ |pattern| Pattern.new(pattern) }
14
+ end
15
+ memoize :list
16
+ alias_method :all, :list
17
+
18
+ # Return the route whose key matches the given key
19
+ def get key
20
+ list.find{ |pattern| pattern.key == key }
21
+ end
22
+ memoize :get
23
+ alias_method :find, :get
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module TripSpark
2
+ class Client::Routes < API
3
+ extend Memoist
4
+
5
+ # Return a list of all routes on the system.
6
+ def list
7
+ post_request('/RouteMap/GetRoutes/').map{ |route| Route.new(route) }
8
+ end
9
+ memoize :list
10
+ alias_method :all, :list
11
+
12
+ # Return the route whose key matches the given key
13
+ def get key
14
+ list.find{ |route| route.key == key }
15
+ end
16
+ memoize :get
17
+ alias_method :find, :get
18
+
19
+ # Return a list of pairs of route keys and direction keys. Used when
20
+ # requesting vehicles.
21
+ def route_direction_pairs *routes
22
+ list.each_with_object([]) do |route, pairs|
23
+ next unless routes.empty? or !routes.include?(route.key)
24
+ route.patterns.each do |pattern|
25
+ pairs << [route.key, pattern.direction.key]
26
+ end
27
+ end.uniq
28
+ end
29
+ memoize :route_direction_pairs
30
+ end
31
+ end
@@ -0,0 +1,66 @@
1
+ module TripSpark
2
+ class Client::Vehicles < API
3
+ extend Memoist
4
+
5
+ # Return a Hash of Pattern objects to Vehicles on that pattern. If `routes`
6
+ # is provided (as an array of route keys), only vehicles on those routes
7
+ # will be included.
8
+ def by_pattern *routes
9
+ params = _route_direction_pair_params(routes)
10
+ routes = post_request('/RouteMap/GetVehicles/', body: params)
11
+ routes.each.with_object({}) do |route, patterns_hash|
12
+ route['VehiclesByPattern'].each do |pat|
13
+ pattern = Pattern.new(pat['Pattern'])
14
+ # Apparently, vehicles can go in multiple directions concurrently,
15
+ # even though that directly conflicts with the idea that vehicles
16
+ # belong to patterns and patterns have one direction.
17
+ # To avoid creating more Vehicle objects that necessary, first clear
18
+ # the Vehicles hash of any duplicates, then create the objects.
19
+ vehicles = pat['Vehicles'].uniq{ |vehicle| vehicle['Key'] }
20
+ patterns_hash[pattern] = vehicles.map{ |vehicle| Vehicle.new(vehicle) }
21
+ end
22
+ end
23
+ end
24
+ memoize :by_pattern
25
+
26
+ # Return a list of all vehicles currently traveling on routes. If `routes`
27
+ # is provided (as an array of route keys), only vehicles on those routes
28
+ # will be included.
29
+ def list *routes
30
+ by_pattern(*routes).values.flatten
31
+ end
32
+ memoize :list
33
+ alias_method :all, :list
34
+
35
+ # Return a Hash of Route keys to Vehicles. If `route_keys` are given,
36
+ # only those Routes will be included
37
+ def by_route *route_keys
38
+ list(*route_keys).each.with_object({}) do |vehicle, route_hash|
39
+ (route_hash[vehicle.route.key] ||= []) << vehicle
40
+ end
41
+ end
42
+ memoize :by_route
43
+
44
+ # Return the vehicle whose key matches the given key
45
+ def get key
46
+ list.find{ |vehicle| vehicle.key == key }
47
+ end
48
+ memoize :get
49
+ alias_method :find, :get
50
+
51
+
52
+ private
53
+ # Return a parameter string suitable for supplying routeDirectionKeys to
54
+ # a call to /GetVehicles/. If rd_pairs is provided (as an array of route-
55
+ # direction_pairs), onlye those routes will be included.
56
+ def _route_direction_pair_params routes
57
+ # The information to populate `routeDirectionKeys` for a request is
58
+ # most easily found in `Client::Routes`, if it was not given directly.
59
+ rd_pairs = Client::Routes.singleton.route_direction_pairs(*routes)
60
+ rd_pairs.each.with_index.with_object([]) do |((route, dir), idx), params|
61
+ params << "routeDirectionKeys[#{idx}][routeKey]=#{route}"
62
+ params << "routeDirectionKeys[#{idx}][directionKey]=#{dir}"
63
+ end.join('&')
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,41 @@
1
+ module TripSpark
2
+ class Configuration
3
+ # The version of the TripSpark system
4
+ attr_accessor :version
5
+ # The base URL of the TripSpark system
6
+ attr_accessor :base_uri
7
+ # The adapter to use for network communication
8
+ attr_accessor :adapter
9
+ # The output stream to which debug information should be written
10
+ attr_accessor :debug_output
11
+
12
+ # The defaults to use for any configuration options that are not provided
13
+ DEFAULT_CONFIGURATION = {
14
+ version: '3.2', # Taken from a comment on "http://bus.gocitybus.com/RouteMap/Index"
15
+ adapter: :httparty,
16
+ debug_output: false
17
+ }
18
+
19
+ # The options required when configuring a TripSpark instance
20
+ REQUIRED_CONFIGURATION = [
21
+ :base_uri
22
+ ]
23
+
24
+ def initialize
25
+ # Apply the default set of configurations before anything else to ensure
26
+ # all options are initialized.
27
+ DEFAULT_CONFIGURATION.each do |name, value|
28
+ send("#{name}=", value)
29
+ end
30
+ end
31
+
32
+ # Ensure that all required configurations have been given a value. Returns
33
+ # true if all required configuration options have been set.
34
+ def validate!
35
+ REQUIRED_CONFIGURATION.each do |name|
36
+ raise "`#{name}` is a required configuration option, but was not given a value." if send("#{name}").nil?
37
+ end
38
+ true
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ module TripSpark
2
+ module Connection
3
+ extend self
4
+
5
+ # Return the connection adapter instance
6
+ def connection
7
+ @connection ||= adapter.new(TripSpark.configuration)
8
+ end
9
+
10
+ # Return the class of the adapter to use for the connection
11
+ def adapter
12
+ @@adapters[TripSpark.configuration.adapter]
13
+ end
14
+
15
+ # Register a new class that can be used as a connection adapter
16
+ def register_adapter name, klass
17
+ (@@adapters ||= {})[name] = klass
18
+ end
19
+ end
20
+ end
21
+
22
+ # Include the adapters that come packaged with the gem
23
+ require_relative 'connection_adapters/httparty_adapter.rb'
@@ -0,0 +1,27 @@
1
+ require 'httparty'
2
+ require 'json'
3
+
4
+ # A Connection adapter using HTTParty as the network transport
5
+ module TripSpark
6
+ module Connection
7
+ class HTTPartyAdapter
8
+ include HTTParty
9
+
10
+ def initialize config
11
+ self.class.base_uri config.base_uri
12
+ # Write debug information to the configured output stream
13
+ self.class.debug_output config.debug_output
14
+ end
15
+
16
+ def get endpoint, opts={}, &block
17
+ JSON.parse(self.class.get(endpoint, opts, &block))
18
+ end
19
+
20
+ def post endpoint, opts={}, &block
21
+ JSON.parse(self.class.post(endpoint, opts, &block))
22
+ end
23
+ end
24
+
25
+ register_adapter :httparty, HTTPartyAdapter
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ class String
2
+ def underscore
3
+ self.dup.underscore!
4
+ end unless method_defined? :underscore
5
+
6
+ def underscore!
7
+ self.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
8
+ self.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
9
+ self.tr_s!('- ', '_')
10
+ self.downcase!
11
+ self
12
+ end unless method_defined? :underscore!
13
+
14
+ def titleize
15
+ self.tr_s('- ', '_').split('_').map(&:capitalize).join(' ')
16
+ end unless method_defined? :titleize
17
+
18
+ def constantize
19
+ self.tr_s('- ', '_').split('_').map(&:capitalize).join
20
+ end unless method_defined? :constantize
21
+ end
@@ -0,0 +1,92 @@
1
+ require 'set'
2
+
3
+ module TripSpark
4
+ class Model
5
+ extend Forwardable
6
+
7
+ class << self
8
+ # Define a new attribute of the model.
9
+ # If `type` is given, a new instance of `type` will be created whenever
10
+ # this attribute is assigned a value. This allows creation of nested
11
+ # objects from a simple Hash.
12
+ # If `type` is given and `array` is true, the value given to this
13
+ # attribute will be interpreted as an array and a new instance of `type`
14
+ # will be created for each entry in the array
15
+ # It `type` is given, and the value given to this attribute is nil, no
16
+ # new instance of `type` will be created. Instead, the value will remain
17
+ # nil, as an instance of NilClass.
18
+ def attribute name, type: nil, array: false
19
+ attributes << [name, type]
20
+ attr_reader name
21
+ # Use a custom writer method to allow typed attributes to be
22
+ # instantiated properly.
23
+ define_method "#{name}=" do |value|
24
+ # Only do type conversion if the type is specified and the value is
25
+ # not nil.
26
+ if type and !value.nil?
27
+ # Lookup is done on TripSpark to ensure that Model subclasses are
28
+ # searched first, falling back to other types (Numeric, Hash, etc.)
29
+ # if no Model subclass is found.
30
+ klass = TripSpark.const_get(type.to_s.constantize)
31
+ value = array ? value.map{ |v| klass.new(v) } : klass.new(value)
32
+ end
33
+ instance_variable_set("@#{name}", value)
34
+ end
35
+ end
36
+
37
+ # The list of attributes defined on the model
38
+ def attributes
39
+ @attributes ||= Set.new
40
+ end
41
+
42
+ # The attribute of the model that can be used to uniquely identify an
43
+ # instance from any other. The primary attribute should also be set
44
+ # with `attribute <name>`.
45
+ attr_accessor :identifier
46
+ def primary_attribute name
47
+ @identifier = name
48
+ end
49
+
50
+ # Define one or more delegated methods on the model, passing them to the
51
+ # given attribute.
52
+ def delegate *names, to:
53
+ names.each do |name|
54
+ def_delegator to, name
55
+ end
56
+ end
57
+ end
58
+
59
+ # Initialize a model instance with any given attributes assigned
60
+ def initialize args={}
61
+ assign(args)
62
+ end
63
+
64
+ # Mass assign a group of attributes. Attribute names will be automatically
65
+ # be converted to snake_case for consistency.
66
+ def assign args={}
67
+ args.each do |name, value|
68
+ public_send("#{name.underscore}=", value)
69
+ end
70
+ end
71
+
72
+ # The value of the primary attribute on this model
73
+ def identifier
74
+ send(self.class.identifier)
75
+ end
76
+
77
+ # Assume that two Model objects are the same if their primary attributes
78
+ # have the same value
79
+ def == o
80
+ identifier == o.identifier
81
+ end
82
+ end
83
+ end
84
+
85
+ # Include all model subclasses
86
+ require_relative 'models/direction'
87
+ require_relative 'models/gps'
88
+ require_relative 'models/route'
89
+ require_relative 'models/pattern'
90
+ require_relative 'models/pattern_point'
91
+ require_relative 'models/stop'
92
+ require_relative 'models/vehicle'
@@ -0,0 +1,21 @@
1
+ module TripSpark
2
+ class Direction < Model
3
+ # The unique key used when referencing this direction
4
+ attribute :direction_key
5
+ alias_method :key, :direction_key
6
+ # The name of this direction
7
+ attribute :direction_name
8
+ alias_method :name, :direction_name
9
+ # NOTE: The purpose of this field is unknown, as it is almost always given
10
+ # a value of `null`.
11
+ attribute :route_key
12
+ # NOTE: The purpose of this field is unknown, as it is almost always given
13
+ # a value of `null`.
14
+ attribute :schedule_key
15
+ # NOTE: The purpose of this field is unknown, as it is almost always given
16
+ # a value of `null`.
17
+ attribute :direction_external_id
18
+
19
+ primary_attribute :direction_key
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ module TripSpark
2
+ class GPS < Model
3
+ # The time at which this GPS object as updated
4
+ attribute :date
5
+ alias_method :time, :date
6
+ alias_method :last_updated, :date
7
+ # The latitudinal position of this object
8
+ attribute :lat
9
+ alias_method :latitude, :lat
10
+ # The longitudinal position of this object
11
+ attribute :long
12
+ alias_method :lon, :long
13
+ alias_method :longitude, :long
14
+ # The speed at which this object is traveling
15
+ attribute :spd
16
+ alias_method :speed, :spd
17
+ # The direction this object is facing
18
+ attribute :dir
19
+ alias_method :direction, :dir
20
+ alias_method :heading, :dir
21
+
22
+ # GPS objects are always considered unique, and therefore do not have a
23
+ # primary attribute
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ module TripSpark
2
+ class Pattern < Model
3
+ # The unique key used when referencing this pattern
4
+ attribute :key
5
+ # The full name of this pattern
6
+ attribute :name
7
+ # The name used to quickly identify this pattern
8
+ attribute :short_name
9
+ # A short summary of the purpose of this pattern
10
+ attribute :description
11
+ # The type of line segment that should be used when displaying this pattern
12
+ attribute :line_type
13
+ # The color that should be used to shade this pattern (as a hexcode)
14
+ attribute :line_color
15
+ # Is this a pattern that can be displayed?
16
+ attribute :is_displayable
17
+ alias_method :displayable?, :is_displayable
18
+ # Is this the primary pattern of the route it belongs to?
19
+ attribute :is_primary_pattern
20
+ alias_method :primary_pattern?, :is_primary_pattern
21
+ # The Direction that this pattern heads in
22
+ attribute :direction, type: :direction
23
+ # The list of key points that this pattern touches
24
+ attribute :pattern_point_list, type: :pattern_point, array: true
25
+ alias_method :pattern_points, :pattern_point_list
26
+ alias_method :points, :pattern_point_list
27
+
28
+ primary_attribute :key
29
+
30
+
31
+ # Return only the pattern points of this pattern that have the type `BusStop`
32
+ def stops
33
+ @stops ||= pattern_point_list.select{ |point| point.type == "BusStop" }
34
+ end
35
+
36
+ # Return only the pattern points of this pattern that have the type `WayPoint`
37
+ def waypoints
38
+ @waypoints ||= pattern_point_list.select{ |point| point.type == "WayPoint" }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ module TripSpark
2
+ class PatternPoint < Model
3
+ # The unique key used when referencing this pattern point
4
+ attribute :key
5
+ # NOTE: The purpose of this field is unknown, as it is almost always given
6
+ # a value of `null`.
7
+ attribute :name
8
+ # NOTE: The purpose of this field is unknown, as it is almost always given
9
+ # a value of `null`.
10
+ attribute :description
11
+ # The position of this pattern point in the pattern it belongs to
12
+ attribute :rank
13
+ # NOTE: The purpose of this field is unknown, as it is almost always given
14
+ # a value of `null`.
15
+ attribute :header_rank
16
+ # The latitudinal position of this pattern point
17
+ attribute :latitude
18
+ # The longitudinal position of this pattern point
19
+ attribute :longitude
20
+ # The type of point that this pattern point represents. Normally either
21
+ # "BusStop" or "WayPoint".
22
+ attribute :point_type_code
23
+ alias_method :type, :point_type_code
24
+ # If this pattern point's type is "BusStop", an instance of `Stop`
25
+ # containing more information about it. Otherwise, nil.
26
+ attribute :stop, type: :stop
27
+ # The key of that pattern that this point belongs to
28
+ attribute :pattern_key
29
+ # Is this pattern point the last point in the pattern it belongs to?
30
+ attribute :is_last_point
31
+ alias_method :last_point?, :is_last_point
32
+
33
+ primary_attribute :key
34
+ end
35
+ end
@@ -0,0 +1,24 @@
1
+ module TripSpark
2
+ class Route < Model
3
+ # The unique key used when referencing this route
4
+ attribute :key
5
+ # The full name of this route
6
+ attribute :name
7
+ # The name used to quickly identify this route
8
+ attribute :short_name
9
+ # A short summary of the purpose of this route
10
+ attribute :description
11
+ # The list of patterns that belong to this route
12
+ attribute :pattern_list, type: :pattern, array: true
13
+ alias_method :patterns, :pattern_list
14
+ # A combination of the name and short_name of this route
15
+ attribute :combined_name
16
+ alias_method :full_name, :combined_name
17
+ # NOTE: The purpose of this field is unknown, as it is almost always given
18
+ # a value of `null`.
19
+ attribute :route_type
20
+ alias_method :type, :route_type
21
+
22
+ primary_attribute :key
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ module TripSpark
2
+ class Stop < Model
3
+ # The unique key used when referencing this stop
4
+ attribute :key
5
+ # The name of this stop
6
+ attribute :name
7
+ # The position of this stop in the pattern it belongs to
8
+ attribute :rank
9
+ # NOTE: The purpose of this field is unknown, as it is almost always given
10
+ # a value of `null`.
11
+ attribute :header_rank
12
+ # The name used to quickly identify this stop
13
+ attribute :stop_code
14
+ # The latitudinal position of this stop
15
+ attribute :latitude
16
+ # The longitudinal position of this stop
17
+ attribute :longitude
18
+ # NOTE: The purpose of this field is unknown, as it is almost always given
19
+ # a useless value, e.g. "9999-12-31T23:59:59.9999999".
20
+ attribute :arrival_at_stop
21
+ # NOTE: The purpose of this field is unknown, as it is almost always given
22
+ # a value of `0`.
23
+ attribute :time_to_stop
24
+ # Is this stop a time point of the pattern? (A point at which a vehicle
25
+ # wait to remain on schedule)
26
+ attribute :is_time_point
27
+ alias_method :time_point?, :is_time_point
28
+ # NOTE: The purpose of this field is unknown, as it is almost always given
29
+ # a useless value, e.g. "0001-01-01T00:00:00".
30
+ attribute :estimated_depart_time
31
+ # NOTE: The purpose of this field is unknown, as it is almost always given
32
+ # a useless value, e.g. "0001-01-01T00:00:00".
33
+ attribute :scheduled_work_date
34
+ # NOTE: The purpose of this field is unknown, as it is almost always given
35
+ # a value of `null`.
36
+ attribute :schedule_key
37
+
38
+ primary_attribute :key
39
+ end
40
+ end
@@ -0,0 +1,52 @@
1
+ module TripSpark
2
+ class Vehicle < Model
3
+ # The unique key used when referencing this vehicle
4
+ attribute :key
5
+ # The name given to this vehicle
6
+ attribute :name
7
+ # The GPS location of this vehicle, along with when it was last updated
8
+ attribute :gps, type: :g_p_s
9
+ # Expose GPS information directly via this vehicle.
10
+ # NOTE: `direction` is delegated here, then aliased as `gps_direction`, and
11
+ # `heading` but `direction` will be not be available like this at run time
12
+ # because it is also the name of a direct attribute of a vehicle, and will
13
+ # get overwritten by that information.
14
+ delegate :latitude, :longitude, :speed, :direction, :last_updated, to: :gps
15
+ alias_method :gps_direction, :direction
16
+ alias_method :heading, :direction
17
+ # The pattern this vehicle is currently traveling
18
+ attribute :pattern, type: :pattern
19
+ # The route this vehicle is currently traveling
20
+ attribute :route, type: :route
21
+ # NOTE: The purpose of this field is unknown, as it is almost always given
22
+ # a value of `null`.
23
+ attribute :direction
24
+ # NOTE: The purpose of this field is unknown, as it is almost always given
25
+ # a value of `null`.
26
+ attribute :trip_data
27
+ # The next stop that this vehicle will arrive at
28
+ attribute :next_stop, type: :stop
29
+ # NOTE: The purpose of this field is unknown, as it is almost always given
30
+ # a value of `null`.
31
+ # The assumption is that this is a boolean indicating that a passenger has
32
+ # requested the bus stop at the next stop.
33
+ attribute :requested_stop
34
+ # Is this the last vehicle on it's pattern?
35
+ attribute :is_last_vehicle
36
+ alias_method :last_vehicle?, :is_last_vehicle
37
+ # The number of passengers this vehicle can carry at one time
38
+ attribute :passenger_capacity
39
+ alias_method :capacity, :passenger_capacity
40
+ # The number of passengers currently onboard this vehicle
41
+ attribute :passengers_onboard
42
+ alias_method :onboard, :passengers_onboard
43
+ # The saturation of the vehicle with passengers
44
+ attribute :percent_filled
45
+ alias_method :saturation, :percent_filled
46
+ # NOTE: The purpose of this field is unknown, as it is almost always given
47
+ # a value of `null`.
48
+ attribute :work
49
+
50
+ primary_attribute :key
51
+ end
52
+ end
@@ -1,3 +1,3 @@
1
1
  module TripSpark
2
- VERSION = "0.0.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tripspark_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Egeland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-23 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2016-07-03 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: memoist
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.14'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.14'
13
41
  description: A reverse-engineered Ruby client for the publicly-visible/accessible
14
42
  API that TripSpark transit system instances expose through their network traffic.
15
43
  email: jonegeland@gmail.com
@@ -19,7 +47,24 @@ extra_rdoc_files:
19
47
  - LICENSE
20
48
  files:
21
49
  - LICENSE
22
- - lib/tripspark.rb
50
+ - lib/tripspark_api.rb
51
+ - lib/tripspark_api/api.rb
52
+ - lib/tripspark_api/client.rb
53
+ - lib/tripspark_api/client/patterns.rb
54
+ - lib/tripspark_api/client/routes.rb
55
+ - lib/tripspark_api/client/vehicles.rb
56
+ - lib/tripspark_api/configuration.rb
57
+ - lib/tripspark_api/connection.rb
58
+ - lib/tripspark_api/connection_adapters/httparty_adapter.rb
59
+ - lib/tripspark_api/core_ext/string.rb
60
+ - lib/tripspark_api/models.rb
61
+ - lib/tripspark_api/models/direction.rb
62
+ - lib/tripspark_api/models/gps.rb
63
+ - lib/tripspark_api/models/pattern.rb
64
+ - lib/tripspark_api/models/pattern_point.rb
65
+ - lib/tripspark_api/models/route.rb
66
+ - lib/tripspark_api/models/stop.rb
67
+ - lib/tripspark_api/models/vehicle.rb
23
68
  - lib/tripspark_api/version.rb
24
69
  homepage: http://github.com/propershark/tripspark_api
25
70
  licenses:
@@ -1 +0,0 @@
1
- require_relative 'tripspark_api/version'