what3words 2.0.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +2 -2
- data/Gemfile +3 -1
- data/LICENSE.txt +1 -1
- data/README.md +175 -69
- data/Rakefile +9 -4
- data/lib/what3words/api.rb +160 -75
- data/lib/what3words/version.rb +4 -1
- data/lib/what3words.rb +4 -2
- data/spec/lib/what3words/what3words_api_spec.rb +248 -66
- data/spec/spec_helper.rb +5 -3
- data/what3words.gemspec +20 -16
- metadata +31 -12
@@ -1,115 +1,297 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require 'spec_helper'
|
4
4
|
|
5
|
-
|
5
|
+
# to run the test type on terminal --> bundle exec rspec
|
6
6
|
|
7
|
+
describe What3Words::API, 'integration', integration: true do
|
7
8
|
before(:all) do
|
8
9
|
WebMock.allow_net_connect!
|
9
10
|
end
|
10
11
|
|
11
|
-
let(:api_key) { ENV[
|
12
|
+
let(:api_key) { ENV['W3W_API_KEY'] }
|
13
|
+
let(:w3w) { described_class.new(key: api_key) }
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
expect { badw3w.forward ["prom", "cape", "pump"] }.
|
18
|
-
to raise_error described_class::ResponseError
|
15
|
+
it 'returns errors from API' do
|
16
|
+
badw3w = described_class.new(key: 'BADKEY')
|
17
|
+
expect { badw3w.convert_to_coordinates 'prom.cape.pump' }
|
18
|
+
.to raise_error described_class::ResponseError
|
19
19
|
end
|
20
20
|
|
21
|
-
describe
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
describe 'getting position' do
|
22
|
+
# @:param string words: A 3 word address as a string
|
23
|
+
# @:param string format: Return data format type; can be one of json (the default), geojson
|
24
|
+
it 'works with string of 3 words separated by \'.\'' do
|
25
|
+
result = w3w.convert_to_coordinates 'prom.cape.pump'
|
25
26
|
expect(result).to include(
|
26
|
-
:
|
27
|
-
:
|
27
|
+
words: 'prom.cape.pump',
|
28
|
+
language: 'en'
|
28
29
|
)
|
29
|
-
expect(result[:
|
30
|
-
:
|
31
|
-
:
|
30
|
+
expect(result[:coordinates]).to include(
|
31
|
+
lat: 51.484463,
|
32
|
+
lng: -0.195405
|
32
33
|
)
|
33
34
|
end
|
34
35
|
|
35
|
-
it
|
36
|
-
result = w3w.
|
36
|
+
it 'sends language parameter for 3 words' do
|
37
|
+
result = w3w.convert_to_coordinates 'prom.cape.pump'
|
37
38
|
expect(result).to include(
|
38
|
-
:
|
39
|
-
:
|
39
|
+
words: 'prom.cape.pump',
|
40
|
+
language: 'en'
|
40
41
|
)
|
41
42
|
end
|
42
43
|
|
43
|
-
it
|
44
|
-
expect { w3w.
|
45
|
-
to raise_error described_class::WordError
|
44
|
+
it 'checks 3 words format matches standard regex' do
|
45
|
+
expect { w3w.convert_to_coordinates '1.cape.pump' }
|
46
|
+
.to raise_error described_class::WordError
|
46
47
|
end
|
47
48
|
|
49
|
+
it 'sends json parameter for 3 words' do
|
50
|
+
result = w3w.convert_to_coordinates 'prom.cape.pump', format: 'json'
|
51
|
+
expect(result).to include(
|
52
|
+
words: 'prom.cape.pump',
|
53
|
+
language: 'en',
|
54
|
+
country: 'GB',
|
55
|
+
square: {
|
56
|
+
'southwest': {
|
57
|
+
'lng': -0.195426,
|
58
|
+
'lat': 51.484449
|
59
|
+
},
|
60
|
+
'northeast': {
|
61
|
+
'lng': -0.195383,
|
62
|
+
'lat': 51.484476
|
63
|
+
}
|
64
|
+
},
|
65
|
+
nearestPlace: 'Kensington, London',
|
66
|
+
coordinates: {
|
67
|
+
'lng': -0.195405,
|
68
|
+
'lat': 51.484463
|
69
|
+
},
|
70
|
+
map: 'https://w3w.co/prom.cape.pump'
|
71
|
+
)
|
72
|
+
end
|
48
73
|
end
|
49
74
|
|
50
|
-
describe
|
51
|
-
|
52
|
-
|
75
|
+
describe 'gets 3 words' do
|
76
|
+
# @:param coordinates: the coordinates of the location to convert to 3 word address
|
77
|
+
it 'from position' do
|
78
|
+
result = w3w.convert_to_3wa [29.567041, 106.587875], format: 'json'
|
53
79
|
expect(result).to include(
|
54
|
-
:
|
55
|
-
:
|
80
|
+
words: 'disclose.strain.redefined',
|
81
|
+
language: 'en'
|
82
|
+
)
|
83
|
+
expect(result[:coordinates]).to include(
|
84
|
+
lat: 29.567041,
|
85
|
+
lng: 106.587875
|
56
86
|
)
|
57
87
|
end
|
58
88
|
|
59
|
-
it
|
60
|
-
result = w3w.
|
89
|
+
it 'from position in fr' do
|
90
|
+
result = w3w.convert_to_3wa [29.567041, 106.587875], language: 'fr', format: 'json'
|
61
91
|
expect(result).to include(
|
62
|
-
:
|
63
|
-
:
|
92
|
+
words: 'courgette.rabotons.infrason',
|
93
|
+
language: 'fr'
|
64
94
|
)
|
65
95
|
end
|
66
|
-
|
67
96
|
end
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
97
|
+
|
98
|
+
describe 'autosuggest' do
|
99
|
+
it 'single input returns suggestions' do
|
100
|
+
# @:param string input: The full or partial 3 word address to obtain
|
101
|
+
# suggestions for. At minimum this must be the first two complete words
|
102
|
+
# plus at least one character from the third word.
|
103
|
+
result = w3w.autosuggest 'disclose.strain.redefin'
|
104
|
+
expect(result).not_to be_empty
|
72
105
|
end
|
73
106
|
|
74
|
-
it
|
75
|
-
#
|
76
|
-
|
107
|
+
it 'simple input will return 3 suggestions' do
|
108
|
+
# @:param string input: The full or partial 3 word address to obtain
|
109
|
+
# suggestions for. At minimum this must be the first two complete words
|
110
|
+
# plus at least one character from the third word.
|
111
|
+
result = w3w.autosuggest 'disclose.strain.redefin', language: 'en'
|
112
|
+
n_default_results = result[:suggestions].count
|
113
|
+
expect(n_default_results).to eq(3)
|
77
114
|
end
|
78
115
|
|
79
|
-
it
|
80
|
-
#
|
81
|
-
|
116
|
+
it 'sends language parameter to an input in a different language' do
|
117
|
+
# @:param string language: A supported 3 word address language as an
|
118
|
+
# ISO 639-1 2 letter code.
|
119
|
+
result = w3w.autosuggest 'trop.caler.perdre', language: 'fr'
|
120
|
+
language = result[:suggestions]
|
121
|
+
language.each do |item|
|
122
|
+
item.each do |k, v|
|
123
|
+
if k == 'language'
|
124
|
+
expect(v).to eq('fr')
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
82
128
|
end
|
83
129
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
# result =
|
88
|
-
w3w.standardblend "trop.caler.perdre", "fr"
|
130
|
+
it 'sends arabic language as a different input' do
|
131
|
+
result = w3w.autosuggest 'مربية.الصباح.المده', language: 'ar'
|
132
|
+
expect(result).not_to be_empty
|
89
133
|
end
|
90
134
|
|
91
|
-
it
|
92
|
-
#
|
93
|
-
|
135
|
+
it 'with n-results' do
|
136
|
+
# @:param int n_results: The number of AutoSuggest results to return.
|
137
|
+
# A maximum of 100 results can be specified, if a number greater than this is
|
138
|
+
# requested, this will be truncated to the maximum. The default is 3.
|
139
|
+
result = w3w.autosuggest 'disclose.strain.redefin', language: 'en', 'n-results': 10
|
140
|
+
# puts result[:suggestions].count
|
141
|
+
n_results = result[:suggestions].count
|
142
|
+
expect(n_results).to be >= 10
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'with n-focus-results' do
|
146
|
+
# @:param int n_focus_results: Specifies the number of results (must be <= n_results)
|
147
|
+
# within the results set which will have a focus. Defaults to
|
148
|
+
# n_results. This allows you to run autosuggest with a mix of
|
149
|
+
# focussed and unfocussed results, to give you a "blend" of the two.
|
150
|
+
result = w3w.autosuggest 'disclose.strain.redefin', language: 'en', 'n-focus-results': 3
|
151
|
+
# puts result[:suggestions].count
|
152
|
+
n_focus_results = result[:suggestions].count
|
153
|
+
expect(n_focus_results).to be >= 3
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'with input-type chenged to generic-voice' do
|
157
|
+
# @:param string input-type: For power users, used to specify voice input mode. Can be
|
158
|
+
# text (default), vocon-hybrid, nmdp-asr or generic-voice.
|
159
|
+
result = w3w.autosuggest 'fun with code', 'input-type': 'generic-voice', language: 'en'
|
160
|
+
suggestions = result[:suggestions]
|
161
|
+
output = ['fund.with.code', 'funk.with.code', 'fund.with.cove']
|
162
|
+
suggestions.each_with_index do |item, index|
|
163
|
+
# puts item[:words]
|
164
|
+
expect(item[:words]).to eq(output[index])
|
165
|
+
end
|
166
|
+
|
167
|
+
expect(result).not_to be_empty
|
168
|
+
end
|
169
|
+
|
170
|
+
xit 'with prefer-land' do
|
171
|
+
# @:param string prefer-land: Makes autosuggest prefer results on land to those in the sea.
|
172
|
+
# This setting is on by default. Use false to disable this setting and receive more suggestions in the sea.
|
173
|
+
result_sea = w3w.autosuggest 'disclose.strain.redefin', 'prefer-land': false, 'n-results': 10
|
174
|
+
result_sea_suggestions = result_sea[:suggestions]
|
175
|
+
|
176
|
+
result_land = w3w.autosuggest 'disclose.strain.redefin', 'prefer-land': true, 'n-results': 10
|
177
|
+
result_land_suggestions = result_land[:suggestions]
|
178
|
+
|
179
|
+
expect(result_sea_suggestions).not_to eq(result_land_suggestions)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'with clip_to_country' do
|
183
|
+
# @:param string clip-to-country: Restricts autosuggest to only return results inside the
|
184
|
+
# countries specified by comma-separated list of uppercase ISO 3166-1
|
185
|
+
# alpha-2 country codes (for example, to restrict to Belgium and the
|
186
|
+
# UK, use clip_to_country="GB,BE")
|
187
|
+
result = w3w.autosuggest 'disclose.strain.redefin', 'clip-to-country': 'GB,BE'
|
188
|
+
country = result[:suggestions]
|
189
|
+
country.each do |item|
|
190
|
+
item.each do |k, v|
|
191
|
+
if k == 'country'
|
192
|
+
if v == 'GB'
|
193
|
+
expect(v).to eq('GB')
|
194
|
+
else
|
195
|
+
expect(v).to eq('BE')
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'with clip-to-bounding-box' do
|
203
|
+
# @:param clip-to-bounding-box: Restrict autosuggest results to a bounding
|
204
|
+
# box, specified by coordinates.
|
205
|
+
result = w3w.autosuggest 'disclose.strain.redefin', 'clip-to-bounding-box': [51.521, -0.343, 52.6, 2.3324]
|
206
|
+
suggestions = result[:suggestions]
|
207
|
+
expect(suggestions).to include(
|
208
|
+
country: 'GB',
|
209
|
+
nearestPlace: 'Saxmundham, Suffolk',
|
210
|
+
words: 'discloses.strain.reddish',
|
211
|
+
rank: 1,
|
212
|
+
language: 'en'
|
213
|
+
)
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'with clip-to-bounding-box raise BadClipToBoundingBox error with 3 coordinates' do
|
217
|
+
# @:param clip-to-bounding-box: Restrict autosuggest results to a bounding
|
218
|
+
# box, specified by coordinates.
|
219
|
+
expect { w3w.autosuggest 'disclose.strain.redefin', 'clip-to-bounding-box': [51.521, -0.343, 52.6] }
|
220
|
+
.to raise_error described_class::ResponseError
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'with clip-to-bounding-box raise 2nd BadClipToBoundingBox error' do
|
224
|
+
# @:param clip-to-bounding-box: Restrictautosuggest results to a bounding
|
225
|
+
# box, specified by coordinates.
|
226
|
+
expect { w3w.autosuggest 'disclose.strain.redefin', 'clip-to-bounding-box': [51.521, -0.343, 55.521, -5.343] }
|
227
|
+
.to raise_error described_class::ResponseError
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'with clip-to-circle' do
|
231
|
+
# @:param clip-to-circle: Restrict autosuggest results to a circle, specified by
|
232
|
+
# the center of the circle, latitude and longitude, and a distance in
|
233
|
+
# kilometres which represents the radius. For convenience, longitude
|
234
|
+
# is allowed to wrap around 180 degrees. For example 181 is equivalent
|
235
|
+
# to -179.
|
236
|
+
result = w3w.autosuggest 'disclose.strain.redefin', 'clip-to-circle': [51.521, -0.343, 142]
|
237
|
+
suggestions = result[:suggestions]
|
238
|
+
expect(suggestions).to include(
|
239
|
+
country: 'GB',
|
240
|
+
nearestPlace: 'Market Harborough, Leicestershire',
|
241
|
+
words: 'discloses.strain.reduce',
|
242
|
+
rank: 1,
|
243
|
+
language: 'en'
|
244
|
+
)
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'with clip-to-polygon' do
|
248
|
+
# @:param clip-to-polygon: Restrict autosuggest results to a polygon,
|
249
|
+
# specified by a list of coordinates. The polygon
|
250
|
+
# should be closed, i.e. the first element should be repeated as the
|
251
|
+
# last element; also the list should contain at least 4 entries.
|
252
|
+
# The API is currently limited to accepting up to 25 pairs.
|
253
|
+
result = w3w.autosuggest 'disclose.strain.redefin', 'clip-to-polygon': [51.521, -0.343, 52.6, 2.3324, 54.234, 8.343, 51.521, -0.343]
|
254
|
+
suggestions = result[:suggestions]
|
255
|
+
expect(suggestions).to include(
|
256
|
+
country: 'GB',
|
257
|
+
nearestPlace: 'Saxmundham, Suffolk',
|
258
|
+
words: 'discloses.strain.reddish',
|
259
|
+
rank: 1,
|
260
|
+
language: 'en'
|
261
|
+
)
|
94
262
|
end
|
95
263
|
end
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
264
|
+
|
265
|
+
describe 'grid_section' do
|
266
|
+
# @:param bounding-box: Bounding box, specified by the northeast and
|
267
|
+
# southwest corner coordinates, for which the grid
|
268
|
+
# should be returned.
|
269
|
+
it 'string input not empty' do
|
270
|
+
result = w3w.grid_section '52.208867,0.117540,52.207988,0.116126'
|
271
|
+
expect(result).not_to be_empty
|
272
|
+
end
|
273
|
+
it 'bad bounding box error if the bbox is greater 4km' do
|
274
|
+
expect { w3w.grid_section '50.0,178,50.01,180.0005' }
|
275
|
+
.to raise_error described_class::ResponseError
|
100
276
|
end
|
101
277
|
end
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
w3w.
|
278
|
+
|
279
|
+
describe 'available_languages' do
|
280
|
+
it 'gets all available languages' do
|
281
|
+
result = w3w.available_languages
|
282
|
+
all_languages = result[:languages].count
|
283
|
+
expect(all_languages).to be >= 51
|
284
|
+
end
|
285
|
+
it 'it does not return an empty list' do
|
286
|
+
result = w3w.available_languages
|
287
|
+
expect(result).not_to be_empty
|
106
288
|
end
|
107
289
|
end
|
108
290
|
|
109
|
-
describe
|
110
|
-
it
|
111
|
-
expect(w3w.deep_symbolize_keys(
|
112
|
-
to eq(:
|
291
|
+
describe 'technical' do
|
292
|
+
it '\'s deep_symbolize_keys helper works' do
|
293
|
+
expect(w3w.deep_symbolize_keys('foo' => { 'bar' => true }))
|
294
|
+
.to eq(foo: { bar: true })
|
113
295
|
end
|
114
296
|
end
|
115
297
|
end
|
data/spec/spec_helper.rb
CHANGED
data/what3words.gemspec
CHANGED
@@ -1,27 +1,31 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path('
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require 'what3words/version'
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name
|
9
|
-
spec.version
|
10
|
-
spec.authors
|
11
|
-
spec.email
|
12
|
-
spec.
|
13
|
-
spec.
|
14
|
-
spec.
|
8
|
+
spec.name = 'what3words'
|
9
|
+
spec.version = What3Words::VERSION
|
10
|
+
spec.authors = ['what3words']
|
11
|
+
spec.email = ['development@what3words.com']
|
12
|
+
spec.description = 'A Ruby wrapper fo the what3words API'
|
13
|
+
spec.summary = 'Ruby wrapper for the what3words API'
|
14
|
+
spec.homepage = 'http://rubygems.org/gems/what3words'
|
15
|
+
spec.license = 'MIT'
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0")
|
17
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
19
|
spec.test_files = spec.files.grep(%r{^spec/})
|
19
|
-
spec.require_paths = [
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
spec.platform = Gem::Platform::RUBY
|
22
|
+
spec.required_ruby_version = '~> 2.6'
|
20
23
|
|
21
|
-
spec.add_dependency
|
24
|
+
spec.add_dependency('rest-client', '>= 1.8', '< 3.0')
|
22
25
|
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
26
|
+
spec.add_development_dependency 'bundler', '>= 1.7.9'
|
27
|
+
spec.add_development_dependency 'rake', '~> 11.1'
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.4'
|
29
|
+
spec.add_development_dependency 'rubocop', '~> 0.48.1'
|
30
|
+
spec.add_development_dependency 'webmock', '~> 3.0'
|
27
31
|
end
|
metadata
CHANGED
@@ -1,29 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: what3words
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- what3words
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.8'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '1.8'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.0'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: bundler
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,21 +72,35 @@ dependencies:
|
|
66
72
|
- - "~>"
|
67
73
|
- !ruby/object:Gem::Version
|
68
74
|
version: '3.4'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rubocop
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 0.48.1
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 0.48.1
|
69
89
|
- !ruby/object:Gem::Dependency
|
70
90
|
name: webmock
|
71
91
|
requirement: !ruby/object:Gem::Requirement
|
72
92
|
requirements:
|
73
93
|
- - "~>"
|
74
94
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
95
|
+
version: '3.0'
|
76
96
|
type: :development
|
77
97
|
prerelease: false
|
78
98
|
version_requirements: !ruby/object:Gem::Requirement
|
79
99
|
requirements:
|
80
100
|
- - "~>"
|
81
101
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
83
|
-
description:
|
102
|
+
version: '3.0'
|
103
|
+
description: A Ruby wrapper fo the what3words API
|
84
104
|
email:
|
85
105
|
- development@what3words.com
|
86
106
|
executables: []
|
@@ -111,20 +131,19 @@ require_paths:
|
|
111
131
|
- lib
|
112
132
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
133
|
requirements:
|
114
|
-
- - "
|
134
|
+
- - "~>"
|
115
135
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
136
|
+
version: '2.6'
|
117
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
138
|
requirements:
|
119
139
|
- - ">="
|
120
140
|
- !ruby/object:Gem::Version
|
121
141
|
version: '0'
|
122
142
|
requirements: []
|
123
|
-
|
124
|
-
rubygems_version: 2.6.10
|
143
|
+
rubygems_version: 3.0.3
|
125
144
|
signing_key:
|
126
145
|
specification_version: 4
|
127
|
-
summary:
|
146
|
+
summary: Ruby wrapper for the what3words API
|
128
147
|
test_files:
|
129
148
|
- spec/config.sample.yaml
|
130
149
|
- spec/lib/what3words/what3words_api_spec.rb
|