google_maps_service_ruby 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,174 @@
1
+ module GoogleMapsService
2
+ # Converts Ruby types to string representations suitable for Maps API server.
3
+ module Convert
4
+ module_function
5
+
6
+ # Converts a lat/lon pair to a comma-separated string.
7
+ #
8
+ # @example
9
+ # >> GoogleMapsService::Convert.latlng({"lat": -33.8674869, "lng": 151.2069902})
10
+ # => "-33.867487,151.206990"
11
+ #
12
+ # @param [Hash, Array] arg The lat/lon hash or array pair.
13
+ #
14
+ # @return [String] Comma-separated lat/lng.
15
+ #
16
+ # @raise [ArgumentError] When argument is not lat/lng hash or array.
17
+ def latlng(arg)
18
+ "%f,%f" % normalize_latlng(arg)
19
+ end
20
+
21
+ # Take the various lat/lng representations and return a tuple.
22
+ #
23
+ # Accepts various representations:
24
+ #
25
+ # 1. Hash with two entries - `lat` and `lng`
26
+ # 2. Array or list - e.g. `[-33, 151]`
27
+ #
28
+ # @param [Hash, Array] arg The lat/lon hash or array pair.
29
+ #
30
+ # @return [Array] Pair of lat and lng array.
31
+ def normalize_latlng(arg)
32
+ if arg.is_a?(Hash)
33
+ lat = arg[:lat] || arg[:latitude] || arg["lat"] || arg["latitude"]
34
+ lng = arg[:lng] || arg[:longitude] || arg["lng"] || arg["longitude"]
35
+ return lat, lng
36
+ elsif arg.is_a?(Array)
37
+ return arg[0], arg[1]
38
+ end
39
+
40
+ raise ArgumentError, "Expected a lat/lng Hash or Array, but got #{arg.class}"
41
+ end
42
+
43
+ # If arg is list-like, then joins it with sep.
44
+ #
45
+ # @param [String] sep Separator string.
46
+ # @param [Array, String] arg Value to coerce into a list.
47
+ #
48
+ # @return [String]
49
+ def join_list(sep, arg)
50
+ as_list(arg).join(sep)
51
+ end
52
+
53
+ # Coerces arg into a list. If arg is already list-like, returns arg.
54
+ # Otherwise, returns a one-element list containing arg.
55
+ #
56
+ # @param [Object] arg
57
+ #
58
+ # @return [Array]
59
+ def as_list(arg)
60
+ if arg.is_a?(Array)
61
+ return arg
62
+ end
63
+ [arg]
64
+ end
65
+
66
+ # Converts the value into a unix time (seconds since unix epoch).
67
+ #
68
+ # @example
69
+ # >> GoogleMapsService::Convert.time(datetime.now())
70
+ # => "1409810596"
71
+ #
72
+ # @param [Time, Date, DateTime, Integer] arg The time.
73
+ #
74
+ # @return [String] String representation of epoch time
75
+ def time(arg)
76
+ if arg.is_a?(DateTime)
77
+ arg = arg.to_time
78
+ end
79
+ arg.to_i.to_s
80
+ end
81
+
82
+ # Converts a dict of components to the format expected by the Google Maps
83
+ # server.
84
+ #
85
+ # @example
86
+ # >> GoogleMapsService::Convert.components({"country": "US", "postal_code": "94043"})
87
+ # => "country:US|postal_code:94043"
88
+ #
89
+ # @param [Hash] arg The component filter.
90
+ #
91
+ # @return [String]
92
+ def components(arg)
93
+ if arg.is_a?(Hash)
94
+ arg = arg.sort.map { |k, v| "#{k}:#{v}" }
95
+ return arg.join("|")
96
+ end
97
+
98
+ raise ArgumentError, "Expected a Hash for components, but got #{arg.class}"
99
+ end
100
+
101
+ # Converts a lat/lon bounds to a comma- and pipe-separated string.
102
+ #
103
+ # Accepts two representations:
104
+ #
105
+ # 1. String: pipe-separated pair of comma-separated lat/lon pairs.
106
+ # 2. Hash with two entries - "southwest" and "northeast". See {.latlng}
107
+ # for information on how these can be represented.
108
+ #
109
+ # For example:
110
+ #
111
+ # >> sydney_bounds = {
112
+ # ?> "northeast": {
113
+ # ?> "lat": -33.4245981,
114
+ # ?> "lng": 151.3426361
115
+ # ?> },
116
+ # ?> "southwest": {
117
+ # ?> "lat": -34.1692489,
118
+ # ?> "lng": 150.502229
119
+ # ?> }
120
+ # ?> }
121
+ # >> GoogleMapsService::Convert.bounds(sydney_bounds)
122
+ # => '-34.169249,150.502229|-33.424598,151.342636'
123
+ #
124
+ # @param [Hash] arg The bounds.
125
+ #
126
+ # @return [String]
127
+ def bounds(arg)
128
+ if arg.is_a?(Hash)
129
+ southwest = arg[:southwest] || arg["southwest"]
130
+ northeast = arg[:northeast] || arg["northeast"]
131
+ return "#{latlng(southwest)}|#{latlng(northeast)}"
132
+ end
133
+
134
+ raise ArgumentError, "Expected a bounds (southwest/northeast) Hash, but got #{arg.class}"
135
+ end
136
+
137
+ # Converts a waypoints to the format expected by the Google Maps server.
138
+ #
139
+ # Accept two representation of waypoint:
140
+ #
141
+ # 1. String: Name of place or comma-separated lat/lon pair.
142
+ # 2. Hash/Array: Lat/lon pair.
143
+ #
144
+ # @param [Array, String, Hash] waypoint Path.
145
+ #
146
+ # @return [String]
147
+ def waypoint(waypoint)
148
+ if waypoint.is_a?(String)
149
+ return waypoint
150
+ end
151
+ GoogleMapsService::Convert.latlng(waypoint)
152
+ end
153
+
154
+ # Converts an array of waypoints (path) to the format expected by the Google Maps
155
+ # server.
156
+ #
157
+ # Accept two representation of waypoint:
158
+ #
159
+ # 1. String: Name of place or comma-separated lat/lon pair.
160
+ # 2. Hash/Array: Lat/lon pair.
161
+ #
162
+ # @param [Array, String, Hash] waypoints Path.
163
+ #
164
+ # @return [String]
165
+ def waypoints(waypoints)
166
+ if waypoints.is_a?(Array) && (waypoints.length == 2) && waypoints[0].is_a?(Numeric) && waypoints[1].is_a?(Numeric)
167
+ waypoints = [waypoints]
168
+ end
169
+
170
+ waypoints = as_list(waypoints)
171
+ join_list("|", waypoints.map { |k| waypoint(k) })
172
+ end
173
+ end
174
+ end
@@ -0,0 +1,52 @@
1
+ module GoogleMapsService
2
+ # Specific Google Maps Service error
3
+ module Error
4
+ # Base error, capable of wrapping another
5
+ class BaseError < StandardError
6
+ # HTTP response object
7
+ # @return [Net::HTTPResponse]
8
+ attr_reader :response
9
+
10
+ # Initialize error
11
+ #
12
+ # @param [Net::HTTPResponse] response HTTP response.
13
+ def initialize(response = nil)
14
+ @response = response
15
+ end
16
+ end
17
+
18
+ # The response redirects to another URL.
19
+ class RedirectError < BaseError
20
+ end
21
+
22
+ # A 4xx class HTTP error occurred.
23
+ # The request is invalid and should not be retried without modification.
24
+ class ClientError < BaseError
25
+ end
26
+
27
+ # A 5xx class HTTP error occurred.
28
+ # An error occurred on the server and the request can be retried.
29
+ class ServerError < BaseError
30
+ end
31
+
32
+ # An unknown error occured.
33
+ class UnknownError < BaseError
34
+ end
35
+
36
+ # General Google Maps Web Service API error occured.
37
+ class ApiError < BaseError
38
+ end
39
+
40
+ # Requiered query is missing
41
+ class InvalidRequestError < ApiError
42
+ end
43
+
44
+ # The quota for the credential is over limit.
45
+ class RateLimitError < ApiError
46
+ end
47
+
48
+ # An unathorized error occurred. It might be caused by invalid key/secret or invalid access.
49
+ class RequestDeniedError < ApiError
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,89 @@
1
+ require "google_maps_service/convert"
2
+
3
+ module GoogleMapsService
4
+ # Encoder/decoder for [Google Encoded Polyline](https://developers.google.com/maps/documentation/utilities/polylinealgorithm).
5
+ module Polyline
6
+ module_function
7
+
8
+ # Decodes a Polyline string into a list of lat/lng hash.
9
+ #
10
+ # See the developer docs for a detailed description of this encoding:
11
+ # https://developers.google.com/maps/documentation/utilities/polylinealgorithm
12
+ #
13
+ # @example
14
+ # encoded_path = '_p~iF~ps|U_ulLnnqC_mqNvxq`@'
15
+ # path = GoogleMapsService::Polyline.decode(encoded_path)
16
+ # #=> [{:lat=>38.5, :lng=>-120.2}, {:lat=>40.7, :lng=>-120.95}, {:lat=>43.252, :lng=>-126.45300000000002}]
17
+ #
18
+ # @param [String] polyline An encoded polyline
19
+ #
20
+ # @return [Array] Array of hash with lat/lng keys
21
+ def decode(polyline)
22
+ points = []
23
+ index = lat = lng = 0
24
+
25
+ while index < polyline.length
26
+ result = 1
27
+ shift = 0
28
+ while true
29
+ b = polyline[index].ord - 63 - 1
30
+ index += 1
31
+ result += b << shift
32
+ shift += 5
33
+ break if b < 0x1f
34
+ end
35
+ lat += (result & 1) != 0 ? (~result >> 1) : (result >> 1)
36
+
37
+ result = 1
38
+ shift = 0
39
+ loop do
40
+ b = polyline[index].ord - 63 - 1
41
+ index += 1
42
+ result += b << shift
43
+ shift += 5
44
+ break if b < 0x1f
45
+ end
46
+ lng += (result & 1) != 0 ? ~(result >> 1) : (result >> 1)
47
+
48
+ points << {lat: lat * 1e-5, lng: lng * 1e-5}
49
+ end
50
+
51
+ points
52
+ end
53
+
54
+ # Encodes a list of points into a polyline string.
55
+ #
56
+ # See the developer docs for a detailed description of this encoding:
57
+ # https://developers.google.com/maps/documentation/utilities/polylinealgorithm
58
+ #
59
+ # @param [Array<Hash>, Array<Array>] points A list of lat/lng pairs.
60
+ #
61
+ # @return [String]
62
+ def encode(points)
63
+ last_lat = last_lng = 0
64
+ result = ""
65
+
66
+ points.each do |point|
67
+ ll = GoogleMapsService::Convert.normalize_latlng(point)
68
+ lat = (ll[0] * 1e5).round.to_i
69
+ lng = (ll[1] * 1e5).round.to_i
70
+ d_lat = lat - last_lat
71
+ d_lng = lng - last_lng
72
+
73
+ [d_lat, d_lng].each do |v|
74
+ v = v < 0 ? ~(v << 1) : (v << 1)
75
+ while v >= 0x20
76
+ result += ((0x20 | (v & 0x1f)) + 63).chr
77
+ v >>= 5
78
+ end
79
+ result += (v + 63).chr
80
+ end
81
+
82
+ last_lat = lat
83
+ last_lng = lng
84
+ end
85
+
86
+ result
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,62 @@
1
+ require "base64"
2
+ require "uri"
3
+
4
+ module GoogleMapsService
5
+ # Helper for handling URL.
6
+ module Url
7
+ module_function
8
+
9
+ # Returns a base64-encoded HMAC-SHA1 signature of a given string.
10
+ #
11
+ # @param [String] secret The key used for the signature, base64 encoded.
12
+ # @param [String] payload The payload to sign.
13
+ #
14
+ # @return [String] Base64-encoded HMAC-SHA1 signature
15
+ def sign_hmac(secret, payload)
16
+ secret = secret.encode("ASCII")
17
+ payload = payload.encode("ASCII")
18
+
19
+ # Decode the private key
20
+ raw_key = Base64.urlsafe_decode64(secret)
21
+
22
+ # Create a signature using the private key and the URL
23
+ digest = OpenSSL::Digest.new("sha1")
24
+ raw_signature = OpenSSL::HMAC.digest(digest, raw_key, payload)
25
+
26
+ # Encode the signature into base64 for url use form.
27
+ Base64.urlsafe_encode64(raw_signature)
28
+ end
29
+
30
+ # URL encodes the parameters.
31
+ # @param [Hash, Array<Array>] params The parameters
32
+ # @return [String]
33
+ def urlencode_params(params)
34
+ unquote_unreserved(URI.encode_www_form(params))
35
+ end
36
+
37
+ # Un-escape any percent-escape sequences in a URI that are unreserved
38
+ # characters. This leaves all reserved, illegal and non-ASCII bytes encoded.
39
+ #
40
+ # @param [String] uri
41
+ #
42
+ # @return [String]
43
+ def unquote_unreserved(uri)
44
+ parts = uri.split("%")
45
+
46
+ (1..parts.length - 1).each do |i|
47
+ h = parts[i][0..1]
48
+
49
+ parts[i] = if h =~ (/^(\h{2})(.*)/) && (c = $1.to_i(16).chr) && UNRESERVED_SET.include?(c)
50
+ c + $2
51
+ else
52
+ "%" + parts[i]
53
+ end
54
+ end
55
+
56
+ parts.join
57
+ end
58
+
59
+ # The unreserved URI characters (RFC 3986)
60
+ UNRESERVED_SET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
61
+ end
62
+ end
@@ -0,0 +1,38 @@
1
+ require_relative "./convert"
2
+
3
+ module GoogleMapsService
4
+ # Validate value that is accepted by Google Maps.
5
+ module Validator
6
+ module_function
7
+
8
+ # Validate travel mode. The valid value of travel mode are `driving`, `walking`, `bicycling` or `transit`.
9
+ #
10
+ # @param [String, Symbol] mode Travel mode to be validated.
11
+ #
12
+ # @raise ArgumentError The travel mode is invalid.
13
+ #
14
+ # @return [String] Valid travel mode.
15
+ def travel_mode(mode)
16
+ # NOTE(broady): the mode parameter is not validated by the Maps API
17
+ # server. Check here to prevent silent failures.
18
+ unless [:driving, :walking, :bicycling, :transit].include?(mode.to_sym)
19
+ raise ArgumentError, "Invalid travel mode."
20
+ end
21
+ mode
22
+ end
23
+
24
+ # Validate route restriction. The valid value of route restriction are `tolls`, `highways` or `ferries`.
25
+ #
26
+ # @param [String, Symbol] avoid Route restriction to be validated.
27
+ #
28
+ # @raise ArgumentError The route restriction is invalid.
29
+ #
30
+ # @return [String] Valid route restriction.
31
+ def avoid(avoid)
32
+ unless [:tolls, :highways, :ferries].include?(avoid.to_sym)
33
+ raise ArgumentError, "Invalid route restriction."
34
+ end
35
+ avoid
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ module GoogleMapsService
2
+ # GoogleMapsService gem version
3
+ VERSION = "0.6.0"
4
+
5
+ # Current operating system
6
+ # @private
7
+ OS_VERSION = begin
8
+ if RUBY_PLATFORM.match?(/mswin|win32|mingw|bccwin|cygwin/)
9
+ `ver`.sub(/\s*\[Version\s*/, "/").sub("]", "").strip
10
+ elsif RUBY_PLATFORM.match?(/darwin/i)
11
+ "Mac OS X/#{`sw_vers -productVersion`}".strip
12
+ elsif RUBY_PLATFORM == "java"
13
+ require "java"
14
+ name = java.lang.System.getProperty("os.name")
15
+ version = java.lang.System.getProperty("os.version")
16
+ "#{name}/#{version}".strip
17
+ else
18
+ `uname -sr`.sub(" ", "/").strip
19
+ end
20
+ rescue
21
+ RUBY_PLATFORM
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ # Google Maps Web Service API.
2
+ module GoogleMapsService
3
+ class << self
4
+ # Global key.
5
+ # @see Client#key
6
+ # @return [String]
7
+ attr_accessor :key
8
+
9
+ # Global client_id.
10
+ # @see Client#client_id
11
+ # @return [String]
12
+ attr_accessor :client_id
13
+
14
+ # Global client_secret.
15
+ # @see Client#client_secret
16
+ # @return [String]
17
+ attr_accessor :client_secret
18
+
19
+ # Global retry_timeout.
20
+ # @see Client#retry_timeout
21
+ # @return [Integer]
22
+ attr_accessor :retry_timeout
23
+
24
+ # Global queries_per_second.
25
+ # @see Client#queries_per_second
26
+ # @return [Integer]
27
+ attr_accessor :queries_per_second
28
+
29
+ # Configure global parameters.
30
+ # @yield [config]
31
+ def configure
32
+ yield self
33
+ true
34
+ end
35
+ end
36
+
37
+ require "google_maps_service/version"
38
+ require "google_maps_service/client"
39
+ require "google_maps_service/polyline"
40
+ end
@@ -0,0 +1,3 @@
1
+ # Gem renamed from google_maps_service to google_maps_service_ruby.
2
+ # This file provides compatibility with bundler default require.
3
+ require_relative "google_maps_service"
metadata ADDED
@@ -0,0 +1,210 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: google_maps_service_ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ platform: ruby
6
+ authors:
7
+ - Lang Sharpe
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-10-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: multi_json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: retriable
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls_reborn
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.25.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.25.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '13.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '13.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: redcarpet
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 3.5.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.5.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.11'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.11'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.21'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.21'
111
+ - !ruby/object:Gem::Dependency
112
+ name: standard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.16'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.16'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 3.18.1
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 3.18.1
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.28
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.28
153
+ description: Google Maps API Client, including the Directions API, Distance Matrix
154
+ API and Geocoding API. google_maps_service_ruby is a fork of google_maps_service,
155
+ which is a fork of google-maps-services-python.
156
+ email:
157
+ - langer8191@gmail.com
158
+ executables: []
159
+ extensions: []
160
+ extra_rdoc_files: []
161
+ files:
162
+ - CHANGELOG.md
163
+ - CODE_OF_CONDUCT.md
164
+ - LICENSE
165
+ - README.md
166
+ - lib/google_maps_service.rb
167
+ - lib/google_maps_service/apis.rb
168
+ - lib/google_maps_service/apis/directions.rb
169
+ - lib/google_maps_service/apis/distance_matrix.rb
170
+ - lib/google_maps_service/apis/elevation.rb
171
+ - lib/google_maps_service/apis/geocoding.rb
172
+ - lib/google_maps_service/apis/roads.rb
173
+ - lib/google_maps_service/apis/time_zone.rb
174
+ - lib/google_maps_service/client.rb
175
+ - lib/google_maps_service/convert.rb
176
+ - lib/google_maps_service/errors.rb
177
+ - lib/google_maps_service/polyline.rb
178
+ - lib/google_maps_service/url.rb
179
+ - lib/google_maps_service/validator.rb
180
+ - lib/google_maps_service/version.rb
181
+ - lib/google_maps_service_ruby.rb
182
+ homepage: https://github.com/langsharpe/google-maps-services-ruby
183
+ licenses:
184
+ - Apache-2.0
185
+ metadata:
186
+ bug_tracker_uri: https://github.com/langsharpe/google-maps-services-ruby/issues
187
+ changelog_uri: https://raw.githubusercontent.com/langsharpe/google-maps-services-ruby/master/CHANGELOG.md
188
+ documentation_uri: https://www.rubydoc.info/gems/google_maps_service_ruby
189
+ homepage_uri: https://github.com/langsharpe/google-maps-services-ruby
190
+ source_code_uri: https://github.com/langsharpe/google-maps-services-ruby
191
+ post_install_message:
192
+ rdoc_options: []
193
+ require_paths:
194
+ - lib
195
+ required_ruby_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: 2.7.0
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ requirements: []
206
+ rubygems_version: 3.1.4
207
+ signing_key:
208
+ specification_version: 4
209
+ summary: Google Maps API Client
210
+ test_files: []