what3words 1.0.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 601e19657a0d9c09dc4af619041bf3ed0d87669b
4
- data.tar.gz: 2df177b0de101ba2928888306db815bcaaa8e9c0
3
+ metadata.gz: 071822e06272c4806cc6493be469b6bf4e03224f
4
+ data.tar.gz: 73bd8cb619a5afc0828b1dd2eec47cf29c031f71
5
5
  SHA512:
6
- metadata.gz: ed00c76a40d5b5675f6caacef0ccd3271d55dd462c1204e0f368c0fc5c1aa8834d99f476656f8cfc6522839ca4dd73184bb33635f5ea6284cc10f4fe80f2a127
7
- data.tar.gz: 4f4b1ca2734b3a50332bc359ba4ae2586a45f6b77a48db52c8164c736e77b87cd6cf1ba82711f6d030e3a4ee71f11bf5dfb7580d768680f36e145c8fda07c52a
6
+ metadata.gz: 2fb0661e08c8e627deb26db2653b881dd5214eb5102b613ba7545ca2c45a45d150516c5e2f772182c5c5c85cf06362b7633713ca7402bcf586359d1abef9ae17
7
+ data.tar.gz: d5b964fdc28f5080ea62e421d4eaec85d4fd5c367cacb6ad1b30f2155ed379cea4a7ef5633fa83048fadf1d76da5169a8c3bad2b48f54e34940a60dad00ce334
data/.editorconfig ADDED
@@ -0,0 +1,16 @@
1
+ # EditorConfig is awesome: http://EditorConfig.org
2
+
3
+ # top-most EditorConfig file
4
+ root = true
5
+
6
+ # Unix-style newlines with a newline ending every file
7
+ [*]
8
+ end_of_line = lf
9
+ insert_final_newline = true
10
+
11
+ # Set default charset
12
+ charset = utf-8
13
+
14
+ # Indentation
15
+ indent_style = space
16
+ indent_size = 2
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 What3Words Limited
1
+ Copyright (c) 2016 What3Words Limited
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,11 +1,12 @@
1
- # What3Words
1
+ # ![what3words](https://map.what3words.com/images/map/marker-border.png)what3words Ruby wrapper
2
2
 
