tripspark_api 0.0.0 → 0.1.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 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'