doublemap_api 2.0.0
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/LICENSE +20 -0
- data/lib/doublemap_api.rb +32 -0
- data/lib/doublemap_api/api.rb +52 -0
- data/lib/doublemap_api/client.rb +17 -0
- data/lib/doublemap_api/client/routes.rb +19 -0
- data/lib/doublemap_api/client/stops.rb +19 -0
- data/lib/doublemap_api/client/vehicles.rb +19 -0
- data/lib/doublemap_api/configuration.rb +41 -0
- data/lib/doublemap_api/connection.rb +23 -0
- data/lib/doublemap_api/connection_adapters/httparty_adapter.rb +27 -0
- data/lib/doublemap_api/core_ext/string.rb +21 -0
- data/lib/doublemap_api/models.rb +88 -0
- data/lib/doublemap_api/models/route.rb +36 -0
- data/lib/doublemap_api/models/stop.rb +27 -0
- data/lib/doublemap_api/models/vehicle.rb +32 -0
- data/lib/doublemap_api/version.rb +3 -0
- metadata +90 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dde680b8393299472cc7dcb6a01ce62778cc5298
|
4
|
+
data.tar.gz: f1865c943dc16601c7d9b603ec9346b4cbd85aca
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 47372e2dece943ae5ada69ff5820e019d582a797c2694269ebdfb281abb772cb0c8bb6d2691d6e6a079f50398b80acdc2b2b4bfbc688fb3a79d1acee380fec27
|
7
|
+
data.tar.gz: 37ad58f6f57c6e8314172109998bbaeeefd98582dfd5fcc810f86c2e94c770c1e99146ea00178c4a7a0da73b48a2a989a3fc6a5d6c5e9362831926b305514f93
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2016 Jon Egeland
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative 'doublemap_api/core_ext/string'
|
2
|
+
|
3
|
+
require_relative 'doublemap_api/version'
|
4
|
+
require_relative 'doublemap_api/configuration'
|
5
|
+
require_relative 'doublemap_api/connection'
|
6
|
+
require_relative 'doublemap_api/models'
|
7
|
+
require_relative 'doublemap_api/api'
|
8
|
+
require_relative 'doublemap_api/client'
|
9
|
+
|
10
|
+
module DoubleMap
|
11
|
+
class << self
|
12
|
+
# Alias for `DoubleMap::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 DoubleMap
|
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,19 @@
|
|
1
|
+
module DoubleMap
|
2
|
+
class Client::Routes < API
|
3
|
+
extend Memoist
|
4
|
+
|
5
|
+
# Return a list of all routes on the system.
|
6
|
+
def list
|
7
|
+
get_request('/map/v2/routes').map{ |route| Route.new(route) }
|
8
|
+
end
|
9
|
+
memoize :list
|
10
|
+
alias_method :all, :list
|
11
|
+
|
12
|
+
# Return the route whose id matches the given id
|
13
|
+
def get id
|
14
|
+
list.find{ |route| route.id == id }
|
15
|
+
end
|
16
|
+
memoize :get
|
17
|
+
alias_method :find, :get
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DoubleMap
|
2
|
+
class Client::Stops < API
|
3
|
+
extend Memoist
|
4
|
+
|
5
|
+
# Return a list of all stops on the system.
|
6
|
+
def list
|
7
|
+
get_request('/map/v2/stops').map{ |stop| Stop.new(stop) }
|
8
|
+
end
|
9
|
+
memoize :list
|
10
|
+
alias_method :all, :list
|
11
|
+
|
12
|
+
# Return the route whose id matches the given id
|
13
|
+
def get id
|
14
|
+
list.find{ |stop| stop.id == id }
|
15
|
+
end
|
16
|
+
memoize :get
|
17
|
+
alias_method :find, :get
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DoubleMap
|
2
|
+
class Client::Vehicles < API
|
3
|
+
extend Memoist
|
4
|
+
|
5
|
+
# Return a list of all vehicles currently traveling on routes.
|
6
|
+
def list
|
7
|
+
get_request('/map/v2/buses').map{ |vehicle| Vehicle.new(vehicle) }
|
8
|
+
end
|
9
|
+
memoize :list
|
10
|
+
alias_method :all, :list
|
11
|
+
|
12
|
+
# Return the vehicle whose id matches the given id
|
13
|
+
def get id
|
14
|
+
list.find{ |vehicle| vehicle.id == id }
|
15
|
+
end
|
16
|
+
memoize :get
|
17
|
+
alias_method :find, :get
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module DoubleMap
|
2
|
+
class Configuration
|
3
|
+
# The version of the DoubleMap system
|
4
|
+
attr_accessor :version
|
5
|
+
# The base URL of the DoubleMap 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 DoubleMap 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 DoubleMap
|
2
|
+
module Connection
|
3
|
+
extend self
|
4
|
+
|
5
|
+
# Return the connection adapter instance
|
6
|
+
def connection
|
7
|
+
@connection ||= adapter.new(DoubleMap.configuration)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Return the class of the adapter to use for the connection
|
11
|
+
def adapter
|
12
|
+
@@adapters[DoubleMap.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 DoubleMap
|
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
|
+
self.class.get(endpoint, opts, &block).parsed_response
|
18
|
+
end
|
19
|
+
|
20
|
+
def post endpoint, opts={}, &block
|
21
|
+
self.class.post(endpoint, opts, &block).parsed_response
|
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,88 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module DoubleMap
|
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 DoubleMap 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 = DoubleMap.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/route'
|
87
|
+
require_relative 'models/stop'
|
88
|
+
require_relative 'models/vehicle'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module DoubleMap
|
2
|
+
class Route < Model
|
3
|
+
# The unique id used when referencing this route
|
4
|
+
attribute :id
|
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 hexadecimal color to use when displaying this route
|
12
|
+
attribute :color
|
13
|
+
# The list of lat/lon points that this route passes through
|
14
|
+
attribute :path
|
15
|
+
# The time of day that this route becomes active
|
16
|
+
attribute :start_time
|
17
|
+
# The time of day that this route stops being active
|
18
|
+
attribute :end_time
|
19
|
+
# The url where schedule information for this route can be found
|
20
|
+
attribute :schedule_url
|
21
|
+
# Is the route currently an active route being serviced
|
22
|
+
attribute :active
|
23
|
+
alias_method :active?, :active
|
24
|
+
alias_method :is_active, :active
|
25
|
+
# NOTE: The purpose of this field is unknown, as it is almost always given
|
26
|
+
# a value of `null`.
|
27
|
+
# It's default value is a Hash, so the assumed purpose is extra information
|
28
|
+
# about the route that doesn't conform to the API schema.
|
29
|
+
attribute :fields
|
30
|
+
# The list of stop ids that this route passes through.
|
31
|
+
attribute :stops
|
32
|
+
|
33
|
+
|
34
|
+
primary_attribute :id
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module DoubleMap
|
2
|
+
class Stop < Model
|
3
|
+
# The unique id used when referencing this stop
|
4
|
+
attribute :id
|
5
|
+
# The name of this stop
|
6
|
+
attribute :name
|
7
|
+
# A short summary of the purpose of this stop
|
8
|
+
attribute :description
|
9
|
+
# The latitudinal position of this stop
|
10
|
+
attribute :lat
|
11
|
+
alias_method :latitude, :lat
|
12
|
+
# The longitudinal position of this stop
|
13
|
+
attribute :lon
|
14
|
+
alias_method :longitude, :lon
|
15
|
+
# NOTE: The purpose of this field is unknown, as it is almost always given
|
16
|
+
# a value of `null`.
|
17
|
+
attribute :buddy
|
18
|
+
# NOTE: The purpose of this field is unknown, as it is almost always given
|
19
|
+
# a value of `null`.
|
20
|
+
# It's default value is a Hash, so the assumed purpose is extra information
|
21
|
+
# about the route that doesn't conform to the API schema.
|
22
|
+
attribute :fields
|
23
|
+
|
24
|
+
|
25
|
+
primary_attribute :id
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module DoubleMap
|
2
|
+
class Vehicle < Model
|
3
|
+
# The unique id used when referencing this vehicle
|
4
|
+
attribute :id
|
5
|
+
# The name given to this vehicle
|
6
|
+
attribute :name
|
7
|
+
# The latitudinal position of this vehicle
|
8
|
+
attribute :lat
|
9
|
+
alias_method :latitude, :lat
|
10
|
+
# The longitudinal position of this vehicle
|
11
|
+
attribute :lon
|
12
|
+
alias_method :longitude, :lon
|
13
|
+
# NOTE: The purpose of this field is unknown, as it is almost always given
|
14
|
+
# a value of `null`.
|
15
|
+
attribute :heading
|
16
|
+
# The route this vehicle is currently traveling
|
17
|
+
attribute :route
|
18
|
+
# The last stop that this vehicle departed from
|
19
|
+
attribute :last_stop
|
20
|
+
# NOTE: The purpose of this field is unknown, as it is almost always given
|
21
|
+
# a value of `null`.
|
22
|
+
# It's default value is a Hash, so the assumed purpose is extra information
|
23
|
+
# about the route that doesn't conform to the API schema.
|
24
|
+
attribute :fields
|
25
|
+
# The time at which this vehicle was last updated. Stored as seconds since
|
26
|
+
# the Unix epoch.
|
27
|
+
attribute :last_update
|
28
|
+
|
29
|
+
|
30
|
+
primary_attribute :id
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: doublemap_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jon Egeland
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-07-02 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'
|
41
|
+
description: A Ruby client for the DoubleMap real-time transit API. The major version
|
42
|
+
of this gem will match the version of the DoubleMap API that it is built for (e.g.,
|
43
|
+
2.0.0 -> v2).
|
44
|
+
email: jonegeland@gmail.com
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files:
|
48
|
+
- LICENSE
|
49
|
+
files:
|
50
|
+
- LICENSE
|
51
|
+
- lib/doublemap_api.rb
|
52
|
+
- lib/doublemap_api/api.rb
|
53
|
+
- lib/doublemap_api/client.rb
|
54
|
+
- lib/doublemap_api/client/routes.rb
|
55
|
+
- lib/doublemap_api/client/stops.rb
|
56
|
+
- lib/doublemap_api/client/vehicles.rb
|
57
|
+
- lib/doublemap_api/configuration.rb
|
58
|
+
- lib/doublemap_api/connection.rb
|
59
|
+
- lib/doublemap_api/connection_adapters/httparty_adapter.rb
|
60
|
+
- lib/doublemap_api/core_ext/string.rb
|
61
|
+
- lib/doublemap_api/models.rb
|
62
|
+
- lib/doublemap_api/models/route.rb
|
63
|
+
- lib/doublemap_api/models/stop.rb
|
64
|
+
- lib/doublemap_api/models/vehicle.rb
|
65
|
+
- lib/doublemap_api/version.rb
|
66
|
+
homepage: http://github.com/propershark/doublemap_api
|
67
|
+
licenses:
|
68
|
+
- MIT
|
69
|
+
metadata: {}
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 2.2.0
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
requirements: []
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 2.4.8
|
87
|
+
signing_key:
|
88
|
+
specification_version: 4
|
89
|
+
summary: A Ruby client for the DoubleMap real-time transit API.
|
90
|
+
test_files: []
|