3
- Use the What3Words API in your Ruby app (see http://what3words.com/api/reference)
3
+ Use the what3words API in your Ruby app (see http://developer.what3words.com/api)
4
4
 
5
5
  ## Installation
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
+ gem 'what3words', '~> 2.0'
9
10
 
10
11
  And then execute:
11
12
 
@@ -17,9 +18,9 @@ Or install it yourself as:
17
18
 
18
19
  ## Usage
19
20
 
20
- Sign up for an API key at http://what3words.com/api/signup
21
+ Sign up for an API key at http://developer.what3words.com
21
22
 
22
- See http://what3words.com/api/reference for all parameters that can be
23
+ See https://docs.what3words.com/api/v2/ for all parameters that can be
23
24
  passed to the API calls
24
25
 
25
26
  If not using Bundler, require it:
@@ -28,64 +29,76 @@ If not using Bundler, require it:
28
29
 
29
30
  Then:
30
31
 
31
- what3words = What3Words::API.new(:key => "<your-api-key>")
32
+ what3words = What3Words::API.new(:key => "YOURAPIKEY")
32
33
 
33
- Convert 3 words into GPS coordinates
34
+ Forward Geocode : convert a 3 word address into GPS coordinates (WGS-84)
34
35
 
35
- what3words.words_to_position ["prom", "cape", "pump"]
36
- # => [51.484463, -0.195405]
36
+ what3words.forward "prom.cape.pump"
37
+ # => {:crs=>{:properties=>{:type=>"ogcwkt", :href=>"http://spatialreference.org/ref/epsg/4326/ogcwkt/"}, :type=>"link"}, :bounds=>{:southwest=>{:lng=>-0.195426, :lat=>51.484449}, :northeast=>{:lng=>-0.195383, :lat=>51.484476}}, :words=>"prom.cape.pump", :map=>"http://w3w.co/prom.cape.pump", :language=>"en", :geometry=>{:lng=>-0.195405, :lat=>51.484463}, :status=>{:status=>200, :reason=>"OK"}, :thanks=>"Thanks from all of us at index.home.raft for using a what3words API"}
37
38
 
38
- Convert OneWord to GPS coordinates
39
+ ## API
40
+ ### Forward Geocoding
41
+ Convert a 3 word address into GPS coordinates and return 3 words for the same position in a different language
39
42
 
40
- what3words.words_to_position "LibertyTech"
41
- # => [51.512573,-0.144879]
43
+ what3words.forward "prom.cape.pump", :lang => "fr"
44
+ # => {:crs=>{:properties=>{:type=>"ogcwkt", :href=>"http://spatialreference.org/ref/epsg/4326/ogcwkt/"}, :type=>"link"}, :bounds=>{:southwest=>{:lng=>-0.195426, :lat=>51.484449}, :northeast=>{:lng=>-0.195383, :lat=>51.484476}}, :words=>"concevoir.époque.amasser", :map=>"http://w3w.co/concevoir.époque.amasser", :language=>"fr", :geometry=>{:lng=>-0.195405, :lat=>51.484463}, :status=>{:status=>200, :reason=>"OK"}, :thanks=>"Thanks from all of us at index.home.raft for using a what3words API"}
42
45
 
43
- Convert 3 words into GPS coordinates and return 3 words for the same position in a different language
46
+ Supported keyword params for `forward` call:
44
47
 
45
- what3words.words_to_position ["prom", "cape", "pump"], :full_response => true, :lang => "fr"
46
- # => { :type => "3 words", :words => ["concevoir", "époque", "amasser"],
47
- :position => [51.484463, -0.195405], :language: "fr" }
48
+ * `lang` (defaults to language of 3 words) - optional language code (only use this if you want to return 3 words in a different language to the language submitted)
49
+ * `format` Return data format type; can be one of json (the default), geojson or xml
50
+ * `display` Return display type; can be one of full (the default) or terse
48
51
 
49
- Supported keyword params for `words_to_position` call:
52
+ ### Reverse Geocoding
53
+ Reverse Geocode : Convert position(latitude) information to a 3 word address
50
54
 
51
- * `full_response` (default false) - return the original response from the API
52
- * `language` (defaults to language of 3 words) - optional language code (only use this if you want to return 3 words in a different language to the language submitted)
53
- * `oneword_password` (default nil) - password for OneWord, if private
54
- * `corners` (default false) - "true" or "false" to return the coordinates of the w3w square. Will return an array with the southwest coordinates of the square and then the northeast coordinate
55
- * `email` (default nil) - user email if required for private OneWord
56
- * `password` (default nil) - user password if required for private OneWord
55
+ what3words.reverse [51.484463, -0.195405]
56
+ # => {:crs=>{:properties=>{:type=>"ogcwkt", :href=>"http://spatialreference.org/ref/epsg/4326/ogcwkt/"}, :type=>"link"}, :bounds=>{:southwest=>{:lng=>-0.195426, :lat=>51.484449}, :northeast=>{:lng=>-0.195383, :lat=>51.484476}}, :words=>"prom.cape.pump", :map=>"http://w3w.co/prom.cape.pump", :language=>"en", :geometry=>{:lng=>-0.195405, :lat=>51.484463}, :status=>{:status=>200, :reason=>"OK"}, :thanks=>"Thanks from all of us at index.home.raft for using a what3words API"}
57
57
 
58
- Convert position information to 3 words
58
+ Convert position information to a 3 word address in a specific language
59
59
 
60
- what3words.position_to_words [51.484463, -0.195405]
61
- # => ["prom", "cape", "pump"]
60
+ what3words.reverse [51.484463, -0.195405], :lang => :fr
61
+ # => {:crs=>{:properties=>{:type=>"ogcwkt", :href=>"http://spatialreference.org/ref/epsg/4326/ogcwkt/"}, :type=>"link"}, :bounds=>{:southwest=>{:lng=>-0.195426, :lat=>51.484449}, :northeast=>{:lng=>-0.195383, :lat=>51.484476}}, :words=>"concevoir.époque.amasser", :map=>"http://w3w.co/concevoir.époque.amasser", :language=>"fr", :geometry=>{:lng=>-0.195405, :lat=>51.484463}, :status=>{:status=>200, :reason=>"OK"}, :thanks=>"Thanks from all of us at index.home.raft for using a what3words API"}
62
62
 
63
- Convert position information to 3 words in a different language
63
+ Supported keyword params for `reverse` call:
64
64
 
65
- what3words.position_to_words [51.484463, -0.195405], :lang => :fr
66
- # => ["concevoir", "époque", "amasser"]
65
+ * `lang` (defaults to en) - optional language code
66
+ * `format` Return data format type; can be one of json (the default), geojson or xml
67
+ * `display` Return display type; can be one of full (the default) or terse
67
68
 
68
- Supported keyword params for `position_to_words` call:
69
+ ### Autosuggest
70
+ Returns a list of 3 word addresses based on user input and other parameters.
69
71
 
70
- * `full_response` (default false) - return the original response from the API
71
- * `language` (defaults to en) - optional language code
72
- * `corners` (default false) - "true" or "false" to return the coordinates of the w3w square. Will return an array with the southwest coordinates of the square and then the northeast coordinate
72
+ This resource provides corrections for the following types of input error:
73
+ - typing errors
74
+ - spelling errors
75
+ - misremembered words (e.g. singular vs. plural)
76
+ - words in the wrong order
73
77
 
74
- Get list of available 3 word languages
78
+ The autosuggest resource determines possible corrections to the supplied 3 word address string based on the probability of the input errors listed above and returns a ranked list of suggestions. This resource can also take into consideration the geographic proximity of possible corrections to a given location to further improve the suggestions returned.
75
79
 
76
- what3words.languages
77
- # => [ "en", "fr" ]
80
+ see https://docs.what3words.com/api/v2/#autosuggest for detailed information
81
+
82
+ Gets suggestions in italian for this address
83
+
84
+ what3words.autosuggest "trovò.calore.perder", "it"
85
+ # => {:suggestions=>[{:score=>12, :country=>"ma", :words=>"trovò.calore.perdere", :rank=>1, :geometry=>{:lng=>-6.665638, :lat=>34.318065}, :place=>"Kenitra, Gharb-Chrarda-Beni Hssen"}, {:score=>12, :country=>"ca", :words=>"trovò.calore.perderò", :rank=>2, :geometry=>{:lng=>-65.036149, :lat=>45.846472}, :place=>"Salisbury, New Brunswick"}, {:score=>17, :country=>"ve", :words=>"trovò.calore.prede", :rank=>3, :geometry=>{:lng=>-70.280645, :lat=>7.24527}, :place=>"Guasdualito, Apure"}], :status=>{:status=>200, :reason=>"OK"}, :thanks=>"Thanks from all of us at index.home.raft for using a what3words API"}
78
86
 
79
- The `get_languages` call also returns the full response from the API
87
+ Supported keyword params for `reverse` call:
88
+ * `format` Return data format type; can be one of json (the default), geojson or xml
89
+ * `display` Return display type; can be one of full (the default) or terse
80
90
 
81
- what3words.languages :full_response => true
82
- # => {:languages=>[{:code=>"de", :name_display=>"Deutsch"}, {:code=>"en", :name_display=>"English"}, ... ]}
91
+ ### Get Languages
92
+ Get list of available 3 word languages
93
+
94
+ what3words.languages
95
+ # => {:languages=>[{:name=>"German", :native_name=>"Deutsch (beta)", :code=>"de"}, {:name=>"Italian", :native_name=>"Italiano (beta)", :code=>"it"}, {:name=>"Turkish", :native_name=>"Türkçe (beta)", :code=>"tr"}, {:name=>"Portuguese", :native_name=>"Português (beta)", :code=>"pt"}, {:name=>"French", :native_name=>"français, langue française (beta)", :code=>"fr"}, {:name=>"Swedish", :native_name=>"svenska (beta)", :code=>"sv"}, {:name=>"English", :native_name=>"English", :code=>"en"}, {:name=>"Russian", :native_name=>"русский язык (beta)", :code=>"ru"}, {:name=>"Spanish; Castilian", :native_name=>"español, castellano (beta)", :code=>"es"}, {:name=>"Swahili", :native_name=>"Kiswahili (beta)", :code=>"sw"}], :status=>{:status=>200, :reason=>"OK"}, :thanks=>"Thanks from all of us at index.home.raft for using a what3words API"}
83
96
 
84
- See http://what3words.com/api/reference for the original API call documentation
97
+ See http://developer.what3words.com for the original API call documentation
85
98
 
86
99
  ## Contributing
87
100
 
88
- 1. Fork it ( http://github.com/<my-github-username>/what3words and click "Fork" )
101
+ 1. Fork it ( http://github.com/what3words/w3w-ruby-wrapper and click "Fork" )
89
102
  2. Create your feature branch (`git checkout -b my-new-feature`)
90
103
  3. Commit your changes (`git commit -am 'Add some feature'`)
91
104
  4. Push to the branch (`git push origin my-new-feature`)
@@ -93,5 +106,11 @@ See http://what3words.com/api/reference for the original API call documentation
93
106
 
94
107
  ### Testing
95
108
 
96
- 1. Unit specs require no set up. Look in `spec/what3words`
97
- 2. Integration specs that hit the API directly are in spec/integration, and need the file spec/config.yaml to be filled in (using spec/config.sample.yaml as a template) with valid details. It is only needed for testing private OneWord functionality
109
+ Prerequisite : we are using [bundler](https://rubygems.org/gems/bundler)
110
+ `$ gem install bundler`
111
+
112
+ 1. `$ cd w3w-ruby-wrapper`
113
+ 1. `$ bundle update`
114
+ 1. `$ rake spec`
115
+ 1. Mock Unit specs require no set up. Look in `spec/mock/`
116
+ 1. Integration specs that hit the API directly are in `spec/what3words`, and need the file `spec/config.yaml` to be filled in (using `spec/config.sample.yaml` as a template) with valid details.
@@ -9,13 +9,16 @@ module What3Words
9
9
  class ResponseError < Error; end
10
10
  class WordError < Error; end
11
11
 
12
- REGEX_3_WORDS = /^\p{L}+\.\p{L}+\.\p{L}+$/u
13
- REGEX_ONE_WORD = /^\*[\p{L}\-0-9]{6,31}$/u
12
+ REGEX_3_WORD_ADDRESS = /^\p{L}+\.\p{L}+\.\p{L}+$/u
13
+ REGEX_STRICT = /^\p{L}{4,}+\.\p{L}{4,}+\.\p{L}{4,}+$/u
14
+
15
+ BASE_URL = "https://api.what3words.com/v2/"
14
16
 
15
17
  ENDPOINTS = {
16
- :words_to_position => "w3w",
17
- :position_to_words => "position",
18
- :languages => "get-languages"
18
+ :forward => "forward",
19
+ :reverse => "reverse",
20
+ :languages => "languages",
21
+ :autosuggest => "autosuggest"
19
22
  }
20
23
 
21
24
  def initialize(params)
@@ -24,67 +27,76 @@ module What3Words
24
27
 
25
28
  attr_reader :key
26
29
 
27
- def words_to_position(words, params = {})
30
+ def forward(words, params = {})
28
31
  words_string = get_words_string words
29
- request_params = assemble_w2p_request_params(words_string, params)
30
- needs_ssl = needs_ssl?(request_params)
31
- response = request! :words_to_position, request_params, needs_ssl
32
- make_response(response, :position, params[:full_response])
32
+ request_params = assemble_forward_request_params(words_string, params)
33
+ response = request! :forward, request_params
34
+ response
33
35
  end
34
36
 
35
- def position_to_words(position, params = {})
36
- request_params = assemble_p2w_request_params(position, params)
37
- response = request! :position_to_words, request_params
38
- make_response(response, :words, params[:full_response])
37
+ def reverse(position, params = {})
38
+ request_params = assemble_reverse_request_params(position, params)
39
+ response = request! :reverse, request_params
40
+ response
39
41
  end
40
42
 
41
- def languages(params = {})
42
- request_params = assemble_common_request_params(params)
43
+ def languages()
44
+ request_params = assemble_common_request_params({})
43
45
  response = request! :languages, request_params
44
- if params[:full_response]
45
- response
46
- else
47
- response[:languages].map {|i| i[:code]}
48
- end
46
+ response
47
+ end
48
+
49
+ def autosuggest(addr, lang, focus = {}, clip = {}, params = {})
50
+ request_params = assemble_autosuggest_request_params(addr, lang, focus, clip, params)
51
+ response = request! :autosuggest, request_params
52
+ response
49
53
  end
50
54
 
51
55
  def assemble_common_request_params(params)
52
56
  h = {:key => key}
53
- h[:lang] = params[:language] if params[:language]
54
- h[:corners] = true if params[:corners]
57
+ h[:lang] = params[:lang] if params[:lang]
58
+ h[:format] = params[:format] if params[:format]
59
+ h[:display] = params[:format] if params[:format]
55
60
  h
56
61
  end
57
62
  private :assemble_common_request_params
58
63
 
59
- def assemble_w2p_request_params(words_string, params)
60
- h = {:string => words_string}
61
- h[:"oneword-password"] = params[:oneword_password] if params[:oneword_password]
62
- h[:email] = params[:email] if params[:email]
63
- h[:password] = params[:password] if params[:password]
64
+ def assemble_forward_request_params(words_string, params)
65
+ h = {:addr => words_string}
64
66
  h.merge(assemble_common_request_params(params))
65
67
  end
66
- private :assemble_w2p_request_params
68
+ private :assemble_forward_request_params
67
69
 
68
- def assemble_p2w_request_params(position, params)
69
- h = {:position => position.join(",")}
70
+ def assemble_reverse_request_params(position, params)
71
+ h = {:coords => position.join(",")}
70
72
  h.merge(assemble_common_request_params(params))
71
73
  end
72
- private :assemble_p2w_request_params
74
+ private :assemble_reverse_request_params
73
75
 
74
- def make_response(response, part_response_key, need_full_response)
75
- if need_full_response
76
- response
77
- else
78
- response[part_response_key]
76
+ def assemble_autosuggest_request_params(addr, lang, focus, clip, params)
77
+ h = {:addr => addr}
78
+ h[:lang] = lang
79
+ if focus.respond_to? :join
80
+ h[:focus] = focus.join(",")
79
81
  end
82
+ h[:clip] = clip if clip.respond_to? :to_str
83
+ h.merge(assemble_common_request_params(params))
80
84
  end
81
- private :make_response
82
-
83
- def request!(endpoint_name, params, needs_ssl = false)
84
- response = RestClient.post endpoint(endpoint_name, needs_ssl), params
85
+ private :assemble_autosuggest_request_params
86
+
87
+ def request!(endpoint_name, params)
88
+ # puts endpoint_name.inspect
89
+ # puts params.inspect
90
+ begin
91
+ response = RestClient.get endpoint(endpoint_name), params: params
92
+ rescue => e
93
+ response = e.response
94
+ end
95
+ # puts "#{response.to_str}"
96
+ # puts "Response status: #{response.code}"
85
97
  response = JSON.parse(response.body)
86
- if response["error"].to_s.strip != ""
87
- raise ResponseError, "#{response["error"]}: #{response["message"]}"
98
+ if response["code"].to_s.strip != ""
99
+ raise ResponseError, "#{response["code"]}: #{response["message"]}"
88
100
  end
89
101
  deep_symbolize_keys(response)
90
102
  end
@@ -103,8 +115,8 @@ module What3Words
103
115
  private :get_words_string
104
116
 
105
117
  def check_words(words)
106
- unless REGEX_3_WORDS.match(words) or REGEX_ONE_WORD.match(words)
107
- raise WordError, "#{words} is not valid 3 words or OneWord"
118
+ unless REGEX_3_WORD_ADDRESS.match(words)
119
+ raise WordError, "#{words} is not a valid 3 word address"
108
120
  end
109
121
  return words
110
122
  end
@@ -123,21 +135,14 @@ module What3Words
123
135
  ni
124
136
  end
125
137
 
126
- def base_url(needs_ssl = false)
127
- protocol = needs_ssl ? "https" : "http"
128
- "#{protocol}://api.what3words.com/"
138
+ def base_url()
139
+ BASE_URL
129
140
  end
130
141
  private :base_url
131
142
 
132
- def endpoint(name, needs_ssl)
133
- return base_url(needs_ssl) + ENDPOINTS.fetch(name)
134
- end
135
-
136
- def needs_ssl?(params)
137
- (params.has_key?(:email) and params.has_key?(:password)) or
138
- params.has_key?(:"oneword-password")
143
+ def endpoint(name)
144
+ return base_url() + ENDPOINTS.fetch(name)
139
145
  end
140
- private :needs_ssl?
141
146
 
142
147
  end
143
148
  end
@@ -1,3 +1,3 @@
1
1
  module What3Words
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -1,4 +1,2 @@
1
1
  ---
2
2
  api_key: APIKEY
3
- private_one_word: "*PRIVATEWORD"
4
- private_one_word_password: PASSWORD
@@ -0,0 +1,106 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+ require "yaml"
5
+
6
+ describe What3Words::API, "integration", :integration => true do
7
+
8
+ before(:all) do
9
+ WebMock.allow_net_connect!
10
+ end
11
+
12
+ let!(:config) do
13
+ file = "spec/config.yaml"
14
+ if ! File.exist? file
15
+ raise "Add a file #{file} (use spec/config.sample.yaml as a template) with correct values to run integration specs"
16
+ end
17
+ YAML.load_file file
18
+ end
19
+
20
+ let(:api_key) { config["api_key"] }
21
+
22
+ let(:w3w) { described_class.new(:key => api_key) }
23
+
24
+ it "returns errors from API" do
25
+ badw3w = described_class.new(:key => "")
26
+ expect { badw3w.forward ["prom", "cape", "pump"] }.
27
+ to raise_error described_class::ResponseError
28
+ end
29
+
30
+ describe "getting position" do
31
+
32
+ it "works with string of 3 words separated by '.'" do
33
+ result = w3w.forward "prom.cape.pump"
34
+ expect(result).to include(
35
+ :words => "prom.cape.pump",
36
+ :language => "en"
37
+ )
38
+ expect(result[:geometry]).to include(
39
+ :lat => "51.484463",
40
+ :lng => "-0.195405"
41
+ )
42
+ end
43
+
44
+ it "sends lang parameter for 3 words" do
45
+ result = w3w.forward ["prom", "cape", "pump"], :lang => "fr"
46
+ expect(result).to include(
47
+ :words => "concevoir.époque.amasser",
48
+ :language => "fr"
49
+ )
50
+ end
51
+
52
+ it "checks 3 words format matches standard regex" do
53
+ expect { w3w.forward "1.cape.pump" }.
54
+ to raise_error described_class::WordError
55
+ end
56
+
57
+ end
58
+
59
+ describe "gets 3 words" do
60
+ it "from position" do
61
+ result = w3w.reverse [29.567041, 106.587875]
62
+ expect(result).to include(
63
+ :words => "disclose.strain.redefined",
64
+ :language => "en"
65
+ )
66
+ end
67
+
68
+ it "from position in fr" do
69
+ result = w3w.reverse [29.567041, 106.587875], :lang => "fr"
70
+ expect(result).to include(
71
+ :words => "courgette.spécieuse.infrason",
72
+ :language => "fr"
73
+ )
74
+ end
75
+
76
+ end
77
+ describe "autosuggest" do
78
+ it "simple addr" do
79
+ result = w3w.autosuggest "trop.caler.perdre", "fr"
80
+ end
81
+
82
+ it "with focus" do
83
+ result = w3w.autosuggest "disclose.strain.redefin", "en", [29.567041, 106.587875]
84
+ end
85
+
86
+ it "with clipping radius around focus" do
87
+ result = w3w.autosuggest "disclose.strain.redefin", "en", [29.567041, 106.587875], "focus(10)"
88
+ end
89
+
90
+ end
91
+ describe "languages" do
92
+ it "gets all languages" do
93
+ result = w3w.languages
94
+ # expect(result[:languages]).to include(
95
+ # :code => "fr"
96
+ # )
97
+ end
98
+ end
99
+
100
+ describe "technical" do
101
+ it "'s deep_symbolize_keys helper works" do
102
+ expect(w3w.deep_symbolize_keys("foo" => {"bar" => true})).
103
+ to eq(:foo => {:bar => true})
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,120 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe What3Words::API do
6
+
7
+ before(:all) do
8
+ WebMock.disable_net_connect!
9
+ end
10
+
11
+ let(:api_key) { "APIkey" }
12
+
13
+ let(:w3w) { described_class.new(:key => api_key) }
14
+
15
+ # it "returns errors from API" do
16
+ # stub_request(:get, "https://api.what3words.com/v2/forward").
17
+ # to_return(:status => 200, :body => '{"code": "300", "message": "Invalid or non-existent 3 word address"}')
18
+ #
19
+ # expect { w3w.forward "a.b.c" }.
20
+ # to raise_error described_class::ResponseError
21
+ # end
22
+
23
+ describe "getting position" do
24
+
25
+ # def stub!(query_params, response_body = {})
26
+ # stub_request(:get, "https://api.what3words.com/v2/forward").
27
+ # with(:query => query_params).
28
+ # to_return(:status => 200, :body => response_body.to_json)
29
+ # end
30
+
31
+ # it "sends 3 words given as string" do
32
+ # # stub_request(:get, "https://api.what3words.com/v2/forward?addr=a.b.c&key=APIkey").
33
+ # # with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>'Ruby'}).
34
+ # # to_return(:status => 200, :body => '{"words" :"a.b.c"}', :headers => {})
35
+ # stub_request(:get, "https://api.what3words.com/v2/forward" ).
36
+ # # with(query: hash_including({"addr" => "a.b.c"}, {"key" => :api_key})).
37
+ # with(query: hash_including(:add => "abc", :key => :api_key)).
38
+ # to_return(:status => 200, :body => '{"words" :"a.b.c"}')
39
+ # # stub! hash_including(:addr => "a.b.c")
40
+ # result = w3w.forward "a.b.c"
41
+ # puts result
42
+ # end
43
+
44
+ # it "extracts position from response" do
45
+ # stub!(hash_including(:addr => "prom.cape.pump"), {"position" => [1, 2]})
46
+ # result = w3w.forward "prom.cape.pump"
47
+ # expect(result).to eq [1, 2]
48
+ # end
49
+
50
+ # it "returns full response instead of just coords" do
51
+ # stub!(hash_including(:addr => "prom.cape.pump"),
52
+ # {"thanks" => "Thanks from all of us at index.home.raft for using a what3words API"})
53
+ # result = w3w.forward "prom.cape.pump", :full_response => true
54
+ # expect(result).to eq :thanks => "Thanks from all of us at index.home.raft for using a what3words API"
55
+ # end
56
+
57
+ # it "sends lang option" do
58
+ # stub!(hash_including(:addr => "prom.cape.pump", :lang => "fr"))
59
+ # w3w.forward "prom.cape.pump", :language => "fr"
60
+ # end
61
+
62
+ # it "parses response errors" do
63
+ # stub! hash_including(:addr => "prom.cape.pump"), {:error => "xx", :message => "msg"}
64
+ # expect { w3w.forward "prom.cape.pump" }.
65
+ # to raise_error described_class::ResponseError, "xx: msg"
66
+ # end
67
+
68
+ # it "checks 3 words as string matches standard regex" do
69
+ # stub! anything
70
+ # expect { w3w.words_to_position "1.cape.pump" }.
71
+ # to raise_error described_class::WordError
72
+ # end
73
+
74
+ end
75
+
76
+ # describe "gets 3 words" do
77
+ #
78
+ # def stub!(request_body, response_body = {})
79
+ # stub_request(:get, "https://api.what3words.com/v2/reverse").
80
+ # with(:body => request_body).
81
+ # to_return(:status => 200, :body => response_body.to_json)
82
+ # end
83
+ #
84
+ # it "extracts 3 words from response" do
85
+ # stub! hash_including(:position => "1,2"), {:words => "prom.cape.pump"}
86
+ # expect(w3w.reverse([1, 2])).to eq "prom.cape.pump"
87
+ # end
88
+ #
89
+ # it "sends lang option" do
90
+ # stub!(hash_including(:position => "1,2", :lang => "fr"))
91
+ # w3w.position_to_words([1, 2], :language => "fr")
92
+ # end
93
+ #
94
+ # end
95
+ #
96
+ # describe "getting available languages" do
97
+ #
98
+ # def stub!(request_body, response_body = {})
99
+ # stub_request(:get, "http://api.what3words.com/get-languages").
100
+ # with(:body => request_body).
101
+ # to_return(:status => 200, :body => response_body.to_json)
102
+ # end
103
+ #
104
+ # it "gets list of codes" do
105
+ # stub! anything, {:languages => [{:code => "l1"}, {:code => "l2"}]}
106
+ # expect(w3w.languages). to eq ["l1", "l2"]
107
+ # end
108
+ #
109
+ # it "gets full response" do
110
+ # stub! anything, {:languages => [{:code => "l1"}, {:code => "l2"}]}
111
+ # expect(w3w.languages :full_response => true).
112
+ # to eq(:languages => [{:code => "l1"}, {:code => "l2"}])
113
+ # end
114
+ # end
115
+
116
+ it "'s deep_symbolize_keys helper works" do
117
+ expect(w3w.deep_symbolize_keys("foo" => {"bar" => 1, "baz" => [{"quux" => "www"}]})).
118
+ to eq(:foo => {:bar => 1, :baz => [{:quux => "www"}]})
119
+ end
120
+ end
data/spec/spec_helper.rb CHANGED
@@ -6,10 +6,10 @@ require "webmock/rspec"
6
6
 
7
7
  require "what3words"
8
8
 
9
- RSpec.configure do |config|
10
- config.filter_run_excluding :integration => true
11
-
12
- config.before(:all) do
13
- WebMock.disable_net_connect!
14
- end
15
- end
9
+ # RSpec.configure do |config|
10
+ # # config.filter_run_excluding :integration => true
11
+ #
12
+ # config.before(:all) do
13
+ # WebMock.disable_net_connect!
14
+ # end
15
+ # end
data/what3words.gemspec CHANGED
@@ -7,9 +7,9 @@ require "what3words/version"
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = "what3words"
9
9
  spec.version = What3Words::VERSION
10
- spec.authors = ["Asfand Yar Qazi"]
11
- spec.email = ["ayqazi@gmail.com"]
12
- spec.summary = "Query the what3words API in Ruby"
10
+ spec.authors = ["what3words"]
11
+ spec.email = ["development@what3words.com"]
12
+ spec.summary = "what3words API wrapper in Ruby"
13
13
  spec.homepage = "http://rubygems.org/gems/what3words"
14
14
  spec.license = "MIT"
15
15
 
@@ -18,10 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^spec/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "rest-client"
21
+ spec.add_dependency "rest-client", "~> 1.8"
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.5"
24
- spec.add_development_dependency "rake"
25
- spec.add_development_dependency "rspec"
26
- spec.add_development_dependency "webmock"
23
+ spec.add_development_dependency "bundler", "~> 1.12"
24
+ spec.add_development_dependency "rake", "~> 11.1"
25
+ spec.add_development_dependency "rspec", "~> 3.4"
26
+ spec.add_development_dependency "webmock", "~> 2.0"
27
27
  end
metadata CHANGED
@@ -1,92 +1,93 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: what3words
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Asfand Yar Qazi
7
+ - what3words
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-22 00:00:00.000000000 Z
11
+ date: 2016-06-10 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
- version: '0'
19
+ version: '1.8'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.8'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.5'
33
+ version: '1.12'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.5'
40
+ version: '1.12'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '11.1'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '11.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '3.4'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '3.4'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: webmock
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '2.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '2.0'
83
83
  description:
84
84
  email:
85
- - ayqazi@gmail.com
85
+ - development@what3words.com
86
86
  executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
+ - ".editorconfig"
90
91
  - ".gitignore"
91
92
  - Gemfile
92
93
  - LICENSE.txt
@@ -96,9 +97,8 @@ files:
96
97
  - lib/what3words/api.rb
97
98
  - lib/what3words/version.rb
98
99
  - spec/config.sample.yaml
99
- - spec/fixtures/LibertyTech.yaml
100
- - spec/integration/what3words_api_integration_spec.rb
101
- - spec/lib/what3words/api_spec.rb
100
+ - spec/lib/what3words/what3words_api_spec.rb
101
+ - spec/mock/api_spec.rb
102
102
  - spec/spec_helper.rb
103
103
  - what3words.gemspec
104
104
  homepage: http://rubygems.org/gems/what3words
@@ -121,14 +121,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
121
  version: '0'
122
122
  requirements: []
123
123
  rubyforge_project:
124
- rubygems_version: 2.2.2
124
+ rubygems_version: 2.5.1
125
125
  signing_key:
126
126
  specification_version: 4
127
- summary: Query the what3words API in Ruby
127
+ summary: what3words API wrapper in Ruby
128
128
  test_files:
129
129
  - spec/config.sample.yaml
130
- - spec/fixtures/LibertyTech.yaml
131
- - spec/integration/what3words_api_integration_spec.rb
132
- - spec/lib/what3words/api_spec.rb
130
+ - spec/lib/what3words/what3words_api_spec.rb
131
+ - spec/mock/api_spec.rb
133
132
  - spec/spec_helper.rb
134
- has_rdoc:
@@ -1,30 +0,0 @@
1
- ---
2
- :type: OneWord
3
- :oneword: "*LibertyTech"
4
- :position:
5
- - 51.512573
6
- - -0.144879
7
- :info:
8
- :name: Liberty Tech office
9
- :address1: 124 New Bond Street
10
- :address2: ''
11
- :address3: ''
12
- :city: London
13
- :county: ''
14
- :postcode: W1S 1DX
15
- :country_id: '0'
16
- :website: http://libertytech.com
17
- :email: enquiries@libertytech.com
18
- :telephone: 0207 493 8140
19
- :delivery_notes: Ring bell number 7, we're on the top floor.
20
- :notes: Top floor, lots of stairs!
21
- :social_facebook: http://www.facebook.com/libertytech
22
- :social_twitter: http://www.twitter.com/libertytech
23
- :social_google: ''
24
- :social_linkedin: ''
25
- :social_instagram: ''
26
- :words:
27
- - boxer
28
- - overnight
29
- - crate
30
- :language: en
@@ -1,106 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "spec_helper"
4
- require "yaml"
5
-
6
- describe What3Words::API, "integration", :integration => true do
7
-
8
- before(:all) do
9
- WebMock.allow_net_connect!
10
- end
11
-
12
- let!(:config) do
13
- file = "spec/config.yaml"
14
- if ! File.exist? file
15
- raise "Add a file #{file} (use spec/config.sample.yaml as a template) with correct values to run integration specs"
16
- end
17
- YAML.load_file file
18
- end
19
-
20
- let(:api_key) { config["api_key"] }
21
- let(:private_one_word) { config["private_one_word"] }
22
- let(:private_one_word_password) { config["private_one_word_password"] }
23
-
24
- let(:w3w) { described_class.new(:key => api_key) }
25
-
26
- it "returns errors from API" do
27
- badw3w = described_class.new(:key => "")
28
- expect { badw3w.words_to_position ["prom", "cape", "pump"] }.
29
- to raise_error described_class::ResponseError
30
- end
31
-
32
- describe "getting position" do
33
-
34
- it "works with 3 words in array" do
35
- result = w3w.words_to_position ["prom", "cape", "pump"]
36
- expect(result).to eq [51.484463, -0.195405]
37
- end
38
-
39
- it "works with string of 3 words separated by '.'" do
40
- result = w3w.words_to_position "prom.cape.pump"
41
- expect(result).to eq [51.484463, -0.195405]
42
- end
43
-
44
- it "gets full response from API" do
45
- result = w3w.words_to_position ["prom", "cape", "pump"], :full_response => true
46
- expect(result).to eq( :type => "3 words", :words => ["prom", "cape", "pump"],
47
- :position => [51.484463, -0.195405], :language => "en" )
48
- end
49
-
50
- it "sends all possible parameters for 3 words" do
51
- result = w3w.words_to_position ["prom", "cape", "pump"], :full_response => true,
52
- :language => "fr", :corners => true
53
- expect(result).to eq(
54
- :type => "3 words", :words => ["concevoir", "époque", "amasser"],
55
- :position => [51.484463, -0.195405], :language => "fr",
56
- :corners => [[51.484449, -0.195426], [51.484476, -0.195383]])
57
- end
58
-
59
- it "checks 3 words format matches standard regex" do
60
- expect { w3w.words_to_position ["1", "cape", "pump"] }.
61
- to raise_error described_class::WordError
62
-
63
- expect { w3w.words_to_position "1.cape.pump" }.
64
- to raise_error described_class::WordError
65
- end
66
-
67
- it "checks OneWord format matches standard regex" do
68
- expect { w3w.words_to_position "123foo" }.
69
- to raise_error described_class::WordError
70
- end
71
-
72
- it "works with a OneWord" do
73
- result = w3w.words_to_position "*LibertyTech"
74
- expect(result).to eq [51.512573, -0.144879]
75
- end
76
-
77
- it "disallows access to protected OneWord" do
78
- expect { w3w.words_to_position private_one_word }.
79
- to raise_error described_class::ResponseError
80
- end
81
-
82
- it "accesses OneWord protected by oneword password" do
83
- expect(w3w.words_to_position private_one_word,
84
- :oneword_password => private_one_word_password).
85
- to eq [29.567043, 106.587865]
86
- end
87
-
88
- xit "accesses OneWord protected by user credentials (username & password)"
89
- end
90
-
91
- describe "gets 3 words" do
92
- it "from position" do
93
- expect(w3w.position_to_words [29.567041, 106.587875], :language => "fr").
94
- to eq ["courgette", "approbateur", "infrason"]
95
- end
96
- end
97
-
98
- it "gets languages" do
99
- expect(w3w.languages).to include "en"
100
- end
101
-
102
- it "'s deep_symbolize_keys helper works" do
103
- expect(w3w.deep_symbolize_keys("foo" => {"bar" => true})).
104
- to eq(:foo => {:bar => true})
105
- end
106
- end
@@ -1,155 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "spec_helper"
4
-
5
- describe What3Words::API do
6
-
7
- before(:all) do
8
- WebMock.disable_net_connect!
9
- end
10
-
11
- let(:api_key) { "APIkey" }
12
-
13
- let(:w3w) { described_class.new(:key => api_key) }
14
-
15
- it "returns errors from API" do
16
- stub_request(:post, "http://api.what3words.com/w3w").
17
- to_return(:status => 200, :body => '{"error": "XX", "message": "msg"}')
18
-
19
- expect { w3w.words_to_position ["prom", "cape", "pump"] }.
20
- to raise_error described_class::ResponseError
21
- end
22
-
23
- describe "getting position" do
24
-
25
- def stub!(request_body, response_body = {}, protocol = "http")
26
- r = stub_request(:post, "#{protocol}://api.what3words.com/w3w").
27
- with(:body => request_body).
28
- to_return(:status => 200, :body => response_body.to_json)
29
- end
30
-
31
- it "sends 3 words given as array" do
32
- stub! hash_including(:string => "a.b.c")
33
- result = w3w.words_to_position ["a", "b", "c"]
34
- end
35
-
36
- it "sends 3 words given as string" do
37
- stub! hash_including(:string => "a.b.c")
38
- result = w3w.words_to_position "a.b.c"
39
- end
40
-
41
- it "extracts position from response" do
42
- stub! hash_including(:string => "a.b.c"), {"position" => [1, 2]}
43
- result = w3w.words_to_position "a.b.c"
44
- expect(result).to eq [1, 2]
45
- end
46
-
47
- it "returns full response instead of just coords" do
48
- stub!(hash_including(:string => "a.b.c"),
49
- {"full" => true})
50
- result = w3w.words_to_position "a.b.c", :full_response => true
51
- expect(result).to eq :full => true
52
- end
53
-
54
- it "sends lang option" do
55
- stub!(hash_including(:string => "a.b.c", :lang => "fr"))
56
- w3w.words_to_position "a.b.c", :language => "fr"
57
- end
58
-
59
- it "sends corners option" do
60
- stub!(hash_including(:string => "a.b.c", :corners => "true"))
61
- w3w.words_to_position "a.b.c", :corners => true
62
- end
63
-
64
- it "uses https for private OneWord with oneword-password" do
65
- stub!(hash_including(:string => "a.b.c", :"oneword-password" => "oopw"),
66
- {}, "https")
67
- w3w.words_to_position "a.b.c", :oneword_password => "oopw"
68
- end
69
-
70
- it "uses https for private OneWord with email / password" do
71
- stub!(hash_including(:string => "a.b.c", :email => "em", :password => "pw"),
72
- {}, "https")
73
- w3w.words_to_position "a.b.c", :email => "em", :password => "pw"
74
- end
75
-
76
- it "parses response errors" do
77
- stub! hash_including(:string => "a.b.c"), {:error => "xx", :message => "msg"}
78
- expect { w3w.words_to_position "a.b.c" }.
79
- to raise_error described_class::ResponseError, "xx: msg"
80
- end
81
-
82
- it "checks 3 words as array matches standard regex" do
83
- stub! anything
84
- expect { w3w.words_to_position ["1", "cape", "pump"] }.
85
- to raise_error described_class::WordError
86
- end
87
-
88
- it "checks 3 words as string matches standard regex" do
89
- stub! anything
90
- expect { w3w.words_to_position "1.cape.pump" }.
91
- to raise_error described_class::WordError
92
- end
93
-
94
- it "checks OneWord format matches standard regex" do
95
- stub! anything
96
- expect { w3w.words_to_position "123foo" }.
97
- to raise_error described_class::WordError
98
- end
99
- end
100
-
101
- describe "gets 3 words" do
102
-
103
- def stub!(request_body, response_body = {})
104
- r = stub_request(:post, "http://api.what3words.com/position").
105
- with(:body => request_body).
106
- to_return(:status => 200, :body => response_body.to_json)
107
- end
108
-
109
- it "extracts 3 words from response" do
110
- stub! hash_including(:position => "1,2"), {:words => ["a", "b", "c"]}
111
- expect(w3w.position_to_words([1, 2])).to eq ["a", "b", "c"]
112
- end
113
-
114
- it "returns full response if asked" do
115
- stub! hash_including(:position => "1,2"), {:full => "1"}
116
- expect(w3w.position_to_words([1, 2], :full_response => true)).to eq(:full => "1")
117
- end
118
-
119
- it "sends lang option" do
120
- stub!(hash_including(:position => "1,2", :lang => "fr"))
121
- w3w.position_to_words([1, 2], :language => "fr")
122
- end
123
-
124
- it "sends corners option" do
125
- stub!(hash_including(:position => "1,2", :corners => "true"))
126
- w3w.position_to_words([1, 2], :corners => true)
127
- end
128
-
129
- end
130
-
131
- describe "getting available languages" do
132
-
133
- def stub!(request_body, response_body = {})
134
- r = stub_request(:post, "http://api.what3words.com/get-languages").
135
- with(:body => request_body).
136
- to_return(:status => 200, :body => response_body.to_json)
137
- end
138
-
139
- it "gets list of codes" do
140
- stub! anything, {:languages => [{:code => "l1"}, {:code => "l2"}]}
141
- expect(w3w.languages). to eq ["l1", "l2"]
142
- end
143
-
144
- it "gets full response" do
145
- stub! anything, {:languages => [{:code => "l1"}, {:code => "l2"}]}
146
- expect(w3w.languages :full_response => true).
147
- to eq(:languages => [{:code => "l1"}, {:code => "l2"}])
148
- end
149
- end
150
-
151
- it "'s deep_symbolize_keys helper works" do
152
- expect(w3w.deep_symbolize_keys("foo" => {"bar" => 1, "baz" => [{"quux" => "www"}]})).
153
- to eq(:foo => {:bar => 1, :baz => [{:quux => "www"}]})
154
- end
155
- end