From 7bfc5363e40e73a1c6b083d34b26a281eff3c1e3 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Fri, 11 Oct 2019 01:55:20 +0200 Subject: [PATCH 01/21] use Ruby 2.6.3 --- .ruby-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruby-version b/.ruby-version index 437459c..ec1cf33 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.5.0 +2.6.3 From a18f28b0392b79b06be304de77e4580527b70b63 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Fri, 11 Oct 2019 02:15:01 +0200 Subject: [PATCH 02/21] add directions endpoint --- lib/google_maps_juice.rb | 1 + lib/google_maps_juice/directions.rb | 54 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 lib/google_maps_juice/directions.rb diff --git a/lib/google_maps_juice.rb b/lib/google_maps_juice.rb index 27cbc14..b3dc42a 100644 --- a/lib/google_maps_juice.rb +++ b/lib/google_maps_juice.rb @@ -14,6 +14,7 @@ module GoogleMapsJuice autoload :Endpoint, 'google_maps_juice/endpoint' autoload :Geocoding, 'google_maps_juice/geocoding' autoload :Timezone, 'google_maps_juice/timezone' + autoload :Directions, 'google_maps_juice/directions' class Error < Exception; end class ApiLimitError < Exception; end diff --git a/lib/google_maps_juice/directions.rb b/lib/google_maps_juice/directions.rb new file mode 100644 index 0000000..627dd50 --- /dev/null +++ b/lib/google_maps_juice/directions.rb @@ -0,0 +1,54 @@ +module GoogleMapsJuice + class Directions < Endpoint + + ENDPOINT = '/directions' + + autoload :Response, 'google_maps_juice/directions/response' + + class << self + def directions(params, api_key: GoogleMapsJuice.config.api_key) + client = GoogleMapsJuice::Client.new(api_key: api_key) + new(client).directions(params) + end + end + + def directions(params) + validate_directions_params(params) + response_text = @client.get("#{ENDPOINT}/json", params) + response = JSON.parse(response_text, object_class: Response) + detect_errors(response) + end + + def validate_directions_params(params) + raise ArgumentError, 'Hash argument expected' unless params.is_a?(Hash) + + # latitude longitude + supported_keys = %w[origin destination] + validate_supported_params(params, supported_keys) + + required_keys = %w[origin destination] + validate_any_required_params(params, required_keys) + + validate_geo_coordinate(params) + end + + def validate_geo_coordinate(params) + raise ArgumentError, 'String argument expected' unless params.values.each.is_a?(String) + + geocoords = params.values.map { |x| x.split(',') }.flatten + geocoords.map! { |x| Float(x).round(7) } + raise ArgumentError, 'Wrong geo-coordinates' if geocoords.size != 4 + + validate_location_params(geocoords) + end + + def validate_location_params(params) + if params[0].abs > 90 || params[2].abs > 90 + raise ArgumentError, 'Wrong latitude value' + end + if params[1].abs > 180 || params[3].abs > 180 + raise ArgumentError, 'Wrong longitude value' + end + end + end +end From 2c3a80c2bd6ade878b5af6ef829ba57dff0981e5 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Fri, 11 Oct 2019 02:15:23 +0200 Subject: [PATCH 03/21] basic directions response --- lib/google_maps_juice/directions/response.rb | 53 ++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 lib/google_maps_juice/directions/response.rb diff --git a/lib/google_maps_juice/directions/response.rb b/lib/google_maps_juice/directions/response.rb new file mode 100644 index 0000000..ce4b0d0 --- /dev/null +++ b/lib/google_maps_juice/directions/response.rb @@ -0,0 +1,53 @@ +require 'active_support/core_ext/hash/slice' + +module GoogleMapsJuice + class Directions::Response < GoogleMapsJuice::Endpoint::Response + def location + result.dig('geometry', 'location') + end + + def partial_match? + result['partial_match'] == true + end + + def route + routes.first + end + + def summary + route.first['summary'] + end + + def legs + route['legs'] + end + + def steps + legs['steps'] + end + + def duration + route['duration'] + end + + def distance + route['distance'] + end + + def start_location + route['start_location'] + end + + def end_location + route['end_location'] + end + + def start_address + route['start_address'] + end + + def end_address + route['end_address'] + end + end +end From 06bc5e830ffffb9bc1bca98281ab508d4825d6da Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Fri, 11 Oct 2019 11:07:57 +0200 Subject: [PATCH 04/21] update bundler and ruby version --- .travis.yml | 4 ++-- google_maps_juice.gemspec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4bcd4e4..1d3f3d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ sudo: false language: ruby rvm: - - 2.5.0 + - 2.6.3 -before_install: gem install bundler -v 1.16.4 +before_install: gem install bundler -v 1.17.3 install: bundle install diff --git a/google_maps_juice.gemspec b/google_maps_juice.gemspec index 7d7e4a4..21bd48a 100644 --- a/google_maps_juice.gemspec +++ b/google_maps_juice.gemspec @@ -25,7 +25,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'activesupport', '~> 5.2' spec.add_dependency 'excon' - spec.add_development_dependency 'bundler', '~> 1.16' + spec.add_development_dependency 'bundler', '~> 1.17.3' spec.add_development_dependency 'rake', '~> 12.3' spec.add_development_dependency 'rspec', '~> 3.5' spec.add_development_dependency 'webmock', '~> 3.4' From 27aa2560c7e757a65626d295ba97c8e1c78f5766 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Mon, 14 Oct 2019 18:47:44 +0200 Subject: [PATCH 05/21] update bundler --- .travis.yml | 2 +- google_maps_juice.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1d3f3d7..f51ecb9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ language: ruby rvm: - 2.6.3 -before_install: gem install bundler -v 1.17.3 +before_install: gem install bundler -v 2.0.2 install: bundle install diff --git a/google_maps_juice.gemspec b/google_maps_juice.gemspec index 21bd48a..ceb1e4e 100644 --- a/google_maps_juice.gemspec +++ b/google_maps_juice.gemspec @@ -25,7 +25,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'activesupport', '~> 5.2' spec.add_dependency 'excon' - spec.add_development_dependency 'bundler', '~> 1.17.3' + spec.add_development_dependency 'bundler', '~> 2.0.2' spec.add_development_dependency 'rake', '~> 12.3' spec.add_development_dependency 'rspec', '~> 3.5' spec.add_development_dependency 'webmock', '~> 3.4' From b905e4c18466fcb27f5945790e03c0a1b0513363 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Mon, 14 Oct 2019 18:57:30 +0200 Subject: [PATCH 06/21] Directions: fix and improvements(more) -bugfix Endpoint::Directions validate_geo_coordinate -improvements in Directions::Response -added directions_spec template --- lib/google_maps_juice/directions.rb | 2 +- lib/google_maps_juice/directions/response.rb | 84 +++++++++----- spec/unit/directions_spec.rb | 116 +++++++++++++++++++ 3 files changed, 170 insertions(+), 32 deletions(-) create mode 100644 spec/unit/directions_spec.rb diff --git a/lib/google_maps_juice/directions.rb b/lib/google_maps_juice/directions.rb index 627dd50..df786ff 100644 --- a/lib/google_maps_juice/directions.rb +++ b/lib/google_maps_juice/directions.rb @@ -33,7 +33,7 @@ def validate_directions_params(params) end def validate_geo_coordinate(params) - raise ArgumentError, 'String argument expected' unless params.values.each.is_a?(String) + raise ArgumentError, 'String argument expected' unless params.values.all?(String) geocoords = params.values.map { |x| x.split(',') }.flatten geocoords.map! { |x| Float(x).round(7) } diff --git a/lib/google_maps_juice/directions/response.rb b/lib/google_maps_juice/directions/response.rb index ce4b0d0..45c9a51 100644 --- a/lib/google_maps_juice/directions/response.rb +++ b/lib/google_maps_juice/directions/response.rb @@ -1,53 +1,75 @@ require 'active_support/core_ext/hash/slice' +# TODO: improve handling of legs and steps + module GoogleMapsJuice class Directions::Response < GoogleMapsJuice::Endpoint::Response - def location - result.dig('geometry', 'location') + def results + self['routes'] end - def partial_match? - result['partial_match'] == true + def routes + results.map { |r| Route.new(r) } end - def route + def first routes.first end - def summary - route.first['summary'] - end + class Route + attr_reader :route + def initialize(route) + @route = route + end +=begin + def initialize(params) + @summary = route['summary'] + @legs = route['legs'] + @step = route['legs']['steps'] + @duration = route['duration'] + @distance = route['distance'] + @start_location = route['start_location'] + @end_location = route['end_location'] + @start_address = route['start_address'] + @end_address = route['end_address'] + end +=end - def legs - route['legs'] - end + def summary + route[:summary] + end - def steps - legs['steps'] - end + def legs + route[:legs] + end - def duration - route['duration'] - end + def steps + route.dig[:legs, :steps] + end - def distance - route['distance'] - end + def duration + route[:duration] + end - def start_location - route['start_location'] - end + def distance + route[:distance] + end - def end_location - route['end_location'] - end + def start_location + route[:start_location].to_s + end - def start_address - route['start_address'] - end + def end_location + route[:end_location].to_s + end + + def start_address + route[:start_address] + end - def end_address - route['end_address'] + def end_address + route[:end_address] + end end end end diff --git a/spec/unit/directions_spec.rb b/spec/unit/directions_spec.rb new file mode 100644 index 0000000..f33b0cd --- /dev/null +++ b/spec/unit/directions_spec.rb @@ -0,0 +1,116 @@ +require 'spec_helper' + +ROME = '12.496365,41.902783' +BARI = '16.871871,41.117143' +SIDNEY = '151.206990,-33.867487' + +# TODO: specs of validate_geo_coordinate and validate_location_params + +RSpec.describe GoogleMapsJuice::Directions do + let(:client) { GoogleMapsJuice::Client.new } + let(:directions) { GoogleMapsJuice::Directions.new(client) } + let(:endpoint) { '/directions/json' } + + describe '#directions' do + subject { directions.directions(params) } + + context 'with bad params' do + context 'when params is not a Hash' do + let(:params) { 'foobar' } + + it 'raises ArgumentError' do + expect { subject }.to raise_error( + ArgumentError, + 'Hash argument expected' + ) + end + end + + context 'when some unsupported param is passed' do + let(:params) { { origin: BARI, foo: 'hey', bar: 'man' } } + + it 'raises ArgumentError' do + expect { subject }.to raise_error( + ArgumentError, + 'The following params are not supported: foo, bar' + ) + end + end + + context 'when none of the required params is passed' do + let(:params) { { region: 'US' } } + + it 'raises ArgumentError' do + expect { subject }.to raise_error( + ArgumentError, + 'Any of the following params are required: address, components' + ) + end + end + end + + context 'with good params' do + before do + expect(client).to receive(:get).with(endpoint, params).and_return(response) + end + + context 'rome to bari geo-coordinates' do + let(:response) { response_fixture('directions/rome_to_bari') } + + context 'with right geo-coordinates' do + let(:params) { { + origin: ROME, + destination: BARI + } } + + it 'returns one or more routes' do + expect_rome_to_bari_result(subject) + end + end + end + + context 'rome to sidney' do + let(:response) { response_fixture('geocoding/rome_to_sidney') } + + context 'with right geo-cordinates' do + let(:params) { { + origin: ROME, + destination: SIDNEY + } } + + it 'returns no route result' do + expect_rome_to_sidney_result(subject) + end + end + end + end + end + + def expect_rome_to_bari_result(result) + expect(result).to be_a GoogleMapsJuice::Directions::Response + expect(result.routes.size).to be > 0 + expect(result.routes.first.summary).to eq '...' + expect(result.routes.first.distance).to eq '...' + expect(result.routes.first.duration).to eq '...' + expect(result.routes.first.start_location).to eq '...' + expect(result.routes.first.end_location).to eq '...' + expect(result.routes.first.start_address).to eq '...' + expect(result.routes.first.end_address).to eq '...' + expect(result.routes.first.legs.size).to be > 0 + expect(result.routes.first.steps.size).to be > 0 + end + + def expect_rome_to_sidney_result(result) + expect(result).to be_a GoogleMapsJuice::Directions::Response + expect(result.routes.size).to eq 0 + expect(result.routes.first.summary).to be nil + expect(result.routes.first.distance).to be nil + expect(result.routes.first.duration).to be nil + expect(result.routes.first.start_location).to be nil + expect(result.routes.first.end_location).to be nil + expect(result.routes.first.start_address).to be nil + expect(result.routes.first.end_address).to be nil + expect(result.routes.first.legs.size).to be nil + expect(result.routes.first.steps.size).to be nil + end +end From f19ac2c3e71b5b26b04818d1c5fe4844cc8bebd7 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 11:13:54 +0200 Subject: [PATCH 07/21] Directions::Response: refactoring and improvements(more) - New logic for Route attributes handling - The first Route's leg is the only one if no waypoint has been passed - Now Route handles first_leg as separate variable - All Route attributes are derived from first_leg except summary --- lib/google_maps_juice/directions/response.rb | 42 +++++++------------- 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/lib/google_maps_juice/directions/response.rb b/lib/google_maps_juice/directions/response.rb index 45c9a51..942530c 100644 --- a/lib/google_maps_juice/directions/response.rb +++ b/lib/google_maps_juice/directions/response.rb @@ -1,6 +1,6 @@ -require 'active_support/core_ext/hash/slice' +# frozen_string_literal: true -# TODO: improve handling of legs and steps +require 'active_support/core_ext/hash/slice' module GoogleMapsJuice class Directions::Response < GoogleMapsJuice::Endpoint::Response @@ -17,58 +17,46 @@ def first end class Route - attr_reader :route + attr_reader :route, :first_leg def initialize(route) @route = route + @first_leg = route['legs'].first end -=begin - def initialize(params) - @summary = route['summary'] - @legs = route['legs'] - @step = route['legs']['steps'] - @duration = route['duration'] - @distance = route['distance'] - @start_location = route['start_location'] - @end_location = route['end_location'] - @start_address = route['start_address'] - @end_address = route['end_address'] - end -=end - def summary - route[:summary] + def legs + route['legs'] end - def legs - route[:legs] + def summary + route['summary'] end def steps - route.dig[:legs, :steps] + first_leg['steps'] end def duration - route[:duration] + first_leg['duration'] end def distance - route[:distance] + first_leg['distance'] end def start_location - route[:start_location].to_s + first_leg['start_location'].to_s end def end_location - route[:end_location].to_s + first_leg['end_location'].to_s end def start_address - route[:start_address] + first_leg['start_address'] end def end_address - route[:end_address] + first_leg['end_address'] end end end From f4d3b4501013931feaf09355fc0ed9a62bac5557 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 11:22:31 +0200 Subject: [PATCH 08/21] directions endpoint: refactoring unit tests --- spec/unit/directions_spec.rb | 125 ++++++++++++++++++++++++----------- 1 file changed, 85 insertions(+), 40 deletions(-) diff --git a/spec/unit/directions_spec.rb b/spec/unit/directions_spec.rb index f33b0cd..685ab74 100644 --- a/spec/unit/directions_spec.rb +++ b/spec/unit/directions_spec.rb @@ -1,11 +1,14 @@ +# frozen_string_literal: true + require 'spec_helper' ROME = '12.496365,41.902783' -BARI = '16.871871,41.117143' -SIDNEY = '151.206990,-33.867487' +COLOSSEUM = '41.890209,12.492231' +SAINTPETER = '41.902270,12.457540' +SIDNEY = '-33.867487,151.206990' # TODO: specs of validate_geo_coordinate and validate_location_params - +# TODO: cover the remaining response cases RSpec.describe GoogleMapsJuice::Directions do let(:client) { GoogleMapsJuice::Client.new } let(:directions) { GoogleMapsJuice::Directions.new(client) } @@ -27,7 +30,7 @@ end context 'when some unsupported param is passed' do - let(:params) { { origin: BARI, foo: 'hey', bar: 'man' } } + let(:params) { { origin: ROME, foo: 'hey', bar: 'man' } } it 'raises ArgumentError' do expect { subject }.to raise_error( @@ -37,16 +40,40 @@ end end + # TODO context 'when none of the required params is passed' do let(:params) { { region: 'US' } } it 'raises ArgumentError' do expect { subject }.to raise_error( ArgumentError, - 'Any of the following params are required: address, components' + 'The following params are not supported: region' + ) + end + end + + context 'when wrong geo-coordinate is passed' do + let(:params) { { origin: '0.0000000,0.0000000' } } + + it 'raises ArgumentError' do + expect { subject }.to raise_error( + ArgumentError, + 'Wrong geo-coordinates' ) end end + + context 'when no argument passed' do + let(:params) { {} } + + it 'raises ArgumentError' do + expect { subject }.to raise_error( + ArgumentError, + 'Any of the following params are required: origin, destination' + ) + end + end + end context 'with good params' do @@ -54,63 +81,81 @@ expect(client).to receive(:get).with(endpoint, params).and_return(response) end - context 'rome to bari geo-coordinates' do - let(:response) { response_fixture('directions/rome_to_bari') } + context 'Rome, from Colosseum to Saint Peter' do + let(:response) { response_fixture('directions/colosseum-s_peter') } context 'with right geo-coordinates' do - let(:params) { { - origin: ROME, - destination: BARI - } } + let(:params) do + { + origin: COLOSSEUM, + destination: SAINTPETER + } + end it 'returns one or more routes' do - expect_rome_to_bari_result(subject) + expect_colosseum_to_s_peter_result(subject) end end end - context 'rome to sidney' do - let(:response) { response_fixture('geocoding/rome_to_sidney') } + context 'Rome, from Colosseum to Colosseum' do + let(:response) { response_fixture('directions/colosseum-colosseum') } + + context 'with same geo-coordinates' do + let(:params) do + { + origin: COLOSSEUM, + destination: COLOSSEUM + } + end + + it 'returns single route composed of one leg with one step of 1m and 1min' do + expect_colosseum_to_colosseum_result(subject) + end + end + end + + context 'from Rome to Sidney' do + let(:response) { response_fixture('directions/rome-sydney') } context 'with right geo-cordinates' do - let(:params) { { - origin: ROME, - destination: SIDNEY - } } + let(:params) do + { + origin: ROME, + destination: SIDNEY + } + end - it 'returns no route result' do - expect_rome_to_sidney_result(subject) + it 'raises ZeroResults' do + expect { subject }.to raise_error(GoogleMapsJuice::ZeroResults) end end end end end - def expect_rome_to_bari_result(result) + def expect_colosseum_to_s_peter_result(result) expect(result).to be_a GoogleMapsJuice::Directions::Response + expect(result.routes).to be_a Array expect(result.routes.size).to be > 0 - expect(result.routes.first.summary).to eq '...' - expect(result.routes.first.distance).to eq '...' - expect(result.routes.first.duration).to eq '...' - expect(result.routes.first.start_location).to eq '...' - expect(result.routes.first.end_location).to eq '...' - expect(result.routes.first.start_address).to eq '...' - expect(result.routes.first.end_address).to eq '...' - expect(result.routes.first.legs.size).to be > 0 - expect(result.routes.first.steps.size).to be > 0 + first_route = result.first + expect(first_route).to be_a GoogleMapsJuice::Directions::Response::Route + expect(first_route.summary).to eq 'Via dei Cerchi' + end + + def expect_colosseum_to_colosseum_result(result) + expect(result).to be_a GoogleMapsJuice::Directions::Response + expect(result.routes).to be_a Array + expect(result.routes.size).to be 1 + first_route = result.first + expect(first_route).to be_a GoogleMapsJuice::Directions::Response::Route + expect(first_route.summary).to eq 'Via Celio Vibenna' end def expect_rome_to_sidney_result(result) expect(result).to be_a GoogleMapsJuice::Directions::Response - expect(result.routes.size).to eq 0 - expect(result.routes.first.summary).to be nil - expect(result.routes.first.distance).to be nil - expect(result.routes.first.duration).to be nil - expect(result.routes.first.start_location).to be nil - expect(result.routes.first.end_location).to be nil - expect(result.routes.first.start_address).to be nil - expect(result.routes.first.end_address).to be nil - expect(result.routes.first.legs.size).to be nil - expect(result.routes.first.steps.size).to be nil + expect(result['status']).to eq 'ZERO_RESULTS' + expect(result['routes']).to be Array + expect(result['routes'].size).to be 0 end end From 9fdd29bcededeb3bc3924b36162e39b2e88b7113 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 11:25:16 +0200 Subject: [PATCH 09/21] Directions endpoint integration tests with vcr --- spec/integration/directions_spec.rb | 90 +++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 spec/integration/directions_spec.rb diff --git a/spec/integration/directions_spec.rb b/spec/integration/directions_spec.rb new file mode 100644 index 0000000..1ce7f18 --- /dev/null +++ b/spec/integration/directions_spec.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +require 'spec_helper' + +ROME = '12.496365,41.902783' +COLOSSEUM = '41.890209,12.492231' +SAINTPETER = '41.902270,12.457540' +SIDNEY = '-33.867487,151.206990' + +RSpec.describe GoogleMapsJuice::Directions do + describe '.directions' do + subject { described_class.directions(params) } + + context 'full match on address', vcr: { + cassette_name: 'directions/directions/valid-coordinates' + } do + let(:params) { { origin: COLOSSEUM, destination: SAINTPETER } } + + it 'returns valid route' do + expect(subject).to be_a GoogleMapsJuice::Directions::Response + expect(subject.routes).to be_a Array + expect(subject.routes.size).to be > 0 + first_route = subject.first + expect(first_route).to be_a GoogleMapsJuice::Directions::Response::Route + expect(first_route.summary).to eq 'Via dei Cerchi' + end + end + + context 'wrong parameter passed', vcr: { + cassette_name: 'directions/directions/wrong-parameter' + } do + let(:params) { { address: 'not a geo-coordinate value' } } + + it 'raises ArgumentError' do + expect { subject }.to raise_error(ArgumentError) + end + end + + context 'when valid origin and directions but no route', vcr: { + cassette_name: 'directions/directions/not-valid-route' + } do + let(:params) do + { + origin: ROME, + destination: SIDNEY + } + end + + it 'raises GoogleMapsJuice::ZeroResults' do + expect { subject }.to raise_error(GoogleMapsJuice::ZeroResults) + end + end + + context 'when no parameters passed', vcr: { + cassette_name: 'directions/directions/no-parameters' + } do + let(:params) do + {} + end + + it 'raises GoogleMapsJuice::ArgumentError' do + expect { subject }.to raise_error(ArgumentError) + end + end + + context 'when same origin and destination passed', vcr: { + cassette_name: 'directions/directions/same-origin-destination' + } do + let(:params) do + { + origin: COLOSSEUM, + destination: COLOSSEUM + } + end + + it 'returns single route composed of one step of 1m and 1min' do + expect(subject).to be_a GoogleMapsJuice::Directions::Response + expect(subject.routes).to be_a Array + expect(subject.routes.size).to be 1 + first_route = subject.first + expect(first_route).to be_a GoogleMapsJuice::Directions::Response::Route + expect(first_route.summary).to eq 'Via Celio Vibenna' + duration = {"text"=>"1 min", "value"=>0} + expect(first_route.duration).to eq duration + distance = {"text"=>"1 m", "value"=>0} + expect(first_route.distance).to eq distance + end + end + end +end From 5ff080ea5012db1d7285ff61c66bbe06cf9b7b3a Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 11:32:49 +0200 Subject: [PATCH 10/21] directions specs: vcr cassettes and responses --- .../directions/colosseum-colosseum.json | 93 +++ .../directions/colosseum-s_peter.json | 562 ++++++++++++++++++ .../response/directions/rome-sydney.json | 23 + .../directions/directions/not-valid-route.yml | 54 ++ .../directions/same-origin-destination.yml | 50 ++ .../directions/valid-coordinates.yml | 50 ++ 6 files changed, 832 insertions(+) create mode 100644 spec/fixtures/response/directions/colosseum-colosseum.json create mode 100644 spec/fixtures/response/directions/colosseum-s_peter.json create mode 100644 spec/fixtures/response/directions/rome-sydney.json create mode 100644 spec/fixtures/vcr/directions/directions/not-valid-route.yml create mode 100644 spec/fixtures/vcr/directions/directions/same-origin-destination.yml create mode 100644 spec/fixtures/vcr/directions/directions/valid-coordinates.yml diff --git a/spec/fixtures/response/directions/colosseum-colosseum.json b/spec/fixtures/response/directions/colosseum-colosseum.json new file mode 100644 index 0000000..016bc9c --- /dev/null +++ b/spec/fixtures/response/directions/colosseum-colosseum.json @@ -0,0 +1,93 @@ +{ + "geocoded_waypoints": [ + { + "geocoder_status": "OK", + "place_id": "ChIJrRMgU7ZhLxMRxAOFkC7I8Sg", + "types": [ + "establishment", + "point_of_interest", + "tourist_attraction" + ] + }, + { + "geocoder_status": "OK", + "place_id": "ChIJrRMgU7ZhLxMRxAOFkC7I8Sg", + "types": [ + "establishment", + "point_of_interest", + "tourist_attraction" + ] + } + ], + "routes": [ + { + "bounds": { + "northeast": { + "lat": 41.8892732, + "lng": 12.4921921 + }, + "southwest": { + "lat": 41.8892732, + "lng": 12.4921921 + } + }, + "copyrights": "Map data ©2019 Google", + "legs": [ + { + "distance": { + "text": "1 m", + "value": 0 + }, + "duration": { + "text": "1 min", + "value": 0 + }, + "end_address": "Piazza del Colosseo, 1, 00184 Roma RM, Italy", + "end_location": { + "lat": 41.8892732, + "lng": 12.4921921 + }, + "start_address": "Piazza del Colosseo, 1, 00184 Roma RM, Italy", + "start_location": { + "lat": 41.8892732, + "lng": 12.4921921 + }, + "steps": [ + { + "distance": { + "text": "1 m", + "value": 0 + }, + "duration": { + "text": "1 min", + "value": 0 + }, + "end_location": { + "lat": 41.8892732, + "lng": 12.4921921 + }, + "html_instructions": "Head on Via Celio Vibenna", + "polyline": { + "points": "}nt~Fe{fkA" + }, + "start_location": { + "lat": 41.8892732, + "lng": 12.4921921 + }, + "travel_mode": "DRIVING" + } + ], + "traffic_speed_entry": [], + "via_waypoint": [] + } + ], + "overview_polyline": { + "points": "}nt~Fe{fkA" + }, + "summary": "Via Celio Vibenna", + "warnings": [], + "waypoint_order": [] + } + ], + "status": "OK" +} \ No newline at end of file diff --git a/spec/fixtures/response/directions/colosseum-s_peter.json b/spec/fixtures/response/directions/colosseum-s_peter.json new file mode 100644 index 0000000..1beefb3 --- /dev/null +++ b/spec/fixtures/response/directions/colosseum-s_peter.json @@ -0,0 +1,562 @@ +{ + "geocoded_waypoints": [ + { + "geocoder_status": "OK", + "place_id": "ChIJrRMgU7ZhLxMRxAOFkC7I8Sg", + "types": [ + "establishment", + "point_of_interest", + "tourist_attraction" + ] + }, + { + "geocoder_status": "OK", + "place_id": "ChIJwyrrs2dgLxMR5U-1KUpa5hs", + "types": [ + "street_address" + ] + } + ], + "routes": [ + { + "bounds": { + "northeast": { + "lat": 41.9016488, + "lng": 12.4921921 + }, + "southwest": { + "lat": 41.885123, + "lng": 12.4583003 + } + }, + "copyrights": "Map data ©2019 Google", + "legs": [ + { + "distance": { + "text": "4.5 km", + "value": 4469 + }, + "duration": { + "text": "13 mins", + "value": 792 + }, + "end_address": "Piazza Pio Xii, 1, 00193 Roma RM, Italy", + "end_location": { + "lat": 41.9016488, + "lng": 12.4583003 + }, + "start_address": "Piazza del Colosseo, 1, 00184 Roma RM, Italy", + "start_location": { + "lat": 41.8892732, + "lng": 12.4921921 + }, + "steps": [ + { + "distance": { + "text": "0.2 km", + "value": 181 + }, + "duration": { + "text": "1 min", + "value": 24 + }, + "end_location": { + "lat": 41.8886001, + "lng": 12.4903215 + }, + "html_instructions": "Head west on Via Celio Vibenna toward Piazza del Arco di Costantino", + "polyline": { + "points": "}nt~Fe{fkAAV?f@@^@TDd@?@BPDPFTLZJVNVRXBDTXRV" + }, + "start_location": { + "lat": 41.8892732, + "lng": 12.4921921 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.4 km", + "value": 377 + }, + "duration": { + "text": "1 min", + "value": 56 + }, + "end_location": { + "lat": 41.8852951, + "lng": 12.4893026 + }, + "html_instructions": "Via Celio Vibenna turns slightly left and becomes Via di San Gregorio", + "polyline": { + "points": "wjt~FoofkANHHBJDTFZFx@NNDPDPDH@PDb@HZFRBD@VFB@TD|@Pj@Lh@Jh@Jj@L^FZF" + }, + "start_location": { + "lat": 41.8886001, + "lng": 12.4903215 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.6 km", + "value": 620 + }, + "duration": { + "text": "1 min", + "value": 87 + }, + "end_location": { + "lat": 41.8881916, + "lng": 12.4832384 + }, + "html_instructions": "Turn right onto Via dei Cerchi", + "maneuver": "turn-right", + "polyline": { + "points": "cvs~FcifkAJPFRFTDT@RcAvBWj@i@lA]v@w@`BKTc@bAYn@Yl@i@rAGLUf@A@c@`AYn@CD]t@_@v@ILQ`@Wf@Ud@Q`@" + }, + "start_location": { + "lat": 41.8852951, + "lng": 12.4893026 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.1 km", + "value": 137 + }, + "duration": { + "text": "1 min", + "value": 38 + }, + "end_location": { + "lat": 41.8872258, + "lng": 12.4822184 + }, + "html_instructions": "Turn left onto Via dell'Ara Massima di Ercole", + "maneuver": "turn-left", + "polyline": { + "points": "eht~FgcekAVTf@h@PNz@~@p@z@" + }, + "start_location": { + "lat": 41.8881916, + "lng": 12.4832384 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "45 m", + "value": 45 + }, + "duration": { + "text": "1 min", + "value": 12 + }, + "end_location": { + "lat": 41.8875241, + "lng": 12.4818526 + }, + "html_instructions": "Turn right onto Via della Greca", + "maneuver": "turn-right", + "polyline": { + "points": "ebt~F{|dkAm@t@KR" + }, + "start_location": { + "lat": 41.8872258, + "lng": 12.4822184 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "82 m", + "value": 82 + }, + "duration": { + "text": "1 min", + "value": 26 + }, + "end_location": { + "lat": 41.88803679999999, + "lng": 12.4811533 + }, + "html_instructions": "Continue straight to stay on Via della Greca", + "maneuver": "straight", + "polyline": { + "points": "_dt~FqzdkAURKJOT]n@Wd@" + }, + "start_location": { + "lat": 41.8875241, + "lng": 12.4818526 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "90 m", + "value": 90 + }, + "duration": { + "text": "1 min", + "value": 27 + }, + "end_location": { + "lat": 41.8886441, + "lng": 12.4804459 + }, + "html_instructions": "Continue onto Largo Amerigo Petrucci", + "polyline": { + "points": "ggt~FevdkAQZCBMNOJYTA?CFGJMRMP" + }, + "start_location": { + "lat": 41.88803679999999, + "lng": 12.4811533 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.1 km", + "value": 108 + }, + "duration": { + "text": "1 min", + "value": 17 + }, + "end_location": { + "lat": 41.8895857, + "lng": 12.4801606 + }, + "html_instructions": "Turn right onto Lungotevere Aventino", + "maneuver": "turn-right", + "polyline": { + "points": "_kt~FyqdkAK@]B[B[FYFKBOFGBSHID" + }, + "start_location": { + "lat": 41.8886441, + "lng": 12.4804459 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.2 km", + "value": 242 + }, + "duration": { + "text": "1 min", + "value": 34 + }, + "end_location": { + "lat": 41.8913812, + "lng": 12.4785865 + }, + "html_instructions": "Continue onto Lungotevere dei Pierleoni
Entering toll zone
", + "polyline": { + "points": "}pt~F_pdkAKBQHGBYJ_@RSLWP?@_@Vy@p@[VC@u@`AEFGJABYf@" + }, + "start_location": { + "lat": 41.8895857, + "lng": 12.4801606 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.3 km", + "value": 343 + }, + "duration": { + "text": "1 min", + "value": 63 + }, + "end_location": { + "lat": 41.8917832, + "lng": 12.4746437 + }, + "html_instructions": "Continue onto Lungotevere de' Cenci", + "polyline": { + "points": "c|t~FefdkAILWf@Sf@W|@O`AOxBAnAPzDDfAFhB" + }, + "start_location": { + "lat": 41.8913812, + "lng": 12.4785865 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.3 km", + "value": 312 + }, + "duration": { + "text": "1 min", + "value": 52 + }, + "end_location": { + "lat": 41.8927341, + "lng": 12.4713105 + }, + "html_instructions": "Continue onto Lungotevere dei Vallati", + "polyline": { + "points": "s~t~FomckA@\\D~@?\\@VAb@Aj@Cf@E\\Gf@GZGXQl@GPEHKVaAhBORc@p@" + }, + "start_location": { + "lat": 41.8917832, + "lng": 12.4746437 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.6 km", + "value": 571 + }, + "duration": { + "text": "1 min", + "value": 67 + }, + "end_location": { + "lat": 41.8964541, + "lng": 12.4665528 + }, + "html_instructions": "Continue onto Lungotevere dei Tebaldi", + "polyline": { + "points": "qdu~FuxbkAW^A@m@z@e@n@U^KRuAhBQXwAnBmAvAa@j@eCnDm@z@mAbBIJ[`@" + }, + "start_location": { + "lat": 41.8927341, + "lng": 12.4713105 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.4 km", + "value": 425 + }, + "duration": { + "text": "1 min", + "value": 65 + }, + "end_location": { + "lat": 41.899799, + "lng": 12.464241 + }, + "html_instructions": "Continue onto Lungotevere dei Sangallo", + "polyline": { + "points": "y{u~F}zakAm@|@KLORUTSNq@`@aAl@ULq@`@YPULQJkC~AIHIB]TKFYFQ@O@e@B" + }, + "start_location": { + "lat": 41.8964541, + "lng": 12.4665528 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.1 km", + "value": 120 + }, + "duration": { + "text": "1 min", + "value": 34 + }, + "end_location": { + "lat": 41.9007314, + "lng": 12.4648744 + }, + "html_instructions": "Continue straight onto Lungotevere dei Fiorentini", + "maneuver": "straight", + "polyline": { + "points": "wpv~FolakAYEa@Ik@M][IKOUYa@" + }, + "start_location": { + "lat": 41.899799, + "lng": 12.464241 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.1 km", + "value": 127 + }, + "duration": { + "text": "1 min", + "value": 37 + }, + "end_location": { + "lat": 41.9015424, + "lng": 12.4637941 + }, + "html_instructions": "Turn left onto Ponte Vittorio Emanuele II
Leaving toll zone
", + "maneuver": "turn-left", + "polyline": { + "points": "qvv~FmpakAORu@dA?@s@dAU\\KLEH" + }, + "start_location": { + "lat": 41.9007314, + "lng": 12.4648744 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.2 km", + "value": 226 + }, + "duration": { + "text": "1 min", + "value": 53 + }, + "end_location": { + "lat": 41.8997924, + "lng": 12.4625573 + }, + "html_instructions": "Turn left onto Lungotevere in Sassia", + "maneuver": "turn-left", + "polyline": { + "points": "s{v~FuiakAT`@HHFHFHHFX^JLLJ@BRLTLRHXJJBj@LXFPDRBJDHDBDBF" + }, + "start_location": { + "lat": 41.9015424, + "lng": 12.4637941 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "28 m", + "value": 28 + }, + "duration": { + "text": "1 min", + "value": 5 + }, + "end_location": { + "lat": 41.8997196, + "lng": 12.46223 + }, + "html_instructions": "Turn right onto Galleria Principe Amedeo Savoia Aosta", + "maneuver": "turn-right", + "polyline": { + "points": "upv~F_bakABTHj@" + }, + "start_location": { + "lat": 41.8997924, + "lng": 12.4625573 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "11 m", + "value": 11 + }, + "duration": { + "text": "1 min", + "value": 2 + }, + "end_location": { + "lat": 41.8997597, + "lng": 12.4621051 + }, + "html_instructions": "Turn right onto Via di Porta Santo Spirito", + "maneuver": "turn-right", + "polyline": { + "points": "gpv~F}_akAGV" + }, + "start_location": { + "lat": 41.8997196, + "lng": 12.46223 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "71 m", + "value": 71 + }, + "duration": { + "text": "1 min", + "value": 16 + }, + "end_location": { + "lat": 41.9002868, + "lng": 12.4616292 + }, + "html_instructions": "Slight right to stay on Via di Porta Santo Spirito", + "maneuver": "turn-slight-right", + "polyline": { + "points": "opv~Fe_akAIRURe@\\KFWP" + }, + "start_location": { + "lat": 41.8997597, + "lng": 12.4621051 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.2 km", + "value": 152 + }, + "duration": { + "text": "1 min", + "value": 34 + }, + "end_location": { + "lat": 41.9014701, + "lng": 12.4607148 + }, + "html_instructions": "Continue onto Via dei Penitenzieri", + "polyline": { + "points": "ysv~Fe|`kAYPABGDMJMHe@Zi@`@UNeAv@" + }, + "start_location": { + "lat": 41.9002868, + "lng": 12.4616292 + }, + "travel_mode": "DRIVING" + }, + { + "distance": { + "text": "0.2 km", + "value": 201 + }, + "duration": { + "text": "1 min", + "value": 43 + }, + "end_location": { + "lat": 41.9016488, + "lng": 12.4583003 + }, + "html_instructions": "Via dei Penitenzieri turns left and becomes Borgo Santo Spirito", + "polyline": { + "points": "e{v~Fmv`kA?FATG|CCj@KdCCl@Ap@CR" + }, + "start_location": { + "lat": 41.9014701, + "lng": 12.4607148 + }, + "travel_mode": "DRIVING" + } + ], + "traffic_speed_entry": [], + "via_waypoint": [] + } + ], + "overview_polyline": { + "points": "}nt~Fe{fkA@tBNjATp@Zn@`ApAXL`@LvBb@~Cl@bHtAZFJPNh@Fh@{AbDkC|FaCtF_D|GiA|BQ`@VTx@x@lBzBy@hAa@^m@dA{@tAo@h@U^MPK@y@Fu@Nc@N{@\\aAb@kAx@uAhAy@bAi@~@a@t@k@dBO`AOxBAnAPzDLpDF|A@t@CnAIdAObAg@bBmA`Cs@dAmBlCa@r@gBbCwAnBmAvAgDzEaDlEy@jAe@h@eAp@wAz@sBlA}DbCe@Na@Be@BYEmAWg@g@i@w@yB`Da@j@EHT`@PRPPt@|@h@Zl@TbB^^HLJF\\Hj@GVIRURq@d@{@l@kBrA{AfAA\\KhEOrDEdA" + }, + "summary": "Via dei Cerchi", + "warnings": [], + "waypoint_order": [] + } + ], + "status": "OK" +} \ No newline at end of file diff --git a/spec/fixtures/response/directions/rome-sydney.json b/spec/fixtures/response/directions/rome-sydney.json new file mode 100644 index 0000000..ab89faf --- /dev/null +++ b/spec/fixtures/response/directions/rome-sydney.json @@ -0,0 +1,23 @@ +{ + "geocoded_waypoints": [ + { + "geocoder_status": "OK", + "place_id": "ChIJu46S-ZZhLxMROG5lkwZ3D7k", + "types": [ + "locality", + "political" + ] + }, + { + "geocoder_status": "OK", + "place_id": "ChIJP3Sa8ziYEmsRUKgyFmh9AQM", + "types": [ + "colloquial_area", + "locality", + "political" + ] + } + ], + "routes": [], + "status": "ZERO_RESULTS" +} \ No newline at end of file diff --git a/spec/fixtures/vcr/directions/directions/not-valid-route.yml b/spec/fixtures/vcr/directions/directions/not-valid-route.yml new file mode 100644 index 0000000..626f485 --- /dev/null +++ b/spec/fixtures/vcr/directions/directions/not-valid-route.yml @@ -0,0 +1,54 @@ +--- +http_interactions: +- request: + method: get + uri: https://maps.googleapis.com/maps/api/directions/json?destination=-33.867487%2C151.206990&key=&origin=12.496365%2C41.902783 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - excon/0.67.0 + Accept: + - "*/*" + response: + status: + code: 200 + message: + headers: + Content-Type: + - application/json; charset=UTF-8 + Date: + - Tue, 15 Oct 2019 13:36:10 GMT + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Cache-Control: + - no-cache, must-revalidate + Server: + - mafe + X-XSS-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + Server-Timing: + - gfet4t7; dur=53 + Alt-Svc: + - quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; + ma=2592000,h3-Q043=":443"; ma=2592000 + Accept-Ranges: + - none + Vary: + - Accept-Language,Accept-Encoding + body: + encoding: ASCII-8BIT + string: | + { + "geocoded_waypoints" : [ {}, {} ], + "routes" : [], + "status" : "ZERO_RESULTS" + } + http_version: + recorded_at: Tue, 15 Oct 2019 13:36:10 GMT +recorded_with: VCR 4.0.0 diff --git a/spec/fixtures/vcr/directions/directions/same-origin-destination.yml b/spec/fixtures/vcr/directions/directions/same-origin-destination.yml new file mode 100644 index 0000000..611e218 --- /dev/null +++ b/spec/fixtures/vcr/directions/directions/same-origin-destination.yml @@ -0,0 +1,50 @@ +--- +http_interactions: +- request: + method: get + uri: https://maps.googleapis.com/maps/api/directions/json?destination=41.890209%2C12.492231&key=&origin=41.890209%2C12.492231 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - excon/0.67.0 + Accept: + - "*/*" + response: + status: + code: 200 + message: + headers: + Content-Type: + - application/json; charset=UTF-8 + Date: + - Tue, 15 Oct 2019 13:43:25 GMT + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Cache-Control: + - no-cache, must-revalidate + Server: + - mafe + X-XSS-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + Server-Timing: + - gfet4t7; dur=61 + Alt-Svc: + - quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; + ma=2592000,h3-Q043=":443"; ma=2592000 + Accept-Ranges: + - none + Vary: + - Accept-Language,Accept-Encoding + body: + encoding: ASCII-8BIT + string: !binary |- + ewogICAiZ2VvY29kZWRfd2F5cG9pbnRzIiA6IFsKICAgICAgewogICAgICAgICAiZ2VvY29kZXJfc3RhdHVzIiA6ICJPSyIsCiAgICAgICAgICJwbGFjZV9pZCIgOiAiQ2hJSnJSTWdVN1poTHhNUnhBT0ZrQzdJOFNnIiwKICAgICAgICAgInR5cGVzIiA6IFsgImVzdGFibGlzaG1lbnQiLCAicG9pbnRfb2ZfaW50ZXJlc3QiLCAidG91cmlzdF9hdHRyYWN0aW9uIiBdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAgImdlb2NvZGVyX3N0YXR1cyIgOiAiT0siLAogICAgICAgICAicGxhY2VfaWQiIDogIkNoSUpyUk1nVTdaaEx4TVJ4QU9Ga0M3SThTZyIsCiAgICAgICAgICJ0eXBlcyIgOiBbICJlc3RhYmxpc2htZW50IiwgInBvaW50X29mX2ludGVyZXN0IiwgInRvdXJpc3RfYXR0cmFjdGlvbiIgXQogICAgICB9CiAgIF0sCiAgICJyb3V0ZXMiIDogWwogICAgICB7CiAgICAgICAgICJib3VuZHMiIDogewogICAgICAgICAgICAibm9ydGhlYXN0IiA6IHsKICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXRod2VzdCIgOiB7CiAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgIH0KICAgICAgICAgfSwKICAgICAgICAgImNvcHlyaWdodHMiIDogIk1hcCBkYXRhIMKpMjAxOSBHb29nbGUiLAogICAgICAgICAibGVncyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbSIsCiAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAwCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAwCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJlbmRfYWRkcmVzcyIgOiAiUGlhenphIGRlbCBDb2xvc3NlbywgMSwgMDAxODQgUm9tYSBSTSwgSXRhbHkiLAogICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgInN0YXJ0X2FkZHJlc3MiIDogIlBpYXp6YSBkZWwgQ29sb3NzZW8sIDEsIDAwMTg0IFJvbWEgUk0sIEl0YWx5IiwKICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgInN0ZXBzIiA6IFsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDAKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDAKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiSGVhZCBvbiBcdTAwM2NiXHUwMDNlVmlhIENlbGlvIFZpYmVubmFcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogIn1udH5GZXtma0EiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAidHJhZmZpY19zcGVlZF9lbnRyeSIgOiBbXSwKICAgICAgICAgICAgICAgInZpYV93YXlwb2ludCIgOiBbXQogICAgICAgICAgICB9CiAgICAgICAgIF0sCiAgICAgICAgICJvdmVydmlld19wb2x5bGluZSIgOiB7CiAgICAgICAgICAgICJwb2ludHMiIDogIn1udH5GZXtma0EiCiAgICAgICAgIH0sCiAgICAgICAgICJzdW1tYXJ5IiA6ICJWaWEgQ2VsaW8gVmliZW5uYSIsCiAgICAgICAgICJ3YXJuaW5ncyIgOiBbXSwKICAgICAgICAgIndheXBvaW50X29yZGVyIiA6IFtdCiAgICAgIH0KICAgXSwKICAgInN0YXR1cyIgOiAiT0siCn0K + http_version: + recorded_at: Tue, 15 Oct 2019 13:43:25 GMT +recorded_with: VCR 4.0.0 diff --git a/spec/fixtures/vcr/directions/directions/valid-coordinates.yml b/spec/fixtures/vcr/directions/directions/valid-coordinates.yml new file mode 100644 index 0000000..ddd23d5 --- /dev/null +++ b/spec/fixtures/vcr/directions/directions/valid-coordinates.yml @@ -0,0 +1,50 @@ +--- +http_interactions: +- request: + method: get + uri: https://maps.googleapis.com/maps/api/directions/json?destination=41.902270%2C12.457540&key=&origin=41.890209%2C12.492231 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - excon/0.67.0 + Accept: + - "*/*" + response: + status: + code: 200 + message: + headers: + Content-Type: + - application/json; charset=UTF-8 + Date: + - Tue, 15 Oct 2019 13:36:10 GMT + Pragma: + - no-cache + Expires: + - Fri, 01 Jan 1990 00:00:00 GMT + Cache-Control: + - no-cache, must-revalidate + Server: + - mafe + X-XSS-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + Server-Timing: + - gfet4t7; dur=202 + Alt-Svc: + - quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; + ma=2592000,h3-Q043=":443"; ma=2592000 + Accept-Ranges: + - none + Vary: + - Accept-Language,Accept-Encoding + body: + encoding: ASCII-8BIT + string: !binary |- + ewogICAiZ2VvY29kZWRfd2F5cG9pbnRzIiA6IFsKICAgICAgewogICAgICAgICAiZ2VvY29kZXJfc3RhdHVzIiA6ICJPSyIsCiAgICAgICAgICJwbGFjZV9pZCIgOiAiQ2hJSnJSTWdVN1poTHhNUnhBT0ZrQzdJOFNnIiwKICAgICAgICAgInR5cGVzIiA6IFsgImVzdGFibGlzaG1lbnQiLCAicG9pbnRfb2ZfaW50ZXJlc3QiLCAidG91cmlzdF9hdHRyYWN0aW9uIiBdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAgImdlb2NvZGVyX3N0YXR1cyIgOiAiT0siLAogICAgICAgICAicGxhY2VfaWQiIDogIkNoSUp3eXJyczJkZ0x4TVI1VS0xS1VwYTVocyIsCiAgICAgICAgICJ0eXBlcyIgOiBbICJzdHJlZXRfYWRkcmVzcyIgXQogICAgICB9CiAgIF0sCiAgICJyb3V0ZXMiIDogWwogICAgICB7CiAgICAgICAgICJib3VuZHMiIDogewogICAgICAgICAgICAibm9ydGhlYXN0IiA6IHsKICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDE2NDg4LAogICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXRod2VzdCIgOiB7CiAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg1MTIzLAogICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ1ODMwMDMKICAgICAgICAgICAgfQogICAgICAgICB9LAogICAgICAgICAiY29weXJpZ2h0cyIgOiAiTWFwIGRhdGEgwqkyMDE5IEdvb2dsZSIsCiAgICAgICAgICJsZWdzIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAidGV4dCIgOiAiNC41IGttIiwKICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDQ0NjkKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEzIG1pbnMiLAogICAgICAgICAgICAgICAgICAidmFsdWUiIDogNzkyCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJlbmRfYWRkcmVzcyIgOiAiUGlhenphIFBpbyBYaWksIDEsIDAwMTkzIFJvbWEgUk0sIEl0YWx5IiwKICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAxNjQ4OCwKICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NTgzMDAzCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJzdGFydF9hZGRyZXNzIiA6ICJQaWF6emEgZGVsIENvbG9zc2VvLCAxLCAwMDE4NCBSb21hIFJNLCBJdGFseSIsCiAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJzdGVwcyIgOiBbCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuMiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAxODEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDI0CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4ODYwMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDkwMzIxNQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIkhlYWQgXHUwMDNjYlx1MDAzZXdlc3RcdTAwM2MvYlx1MDAzZSBvbiBcdTAwM2NiXHUwMDNlVmlhIENlbGlvIFZpYmVubmFcdTAwM2MvYlx1MDAzZSB0b3dhcmQgXHUwMDNjYlx1MDAzZVBpYXp6YSBkZWwgQXJjbyBkaSBDb3N0YW50aW5vXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJ9bnR+RmV7ZmtBQVY/ZkBAXkBURGRAP0BCUERQRlRMWkpWTlZSWEJEVFhSViIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjQga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMzc3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA1NgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODUyOTUxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4OTMwMjYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJcdTAwM2NiXHUwMDNlVmlhIENlbGlvIFZpYmVubmFcdTAwM2MvYlx1MDAzZSB0dXJucyBzbGlnaHRseSBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIGFuZCBiZWNvbWVzIFx1MDAzY2JcdTAwM2VWaWEgZGkgU2FuIEdyZWdvcmlvXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJ3anR+Rm9vZmtBTkhIQkpEVEZaRnhATk5EUERQREhAUERiQEhaRlJCREBWRkJAVER8QFBqQExoQEpoQEpqQExeRlpGIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4ODYwMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDkwMzIxNQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuNiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA2MjAKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDg3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4ODE5MTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDgzMjM4NAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlR1cm4gXHUwMDNjYlx1MDAzZXJpZ2h0XHUwMDNjL2JcdTAwM2Ugb250byBcdTAwM2NiXHUwMDNlVmlhIGRlaSBDZXJjaGlcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogImN2c35GY2lma0FKUEZSRlREVEBSY0F2QldqQGlAbEFddkB3QGBCS1RjQGJBWW5AWWxAaUByQUdMVWZAQUBjQGBBWW5AQ0RddEBfQHZASUxRYEBXZkBVZEBRYEAiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg1Mjk1MSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODkzMDI2CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4xIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDEzNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMzgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg3MjI1OCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODIyMTg0CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiVHVybiBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZVZpYSBkZWxsJ0FyYSBNYXNzaW1hIGRpIEVyY29sZVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJ0dXJuLWxlZnQiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJlaHR+RmdjZWtBVlRmQGhAUE56QH5AcEB6QCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODgxOTE2LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MzIzODQKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICI0NSBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDQ1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAxMgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODc1MjQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MTg1MjYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJUdXJuIFx1MDAzY2JcdTAwM2VyaWdodFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZVZpYSBkZWxsYSBHcmVjYVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJ0dXJuLXJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAiZWJ0fkZ7fGRrQW1AdEBLUiIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODcyMjU4LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MjIxODQKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICI4MiBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDgyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyNgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODgwMzY3OTk5OTk5OSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODExNTMzCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiQ29udGludWUgc3RyYWlnaHQgdG8gc3RheSBvbiBcdTAwM2NiXHUwMDNlVmlhIGRlbGxhIEdyZWNhXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAibWFuZXV2ZXIiIDogInN0cmFpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAiX2R0fkZxemRrQVVSS0pPVF1uQFdkQCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODc1MjQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MTg1MjYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICI5MCBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDkwCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODg2NDQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MDQ0NTkKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VMYXJnbyBBbWVyaWdvIFBldHJ1Y2NpXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJnZ3R+RmV2ZGtBUVpDQk1OT0pZVEE/Q0ZHSk1STVAiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg4MDM2Nzk5OTk5OTksCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDgxMTUzMwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuMSBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAxMDgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDE3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4OTU4NTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDgwMTYwNgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlR1cm4gXHUwMDNjYlx1MDAzZXJpZ2h0XHUwMDNjL2JcdTAwM2Ugb250byBcdTAwM2NiXHUwMDNlTHVuZ290ZXZlcmUgQXZlbnRpbm9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogIl9rdH5GeXFka0FLQF1CW0JbRllGS0JPRkdCU0hJRCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODg2NDQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MDQ0NTkKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjIga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMjQyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAzNAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTEzODEyLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ3ODU4NjUKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VMdW5nb3RldmVyZSBkZWkgUGllcmxlb25pXHUwMDNjL2JcdTAwM2VcdTAwM2NkaXYgc3R5bGU9XCJmb250LXNpemU6MC45ZW1cIlx1MDAzZUVudGVyaW5nIHRvbGwgem9uZVx1MDAzYy9kaXZcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJ9cHR+Rl9wZGtBS0JRSEdCWUpfQFJTTFdQP0BfQFZ5QHBAW1ZDQHVAYEFFRkdKQUJZZkAiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5NTg1NywKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODAxNjA2CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4zIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDM0MwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogNjMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODkxNzgzMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NzQ2NDM3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiQ29udGludWUgb250byBcdTAwM2NiXHUwMDNlTHVuZ290ZXZlcmUgZGUnIENlbmNpXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJjfHR+RmVmZGtBSUxXZkBTZkBXfEBPYEFPeEJBbkFQekREZkFGaEIiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODkxMzgxMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40Nzg1ODY1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4zIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDMxMgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogNTIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODkyNzM0MSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NzEzMTA1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiQ29udGludWUgb250byBcdTAwM2NiXHUwMDNlTHVuZ290ZXZlcmUgZGVpIFZhbGxhdGlcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogInN+dH5Gb21ja0FAXFxEfkA/XFxAVkFiQEFqQENmQEVcXEdmQEdaR1hRbEBHUEVIS1ZhQWhCT1JjQHBAIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5MTc4MzIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDc0NjQzNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuNiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA1NzEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDY3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5NjQ1NDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDY2NTUyOAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIkNvbnRpbnVlIG9udG8gXHUwMDNjYlx1MDAzZUx1bmdvdGV2ZXJlIGRlaSBUZWJhbGRpXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJxZHV+RnV4YmtBV15BQG1AekBlQG5AVV5LUnVBaEJRWHdBbkJtQXZBYUBqQGVDbkRtQHpAbUFiQklKW2BAIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5MjczNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDcxMzEwNQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuNCBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA0MjUKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDY1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5OTc5OSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjQyNDEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VMdW5nb3RldmVyZSBkZWkgU2FuZ2FsbG9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogInl7dX5GfXpha0FtQHxAS0xPUlVUU05xQGBAYUFsQFVMcUBgQFlQVUxRSmtDfkFJSElCXVRLRllGUUBPQGVAQiIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTY0NTQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2NjU1MjgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjEga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMTIwCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAzNAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDA3MzE0LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2NDg3NDQKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBzdHJhaWdodCBvbnRvIFx1MDAzY2JcdTAwM2VMdW5nb3RldmVyZSBkZWkgRmlvcmVudGluaVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJzdHJhaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogIndwdn5Gb2xha0FZRWFASWtATV1bSUtPVVlhQCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3OTksCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDY0MjQxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4xIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDEyNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMzcKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAxNTQyNCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjM3OTQxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiVHVybiBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZVBvbnRlIFZpdHRvcmlvIEVtYW51ZWxlIElJXHUwMDNjL2JcdTAwM2VcdTAwM2NkaXYgc3R5bGU9XCJmb250LXNpemU6MC45ZW1cIlx1MDAzZUxlYXZpbmcgdG9sbCB6b25lXHUwMDNjL2Rpdlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1sZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAicXZ2fkZtcGFrQU9SdUBkQT9Ac0BkQVVcXEtMRUgiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAwNzMxNCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjQ4NzQ0CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4yIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDIyNgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogNTMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODk5NzkyNCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjI1NTczCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiVHVybiBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZUx1bmdvdGV2ZXJlIGluIFNhc3NpYVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJ0dXJuLWxlZnQiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJze3Z+RnVpYWtBVGBASEhGSEZISEZYXkpMTEpAQlJMVExSSFhKSkJqQExYRlBEUkJKREhEQkRCRiIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDE1NDI0LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2Mzc5NDEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIyOCBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDI4CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5OTcxOTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDYyMjMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJUdXJuIFx1MDAzY2JcdTAwM2VyaWdodFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZUdhbGxlcmlhIFByaW5jaXBlIEFtZWRlbyBTYXZvaWEgQW9zdGFcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogInVwdn5GX2Jha0FCVEhqQCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3OTI0LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MjU1NzMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxMSBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDExCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5OTc1OTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDYyMTA1MQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlR1cm4gXHUwMDNjYlx1MDAzZXJpZ2h0XHUwMDNjL2JcdTAwM2Ugb250byBcdTAwM2NiXHUwMDNlVmlhIGRpIFBvcnRhIFNhbnRvIFNwaXJpdG9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogImdwdn5GfV9ha0FHViIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3MTk2LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MjIzCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiNzEgbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA3MQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMTYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAwMjg2OCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjE2MjkyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiU2xpZ2h0IFx1MDAzY2JcdTAwM2VyaWdodFx1MDAzYy9iXHUwMDNlIHRvIHN0YXkgb24gXHUwMDNjYlx1MDAzZVZpYSBkaSBQb3J0YSBTYW50byBTcGlyaXRvXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAibWFuZXV2ZXIiIDogInR1cm4tc2xpZ2h0LXJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAib3B2fkZlX2FrQUlSVVJlQFxcS0ZXUCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3NTk3LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MjEwNTEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjIga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMTUyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAzNAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDE0NzAxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MDcxNDgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VWaWEgZGVpIFBlbml0ZW56aWVyaVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAieXN2fkZlfGBrQVlQQUJHRE1KTUhlQFppQGBAVU5lQXZAIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjkwMDI4NjgsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDYxNjI5MgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuMiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyMDEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDQzCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjkwMTY0ODgsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDU4MzAwMwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlx1MDAzY2JcdTAwM2VWaWEgZGVpIFBlbml0ZW56aWVyaVx1MDAzYy9iXHUwMDNlIHR1cm5zIFx1MDAzY2JcdTAwM2VsZWZ0XHUwMDNjL2JcdTAwM2UgYW5kIGJlY29tZXMgXHUwMDNjYlx1MDAzZUJvcmdvIFNhbnRvIFNwaXJpdG9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogImV7dn5GbXZga0E/RkFUR3xDQ2pAS2RDQ2xAQXBAQ1IiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAxNDcwMSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjA3MTQ4CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAidHJhZmZpY19zcGVlZF9lbnRyeSIgOiBbXSwKICAgICAgICAgICAgICAgInZpYV93YXlwb2ludCIgOiBbXQogICAgICAgICAgICB9CiAgICAgICAgIF0sCiAgICAgICAgICJvdmVydmlld19wb2x5bGluZSIgOiB7CiAgICAgICAgICAgICJwb2ludHMiIDogIn1udH5GZXtma0FAdEJOakFUcEBabkBgQXBBWExgQEx2QmJAfkNsQGJIdEFaRkpQTmhARmhAe0FiRGtDfEZhQ3RGX0R8R2lBfEJRYEBWVHhAeEBsQnpCeUBoQWFAXm1AZEF7QHRBb0BoQFVeTVBLQHlARnVATmNATntAXFxhQWJAa0F4QHVBaEF5QGJBaUB+QGFAdEBrQGRCT2BBT3hCQW5BUHpETHBERnxBQHRAQ25BSWRBT2JBZ0BiQm1BYENzQGRBbUJsQ2FAckBnQmJDd0FuQm1BdkFnRHpFYURsRXlAakFlQGhAZUFwQHdBekBzQmxBfURiQ2VATmFAQmVAQllFbUFXZ0BnQGlAd0B5QmBEYUBqQEVIVGBAUFJQUHRAfEBoQFpsQFRiQl5eSExKRlxcSGpAR1ZJUlVScUBkQHtAbEBrQnJBe0FmQUFcXEtoRU9yREVkQSIKICAgICAgICAgfSwKICAgICAgICAgInN1bW1hcnkiIDogIlZpYSBkZWkgQ2VyY2hpIiwKICAgICAgICAgIndhcm5pbmdzIiA6IFtdLAogICAgICAgICAid2F5cG9pbnRfb3JkZXIiIDogW10KICAgICAgfQogICBdLAogICAic3RhdHVzIiA6ICJPSyIKfQo= + http_version: + recorded_at: Tue, 15 Oct 2019 13:36:10 GMT +recorded_with: VCR 4.0.0 From 3eed0890d14d83a2d2cdbe06e69d160c57ea6982 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 12:19:07 +0200 Subject: [PATCH 11/21] bundler: downgrade to 1.17.2 --- google_maps_juice.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google_maps_juice.gemspec b/google_maps_juice.gemspec index ceb1e4e..e745b95 100644 --- a/google_maps_juice.gemspec +++ b/google_maps_juice.gemspec @@ -25,7 +25,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'activesupport', '~> 5.2' spec.add_dependency 'excon' - spec.add_development_dependency 'bundler', '~> 2.0.2' + spec.add_development_dependency 'bundler', '~> 1.17.2' spec.add_development_dependency 'rake', '~> 12.3' spec.add_development_dependency 'rspec', '~> 3.5' spec.add_development_dependency 'webmock', '~> 3.4' From 8821e8e3ccf57ed8581155c68d9cca152797651e Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 12:27:12 +0200 Subject: [PATCH 12/21] bundler: downgrade fix --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f51ecb9..a8502f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ language: ruby rvm: - 2.6.3 -before_install: gem install bundler -v 2.0.2 +before_install: gem install bundler -v 1.17.2 install: bundle install From 09cba66a361333b898cde581289370ca146ec3fe Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 15:48:04 +0200 Subject: [PATCH 13/21] Directions.directions: renamed as Directions.find (+) - replaced .directions with .find in all files - updated names of vcr cassettes' folders --- lib/google_maps_juice/directions.rb | 11 +++++------ .../{directions => find}/not-valid-route.yml | 6 +++--- .../same-origin-destination.yml | 6 +++--- .../{directions => find}/valid-coordinates.yml | 6 +++--- spec/integration/directions_spec.rb | 14 +++++++------- spec/unit/directions_spec.rb | 2 +- 6 files changed, 22 insertions(+), 23 deletions(-) rename spec/fixtures/vcr/directions/{directions => find}/not-valid-route.yml (91%) rename spec/fixtures/vcr/directions/{directions => find}/same-origin-destination.yml (97%) rename spec/fixtures/vcr/directions/{directions => find}/valid-coordinates.yml (99%) diff --git a/lib/google_maps_juice/directions.rb b/lib/google_maps_juice/directions.rb index df786ff..0195f0e 100644 --- a/lib/google_maps_juice/directions.rb +++ b/lib/google_maps_juice/directions.rb @@ -6,23 +6,22 @@ class Directions < Endpoint autoload :Response, 'google_maps_juice/directions/response' class << self - def directions(params, api_key: GoogleMapsJuice.config.api_key) + def find(params, api_key: GoogleMapsJuice.config.api_key) client = GoogleMapsJuice::Client.new(api_key: api_key) - new(client).directions(params) + new(client).find(params) end end - def directions(params) - validate_directions_params(params) + def find(params) + validate_find_params(params) response_text = @client.get("#{ENDPOINT}/json", params) response = JSON.parse(response_text, object_class: Response) detect_errors(response) end - def validate_directions_params(params) + def validate_find_params(params) raise ArgumentError, 'Hash argument expected' unless params.is_a?(Hash) - # latitude longitude supported_keys = %w[origin destination] validate_supported_params(params, supported_keys) diff --git a/spec/fixtures/vcr/directions/directions/not-valid-route.yml b/spec/fixtures/vcr/directions/find/not-valid-route.yml similarity index 91% rename from spec/fixtures/vcr/directions/directions/not-valid-route.yml rename to spec/fixtures/vcr/directions/find/not-valid-route.yml index 626f485..cc8ddee 100644 --- a/spec/fixtures/vcr/directions/directions/not-valid-route.yml +++ b/spec/fixtures/vcr/directions/find/not-valid-route.yml @@ -19,7 +19,7 @@ http_interactions: Content-Type: - application/json; charset=UTF-8 Date: - - Tue, 15 Oct 2019 13:36:10 GMT + - Wed, 16 Oct 2019 13:22:14 GMT Pragma: - no-cache Expires: @@ -33,7 +33,7 @@ http_interactions: X-Frame-Options: - SAMEORIGIN Server-Timing: - - gfet4t7; dur=53 + - gfet4t7; dur=65 Alt-Svc: - quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000 @@ -50,5 +50,5 @@ http_interactions: "status" : "ZERO_RESULTS" } http_version: - recorded_at: Tue, 15 Oct 2019 13:36:10 GMT + recorded_at: Wed, 16 Oct 2019 13:22:14 GMT recorded_with: VCR 4.0.0 diff --git a/spec/fixtures/vcr/directions/directions/same-origin-destination.yml b/spec/fixtures/vcr/directions/find/same-origin-destination.yml similarity index 97% rename from spec/fixtures/vcr/directions/directions/same-origin-destination.yml rename to spec/fixtures/vcr/directions/find/same-origin-destination.yml index 611e218..e48f76f 100644 --- a/spec/fixtures/vcr/directions/directions/same-origin-destination.yml +++ b/spec/fixtures/vcr/directions/find/same-origin-destination.yml @@ -19,7 +19,7 @@ http_interactions: Content-Type: - application/json; charset=UTF-8 Date: - - Tue, 15 Oct 2019 13:43:25 GMT + - Wed, 16 Oct 2019 13:22:14 GMT Pragma: - no-cache Expires: @@ -33,7 +33,7 @@ http_interactions: X-Frame-Options: - SAMEORIGIN Server-Timing: - - gfet4t7; dur=61 + - gfet4t7; dur=47 Alt-Svc: - quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000 @@ -46,5 +46,5 @@ http_interactions: string: !binary |- ewogICAiZ2VvY29kZWRfd2F5cG9pbnRzIiA6IFsKICAgICAgewogICAgICAgICAiZ2VvY29kZXJfc3RhdHVzIiA6ICJPSyIsCiAgICAgICAgICJwbGFjZV9pZCIgOiAiQ2hJSnJSTWdVN1poTHhNUnhBT0ZrQzdJOFNnIiwKICAgICAgICAgInR5cGVzIiA6IFsgImVzdGFibGlzaG1lbnQiLCAicG9pbnRfb2ZfaW50ZXJlc3QiLCAidG91cmlzdF9hdHRyYWN0aW9uIiBdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAgImdlb2NvZGVyX3N0YXR1cyIgOiAiT0siLAogICAgICAgICAicGxhY2VfaWQiIDogIkNoSUpyUk1nVTdaaEx4TVJ4QU9Ga0M3SThTZyIsCiAgICAgICAgICJ0eXBlcyIgOiBbICJlc3RhYmxpc2htZW50IiwgInBvaW50X29mX2ludGVyZXN0IiwgInRvdXJpc3RfYXR0cmFjdGlvbiIgXQogICAgICB9CiAgIF0sCiAgICJyb3V0ZXMiIDogWwogICAgICB7CiAgICAgICAgICJib3VuZHMiIDogewogICAgICAgICAgICAibm9ydGhlYXN0IiA6IHsKICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXRod2VzdCIgOiB7CiAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgIH0KICAgICAgICAgfSwKICAgICAgICAgImNvcHlyaWdodHMiIDogIk1hcCBkYXRhIMKpMjAxOSBHb29nbGUiLAogICAgICAgICAibGVncyIgOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbSIsCiAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAwCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAwCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJlbmRfYWRkcmVzcyIgOiAiUGlhenphIGRlbCBDb2xvc3NlbywgMSwgMDAxODQgUm9tYSBSTSwgSXRhbHkiLAogICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgInN0YXJ0X2FkZHJlc3MiIDogIlBpYXp6YSBkZWwgQ29sb3NzZW8sIDEsIDAwMTg0IFJvbWEgUk0sIEl0YWx5IiwKICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgInN0ZXBzIiA6IFsKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDAKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDAKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiSGVhZCBvbiBcdTAwM2NiXHUwMDNlVmlhIENlbGlvIFZpYmVubmFcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogIn1udH5GZXtma0EiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAidHJhZmZpY19zcGVlZF9lbnRyeSIgOiBbXSwKICAgICAgICAgICAgICAgInZpYV93YXlwb2ludCIgOiBbXQogICAgICAgICAgICB9CiAgICAgICAgIF0sCiAgICAgICAgICJvdmVydmlld19wb2x5bGluZSIgOiB7CiAgICAgICAgICAgICJwb2ludHMiIDogIn1udH5GZXtma0EiCiAgICAgICAgIH0sCiAgICAgICAgICJzdW1tYXJ5IiA6ICJWaWEgQ2VsaW8gVmliZW5uYSIsCiAgICAgICAgICJ3YXJuaW5ncyIgOiBbXSwKICAgICAgICAgIndheXBvaW50X29yZGVyIiA6IFtdCiAgICAgIH0KICAgXSwKICAgInN0YXR1cyIgOiAiT0siCn0K http_version: - recorded_at: Tue, 15 Oct 2019 13:43:25 GMT + recorded_at: Wed, 16 Oct 2019 13:22:14 GMT recorded_with: VCR 4.0.0 diff --git a/spec/fixtures/vcr/directions/directions/valid-coordinates.yml b/spec/fixtures/vcr/directions/find/valid-coordinates.yml similarity index 99% rename from spec/fixtures/vcr/directions/directions/valid-coordinates.yml rename to spec/fixtures/vcr/directions/find/valid-coordinates.yml index ddd23d5..5cef312 100644 --- a/spec/fixtures/vcr/directions/directions/valid-coordinates.yml +++ b/spec/fixtures/vcr/directions/find/valid-coordinates.yml @@ -19,7 +19,7 @@ http_interactions: Content-Type: - application/json; charset=UTF-8 Date: - - Tue, 15 Oct 2019 13:36:10 GMT + - Wed, 16 Oct 2019 13:22:14 GMT Pragma: - no-cache Expires: @@ -33,7 +33,7 @@ http_interactions: X-Frame-Options: - SAMEORIGIN Server-Timing: - - gfet4t7; dur=202 + - gfet4t7; dur=209 Alt-Svc: - quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000 @@ -46,5 +46,5 @@ http_interactions: string: !binary |- ewogICAiZ2VvY29kZWRfd2F5cG9pbnRzIiA6IFsKICAgICAgewogICAgICAgICAiZ2VvY29kZXJfc3RhdHVzIiA6ICJPSyIsCiAgICAgICAgICJwbGFjZV9pZCIgOiAiQ2hJSnJSTWdVN1poTHhNUnhBT0ZrQzdJOFNnIiwKICAgICAgICAgInR5cGVzIiA6IFsgImVzdGFibGlzaG1lbnQiLCAicG9pbnRfb2ZfaW50ZXJlc3QiLCAidG91cmlzdF9hdHRyYWN0aW9uIiBdCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAgImdlb2NvZGVyX3N0YXR1cyIgOiAiT0siLAogICAgICAgICAicGxhY2VfaWQiIDogIkNoSUp3eXJyczJkZ0x4TVI1VS0xS1VwYTVocyIsCiAgICAgICAgICJ0eXBlcyIgOiBbICJzdHJlZXRfYWRkcmVzcyIgXQogICAgICB9CiAgIF0sCiAgICJyb3V0ZXMiIDogWwogICAgICB7CiAgICAgICAgICJib3VuZHMiIDogewogICAgICAgICAgICAibm9ydGhlYXN0IiA6IHsKICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDE2NDg4LAogICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNvdXRod2VzdCIgOiB7CiAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg1MTIzLAogICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ1ODMwMDMKICAgICAgICAgICAgfQogICAgICAgICB9LAogICAgICAgICAiY29weXJpZ2h0cyIgOiAiTWFwIGRhdGEgwqkyMDE5IEdvb2dsZSIsCiAgICAgICAgICJsZWdzIiA6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAidGV4dCIgOiAiNC41IGttIiwKICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDQ0NjkKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEzIG1pbnMiLAogICAgICAgICAgICAgICAgICAidmFsdWUiIDogNzkyCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJlbmRfYWRkcmVzcyIgOiAiUGlhenphIFBpbyBYaWksIDEsIDAwMTkzIFJvbWEgUk0sIEl0YWx5IiwKICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAxNjQ4OCwKICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NTgzMDAzCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJzdGFydF9hZGRyZXNzIiA6ICJQaWF6emEgZGVsIENvbG9zc2VvLCAxLCAwMDE4NCBSb21hIFJNLCBJdGFseSIsCiAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5MjczMiwKICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40OTIxOTIxCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICJzdGVwcyIgOiBbCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuMiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAxODEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDI0CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4ODYwMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDkwMzIxNQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIkhlYWQgXHUwMDNjYlx1MDAzZXdlc3RcdTAwM2MvYlx1MDAzZSBvbiBcdTAwM2NiXHUwMDNlVmlhIENlbGlvIFZpYmVubmFcdTAwM2MvYlx1MDAzZSB0b3dhcmQgXHUwMDNjYlx1MDAzZVBpYXp6YSBkZWwgQXJjbyBkaSBDb3N0YW50aW5vXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJ9bnR+RmV7ZmtBQVY/ZkBAXkBURGRAP0BCUERQRlRMWkpWTlZSWEJEVFhSViIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODkyNzMyLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ5MjE5MjEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjQga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMzc3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA1NgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODUyOTUxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4OTMwMjYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJcdTAwM2NiXHUwMDNlVmlhIENlbGlvIFZpYmVubmFcdTAwM2MvYlx1MDAzZSB0dXJucyBzbGlnaHRseSBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIGFuZCBiZWNvbWVzIFx1MDAzY2JcdTAwM2VWaWEgZGkgU2FuIEdyZWdvcmlvXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJ3anR+Rm9vZmtBTkhIQkpEVEZaRnhATk5EUERQREhAUERiQEhaRlJCREBWRkJAVER8QFBqQExoQEpoQEpqQExeRlpGIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4ODYwMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDkwMzIxNQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuNiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA2MjAKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDg3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4ODE5MTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDgzMjM4NAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlR1cm4gXHUwMDNjYlx1MDAzZXJpZ2h0XHUwMDNjL2JcdTAwM2Ugb250byBcdTAwM2NiXHUwMDNlVmlhIGRlaSBDZXJjaGlcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogImN2c35GY2lma0FKUEZSRlREVEBSY0F2QldqQGlAbEFddkB3QGBCS1RjQGJBWW5AWWxAaUByQUdMVWZAQUBjQGBBWW5AQ0RddEBfQHZASUxRYEBXZkBVZEBRYEAiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg1Mjk1MSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODkzMDI2CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4xIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDEzNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMzgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg3MjI1OCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODIyMTg0CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiVHVybiBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZVZpYSBkZWxsJ0FyYSBNYXNzaW1hIGRpIEVyY29sZVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJ0dXJuLWxlZnQiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJlaHR+RmdjZWtBVlRmQGhAUE56QH5AcEB6QCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODgxOTE2LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MzIzODQKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICI0NSBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDQ1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAxMgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODc1MjQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MTg1MjYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJUdXJuIFx1MDAzY2JcdTAwM2VyaWdodFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZVZpYSBkZWxsYSBHcmVjYVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJ0dXJuLXJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAiZWJ0fkZ7fGRrQW1AdEBLUiIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODcyMjU4LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MjIxODQKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICI4MiBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDgyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyNgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODgwMzY3OTk5OTk5OSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODExNTMzCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiQ29udGludWUgc3RyYWlnaHQgdG8gc3RheSBvbiBcdTAwM2NiXHUwMDNlVmlhIGRlbGxhIEdyZWNhXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAibWFuZXV2ZXIiIDogInN0cmFpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAiX2R0fkZxemRrQVVSS0pPVF1uQFdkQCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODc1MjQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MTg1MjYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICI5MCBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDkwCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODg2NDQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MDQ0NTkKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VMYXJnbyBBbWVyaWdvIFBldHJ1Y2NpXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJnZ3R+RmV2ZGtBUVpDQk1OT0pZVEE/Q0ZHSk1STVAiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg4MDM2Nzk5OTk5OTksCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDgxMTUzMwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuMSBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAxMDgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDE3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg4OTU4NTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDgwMTYwNgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlR1cm4gXHUwMDNjYlx1MDAzZXJpZ2h0XHUwMDNjL2JcdTAwM2Ugb250byBcdTAwM2NiXHUwMDNlTHVuZ290ZXZlcmUgQXZlbnRpbm9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogIl9rdH5GeXFka0FLQF1CW0JbRllGS0JPRkdCU0hJRCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44ODg2NDQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ4MDQ0NTkKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjIga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMjQyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAzNAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTEzODEyLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ3ODU4NjUKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VMdW5nb3RldmVyZSBkZWkgUGllcmxlb25pXHUwMDNjL2JcdTAwM2VcdTAwM2NkaXYgc3R5bGU9XCJmb250LXNpemU6MC45ZW1cIlx1MDAzZUVudGVyaW5nIHRvbGwgem9uZVx1MDAzYy9kaXZcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJ9cHR+Rl9wZGtBS0JRSEdCWUpfQFJTTFdQP0BfQFZ5QHBAW1ZDQHVAYEFFRkdKQUJZZkAiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODg5NTg1NywKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40ODAxNjA2CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4zIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDM0MwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogNjMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODkxNzgzMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NzQ2NDM3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiQ29udGludWUgb250byBcdTAwM2NiXHUwMDNlTHVuZ290ZXZlcmUgZGUnIENlbmNpXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJjfHR+RmVmZGtBSUxXZkBTZkBXfEBPYEFPeEJBbkFQekREZkFGaEIiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODkxMzgxMiwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40Nzg1ODY1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4zIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDMxMgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogNTIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODkyNzM0MSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NzEzMTA1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiQ29udGludWUgb250byBcdTAwM2NiXHUwMDNlTHVuZ290ZXZlcmUgZGVpIFZhbGxhdGlcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogInN+dH5Gb21ja0FAXFxEfkA/XFxAVkFiQEFqQENmQEVcXEdmQEdaR1hRbEBHUEVIS1ZhQWhCT1JjQHBAIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5MTc4MzIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDc0NjQzNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuNiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA1NzEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDY3CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5NjQ1NDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDY2NTUyOAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIkNvbnRpbnVlIG9udG8gXHUwMDNjYlx1MDAzZUx1bmdvdGV2ZXJlIGRlaSBUZWJhbGRpXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJxZHV+RnV4YmtBV15BQG1AekBlQG5AVV5LUnVBaEJRWHdBbkJtQXZBYUBqQGVDbkRtQHpAbUFiQklKW2BAIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5MjczNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDcxMzEwNQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuNCBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA0MjUKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDY1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5OTc5OSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjQyNDEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VMdW5nb3RldmVyZSBkZWkgU2FuZ2FsbG9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogInl7dX5GfXpha0FtQHxAS0xPUlVUU05xQGBAYUFsQFVMcUBgQFlQVUxRSmtDfkFJSElCXVRLRllGUUBPQGVAQiIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTY0NTQxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2NjU1MjgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjEga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMTIwCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAzNAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDA3MzE0LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2NDg3NDQKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBzdHJhaWdodCBvbnRvIFx1MDAzY2JcdTAwM2VMdW5nb3RldmVyZSBkZWkgRmlvcmVudGluaVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJzdHJhaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogIndwdn5Gb2xha0FZRWFASWtATV1bSUtPVVlhQCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3OTksCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDY0MjQxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4xIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDEyNwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMzcKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAxNTQyNCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjM3OTQxCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiVHVybiBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZVBvbnRlIFZpdHRvcmlvIEVtYW51ZWxlIElJXHUwMDNjL2JcdTAwM2VcdTAwM2NkaXYgc3R5bGU9XCJmb250LXNpemU6MC45ZW1cIlx1MDAzZUxlYXZpbmcgdG9sbCB6b25lXHUwMDNjL2Rpdlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1sZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAicXZ2fkZtcGFrQU9SdUBkQT9Ac0BkQVVcXEtMRUgiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAwNzMxNCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjQ4NzQ0CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMC4yIGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDIyNgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogNTMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuODk5NzkyNCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjI1NTczCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiVHVybiBcdTAwM2NiXHUwMDNlbGVmdFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZUx1bmdvdGV2ZXJlIGluIFNhc3NpYVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgIm1hbmV1dmVyIiA6ICJ0dXJuLWxlZnQiLAogICAgICAgICAgICAgICAgICAgICAicG9seWxpbmUiIDogewogICAgICAgICAgICAgICAgICAgICAgICAicG9pbnRzIiA6ICJze3Z+RnVpYWtBVGBASEhGSEZISEZYXkpMTEpAQlJMVExSSFhKSkJqQExYRlBEUkJKREhEQkRCRiIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDE1NDI0LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2Mzc5NDEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIyOCBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDI4CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA1CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5OTcxOTYsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDYyMjMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJUdXJuIFx1MDAzY2JcdTAwM2VyaWdodFx1MDAzYy9iXHUwMDNlIG9udG8gXHUwMDNjYlx1MDAzZUdhbGxlcmlhIFByaW5jaXBlIEFtZWRlbyBTYXZvaWEgQW9zdGFcdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogInVwdn5GX2Jha0FCVEhqQCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3OTI0LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MjU1NzMKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxMSBtIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDExCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjg5OTc1OTcsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDYyMTA1MQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlR1cm4gXHUwMDNjYlx1MDAzZXJpZ2h0XHUwMDNjL2JcdTAwM2Ugb250byBcdTAwM2NiXHUwMDNlVmlhIGRpIFBvcnRhIFNhbnRvIFNwaXJpdG9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJtYW5ldXZlciIgOiAidHVybi1yaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogImdwdn5GfV9ha0FHViIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3MTk2LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MjIzCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAiZGlzdGFuY2UiIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiNzEgbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiA3MQogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIgOiAiMSBtaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMTYKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImVuZF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAwMjg2OCwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjE2MjkyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJodG1sX2luc3RydWN0aW9ucyIgOiAiU2xpZ2h0IFx1MDAzY2JcdTAwM2VyaWdodFx1MDAzYy9iXHUwMDNlIHRvIHN0YXkgb24gXHUwMDNjYlx1MDAzZVZpYSBkaSBQb3J0YSBTYW50byBTcGlyaXRvXHUwMDNjL2JcdTAwM2UiLAogICAgICAgICAgICAgICAgICAgICAibWFuZXV2ZXIiIDogInR1cm4tc2xpZ2h0LXJpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAib3B2fkZlX2FrQUlSVVJlQFxcS0ZXUCIKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS44OTk3NTk3LAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MjEwNTEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgInRyYXZlbF9tb2RlIiA6ICJEUklWSU5HIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIwLjIga20iLAogICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUiIDogMTUyCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0IiA6ICIxIG1pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAzNAogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiZW5kX2xvY2F0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImxhdCIgOiA0MS45MDE0NzAxLAogICAgICAgICAgICAgICAgICAgICAgICAibG5nIiA6IDEyLjQ2MDcxNDgKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImh0bWxfaW5zdHJ1Y3Rpb25zIiA6ICJDb250aW51ZSBvbnRvIFx1MDAzY2JcdTAwM2VWaWEgZGVpIFBlbml0ZW56aWVyaVx1MDAzYy9iXHUwMDNlIiwKICAgICAgICAgICAgICAgICAgICAgInBvbHlsaW5lIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50cyIgOiAieXN2fkZlfGBrQVlQQUJHRE1KTUhlQFppQGBAVU5lQXZAIgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAic3RhcnRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjkwMDI4NjgsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDYxNjI5MgogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAidHJhdmVsX21vZGUiIDogIkRSSVZJTkciCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgImRpc3RhbmNlIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjAuMiBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIgOiAyMDEKICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgImR1cmF0aW9uIiA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiIDogIjEgbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlIiA6IDQzCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJlbmRfbG9jYXRpb24iIDogewogICAgICAgICAgICAgICAgICAgICAgICAibGF0IiA6IDQxLjkwMTY0ODgsCiAgICAgICAgICAgICAgICAgICAgICAgICJsbmciIDogMTIuNDU4MzAwMwogICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAiaHRtbF9pbnN0cnVjdGlvbnMiIDogIlx1MDAzY2JcdTAwM2VWaWEgZGVpIFBlbml0ZW56aWVyaVx1MDAzYy9iXHUwMDNlIHR1cm5zIFx1MDAzY2JcdTAwM2VsZWZ0XHUwMDNjL2JcdTAwM2UgYW5kIGJlY29tZXMgXHUwMDNjYlx1MDAzZUJvcmdvIFNhbnRvIFNwaXJpdG9cdTAwM2MvYlx1MDAzZSIsCiAgICAgICAgICAgICAgICAgICAgICJwb2x5bGluZSIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJwb2ludHMiIDogImV7dn5GbXZga0E/RkFUR3xDQ2pAS2RDQ2xAQXBAQ1IiCiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJzdGFydF9sb2NhdGlvbiIgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsYXQiIDogNDEuOTAxNDcwMSwKICAgICAgICAgICAgICAgICAgICAgICAgImxuZyIgOiAxMi40NjA3MTQ4CiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICJ0cmF2ZWxfbW9kZSIgOiAiRFJJVklORyIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAidHJhZmZpY19zcGVlZF9lbnRyeSIgOiBbXSwKICAgICAgICAgICAgICAgInZpYV93YXlwb2ludCIgOiBbXQogICAgICAgICAgICB9CiAgICAgICAgIF0sCiAgICAgICAgICJvdmVydmlld19wb2x5bGluZSIgOiB7CiAgICAgICAgICAgICJwb2ludHMiIDogIn1udH5GZXtma0FAdEJOakFUcEBabkBgQXBBWExgQEx2QmJAfkNsQGJIdEFaRkpQTmhARmhAe0FiRGtDfEZhQ3RGX0R8R2lBfEJRYEBWVHhAeEBsQnpCeUBoQWFAXm1AZEF7QHRBb0BoQFVeTVBLQHlARnVATmNATntAXFxhQWJAa0F4QHVBaEF5QGJBaUB+QGFAdEBrQGRCT2BBT3hCQW5BUHpETHBERnxBQHRAQ25BSWRBT2JBZ0BiQm1BYENzQGRBbUJsQ2FAckBnQmJDd0FuQm1BdkFnRHpFYURsRXlAakFlQGhAZUFwQHdBekBzQmxBfURiQ2VATmFAQmVAQllFbUFXZ0BnQGlAd0B5QmBEYUBqQEVIVGBAUFJQUHRAfEBoQFpsQFRiQl5eSExKRlxcSGpAR1ZJUlVScUBkQHtAbEBrQnJBe0FmQUFcXEtoRU9yREVkQSIKICAgICAgICAgfSwKICAgICAgICAgInN1bW1hcnkiIDogIlZpYSBkZWkgQ2VyY2hpIiwKICAgICAgICAgIndhcm5pbmdzIiA6IFtdLAogICAgICAgICAid2F5cG9pbnRfb3JkZXIiIDogW10KICAgICAgfQogICBdLAogICAic3RhdHVzIiA6ICJPSyIKfQo= http_version: - recorded_at: Tue, 15 Oct 2019 13:36:10 GMT + recorded_at: Wed, 16 Oct 2019 13:22:14 GMT recorded_with: VCR 4.0.0 diff --git a/spec/integration/directions_spec.rb b/spec/integration/directions_spec.rb index 1ce7f18..3aaaf7e 100644 --- a/spec/integration/directions_spec.rb +++ b/spec/integration/directions_spec.rb @@ -8,11 +8,11 @@ SIDNEY = '-33.867487,151.206990' RSpec.describe GoogleMapsJuice::Directions do - describe '.directions' do - subject { described_class.directions(params) } + describe '.find' do + subject { described_class.find(params) } context 'full match on address', vcr: { - cassette_name: 'directions/directions/valid-coordinates' + cassette_name: 'directions/find/valid-coordinates' } do let(:params) { { origin: COLOSSEUM, destination: SAINTPETER } } @@ -27,7 +27,7 @@ end context 'wrong parameter passed', vcr: { - cassette_name: 'directions/directions/wrong-parameter' + cassette_name: 'directions/find/wrong-parameter' } do let(:params) { { address: 'not a geo-coordinate value' } } @@ -37,7 +37,7 @@ end context 'when valid origin and directions but no route', vcr: { - cassette_name: 'directions/directions/not-valid-route' + cassette_name: 'directions/find/not-valid-route' } do let(:params) do { @@ -52,7 +52,7 @@ end context 'when no parameters passed', vcr: { - cassette_name: 'directions/directions/no-parameters' + cassette_name: 'directions/find/no-parameters' } do let(:params) do {} @@ -64,7 +64,7 @@ end context 'when same origin and destination passed', vcr: { - cassette_name: 'directions/directions/same-origin-destination' + cassette_name: 'directions/find/same-origin-destination' } do let(:params) do { diff --git a/spec/unit/directions_spec.rb b/spec/unit/directions_spec.rb index 685ab74..e735297 100644 --- a/spec/unit/directions_spec.rb +++ b/spec/unit/directions_spec.rb @@ -15,7 +15,7 @@ let(:endpoint) { '/directions/json' } describe '#directions' do - subject { directions.directions(params) } + subject { directions.find(params) } context 'with bad params' do context 'when params is not a Hash' do From ef72938762fa0294b37877fb8d5f8dacb010a17c Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Wed, 16 Oct 2019 15:59:34 +0200 Subject: [PATCH 14/21] Directions endpoint: refactoring - directions.rb: validate_location_params rewritten - some context fixes in both unit and integration directions_spec --- lib/google_maps_juice/directions.rb | 6 ++++-- spec/integration/directions_spec.rb | 4 ++-- spec/unit/directions_spec.rb | 6 ++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/google_maps_juice/directions.rb b/lib/google_maps_juice/directions.rb index 0195f0e..164f678 100644 --- a/lib/google_maps_juice/directions.rb +++ b/lib/google_maps_juice/directions.rb @@ -42,10 +42,12 @@ def validate_geo_coordinate(params) end def validate_location_params(params) - if params[0].abs > 90 || params[2].abs > 90 + latitudes = params[0], params[2] + if latitudes.any? { |l| l.abs > 90 } raise ArgumentError, 'Wrong latitude value' end - if params[1].abs > 180 || params[3].abs > 180 + longitudes = params[1], params[3] + if longitudes.any? { |l| l.abs > 180 } raise ArgumentError, 'Wrong longitude value' end end diff --git a/spec/integration/directions_spec.rb b/spec/integration/directions_spec.rb index 3aaaf7e..543d182 100644 --- a/spec/integration/directions_spec.rb +++ b/spec/integration/directions_spec.rb @@ -11,7 +11,7 @@ describe '.find' do subject { described_class.find(params) } - context 'full match on address', vcr: { + context 'when distinct and valid geo-coordinates passed', vcr: { cassette_name: 'directions/find/valid-coordinates' } do let(:params) { { origin: COLOSSEUM, destination: SAINTPETER } } @@ -26,7 +26,7 @@ end end - context 'wrong parameter passed', vcr: { + context 'when wrong parameter passed', vcr: { cassette_name: 'directions/find/wrong-parameter' } do let(:params) { { address: 'not a geo-coordinate value' } } diff --git a/spec/unit/directions_spec.rb b/spec/unit/directions_spec.rb index e735297..6661519 100644 --- a/spec/unit/directions_spec.rb +++ b/spec/unit/directions_spec.rb @@ -7,8 +7,7 @@ SAINTPETER = '41.902270,12.457540' SIDNEY = '-33.867487,151.206990' -# TODO: specs of validate_geo_coordinate and validate_location_params -# TODO: cover the remaining response cases +# TODO: cover the remaining contexts RSpec.describe GoogleMapsJuice::Directions do let(:client) { GoogleMapsJuice::Client.new } let(:directions) { GoogleMapsJuice::Directions.new(client) } @@ -40,8 +39,7 @@ end end - # TODO - context 'when none of the required params is passed' do + context 'when some of the required params is not passed' do let(:params) { { region: 'US' } } it 'raises ArgumentError' do From af27a2d740042545ab6f512dadbe2691bf73d43b Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Mon, 21 Oct 2019 14:15:10 +0200 Subject: [PATCH 15/21] Directions::Response: fix returned location's type --- lib/google_maps_juice/directions/response.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/google_maps_juice/directions/response.rb b/lib/google_maps_juice/directions/response.rb index 942530c..3e451d8 100644 --- a/lib/google_maps_juice/directions/response.rb +++ b/lib/google_maps_juice/directions/response.rb @@ -44,11 +44,11 @@ def distance end def start_location - first_leg['start_location'].to_s + first_leg['start_location'] end def end_location - first_leg['end_location'].to_s + first_leg['end_location'] end def start_address From 6a8ce4da195b1bc077fef0a55168247bae9538ba Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Mon, 21 Oct 2019 14:15:53 +0200 Subject: [PATCH 16/21] improved unit specs coverage --- spec/unit/directions_spec.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/spec/unit/directions_spec.rb b/spec/unit/directions_spec.rb index 6661519..e77730a 100644 --- a/spec/unit/directions_spec.rb +++ b/spec/unit/directions_spec.rb @@ -139,6 +139,18 @@ def expect_colosseum_to_s_peter_result(result) first_route = result.first expect(first_route).to be_a GoogleMapsJuice::Directions::Response::Route expect(first_route.summary).to eq 'Via dei Cerchi' + expect(first_route.legs).to be_a Array + expect(first_route.legs.size).to be >= 1 + expect(first_route.duration['text']).to eq '13 mins' + expect(first_route.distance['text']).to eq '4.5 km' + expect(first_route.steps).to be_a Array + expect(first_route.steps.size).to be >= 1 + expect(first_route.start_location['lat']).to eq 41.8892732 + expect(first_route.start_location['lng']).to eq 12.4921921 + expect(first_route.end_location['lat']).to eq 41.9016488 + expect(first_route.end_location['lng']).to eq 12.4583003 + expect(first_route.start_address).to eq 'Piazza del Colosseo, 1, 00184 Roma RM, Italy' + expect(first_route.end_address).to eq 'Piazza Pio Xii, 1, 00193 Roma RM, Italy' end def expect_colosseum_to_colosseum_result(result) @@ -148,6 +160,18 @@ def expect_colosseum_to_colosseum_result(result) first_route = result.first expect(first_route).to be_a GoogleMapsJuice::Directions::Response::Route expect(first_route.summary).to eq 'Via Celio Vibenna' + expect(first_route.legs).to be_a Array + expect(first_route.legs.size).to be >= 1 + expect(first_route.duration['text']).to eq '1 min' + expect(first_route.distance['text']).to eq '1 m' + expect(first_route.steps).to be_a Array + expect(first_route.steps.size).to be >= 1 + expect(first_route.start_location['lat']).to eq 41.8892732 + expect(first_route.start_location['lng']).to eq 12.4921921 + expect(first_route.end_location['lat']).to eq 41.8892732 + expect(first_route.end_location['lng']).to eq 12.4921921 + expect(first_route.start_address).to eq 'Piazza del Colosseo, 1, 00184 Roma RM, Italy' + expect(first_route.end_address).to eq 'Piazza del Colosseo, 1, 00184 Roma RM, Italy' end def expect_rome_to_sidney_result(result) From fd989985d8d76a49eac8a66a578e758e5c905acb Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Mon, 21 Oct 2019 14:34:42 +0200 Subject: [PATCH 17/21] removed dead code from directions unit spec --- spec/unit/directions_spec.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/spec/unit/directions_spec.rb b/spec/unit/directions_spec.rb index e77730a..693fb0f 100644 --- a/spec/unit/directions_spec.rb +++ b/spec/unit/directions_spec.rb @@ -174,10 +174,4 @@ def expect_colosseum_to_colosseum_result(result) expect(first_route.end_address).to eq 'Piazza del Colosseo, 1, 00184 Roma RM, Italy' end - def expect_rome_to_sidney_result(result) - expect(result).to be_a GoogleMapsJuice::Directions::Response - expect(result['status']).to eq 'ZERO_RESULTS' - expect(result['routes']).to be Array - expect(result['routes'].size).to be 0 - end end From d91ae33048835731ab639aa09b4ae09f12357fc5 Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Mon, 21 Oct 2019 14:36:35 +0200 Subject: [PATCH 18/21] improved directions unit spec (+) - spec for wrong latitude value - spec for wrong longitude value --- spec/unit/directions_spec.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/spec/unit/directions_spec.rb b/spec/unit/directions_spec.rb index 693fb0f..2a6da53 100644 --- a/spec/unit/directions_spec.rb +++ b/spec/unit/directions_spec.rb @@ -61,6 +61,26 @@ end end + context 'when wrong latitude is passed' do + let(:params) { { origin: '0.0,0.0', destination: '91.0,0.0'} } + + it 'raises ArgumentError' do + expect { subject }.to raise_error( + ArgumentError, 'Wrong latitude value' + ) + end + end + + context 'when wrong longitude is passed' do + let(:params) { { origin: '0.0,0.0', destination: '0.0,181.0'} } + + it 'raises ArgumentError' do + expect { subject }.to raise_error( + ArgumentError, 'Wrong longitude value' + ) + end + end + context 'when no argument passed' do let(:params) { {} } From cd150296efe527023b1fd43953735c5f274f7cbd Mon Sep 17 00:00:00 2001 From: alexmik95 Date: Tue, 29 Oct 2019 12:48:52 +0100 Subject: [PATCH 19/21] update README with Directions endpoint --- README.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/README.md b/README.md index 836bd10..59e4b61 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ This gem aims at progressively covering a fair amount of those widely-used servi * Geocoding * Time Zone +* Directions Contributors are welcome! @@ -181,6 +182,59 @@ The `by_location` method returns a `GoogleMapsJuice::Timezone::Response`. It's a * `dst_offset`: the offset for daylight-savings time in seconds +## Directions + +[Google's Directions API](https://developers.google.com/maps/documentation/directions/intro#DirectionsRequests) returns the possible routes of given origin and destination geographic locations; Google's API accepts address, textual latitude/longitude value, or place ID of which you wish to calculate directions. Currently this gem implements only latitude/longitude mode. +`GoogleMapsJuice` will raise an `ArgumentError` if some unsupported param is passed, or when none of the required params are passed. + +```ruby +response = GoogleMapsJuice::Directions.find(origin: '41.8892732,12.4921921', destination: '41.9016488,12.4583003') +``` + +Compared to Google's raw API request, it provides validation of both origin and destination, in order to avoid sending requests when they would fail for sure - to learn more see `spec/unit/directions_spec.rb`. + +**Accepted params:** + +* Both `origin` and `destination` are mandatory +* `origin` is composed by `latitude` and `longitude`, comma separated float values +* `destination` same as `origin` + + +### Directions Response + +The `find` method returns a `GoogleMapsJuice::Directions::Response`. It's a `Hash` representation of Google's JSON response. However, it also provides a few useful methods: + +* `results`: the `Hash` raw result + +* `routes`: a `List` of `Route` objects + +* `first`: the first `Route` of the `routes` `List` + +**How it works** + +As described in [Google's Directions API](https://developers.google.com/maps/documentation/directions/intro#Routes), the response contains all possible routes. Each route is composed by some attributes. In particular each route has one or more legs, wich in turn has one or more steps. +If no waypoint have been passed, the route response will contains a single leg. Since `GoogleMapsJuice::Directions` currently don't handles waypoints, for each route is considered only the first leg. +The `GoogleMapsJuice::Directions::Response::Route` is a rappresentation of a response route and provides methods to access all route's attributes: + +* `summary`: a brief description of the route + +* `legs`: all legs of the route, generally a single one + +* `steps`: all steps of the first route's leg + +* `duration`: time duration of the first route's leg + +* `distance`: distance between origin and destination of first route's leg + +* `start_location`: `latitude`/`longitude` of the origin first route's leg + +* `end_location`: `latitude`/`longitude` of the destination first route's leg + +* `start_address`: address of the origin first route's leg + +* `end_address`: address of the destination first route's leg + + ## Development After checking out the repo, run `bin/setup` to install dependencies. Create a `.env` file and save your Google API key there; if you want to use a different key for testing, put it in `.env.test` and it will override the one in `.env`. From 003ccffd8b37e0728706667acf313c058fdfa303 Mon Sep 17 00:00:00 2001 From: Davide Papagni Date: Wed, 30 Oct 2019 09:54:00 +0100 Subject: [PATCH 20/21] Readme: minor improvements to Directions section --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 59e4b61..8f59faa 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,7 @@ Compared to Google's raw API request, it provides validation of both origin and * Both `origin` and `destination` are mandatory * `origin` is composed by `latitude` and `longitude`, comma separated float values -* `destination` same as `origin` +* `destination` same format as `origin` ### Directions Response @@ -206,15 +206,15 @@ The `find` method returns a `GoogleMapsJuice::Directions::Response`. It's a `Has * `results`: the `Hash` raw result -* `routes`: a `List` of `Route` objects +* `routes`: an `Array` of `GoogleMapsJuice::Directions::Response::Route` objects * `first`: the first `Route` of the `routes` `List` **How it works** -As described in [Google's Directions API](https://developers.google.com/maps/documentation/directions/intro#Routes), the response contains all possible routes. Each route is composed by some attributes. In particular each route has one or more legs, wich in turn has one or more steps. -If no waypoint have been passed, the route response will contains a single leg. Since `GoogleMapsJuice::Directions` currently don't handles waypoints, for each route is considered only the first leg. -The `GoogleMapsJuice::Directions::Response::Route` is a rappresentation of a response route and provides methods to access all route's attributes: +As described in [Google's Directions API](https://developers.google.com/maps/documentation/directions/intro#Routes), the response contains all possible routes. Each route has some attributes and one or more *legs*, wich in turn have one or more *steps*. +If no waypoints are passed, the route response will contain a single leg. Since `GoogleMapsJuice::Directions` doesn't handles waypoints yet, only the first leg is considered for each route. +The `GoogleMapsJuice::Directions::Response::Route` is a representation of a response route and provides methods to access all route's attributes: * `summary`: a brief description of the route From 45868e605a7d1620aa752d7ed33a82dcca4f07c7 Mon Sep 17 00:00:00 2001 From: Davide Papagni Date: Wed, 30 Oct 2019 09:54:51 +0100 Subject: [PATCH 21/21] Readme: remove "How it works" section from Directions section --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 8f59faa..c733519 100644 --- a/README.md +++ b/README.md @@ -210,8 +210,6 @@ The `find` method returns a `GoogleMapsJuice::Directions::Response`. It's a `Has * `first`: the first `Route` of the `routes` `List` -**How it works** - As described in [Google's Directions API](https://developers.google.com/maps/documentation/directions/intro#Routes), the response contains all possible routes. Each route has some attributes and one or more *legs*, wich in turn have one or more *steps*. If no waypoints are passed, the route response will contain a single leg. Since `GoogleMapsJuice::Directions` doesn't handles waypoints yet, only the first leg is considered for each route. The `GoogleMapsJuice::Directions::Response::Route` is a representation of a response route and provides methods to access all route's attributes: