tlaw 0.0.2 → 0.1.0.pre
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 +4 -4
- data/.ruby-version +1 -0
- data/CHANGELOG.md +18 -2
- data/README.md +10 -7
- data/examples/demo_base.rb +2 -2
- data/examples/experimental/README.md +3 -0
- data/examples/experimental/afterthedeadline.rb +22 -0
- data/examples/experimental/airvisual.rb +14 -0
- data/examples/experimental/apixu.rb +32 -0
- data/examples/experimental/bing_maps.rb +18 -0
- data/examples/experimental/currencylayer.rb +25 -0
- data/examples/experimental/earthquake.rb +29 -0
- data/examples/experimental/freegeoip.rb +16 -0
- data/examples/experimental/geonames.rb +98 -0
- data/examples/experimental/isfdb.rb +17 -0
- data/examples/experimental/musicbrainz.rb +27 -0
- data/examples/experimental/nominatim.rb +52 -0
- data/examples/experimental/omdb.rb +68 -0
- data/examples/experimental/open_exchange_rates.rb +36 -0
- data/examples/experimental/open_route.rb +27 -0
- data/examples/experimental/open_street_map.rb +16 -0
- data/examples/experimental/quandl.rb +50 -0
- data/examples/experimental/reddit.rb +25 -0
- data/examples/experimental/swapi.rb +27 -0
- data/examples/experimental/tmdb.rb +53 -0
- data/examples/experimental/world_bank.rb +85 -0
- data/examples/experimental/world_bank_climate.rb +77 -0
- data/examples/experimental/wunderground.rb +66 -0
- data/examples/experimental/wunderground_demo.rb +7 -0
- data/examples/forecast_io.rb +16 -16
- data/examples/giphy.rb +4 -4
- data/examples/giphy_demo.rb +1 -1
- data/examples/open_weather_map.rb +64 -60
- data/examples/open_weather_map_demo.rb +4 -4
- data/examples/tmdb_demo.rb +1 -1
- data/examples/urbandictionary_demo.rb +2 -2
- data/lib/tlaw.rb +14 -15
- data/lib/tlaw/api.rb +108 -26
- data/lib/tlaw/api_path.rb +86 -87
- data/lib/tlaw/data_table.rb +15 -10
- data/lib/tlaw/dsl.rb +126 -224
- data/lib/tlaw/dsl/api_builder.rb +47 -0
- data/lib/tlaw/dsl/base_builder.rb +108 -0
- data/lib/tlaw/dsl/endpoint_builder.rb +26 -0
- data/lib/tlaw/dsl/namespace_builder.rb +86 -0
- data/lib/tlaw/endpoint.rb +63 -85
- data/lib/tlaw/formatting.rb +55 -0
- data/lib/tlaw/formatting/describe.rb +86 -0
- data/lib/tlaw/formatting/inspect.rb +52 -0
- data/lib/tlaw/namespace.rb +141 -98
- data/lib/tlaw/param.rb +45 -141
- data/lib/tlaw/param/type.rb +36 -49
- data/lib/tlaw/response_processors.rb +81 -0
- data/lib/tlaw/util.rb +16 -33
- data/lib/tlaw/version.rb +6 -3
- data/tlaw.gemspec +9 -9
- metadata +63 -13
- data/lib/tlaw/param_set.rb +0 -111
- data/lib/tlaw/response_processor.rb +0 -126
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '009cee34cd6c91e7fdb5a24914d1b8ffcb7c0639'
|
4
|
+
data.tar.gz: ab895dc56817673f6222f930a59fc525ff72fff3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f5e188083216814e176d0c0161a424f9d124272411c8c15ca54b3ed3f7367d1f62e689c61ec80cc8feb22c2231178638dc1c7f066cac199dd383ab4861bbe754
|
7
|
+
data.tar.gz: 78c2c75ba92efde05fdb927198fe4a565da0a5ce53d94dd1142b2592f980edeaca11a9018fe5d2e6ef4bc759a9ee49ffd5f3257b5326ab1b44a3b146744e131f
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.0
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,27 @@
|
|
1
1
|
# The Last API Wrapper Changelog
|
2
2
|
|
3
|
-
|
3
|
+
## 0.1.0.pre (2018-12-21)
|
4
|
+
|
5
|
+
* `Namespace#children` is an `Array` now, with `Namespace#child_index` being a `Hash` (@marcandre);
|
6
|
+
* DSL now can accept strings as a Namespace/Endpoint name (@marcandre);
|
7
|
+
* Classes' `.inspect` fixed to match Ruby's conventions (@marcandre);
|
8
|
+
* Improved object tree navigation (@marcandre):
|
9
|
+
* `APIPath#parent`, `APIPath.parent` (immediate parent class/object);
|
10
|
+
* `APIPath#parents`, `APIPath.parents` (parent classes/objects all the way up);
|
11
|
+
* `Namespace#traverse` (depth-first children tree enumeration).
|
12
|
+
* Lots of refactoring (better call it "rewrite", honestly), internal structure was simplified and
|
13
|
+
decoupled, API and DSL was kept the same (I hope).
|
14
|
+
* I am really thankful to @marcandre and @joelvh for cleaning up job they've done. Sorry, guys,
|
15
|
+
eventually I've rewrote the thing completely :)
|
16
|
+
* Added `shared_def`/`use_def` to reuse some common parts of definitions (thanks @marcandre for
|
17
|
+
discussion).
|
18
|
+
|
19
|
+
## 0.0.2 (2017-07-31)
|
4
20
|
|
5
21
|
* Codebase modernized and rubocopped;
|
6
22
|
* Support for redirects;
|
7
23
|
* Support for pattern-based (regexp) postprocessors.
|
8
24
|
|
9
|
-
|
25
|
+
## 0.0.1 (2016-09-19)
|
10
26
|
|
11
27
|
Initial release.
|
data/README.md
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
[](https://travis-ci.org/molybdenum-99/tlaw)
|
5
5
|
[](https://coveralls.io/r/molybdenum-99/tlaw?branch=master)
|
6
6
|
|
7
|
-
**TLAW** (pronounce it like "tea+love"... or whatever) is the last (and
|
8
|
-
|
9
|
-
(think weather, search, economical indicators, geonames and so on).
|
7
|
+
**TLAW** (pronounce it like "tea+love"... or whatever) is the last (and only)
|
8
|
+
API wrapper framework you'll ever need for accessing _GET-only APIs_<sup>[*](#get-only-api)</sup>
|
9
|
+
in a consistent way (think weather, search, economical indicators, geonames and so on).
|
10
10
|
|
11
11
|
## Table Of Contents
|
12
12
|
|
@@ -68,6 +68,9 @@ options:
|
|
68
68
|
TLAW tries to close this gap: provide a base for _breath-easy_ API description
|
69
69
|
which produces solid, fast and reliable wrappers.
|
70
70
|
|
71
|
+
See also a [showcase blog post](http://zverok.github.io/blog/2017-07-31-giphy-tlaw.html) with on-the-fly
|
72
|
+
API wrapper building for GIPHY.
|
73
|
+
|
71
74
|
## Usage
|
72
75
|
|
73
76
|
### URLs and params description
|
@@ -88,7 +91,7 @@ class Example < TLAW::API
|
|
88
91
|
# Method is still e.bar, though.
|
89
92
|
|
90
93
|
# Now, for params definition:
|
91
|
-
|
94
|
+
endpoint :movie do
|
92
95
|
param :id
|
93
96
|
end
|
94
97
|
# Method call would be movie(id: '123')
|
@@ -299,7 +302,7 @@ post_process_items('foo') {
|
|
299
302
|
|
300
303
|
# More realistic examples:
|
301
304
|
post_process('meta.count', &:to_i)
|
302
|
-
|
305
|
+
post_process_items('daily') {
|
303
306
|
post_process('date', &Date.method(:parse))
|
304
307
|
}
|
305
308
|
post_process('auxiliary_value') { nil } # Nil's will be thrown away completely
|
@@ -311,9 +314,9 @@ See full post-processing features descriptions in
|
|
311
314
|
#### All at once
|
312
315
|
|
313
316
|
All described response processing steps are performed in this order:
|
317
|
+
|
314
318
|
* parsing and initial flattening of JSON (or XML) hash;
|
315
|
-
* applying post-processors (and flatten the response after _each_ of
|
316
|
-
them);
|
319
|
+
* applying post-processors (and flatten the response after _each_ of them);
|
317
320
|
* make `DataTable`s from arrays of hashes.
|
318
321
|
|
319
322
|
### Documentability
|
data/examples/demo_base.rb
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
$:.unshift 'lib'
|
4
|
+
require 'tlaw'
|
5
|
+
|
6
|
+
#http://docs.themoviedb.apiary.io/#reference/movies/movielatest
|
7
|
+
|
8
|
+
class AfterTheDeadline < TLAW::API
|
9
|
+
define do
|
10
|
+
base 'http://service.afterthedeadline.com'
|
11
|
+
|
12
|
+
param :key, required: true
|
13
|
+
|
14
|
+
endpoint :document, '/checkDocument', xml: true do
|
15
|
+
param :data, keyword: false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
atd = AfterTheDeadline.new(key: 'test-tlaw')
|
21
|
+
|
22
|
+
pp atd.document("Isn't it cool and cute and awesme? Yepx it is.")['results.error'].to_a
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative '../demo_base'
|
2
|
+
|
3
|
+
class AirVisual < TLAW::API
|
4
|
+
define do
|
5
|
+
base 'http://api.airvisual.com/v1'
|
6
|
+
param :key, required: true
|
7
|
+
|
8
|
+
endpoint :nearest, '/nearest?lat={latitude}&lon={longitude}' do
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
av = AirVisual.new(key: ENV['AIRVISUAL'])
|
14
|
+
pp av.nearest(50.004444, 36.231389)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative '../demo_base'
|
2
|
+
|
3
|
+
class APIXU < TLAW::API
|
4
|
+
define do
|
5
|
+
docs 'https://www.apixu.com/doc/'
|
6
|
+
|
7
|
+
base 'http://api.apixu.com/v1'
|
8
|
+
|
9
|
+
param :key, required: true
|
10
|
+
param :lang
|
11
|
+
|
12
|
+
namespace :current, '/current.json' do
|
13
|
+
endpoint :city, '?q={city}' do
|
14
|
+
param :city, :to_s, required: true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
namespace :forecast, '/forecast.json' do
|
19
|
+
endpoint :city, '?q={city}' do
|
20
|
+
param :city, :to_s, required: true
|
21
|
+
param :days, :to_i
|
22
|
+
param :dt, Date, format: ->(dt) { dt.strftime('%Y-%m-%d') }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
apixu = APIXU.new(key: ENV['APIXU'], lang: 'uk')
|
29
|
+
pp apixu.current.city('Kharkiv')
|
30
|
+
#res = apixu.forecast.city('Odesa', days: 10, dt: Date.parse('2017-07-03'))
|
31
|
+
#pp res['forecast.forecastday']['day.mintemp_c']
|
32
|
+
#pp res['forecast.forecastday']['day.maxtemp_c']
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../demo_base'
|
2
|
+
|
3
|
+
#http://docs.themoviedb.apiary.io/#reference/movies/movielatest
|
4
|
+
|
5
|
+
class BingMaps < TLAW::API
|
6
|
+
define do
|
7
|
+
base 'http://dev.virtualearth.net/REST/v1'
|
8
|
+
param :key, required: true
|
9
|
+
|
10
|
+
namespace :locations, '/Locations' do
|
11
|
+
endpoint :query, '?q={q}'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
maps = BingMaps.new(key: ENV['BING_MAPS'])
|
17
|
+
|
18
|
+
pp maps.locations.query('Харків, Олексіівська 33а')['resourceSets'].first
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../demo_base'
|
2
|
+
|
3
|
+
class CurrencyLayer < TLAW::API
|
4
|
+
define do
|
5
|
+
base 'http://apilayer.net/api/'
|
6
|
+
|
7
|
+
param :access_key, required: true
|
8
|
+
|
9
|
+
endpoint :live do
|
10
|
+
param :currencies, Array
|
11
|
+
end
|
12
|
+
|
13
|
+
endpoint :historical do
|
14
|
+
param :date, :to_date, required: :true, keyword: false, format: ->(d) { d.strftime('%Y-%m-%d') }
|
15
|
+
param :currencies, Array
|
16
|
+
|
17
|
+
post_process 'date', &Date.method(:parse)
|
18
|
+
post_process 'timestamp', &Time.method(:at)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
cur = CurrencyLayer.new(access_key: ENV['CURRENCYLAYER'])
|
24
|
+
|
25
|
+
pp cur.historical(Date.parse('2016-01-01'), currencies: %w[UAH])
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
$:.unshift 'lib'
|
4
|
+
require 'tlaw'
|
5
|
+
|
6
|
+
class Earthquake < TLAW::API
|
7
|
+
define do
|
8
|
+
base 'http://earthquake.usgs.gov/fdsnws/event/1'
|
9
|
+
|
10
|
+
endpoint :count, '/count?format=geojson' do
|
11
|
+
param :starttime, Date, format: ->(d) { d.strftime('%Y-%m-%d') }
|
12
|
+
param :endtime, Date, format: ->(d) { d.strftime('%Y-%m-%d') }
|
13
|
+
end
|
14
|
+
|
15
|
+
endpoint :query, '/query?format=geojson' do
|
16
|
+
param :starttime, Date, format: ->(d) { d.strftime('%Y-%m-%d') }
|
17
|
+
param :endtime, Date, format: ->(d) { d.strftime('%Y-%m-%d') }
|
18
|
+
param :minmagnitude, :to_i
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
#/query?format=geojson&starttime=2001-01-01&endtime=2014-01-02
|
25
|
+
|
26
|
+
e = Earthquake.new
|
27
|
+
res = e.query(starttime: Date.parse('2000-01-01'), endtime: Date.parse('2017-01-02'), minmagnitude: 9)
|
28
|
+
pp res['features'].count
|
29
|
+
pp res['features'].first
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require_relative '../demo_base'
|
2
|
+
require 'geo/coord'
|
3
|
+
|
4
|
+
#http://www.geonames.org/export/web-services.html
|
5
|
+
#http://www.geonames.org/export/credits.html
|
6
|
+
#http://www.geonames.org/export/ws-overview.html
|
7
|
+
|
8
|
+
class GeoNames < TLAW::API
|
9
|
+
define do
|
10
|
+
base 'http://api.geonames.org'
|
11
|
+
|
12
|
+
param :username, required: true
|
13
|
+
param :lang
|
14
|
+
|
15
|
+
ERROR_CODES = {
|
16
|
+
10 => 'Authorization Exception',
|
17
|
+
11 => 'record does not exist',
|
18
|
+
12 => 'other error',
|
19
|
+
13 => 'database timeout',
|
20
|
+
14 => 'invalid parameter',
|
21
|
+
15 => 'no result found',
|
22
|
+
16 => 'duplicate exception',
|
23
|
+
17 => 'postal code not found',
|
24
|
+
18 => 'daily limit of credits exceeded',
|
25
|
+
19 => 'hourly limit of credits exceeded',
|
26
|
+
20 => 'weekly limit of credits exceeded',
|
27
|
+
21 => 'invalid input',
|
28
|
+
22 => 'server overloaded exception',
|
29
|
+
23 => 'service not implemented',
|
30
|
+
}
|
31
|
+
|
32
|
+
post_process do |response|
|
33
|
+
if response['status.value']
|
34
|
+
fail "#{ERROR_CODES[response['status.value']]}: #{response['status.message']}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
namespace :search, path: '/searchJSON' do
|
39
|
+
endpoint :query, path: '?q={q}' do
|
40
|
+
param :q, required: true
|
41
|
+
param :country #TODO: country=FR&country=GP
|
42
|
+
end
|
43
|
+
|
44
|
+
endpoint :name, path: '?name={name}' do
|
45
|
+
param :name, required: true
|
46
|
+
end
|
47
|
+
|
48
|
+
endpoint :name_equals, path: '?name_equals={name}' do
|
49
|
+
param :name, required: true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
namespace :postal_codes, path: '' do
|
54
|
+
endpoint :countries, path: '/postalCodeCountryInfoJSON'
|
55
|
+
end
|
56
|
+
|
57
|
+
namespace :near, path: '' do
|
58
|
+
param :lat, keyword: false
|
59
|
+
param :lng, keyword: false
|
60
|
+
|
61
|
+
endpoint :ocean, path: '/oceanJSON'
|
62
|
+
endpoint :country, path: '/countryCodeJSON'
|
63
|
+
endpoint :weather, path: '/findNearByWeatherJSON'
|
64
|
+
endpoint :extended, path: '/extendedFindNearby', xml: true do
|
65
|
+
post_process_replace { |res| res['geonames.geoname'] }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
namespace :weather, path: '' do
|
70
|
+
endpoint :near, path: '/findNearByWeatherJSON?lat={lat}&lng={lng}'
|
71
|
+
end
|
72
|
+
|
73
|
+
endpoint :earthquakes, path: '/earthquakesJSON' do
|
74
|
+
param :north
|
75
|
+
param :south
|
76
|
+
param :east
|
77
|
+
param :west
|
78
|
+
|
79
|
+
post_process_items 'earthquakes' do
|
80
|
+
post_process 'datetime', &Time.method(:parse)
|
81
|
+
post_process { |h| h['coord'] = Geo::Coord.new(h['lat'], h['lng']) }
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
gn = GeoNames.new(username: ENV.fetch('GEONAMES'))
|
88
|
+
|
89
|
+
#pp gn.search.name_equals('Kharkiv')['geonames'].to_a
|
90
|
+
#pp gn.postal_codes.countries['geonames'].detect { |r| r['countryName'].include?('Thai') }
|
91
|
+
#pp gn.near(50.004444, 36.231389).country
|
92
|
+
#pp gn.near(50.004444, 36.231389).ocean
|
93
|
+
pp gn.near(50.004444, 36.231389).extended.to_a
|
94
|
+
#pp gn.near(50.004444, 36.231389).weather
|
95
|
+
#pp gn.weather.near(50.004444, 36.231389)
|
96
|
+
|
97
|
+
#pp gn.earthquakes(north: 44.1, south: -9.9, east: -22.4, west: 55.2)['earthquakes'].to_a
|
98
|
+
# => to worldize!
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
$:.unshift 'lib'
|
4
|
+
require 'tlaw'
|
5
|
+
|
6
|
+
class ISFDB < TLAW::API
|
7
|
+
define do
|
8
|
+
base 'http://www.isfdb.org/cgi-bin/rest'
|
9
|
+
|
10
|
+
endpoint :isbn, '/getpub.cgi?{isbn}', xml: true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
i = ISFDB.new
|
15
|
+
|
16
|
+
#pp i.isbn('0399137378')["ISFDB.Publications.Publication"].last
|
17
|
+
pp i.isbn('038533348X')["ISFDB.Publications.Publication"].to_a
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
$:.unshift 'lib'
|
4
|
+
require 'tlaw'
|
5
|
+
|
6
|
+
class MusicBrainz < TLAW::API
|
7
|
+
define do
|
8
|
+
base 'http://musicbrainz.org/ws/2'
|
9
|
+
|
10
|
+
endpoint :area, '/area/{id}?fmt=json'
|
11
|
+
|
12
|
+
namespace :artist do
|
13
|
+
endpoint :area, '?area={area_id}&fmt=json'
|
14
|
+
endpoint :get, '/{id}?fmt=json' do
|
15
|
+
param :inc, :to_a, format: ->(a) { a.join('+') }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
mb = MusicBrainz.new
|
22
|
+
|
23
|
+
#pp mb.area '37572420-4b2c-47e5-bf2b-536c9a50a362'
|
24
|
+
#pp mb.artist.area('904768d0-61ca-3c40-93ac-93adc36fef4b')['artists'].first
|
25
|
+
res = mb.artist.get('00496bc8-93bf-4284-a3ea-cfd97eb99b2f', inc: %w[recordings releases release-groups works])
|
26
|
+
pp res['recordings'].first
|
27
|
+
pp res['releases'].first
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
$:.unshift 'lib'
|
4
|
+
require 'tlaw'
|
5
|
+
|
6
|
+
class Nominatim < TLAW::API
|
7
|
+
define do
|
8
|
+
base 'http://nominatim.openstreetmap.org'
|
9
|
+
|
10
|
+
param :lang, field: 'accept%2Dlanguage'
|
11
|
+
|
12
|
+
namespace :search, '/search?format=json' do
|
13
|
+
endpoint :query, '' do
|
14
|
+
param :query, field: :q, keyword: false
|
15
|
+
|
16
|
+
param :details, field: :addressdetails, enum: {false => 0, true => 1}
|
17
|
+
param :geojson, field: :polygon_geojson, enum: {false => 0, true => 1}
|
18
|
+
param :tags, field: :extratags, enum: {false => 0, true => 1}
|
19
|
+
param :limit
|
20
|
+
end
|
21
|
+
|
22
|
+
endpoint :address, '' do
|
23
|
+
param :city
|
24
|
+
param :country
|
25
|
+
param :street
|
26
|
+
param :postalcode
|
27
|
+
param :details, field: :addressdetails, enum: {false => 0, true => 1}
|
28
|
+
param :geojson, field: :polygon_geojson, enum: {false => 0, true => 1}
|
29
|
+
param :tags, field: :extratags, enum: {false => 0, true => 1}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
endpoint :geocode, '/reverse?format=json' do
|
34
|
+
param :lat, :to_f, keyword: false
|
35
|
+
param :lng, :to_f, field: :lon, keyword: false
|
36
|
+
end
|
37
|
+
|
38
|
+
endpoint :lookup, '/lookup?format=json&osm_ids={ids}' do
|
39
|
+
param :ids # , splat: true -- TODO
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
n = Nominatim.new(lang: 'en')
|
45
|
+
|
46
|
+
#pp n.search.address(country: 'Ukraine', city: 'Kharkiv', street: '33a Oleksiivska', details: true, geojson: true, tags: true).first
|
47
|
+
# pp n.search.query('New York, Times Square', details: true, tags: true, limit: 1).to_a
|
48
|
+
#pp n.geocode(50.0403843, 36.203339684)
|
49
|
+
#pp n.search.query('Pharmacy, Kharkiv', details: true, tags: true, limit: 100)['address.pharmacy'].compact
|
50
|
+
#pp n.geocode(49.9808, 36.2527)
|
51
|
+
# pp n.search.address(country: 'Thailand', city: 'Bangkok', details: true, tags: true).to_a
|
52
|
+
pp n.search.query('Oleksiivska 33a, Kharkiv, Ukraine').to_a
|