├── lib ├── mainstreet │ ├── version.rb │ ├── model.rb │ └── address_verifier.rb └── mainstreet.rb ├── .gitignore ├── test ├── locales │ └── fr.yml ├── model_test.rb ├── test_helper.rb ├── address_verifier_test.rb └── cassettes │ ├── smarty_streets.yml │ └── default.yml ├── Rakefile ├── Gemfile ├── .github └── workflows │ └── build.yml ├── mainstreet.gemspec ├── CHANGELOG.md ├── LICENSE.txt └── README.md /lib/mainstreet/version.rb: -------------------------------------------------------------------------------- 1 | module MainStreet 2 | VERSION = "0.4.0" 3 | end 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /Gemfile.lock 4 | /_yardoc/ 5 | /coverage/ 6 | /doc/ 7 | /pkg/ 8 | /spec/reports/ 9 | /tmp/ 10 | -------------------------------------------------------------------------------- /test/locales/fr.yml: -------------------------------------------------------------------------------- 1 | fr: 2 | mainstreet: 3 | errors: 4 | messages: 5 | unconfirmed: Cette adresse n’est pas reconnue 6 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require "rake/testtask" 3 | 4 | Rake::TestTask.new do |t| 5 | t.pattern = "test/**/*_test.rb" 6 | end 7 | 8 | task default: :test 9 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gemspec 4 | 5 | gem "rake" 6 | gem "minitest" 7 | gem "activerecord" 8 | gem "i18n" 9 | gem "sqlite3", platform: :ruby 10 | gem "sqlite3-ffi", platform: :jruby 11 | gem "vcr" 12 | gem "webmock" 13 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v5 8 | - uses: ruby/setup-ruby@v1 9 | with: 10 | ruby-version: 3.4 11 | bundler-cache: true 12 | - run: bundle exec rake test 13 | -------------------------------------------------------------------------------- /mainstreet.gemspec: -------------------------------------------------------------------------------- 1 | require_relative "lib/mainstreet/version" 2 | 3 | Gem::Specification.new do |spec| 4 | spec.name = "mainstreet" 5 | spec.version = MainStreet::VERSION 6 | spec.summary = "Address verification for Ruby and Rails" 7 | spec.homepage = "https://github.com/ankane/mainstreet" 8 | spec.license = "MIT" 9 | 10 | spec.author = "Andrew Kane" 11 | spec.email = "andrew@ankane.org" 12 | 13 | spec.files = Dir["*.{md,txt}", "{lib}/**/*"] 14 | spec.require_path = "lib" 15 | 16 | spec.required_ruby_version = ">= 3.1" 17 | 18 | spec.add_dependency "geocoder", ">= 1.5.1" 19 | end 20 | -------------------------------------------------------------------------------- /lib/mainstreet.rb: -------------------------------------------------------------------------------- 1 | # dependencies 2 | require "geocoder" 3 | 4 | # modules 5 | require_relative "mainstreet/address_verifier" 6 | require_relative "mainstreet/version" 7 | 8 | module MainStreet 9 | class << self 10 | attr_writer :lookup 11 | 12 | def lookup 13 | @lookup ||= ENV["SMARTY_STREETS_AUTH_ID"] ? :smarty_streets : nil 14 | end 15 | end 16 | end 17 | 18 | if ENV["SMARTY_STREETS_AUTH_ID"] 19 | Geocoder.config[:smarty_streets] ||= { 20 | api_key: [ 21 | ENV["SMARTY_STREETS_AUTH_ID"], 22 | ENV["SMARTY_STREETS_AUTH_TOKEN"] 23 | ] 24 | } 25 | end 26 | 27 | if defined?(ActiveSupport.on_load) 28 | ActiveSupport.on_load(:active_record) do 29 | require_relative "mainstreet/model" 30 | extend MainStreet::Model 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.4.0 (2024-10-22) 2 | 3 | - Dropped support for Ruby < 3.1 4 | 5 | ## 0.3.0 (2022-10-09) 6 | 7 | - Dropped support for Ruby < 2.7 8 | 9 | ## 0.2.3 (2022-02-08) 10 | 11 | - Added `lookup` option 12 | - Fixed duplicate API calls for invalid addresses 13 | 14 | ## 0.2.2 (2020-04-16) 15 | 16 | - Fixed bug with SmartyStreets and ZIP code only addresses 17 | 18 | ## 0.2.1 (2019-10-04) 19 | 20 | - Added support for i18n 21 | - Added support for more validation options like `if` and `on` 22 | - Specified minimum Geocoder version 23 | 24 | ## 0.2.0 (2018-11-30) 25 | 26 | - Added `AddressVerifier` 27 | - Added `validates_address` method 28 | - Removed `acts_as_address` method 29 | 30 | ## 0.1.0 (2017-05-01) 31 | 32 | - Added more validation 33 | - Fixed model generator for Rails 5 34 | 35 | ## 0.0.1 (2015-03-14) 36 | 37 | - First release 38 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2022 Andrew Kane 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/model_test.rb: -------------------------------------------------------------------------------- 1 | require_relative "test_helper" 2 | 3 | class ModelTest < Minitest::Test 4 | def test_success 5 | address = Address.new( 6 | street: "1 Infinite Loop", 7 | city: "Cupertino", 8 | region: "CA", 9 | postal_code: "95014" 10 | ) 11 | assert address.valid? 12 | assert_in_delta 37.3319, address.latitude, 0.01 13 | assert_in_delta (-122.0302), address.longitude, 0.01 14 | end 15 | 16 | def test_failed 17 | address = Address.new( 18 | street: "1600 Fake Ave", 19 | city: "Washington", 20 | region: "DC", 21 | postal_code: "20500" 22 | ) 23 | assert !address.valid? 24 | assert_equal ["Address can't be confirmed"], address.errors.full_messages 25 | end 26 | 27 | def test_blank 28 | address = Address.new 29 | assert address.valid? 30 | end 31 | 32 | def test_international_success 33 | address = Address.new( 34 | street: "13 Rue Yves Toudic", 35 | city: "Paris", 36 | postal_code: "75010", 37 | country: "France" 38 | ) 39 | assert address.valid? 40 | assert_in_delta 48.867, address.latitude, 0.01 41 | assert_in_delta 2.363, address.longitude, 0.01 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /lib/mainstreet/model.rb: -------------------------------------------------------------------------------- 1 | module MainStreet 2 | module Model 3 | def validates_address(fields:, geocode: false, country: nil, **options) 4 | fields = Array(fields.map(&:to_s)) 5 | geocode_options = {latitude: :latitude, longitude: :longitude} 6 | geocode_options = geocode_options.merge(geocode) if geocode.is_a?(Hash) 7 | options[:if] ||= -> { fields.any? { |f| changes.key?(f.to_s) } } unless options[:unless] 8 | 9 | class_eval do 10 | validate :verify_address, **options 11 | 12 | define_method :verify_address do 13 | address = fields.map { |v| send(v).presence }.compact.join(", ") 14 | 15 | if address.present? 16 | # must use a different variable than country 17 | record_country = instance_exec(&country) if country.respond_to?(:call) 18 | verifier = MainStreet::AddressVerifier.new(address, country: record_country) 19 | if verifier.success? 20 | if geocode 21 | self.send("#{geocode_options[:latitude]}=", verifier.latitude) 22 | self.send("#{geocode_options[:longitude]}=", verifier.longitude) 23 | end 24 | else 25 | errors.add(:base, verifier.failure_message) 26 | end 27 | 28 | # legacy - for standardize_address method 29 | @address_verification_result = verifier.result 30 | end 31 | end 32 | end 33 | end 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | require "bundler/setup" 2 | require "active_record" 3 | Bundler.require(:default) 4 | require "minitest/autorun" 5 | require "vcr" 6 | require "webmock" 7 | 8 | def smarty_streets? 9 | !ENV["SMARTY_STREETS_AUTH_ID"].nil? 10 | end 11 | 12 | I18n.load_path << Dir[File.expand_path("locales", __dir__) + "/*.yml"] 13 | 14 | VCR.configure do |c| 15 | c.hook_into :webmock 16 | c.cassette_library_dir = "test/cassettes" 17 | c.filter_sensitive_data("") { ENV["SMARTY_STREETS_AUTH_ID"] } if ENV["SMARTY_STREETS_AUTH_ID"] 18 | c.filter_sensitive_data("") { ENV["SMARTY_STREETS_AUTH_TOKEN"] } if ENV["SMARTY_STREETS_AUTH_TOKEN"] 19 | end 20 | 21 | cassette_name = smarty_streets? ? "smarty_streets" : "default" 22 | VCR.insert_cassette(cassette_name, record: :once) 23 | Minitest.after_run { VCR.eject_cassette } 24 | 25 | ActiveRecord::Base.logger = ActiveSupport::Logger.new(ENV["VERBOSE"] ? STDOUT : nil) 26 | ActiveRecord::Migration.verbose = ENV["VERBOSE"] 27 | 28 | # migrations 29 | ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:" 30 | 31 | ActiveRecord::Schema.define do 32 | create_table :addresses do |t| 33 | t.text :street 34 | t.text :city 35 | t.string :region 36 | t.string :postal_code 37 | t.string :country 38 | t.decimal :latitude 39 | t.decimal :longitude 40 | end 41 | end 42 | 43 | class Address < ActiveRecord::Base 44 | validates_address fields: [:street, :city, :region, :postal_code], 45 | geocode: true, 46 | country: -> { country } 47 | end 48 | -------------------------------------------------------------------------------- /test/address_verifier_test.rb: -------------------------------------------------------------------------------- 1 | require_relative "test_helper" 2 | 3 | class AddressVerifierTest < Minitest::Test 4 | def test_success 5 | address = "1 Infinite Loop, Cupertino, CA 95014" 6 | verifier = MainStreet::AddressVerifier.new(address) 7 | assert verifier.success? 8 | assert_nil verifier.failure_message 9 | assert_in_delta 37.3319, verifier.latitude, 0.01 10 | assert_in_delta (-122.0302), verifier.longitude, 0.01 11 | end 12 | 13 | def test_failed 14 | address = "1 Fake Loop, Cupertino, CA 95014" 15 | verifier = MainStreet::AddressVerifier.new(address) 16 | assert !verifier.success? 17 | assert_equal "Address can't be confirmed", verifier.failure_message 18 | assert_nil verifier.latitude 19 | assert_nil verifier.longitude 20 | end 21 | 22 | def test_failed_suite 23 | address = "122 Mast Rd, Lee, NH 03861" 24 | verifier = MainStreet::AddressVerifier.new(address) 25 | if smarty_streets? 26 | assert !verifier.success? 27 | assert_equal "Apartment or suite is missing", verifier.failure_message 28 | else 29 | assert verifier.success? 30 | end 31 | end 32 | 33 | def test_international_success 34 | address = "13 Rue Yves Toudic, Paris 75010" 35 | verifier = MainStreet::AddressVerifier.new(address, country: "France") 36 | assert verifier.success? 37 | assert_nil verifier.failure_message 38 | assert_in_delta 48.867, verifier.latitude, 0.01 39 | assert_in_delta 2.363, verifier.longitude, 0.01 40 | end 41 | 42 | def test_international_failed 43 | address = "99 Fictitious St, Westminster, London SW1A 2AA" 44 | verifier = MainStreet::AddressVerifier.new(address, country: "GBR") 45 | assert !verifier.success? 46 | end 47 | 48 | def test_i18n 49 | address = "1 Fake Loop, Cupertino, CA 95014" 50 | verifier = MainStreet::AddressVerifier.new(address, locale: :fr) 51 | assert_equal "Cette adresse n’est pas reconnue", verifier.failure_message 52 | end 53 | end 54 | -------------------------------------------------------------------------------- /lib/mainstreet/address_verifier.rb: -------------------------------------------------------------------------------- 1 | module MainStreet 2 | class AddressVerifier 3 | def initialize(address, country: nil, locale: nil) 4 | @address = address 5 | @country = country 6 | @locale = locale 7 | end 8 | 9 | def success? 10 | failure_message.nil? 11 | end 12 | 13 | def failure_message 14 | if !result 15 | message :unconfirmed, "Address can't be confirmed" 16 | elsif result.respond_to?(:analysis) 17 | analysis = result.analysis 18 | 19 | if analysis["verification_status"] 20 | case analysis["verification_status"] 21 | when "Verified" 22 | nil # success!! 23 | when "Ambiguous", "Partial", "None" 24 | message :unconfirmed, "Address can't be confirmed" 25 | else 26 | raise "Unknown verification_status" 27 | end 28 | elsif analysis["dpv_match_code"] 29 | case analysis["dpv_match_code"] 30 | when "Y" 31 | nil # success!! 32 | when "N" 33 | message :unconfirmed, "Address can't be confirmed" 34 | when "S" 35 | message :apt_unconfirmed, "Apartment or suite can't be confirmed" 36 | when "D" 37 | message :apt_missing, "Apartment or suite is missing" 38 | else 39 | raise "Unknown dpv_match_code" 40 | end 41 | end 42 | end 43 | end 44 | 45 | def result 46 | return @result if defined?(@result) 47 | 48 | @result = begin 49 | options = {lookup: MainStreet.lookup} 50 | options[:country] = @country if @country && !usa? 51 | # don't use smarty streets zipcode only API 52 | # keep mirrored with geocoder gem, including \Z 53 | # \Z is the same as \z when strip is used 54 | if @address.to_s.strip !~ /\A\d{5}(-\d{4})?\Z/ 55 | Geocoder.search(@address, options).first 56 | end 57 | end 58 | end 59 | 60 | def latitude 61 | result && result.latitude 62 | end 63 | 64 | def longitude 65 | result && result.longitude 66 | end 67 | 68 | private 69 | 70 | def usa? 71 | ["United States", "USA", "US", "840"].include?(@country.to_s) 72 | end 73 | 74 | def message(key, default) 75 | if defined?(I18n) 76 | I18n.t(key, scope: [:mainstreet, :errors, :messages], locale: @locale, default: default) 77 | else 78 | default 79 | end 80 | end 81 | end 82 | end 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MainStreet 2 | 3 | Address verification for Ruby and Rails 4 | 5 | :earth_americas: Supports international addresses 6 | 7 | [![Build Status](https://github.com/ankane/mainstreet/actions/workflows/build.yml/badge.svg)](https://github.com/ankane/mainstreet/actions) 8 | 9 | ## Installation 10 | 11 | Add this line to your application’s Gemfile: 12 | 13 | ```ruby 14 | gem "mainstreet" 15 | ``` 16 | 17 | ## How It Works 18 | 19 | MainStreet uses [Geocoder](https://github.com/alexreisner/geocoder) for address verification, which has a number of [3rd party services](https://github.com/alexreisner/geocoder/blob/master/README_API_GUIDE.md#global-street-address-lookups) you can use. If you adhere to GDPR, be sure to add the service to your subprocessor list. 20 | 21 | With some services, bad street numbers, units, and postal codes may pass verification. For full verification, get an account with [SmartyStreets](https://smartystreets.com). The free plan supports 250 lookups per month for US addresses, and plans for international addresses start at $7. To use it, set: 22 | 23 | ```ruby 24 | ENV["SMARTY_STREETS_AUTH_ID"] = "auth-id" 25 | ENV["SMARTY_STREETS_AUTH_TOKEN"] = "auth-token" 26 | ``` 27 | 28 | ## How to Use 29 | 30 | Check an address with: 31 | 32 | ```ruby 33 | address = "1600 Pennsylvania Ave NW, Washington DC 20500" 34 | verifier = MainStreet::AddressVerifier.new(address) 35 | verifier.success? 36 | ``` 37 | 38 | If verification fails, get the failure message with: 39 | 40 | ```ruby 41 | verifier.failure_message 42 | ``` 43 | 44 | Get details about the result with: 45 | 46 | ```ruby 47 | verifier.result 48 | ``` 49 | 50 | Get the latitude and longitude with: 51 | 52 | ```ruby 53 | verifier.latitude 54 | verifier.longitude 55 | ``` 56 | 57 | ## Active Record 58 | 59 | For Active Record models, use: 60 | 61 | ```ruby 62 | class User < ApplicationRecord 63 | validates_address fields: [:street, :street2, :city, :state, :postal_code] 64 | end 65 | ``` 66 | 67 | The order should be the same as if you were to write the address out. 68 | 69 | For performance, the address is only verified if at least one of the fields changes. Set your own condition with: 70 | 71 | ```ruby 72 | class User < ApplicationRecord 73 | validates_address if: -> { something_changed? }, ... 74 | end 75 | ``` 76 | 77 | Geocode the address with: 78 | 79 | ```ruby 80 | class User < ApplicationRecord 81 | validates_address geocode: true, ... 82 | end 83 | ``` 84 | 85 | The `latitude` and `longitude` fields are used by default. Specify the fields with: 86 | 87 | ```ruby 88 | class User < ApplicationRecord 89 | validates_address geocode: {latitude: :lat, longitude: :lon}, ... 90 | end 91 | ``` 92 | 93 | Empty addresses are not verified. To require an address, add your own validation. 94 | 95 | ```ruby 96 | class User < ApplicationRecord 97 | validates :street, presence: true 98 | end 99 | ``` 100 | 101 | ## SmartyStreets 102 | 103 | With SmartyStreets, you must pass the country for non-US addresses. 104 | 105 | ```ruby 106 | MainStreet::AddressVerifier.new(address, country: "France") 107 | ``` 108 | 109 | Here’s the list of [supported countries](https://smartystreets.com/docs/cloud/international-street-api#countries). You can pass the name, ISO-3, ISO-2, or ISO-N code (like `France`, `FRA`, `FR`, or `250`). 110 | 111 | For Active Record, use: 112 | 113 | ```ruby 114 | class User < ApplicationRecord 115 | validates_address country: "France", ... 116 | end 117 | ``` 118 | 119 | Or use a proc to make it dynamic 120 | 121 | ```ruby 122 | class User < ApplicationRecord 123 | validates_address country: -> { country }, ... 124 | end 125 | ``` 126 | 127 | ## Internationalization (i18n) 128 | 129 | You can customize error messages with the [i18n](https://github.com/ruby-i18n/i18n) gem. In Rails, add to the appropriate `config/locales` file: 130 | 131 | ```yml 132 | en: 133 | mainstreet: 134 | errors: 135 | messages: 136 | unconfirmed: Address can't be confirmed 137 | apt_unconfirmed: Apartment or suite can't be confirmed 138 | apt_missing: Apartment or suite is missing 139 | ``` 140 | 141 | ## Data Protection 142 | 143 | We recommend encrypting street information and postal code (at the very least) for user addresses. [Lockbox](https://github.com/ankane/lockbox) is great for this. Check out [this article](https://ankane.org/sensitive-data-rails) for more details. 144 | 145 | ```ruby 146 | class User < ApplicationRecord 147 | has_encrypted :street, :postal_code 148 | end 149 | ``` 150 | 151 | ## History 152 | 153 | View the [changelog](https://github.com/ankane/mainstreet/blob/master/CHANGELOG.md) 154 | 155 | ## Contributing 156 | 157 | Everyone is encouraged to help improve this project. Here are a few ways you can help: 158 | 159 | - [Report bugs](https://github.com/ankane/mainstreet/issues) 160 | - Fix bugs and [submit pull requests](https://github.com/ankane/mainstreet/pulls) 161 | - Write, clarify, or fix documentation 162 | - Suggest or add new features 163 | 164 | To get started with development: 165 | 166 | ```sh 167 | git clone https://github.com/ankane/mainstreet.git 168 | cd mainstreet 169 | bundle install 170 | bundle exec rake test 171 | ``` 172 | -------------------------------------------------------------------------------- /test/cassettes/smarty_streets.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept-Encoding: 11 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 12 | Accept: 13 | - "*/*" 14 | User-Agent: 15 | - Ruby 16 | response: 17 | status: 18 | code: 200 19 | message: OK 20 | headers: 21 | Content-Length: 22 | - '2' 23 | Content-Type: 24 | - application/json; charset=utf-8 25 | Date: 26 | - Sat, 01 Dec 2018 01:47:40 GMT 27 | Strict-Transport-Security: 28 | - max-age=31536000; includeSubDomains 29 | body: 30 | encoding: UTF-8 31 | string: "[]" 32 | http_version: 33 | recorded_at: Sat, 01 Dec 2018 01:47:40 GMT 34 | - request: 35 | method: get 36 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 37 | body: 38 | encoding: US-ASCII 39 | string: '' 40 | headers: 41 | Accept-Encoding: 42 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 43 | Accept: 44 | - "*/*" 45 | User-Agent: 46 | - Ruby 47 | response: 48 | status: 49 | code: 200 50 | message: OK 51 | headers: 52 | Content-Length: 53 | - '2' 54 | Content-Type: 55 | - application/json; charset=utf-8 56 | Date: 57 | - Sat, 01 Dec 2018 01:47:40 GMT 58 | Strict-Transport-Security: 59 | - max-age=31536000; includeSubDomains 60 | body: 61 | encoding: UTF-8 62 | string: "[]" 63 | http_version: 64 | recorded_at: Sat, 01 Dec 2018 01:47:40 GMT 65 | - request: 66 | method: get 67 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 68 | body: 69 | encoding: US-ASCII 70 | string: '' 71 | headers: 72 | Accept-Encoding: 73 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 74 | Accept: 75 | - "*/*" 76 | User-Agent: 77 | - Ruby 78 | response: 79 | status: 80 | code: 200 81 | message: OK 82 | headers: 83 | Content-Length: 84 | - '2' 85 | Content-Type: 86 | - application/json; charset=utf-8 87 | Date: 88 | - Sat, 01 Dec 2018 01:47:41 GMT 89 | Strict-Transport-Security: 90 | - max-age=31536000; includeSubDomains 91 | body: 92 | encoding: UTF-8 93 | string: "[]" 94 | http_version: 95 | recorded_at: Sat, 01 Dec 2018 01:47:41 GMT 96 | - request: 97 | method: get 98 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 99 | body: 100 | encoding: US-ASCII 101 | string: '' 102 | headers: 103 | Accept-Encoding: 104 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 105 | Accept: 106 | - "*/*" 107 | User-Agent: 108 | - Ruby 109 | response: 110 | status: 111 | code: 200 112 | message: OK 113 | headers: 114 | Content-Length: 115 | - '2' 116 | Content-Type: 117 | - application/json; charset=utf-8 118 | Date: 119 | - Sat, 01 Dec 2018 01:47:41 GMT 120 | Strict-Transport-Security: 121 | - max-age=31536000; includeSubDomains 122 | body: 123 | encoding: UTF-8 124 | string: "[]" 125 | http_version: 126 | recorded_at: Sat, 01 Dec 2018 01:47:41 GMT 127 | - request: 128 | method: get 129 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=122%20Mast%20Rd,%20Lee,%20NH%2003861 130 | body: 131 | encoding: US-ASCII 132 | string: '' 133 | headers: 134 | Accept-Encoding: 135 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 136 | Accept: 137 | - "*/*" 138 | User-Agent: 139 | - Ruby 140 | response: 141 | status: 142 | code: 200 143 | message: OK 144 | headers: 145 | Content-Length: 146 | - '860' 147 | Content-Type: 148 | - application/json; charset=utf-8 149 | Date: 150 | - Sat, 01 Dec 2018 01:47:41 GMT 151 | Strict-Transport-Security: 152 | - max-age=31536000; includeSubDomains 153 | body: 154 | encoding: UTF-8 155 | string: '[{"input_index":0,"candidate_index":0,"delivery_line_1":"122 Mast Rd","last_line":"Lee 156 | NH 03861-6571","delivery_point_barcode":"038616571995","components":{"primary_number":"122","street_name":"Mast","street_suffix":"Rd","city_name":"Lee","default_city_name":"Lee","state_abbreviation":"NH","zipcode":"03861","plus4_code":"6571","delivery_point":"99","delivery_point_check_digit":"5"},"metadata":{"record_type":"H","zip_type":"Standard","county_fips":"33017","county_name":"Strafford","carrier_route":"R006","congressional_district":"01","building_default_indicator":"Y","rdi":"Commercial","elot_sequence":"0250","elot_sort":"A","latitude":43.13356,"longitude":-70.99477,"precision":"Zip9","time_zone":"Eastern","utc_offset":-5,"dst":true},"analysis":{"dpv_match_code":"D","dpv_footnotes":"AAN1","dpv_cmra":"N","dpv_vacant":"N","active":"N","footnotes":"H#"}}]' 157 | http_version: 158 | recorded_at: Sat, 01 Dec 2018 01:47:41 GMT 159 | - request: 160 | method: get 161 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1%20Infinite%20Loop,%20Cupertino,%20CA%2095014 162 | body: 163 | encoding: US-ASCII 164 | string: '' 165 | headers: 166 | Accept-Encoding: 167 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 168 | Accept: 169 | - "*/*" 170 | User-Agent: 171 | - Ruby 172 | response: 173 | status: 174 | code: 200 175 | message: OK 176 | headers: 177 | Content-Length: 178 | - '839' 179 | Content-Type: 180 | - application/json; charset=utf-8 181 | Date: 182 | - Sat, 01 Dec 2018 01:47:42 GMT 183 | Strict-Transport-Security: 184 | - max-age=31536000; includeSubDomains 185 | body: 186 | encoding: UTF-8 187 | string: '[{"input_index":0,"candidate_index":0,"delivery_line_1":"1 Infinite 188 | Loop","last_line":"Cupertino CA 95014-2083","delivery_point_barcode":"950142083017","components":{"primary_number":"1","street_name":"Infinite","street_suffix":"Loop","city_name":"Cupertino","default_city_name":"Cupertino","state_abbreviation":"CA","zipcode":"95014","plus4_code":"2083","delivery_point":"01","delivery_point_check_digit":"7"},"metadata":{"record_type":"S","zip_type":"Standard","county_fips":"06085","county_name":"Santa 189 | Clara","carrier_route":"C067","congressional_district":"18","rdi":"Commercial","elot_sequence":"0034","elot_sort":"A","latitude":37.33053,"longitude":-122.02887,"precision":"Zip9","time_zone":"Pacific","utc_offset":-8,"dst":true},"analysis":{"dpv_match_code":"Y","dpv_footnotes":"AABB","dpv_cmra":"N","dpv_vacant":"N","active":"Y"}}]' 190 | http_version: 191 | recorded_at: Sat, 01 Dec 2018 01:47:42 GMT 192 | - request: 193 | method: get 194 | uri: https://international-street.api.smartystreets.com/verify?auth-id=&auth-token=&country=GBR&freeform=99%20Fictitious%20St,%20Westminster,%20London%20SW1A%202AA&geocode=true 195 | body: 196 | encoding: US-ASCII 197 | string: '' 198 | headers: 199 | Accept-Encoding: 200 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 201 | Accept: 202 | - "*/*" 203 | User-Agent: 204 | - Ruby 205 | response: 206 | status: 207 | code: 200 208 | message: OK 209 | headers: 210 | Content-Length: 211 | - '749' 212 | Content-Type: 213 | - application/json; charset=utf-8 214 | Date: 215 | - Sat, 01 Dec 2018 01:47:42 GMT 216 | Strict-Transport-Security: 217 | - max-age=31536000; includeSubDomains 218 | body: 219 | encoding: UTF-8 220 | string: '[{"address1":"99 Downing Street","address2":"Westminster","address3":"London","address4":"SW1A 221 | 2AA","components":{"administrative_area":"London","country_iso_3":"GBR","locality":"London","dependent_locality":"Westminster","postal_code":"SW1A 222 | 2AA","postal_code_short":"SW1A 2AA","premise":"99","premise_number":"99","thoroughfare":"Downing 223 | Street","thoroughfare_name":"Fictitious","thoroughfare_trailing_type":"Street"},"metadata":{"latitude":51.50317,"longitude":-0.12708,"geocode_precision":"Thoroughfare","max_geocode_precision":"DeliveryPoint","address_format":"premise 224 | thoroughfare|dependent_locality|locality|postal_code"},"analysis":{"verification_status":"Partial","address_precision":"Thoroughfare","max_address_precision":"DeliveryPoint"}}]' 225 | http_version: 226 | recorded_at: Sat, 01 Dec 2018 01:47:43 GMT 227 | - request: 228 | method: get 229 | uri: https://international-street.api.smartystreets.com/verify?auth-id=&auth-token=&country=France&freeform=13%20Rue%20Yves%20Toudic,%20Paris%2075010&geocode=true 230 | body: 231 | encoding: US-ASCII 232 | string: '' 233 | headers: 234 | Accept-Encoding: 235 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 236 | Accept: 237 | - "*/*" 238 | User-Agent: 239 | - Ruby 240 | response: 241 | status: 242 | code: 200 243 | message: OK 244 | headers: 245 | Content-Length: 246 | - '765' 247 | Content-Type: 248 | - application/json; charset=utf-8 249 | Date: 250 | - Sat, 01 Dec 2018 01:47:43 GMT 251 | Strict-Transport-Security: 252 | - max-age=31536000; includeSubDomains 253 | body: 254 | encoding: UTF-8 255 | string: '[{"address1":"13 Rue Yves Toudic","address2":"10E Arrondissement","address3":"75010 256 | Paris","components":{"super_administrative_area":"Ile-De-France","administrative_area":"Paris","country_iso_3":"FRA","locality":"Paris","dependent_locality":"10E 257 | Arrondissement","postal_code":"75010","postal_code_short":"75010","premise":"13","premise_number":"13","thoroughfare":"Rue 258 | Yves Toudic","thoroughfare_name":"Yves Toudic","thoroughfare_type":"Rue"},"metadata":{"latitude":48.870131,"longitude":2.363473,"geocode_precision":"Premise","max_geocode_precision":"DeliveryPoint","address_format":"premise 259 | thoroughfare|dependent_locality|postal_code locality"},"analysis":{"verification_status":"Verified","address_precision":"Premise","max_address_precision":"DeliveryPoint"}}]' 260 | http_version: 261 | recorded_at: Sat, 01 Dec 2018 01:47:43 GMT 262 | - request: 263 | method: get 264 | uri: https://international-street.api.smartystreets.com/verify?auth-id=&auth-token=&country=France&freeform=13%20Rue%20Yves%20Toudic,%20Paris,%2075010&geocode=true 265 | body: 266 | encoding: US-ASCII 267 | string: '' 268 | headers: 269 | Accept-Encoding: 270 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 271 | Accept: 272 | - "*/*" 273 | User-Agent: 274 | - Ruby 275 | response: 276 | status: 277 | code: 200 278 | message: OK 279 | headers: 280 | Content-Length: 281 | - '765' 282 | Content-Type: 283 | - application/json; charset=utf-8 284 | Date: 285 | - Sat, 01 Dec 2018 01:47:43 GMT 286 | Strict-Transport-Security: 287 | - max-age=31536000; includeSubDomains 288 | body: 289 | encoding: UTF-8 290 | string: '[{"address1":"13 Rue Yves Toudic","address2":"10E Arrondissement","address3":"75010 291 | Paris","components":{"super_administrative_area":"Ile-De-France","administrative_area":"Paris","country_iso_3":"FRA","locality":"Paris","dependent_locality":"10E 292 | Arrondissement","postal_code":"75010","postal_code_short":"75010","premise":"13","premise_number":"13","thoroughfare":"Rue 293 | Yves Toudic","thoroughfare_name":"Yves Toudic","thoroughfare_type":"Rue"},"metadata":{"latitude":48.870131,"longitude":2.363473,"geocode_precision":"Premise","max_geocode_precision":"DeliveryPoint","address_format":"premise 294 | thoroughfare|dependent_locality|postal_code locality"},"analysis":{"verification_status":"Verified","address_precision":"Premise","max_address_precision":"DeliveryPoint"}}]' 295 | http_version: 296 | recorded_at: Sat, 01 Dec 2018 01:47:44 GMT 297 | - request: 298 | method: get 299 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1%20Infinite%20Loop,%20Cupertino,%20CA,%2095014 300 | body: 301 | encoding: US-ASCII 302 | string: '' 303 | headers: 304 | Accept-Encoding: 305 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 306 | Accept: 307 | - "*/*" 308 | User-Agent: 309 | - Ruby 310 | response: 311 | status: 312 | code: 200 313 | message: OK 314 | headers: 315 | Content-Length: 316 | - '839' 317 | Content-Type: 318 | - application/json; charset=utf-8 319 | Date: 320 | - Sat, 01 Dec 2018 01:47:44 GMT 321 | Strict-Transport-Security: 322 | - max-age=31536000; includeSubDomains 323 | body: 324 | encoding: UTF-8 325 | string: '[{"input_index":0,"candidate_index":0,"delivery_line_1":"1 Infinite 326 | Loop","last_line":"Cupertino CA 95014-2083","delivery_point_barcode":"950142083017","components":{"primary_number":"1","street_name":"Infinite","street_suffix":"Loop","city_name":"Cupertino","default_city_name":"Cupertino","state_abbreviation":"CA","zipcode":"95014","plus4_code":"2083","delivery_point":"01","delivery_point_check_digit":"7"},"metadata":{"record_type":"S","zip_type":"Standard","county_fips":"06085","county_name":"Santa 327 | Clara","carrier_route":"C067","congressional_district":"18","rdi":"Commercial","elot_sequence":"0034","elot_sort":"A","latitude":37.33053,"longitude":-122.02887,"precision":"Zip9","time_zone":"Pacific","utc_offset":-8,"dst":true},"analysis":{"dpv_match_code":"Y","dpv_footnotes":"AABB","dpv_cmra":"N","dpv_vacant":"N","active":"Y"}}]' 328 | http_version: 329 | recorded_at: Sat, 01 Dec 2018 01:47:44 GMT 330 | - request: 331 | method: get 332 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 333 | body: 334 | encoding: US-ASCII 335 | string: '' 336 | headers: 337 | Accept-Encoding: 338 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 339 | Accept: 340 | - "*/*" 341 | User-Agent: 342 | - Ruby 343 | response: 344 | status: 345 | code: 200 346 | message: OK 347 | headers: 348 | Content-Length: 349 | - '2' 350 | Content-Type: 351 | - application/json; charset=utf-8 352 | Date: 353 | - Sat, 01 Dec 2018 01:47:44 GMT 354 | Strict-Transport-Security: 355 | - max-age=31536000; includeSubDomains 356 | body: 357 | encoding: UTF-8 358 | string: "[]" 359 | http_version: 360 | recorded_at: Sat, 01 Dec 2018 01:47:44 GMT 361 | - request: 362 | method: get 363 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 364 | body: 365 | encoding: US-ASCII 366 | string: '' 367 | headers: 368 | Accept-Encoding: 369 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 370 | Accept: 371 | - "*/*" 372 | User-Agent: 373 | - Ruby 374 | response: 375 | status: 376 | code: 200 377 | message: OK 378 | headers: 379 | Content-Length: 380 | - '2' 381 | Content-Type: 382 | - application/json; charset=utf-8 383 | Date: 384 | - Sat, 01 Dec 2018 01:47:44 GMT 385 | Strict-Transport-Security: 386 | - max-age=31536000; includeSubDomains 387 | body: 388 | encoding: UTF-8 389 | string: "[]" 390 | http_version: 391 | recorded_at: Sat, 01 Dec 2018 01:47:44 GMT 392 | - request: 393 | method: get 394 | uri: https://us-street.api.smartystreets.com/street-address?auth-id=&auth-token=&street=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 395 | body: 396 | encoding: US-ASCII 397 | string: '' 398 | headers: 399 | Accept-Encoding: 400 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 401 | Accept: 402 | - "*/*" 403 | User-Agent: 404 | - Ruby 405 | response: 406 | status: 407 | code: 200 408 | message: OK 409 | headers: 410 | Content-Length: 411 | - '2' 412 | Content-Type: 413 | - application/json; charset=utf-8 414 | Date: 415 | - Sat, 01 Dec 2018 01:47:44 GMT 416 | Strict-Transport-Security: 417 | - max-age=31536000; includeSubDomains 418 | body: 419 | encoding: UTF-8 420 | string: "[]" 421 | http_version: 422 | recorded_at: Sat, 01 Dec 2018 01:47:44 GMT 423 | recorded_with: VCR 4.0.0 424 | -------------------------------------------------------------------------------- /test/cassettes/default.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Accept-Encoding: 11 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 12 | Accept: 13 | - "*/*" 14 | User-Agent: 15 | - Ruby 16 | response: 17 | status: 18 | code: 200 19 | message: OK 20 | headers: 21 | Date: 22 | - Sat, 01 Dec 2018 01:08:56 GMT 23 | Server: 24 | - Apache/2.4.29 (Ubuntu) 25 | Access-Control-Allow-Origin: 26 | - "*" 27 | Access-Control-Allow-Methods: 28 | - OPTIONS,GET 29 | Strict-Transport-Security: 30 | - max-age=31536000; includeSubDomains; preload 31 | Expect-Ct: 32 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 33 | Upgrade: 34 | - h2 35 | Connection: 36 | - Upgrade, close 37 | Transfer-Encoding: 38 | - chunked 39 | Content-Type: 40 | - application/json; charset=UTF-8 41 | body: 42 | encoding: UTF-8 43 | string: "[]" 44 | http_version: 45 | recorded_at: Sat, 01 Dec 2018 01:08:56 GMT 46 | - request: 47 | method: get 48 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 49 | body: 50 | encoding: US-ASCII 51 | string: '' 52 | headers: 53 | Accept-Encoding: 54 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 55 | Accept: 56 | - "*/*" 57 | User-Agent: 58 | - Ruby 59 | response: 60 | status: 61 | code: 200 62 | message: OK 63 | headers: 64 | Date: 65 | - Sat, 01 Dec 2018 01:08:56 GMT 66 | Server: 67 | - Apache/2.4.29 (Ubuntu) 68 | Access-Control-Allow-Origin: 69 | - "*" 70 | Access-Control-Allow-Methods: 71 | - OPTIONS,GET 72 | Strict-Transport-Security: 73 | - max-age=31536000; includeSubDomains; preload 74 | Expect-Ct: 75 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 76 | Upgrade: 77 | - h2 78 | Connection: 79 | - Upgrade, close 80 | Transfer-Encoding: 81 | - chunked 82 | Content-Type: 83 | - application/json; charset=UTF-8 84 | body: 85 | encoding: UTF-8 86 | string: "[]" 87 | http_version: 88 | recorded_at: Sat, 01 Dec 2018 01:08:57 GMT 89 | - request: 90 | method: get 91 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 92 | body: 93 | encoding: US-ASCII 94 | string: '' 95 | headers: 96 | Accept-Encoding: 97 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 98 | Accept: 99 | - "*/*" 100 | User-Agent: 101 | - Ruby 102 | response: 103 | status: 104 | code: 200 105 | message: OK 106 | headers: 107 | Date: 108 | - Sat, 01 Dec 2018 01:08:57 GMT 109 | Server: 110 | - Apache/2.4.29 (Ubuntu) 111 | Access-Control-Allow-Origin: 112 | - "*" 113 | Access-Control-Allow-Methods: 114 | - OPTIONS,GET 115 | Strict-Transport-Security: 116 | - max-age=31536000; includeSubDomains; preload 117 | Expect-Ct: 118 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 119 | Upgrade: 120 | - h2 121 | Connection: 122 | - Upgrade, close 123 | Transfer-Encoding: 124 | - chunked 125 | Content-Type: 126 | - application/json; charset=UTF-8 127 | body: 128 | encoding: UTF-8 129 | string: "[]" 130 | http_version: 131 | recorded_at: Sat, 01 Dec 2018 01:08:57 GMT 132 | - request: 133 | method: get 134 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 135 | body: 136 | encoding: US-ASCII 137 | string: '' 138 | headers: 139 | Accept-Encoding: 140 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 141 | Accept: 142 | - "*/*" 143 | User-Agent: 144 | - Ruby 145 | response: 146 | status: 147 | code: 200 148 | message: OK 149 | headers: 150 | Date: 151 | - Sat, 01 Dec 2018 01:08:58 GMT 152 | Server: 153 | - Apache/2.4.29 (Ubuntu) 154 | Access-Control-Allow-Origin: 155 | - "*" 156 | Access-Control-Allow-Methods: 157 | - OPTIONS,GET 158 | Strict-Transport-Security: 159 | - max-age=31536000; includeSubDomains; preload 160 | Expect-Ct: 161 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 162 | Upgrade: 163 | - h2 164 | Connection: 165 | - Upgrade, close 166 | Transfer-Encoding: 167 | - chunked 168 | Content-Type: 169 | - application/json; charset=UTF-8 170 | body: 171 | encoding: UTF-8 172 | string: "[]" 173 | http_version: 174 | recorded_at: Sat, 01 Dec 2018 01:08:58 GMT 175 | - request: 176 | method: get 177 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1600%20Fake%20Ave,%20Washington,%20DC,%2020500 178 | body: 179 | encoding: US-ASCII 180 | string: '' 181 | headers: 182 | Accept-Encoding: 183 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 184 | Accept: 185 | - "*/*" 186 | User-Agent: 187 | - Ruby 188 | response: 189 | status: 190 | code: 200 191 | message: OK 192 | headers: 193 | Date: 194 | - Sat, 01 Dec 2018 01:08:59 GMT 195 | Server: 196 | - Apache/2.4.29 (Ubuntu) 197 | Access-Control-Allow-Origin: 198 | - "*" 199 | Access-Control-Allow-Methods: 200 | - OPTIONS,GET 201 | Strict-Transport-Security: 202 | - max-age=31536000; includeSubDomains; preload 203 | Expect-Ct: 204 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 205 | Upgrade: 206 | - h2 207 | Connection: 208 | - Upgrade, close 209 | Transfer-Encoding: 210 | - chunked 211 | Content-Type: 212 | - application/json; charset=UTF-8 213 | body: 214 | encoding: UTF-8 215 | string: "[]" 216 | http_version: 217 | recorded_at: Sat, 01 Dec 2018 01:08:59 GMT 218 | - request: 219 | method: get 220 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=13%20Rue%20Yves%20Toudic,%20Paris,%2075010 221 | body: 222 | encoding: US-ASCII 223 | string: '' 224 | headers: 225 | Accept-Encoding: 226 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 227 | Accept: 228 | - "*/*" 229 | User-Agent: 230 | - Ruby 231 | response: 232 | status: 233 | code: 200 234 | message: OK 235 | headers: 236 | Date: 237 | - Sat, 01 Dec 2018 01:08:59 GMT 238 | Server: 239 | - Apache/2.4.29 (Ubuntu) 240 | Access-Control-Allow-Origin: 241 | - "*" 242 | Access-Control-Allow-Methods: 243 | - OPTIONS,GET 244 | Strict-Transport-Security: 245 | - max-age=31536000; includeSubDomains; preload 246 | Expect-Ct: 247 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 248 | Upgrade: 249 | - h2 250 | Connection: 251 | - Upgrade, close 252 | Transfer-Encoding: 253 | - chunked 254 | Content-Type: 255 | - application/json; charset=UTF-8 256 | body: 257 | encoding: ASCII-8BIT 258 | string: !binary |- 259 | W3sicGxhY2VfaWQiOiI4NzE0NjgyIiwibGljZW5jZSI6IkRhdGEgwqkgT3BlblN0cmVldE1hcCBjb250cmlidXRvcnMsIE9EYkwgMS4wLiBodHRwczpcL1wvb3NtLm9yZ1wvY29weXJpZ2h0Iiwib3NtX3R5cGUiOiJub2RlIiwib3NtX2lkIjoiOTEyMjcwNzQ1IiwiYm91bmRpbmdib3giOlsiNDguODcwMDc5NSIsIjQ4Ljg3MDE3OTUiLCIyLjM2MzQ0MTMiLCIyLjM2MzU0MTMiXSwibGF0IjoiNDguODcwMTI5NSIsImxvbiI6IjIuMzYzNDkxMyIsImRpc3BsYXlfbmFtZSI6IjEzLCBSdWUgWXZlcyBUb3VkaWMsIFBvcnRlLVN0LU1hcnRpbiwgMTB0aCBBcnJvbmRpc3NlbWVudCwgUGFyaXMsIElsZS1kZS1GcmFuY2UsIE1ldHJvcG9saXRhbiBGcmFuY2UsIDc1MDEwLCBGcmFuY2UiLCJjbGFzcyI6InBsYWNlIiwidHlwZSI6ImhvdXNlIiwiaW1wb3J0YW5jZSI6MC42MzA5OTk5OTk5OTk5OTk5LCJhZGRyZXNzIjp7ImhvdXNlX251bWJlciI6IjEzIiwicm9hZCI6IlJ1ZSBZdmVzIFRvdWRpYyIsInN1YnVyYiI6IlBvcnRlLVN0LU1hcnRpbiIsImNpdHlfZGlzdHJpY3QiOiIxMHRoIEFycm9uZGlzc2VtZW50IiwiY2l0eSI6IlBhcmlzIiwiY291bnR5IjoiUGFyaXMiLCJzdGF0ZSI6IklsZS1kZS1GcmFuY2UiLCJjb3VudHJ5IjoiRnJhbmNlIiwicG9zdGNvZGUiOiI3NTAxMCIsImNvdW50cnlfY29kZSI6ImZyIn19XQ== 260 | http_version: 261 | recorded_at: Sat, 01 Dec 2018 01:09:00 GMT 262 | - request: 263 | method: get 264 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Infinite%20Loop,%20Cupertino,%20CA,%2095014 265 | body: 266 | encoding: US-ASCII 267 | string: '' 268 | headers: 269 | Accept-Encoding: 270 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 271 | Accept: 272 | - "*/*" 273 | User-Agent: 274 | - Ruby 275 | response: 276 | status: 277 | code: 200 278 | message: OK 279 | headers: 280 | Date: 281 | - Sat, 01 Dec 2018 01:09:00 GMT 282 | Server: 283 | - Apache/2.4.29 (Ubuntu) 284 | Access-Control-Allow-Origin: 285 | - "*" 286 | Access-Control-Allow-Methods: 287 | - OPTIONS,GET 288 | Strict-Transport-Security: 289 | - max-age=31536000; includeSubDomains; preload 290 | Expect-Ct: 291 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 292 | Upgrade: 293 | - h2 294 | Connection: 295 | - Upgrade, close 296 | Transfer-Encoding: 297 | - chunked 298 | Content-Type: 299 | - application/json; charset=UTF-8 300 | body: 301 | encoding: ASCII-8BIT 302 | string: !binary |- 303 | W3sicGxhY2VfaWQiOiIxNjAzNTAwOCIsImxpY2VuY2UiOiJEYXRhIMKpIE9wZW5TdHJlZXRNYXAgY29udHJpYnV0b3JzLCBPRGJMIDEuMC4gaHR0cHM6XC9cL29zbS5vcmdcL2NvcHlyaWdodCIsIm9zbV90eXBlIjoibm9kZSIsIm9zbV9pZCI6IjE0Mjk0Nzc1MDQiLCJib3VuZGluZ2JveCI6WyIzNy4zMzEzNTUiLCIzNy4zMzE0NTUiLCItMTIyLjAzMDQ2ODUiLCItMTIyLjAzMDM2ODUiXSwibGF0IjoiMzcuMzMxNDA1IiwibG9uIjoiLTEyMi4wMzA0MTg1IiwiZGlzcGxheV9uYW1lIjoiQXBwbGUgSW5maW5pdGUgTG9vcCwgMSwgSW5maW5pdGUgTG9vcCwgQXBwbGUsIEluYy4sIEN1cGVydGlubywgU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLCA5NTAxNCwgVVNBIiwiY2xhc3MiOiJzaG9wIiwidHlwZSI6ImVsZWN0cm9uaWNzIiwiaW1wb3J0YW5jZSI6MC42MzA5OTk5OTk5OTk5OTk5LCJhZGRyZXNzIjp7ImVsZWN0cm9uaWNzIjoiQXBwbGUgSW5maW5pdGUgTG9vcCIsImhvdXNlX251bWJlciI6IjEiLCJyb2FkIjoiSW5maW5pdGUgTG9vcCIsImNvbW1lcmNpYWwiOiJBcHBsZSwgSW5jLiIsImNpdHkiOiJDdXBlcnRpbm8iLCJjb3VudHkiOiJTYW50YSBDbGFyYSBDb3VudHkiLCJzdGF0ZSI6IkNhbGlmb3JuaWEiLCJwb3N0Y29kZSI6Ijk1MDE0IiwiY291bnRyeSI6IlVTQSIsImNvdW50cnlfY29kZSI6InVzIn19LHsicGxhY2VfaWQiOiIxMDExNTI5NzIiLCJsaWNlbmNlIjoiRGF0YSDCqSBPcGVuU3RyZWV0TWFwIGNvbnRyaWJ1dG9ycywgT0RiTCAxLjAuIGh0dHBzOlwvXC9vc20ub3JnXC9jb3B5cmlnaHQiLCJvc21fdHlwZSI6IndheSIsIm9zbV9pZCI6IjExNDA1NDgyOSIsImJvdW5kaW5nYm94IjpbIjM3LjMzMTE5NTciLCIzNy4zMzIxNjQ5IiwiLTEyMi4wMzA1NTQzIiwiLTEyMi4wMjk3OTY0Il0sImxhdCI6IjM3LjMzMTY3NCIsImxvbiI6Ii0xMjIuMDMwMDg0ODA3ODIxIiwiZGlzcGxheV9uYW1lIjoiSW5maW5pdGUgTG9vcCAxLCAxLCBJbmZpbml0ZSBMb29wLCBBcHBsZSwgSW5jLiwgQ3VwZXJ0aW5vLCBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEsIDk1MDE0LCBVU0EiLCJjbGFzcyI6ImJ1aWxkaW5nIiwidHlwZSI6InllcyIsImltcG9ydGFuY2UiOjAuNjMwOTk5OTk5OTk5OTk5OSwiYWRkcmVzcyI6eyJidWlsZGluZyI6IkluZmluaXRlIExvb3AgMSIsImhvdXNlX251bWJlciI6IjEiLCJyb2FkIjoiSW5maW5pdGUgTG9vcCIsImNvbW1lcmNpYWwiOiJBcHBsZSwgSW5jLiIsImNpdHkiOiJDdXBlcnRpbm8iLCJjb3VudHkiOiJTYW50YSBDbGFyYSBDb3VudHkiLCJzdGF0ZSI6IkNhbGlmb3JuaWEiLCJwb3N0Y29kZSI6Ijk1MDE0IiwiY291bnRyeSI6IlVTQSIsImNvdW50cnlfY29kZSI6InVzIn19XQ== 304 | http_version: 305 | recorded_at: Sat, 01 Dec 2018 01:09:00 GMT 306 | - request: 307 | method: get 308 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=122%20Mast%20Rd,%20Lee,%20NH%2003861 309 | body: 310 | encoding: US-ASCII 311 | string: '' 312 | headers: 313 | Accept-Encoding: 314 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 315 | Accept: 316 | - "*/*" 317 | User-Agent: 318 | - Ruby 319 | response: 320 | status: 321 | code: 200 322 | message: OK 323 | headers: 324 | Date: 325 | - Sat, 01 Dec 2018 01:09:01 GMT 326 | Server: 327 | - Apache/2.4.29 (Ubuntu) 328 | Access-Control-Allow-Origin: 329 | - "*" 330 | Access-Control-Allow-Methods: 331 | - OPTIONS,GET 332 | Strict-Transport-Security: 333 | - max-age=31536000; includeSubDomains; preload 334 | Expect-Ct: 335 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 336 | Upgrade: 337 | - h2 338 | Connection: 339 | - Upgrade, close 340 | Transfer-Encoding: 341 | - chunked 342 | Content-Type: 343 | - application/json; charset=UTF-8 344 | body: 345 | encoding: ASCII-8BIT 346 | string: !binary |- 347 | W3sicGxhY2VfaWQiOiIxMDgxNDM1NDEiLCJsaWNlbmNlIjoiRGF0YSDCqSBPcGVuU3RyZWV0TWFwIGNvbnRyaWJ1dG9ycywgT0RiTCAxLjAuIGh0dHBzOlwvXC9vc20ub3JnXC9jb3B5cmlnaHQiLCJvc21fdHlwZSI6IndheSIsIm9zbV9pZCI6IjE0MjU0NjMwOCIsImJvdW5kaW5nYm94IjpbIjQzLjEzNTk2NSIsIjQzLjEzNjIxODUiLCItNzAuOTg2NDEwNyIsIi03MC45ODU1MTM2Il0sImxhdCI6IjQzLjEzNjEwMTIiLCJsb24iOiItNzAuOTg1ODM2ODM5NDgxMiIsImRpc3BsYXlfbmFtZSI6IjEyMiwgTWFzdCBSb2FkLCBMZWUsIFN0cmFmZm9yZCBDb3VudHksIE5ldyBIYW1wc2hpcmUsIDAzODYxLCBVU0EiLCJjbGFzcyI6ImJ1aWxkaW5nIiwidHlwZSI6InllcyIsImltcG9ydGFuY2UiOjAuNTMwOTk5OTk5OTk5OTk5OSwiYWRkcmVzcyI6eyJob3VzZV9udW1iZXIiOiIxMjIiLCJyb2FkIjoiTWFzdCBSb2FkIiwidmlsbGFnZSI6IkxlZSIsImNvdW50eSI6IlN0cmFmZm9yZCBDb3VudHkiLCJzdGF0ZSI6Ik5ldyBIYW1wc2hpcmUiLCJwb3N0Y29kZSI6IjAzODYxIiwiY291bnRyeSI6IlVTQSIsImNvdW50cnlfY29kZSI6InVzIn19XQ== 348 | http_version: 349 | recorded_at: Sat, 01 Dec 2018 01:09:01 GMT 350 | - request: 351 | method: get 352 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=13%20Rue%20Yves%20Toudic,%20Paris%2075010 353 | body: 354 | encoding: US-ASCII 355 | string: '' 356 | headers: 357 | Accept-Encoding: 358 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 359 | Accept: 360 | - "*/*" 361 | User-Agent: 362 | - Ruby 363 | response: 364 | status: 365 | code: 200 366 | message: OK 367 | headers: 368 | Date: 369 | - Sat, 01 Dec 2018 01:09:02 GMT 370 | Server: 371 | - Apache/2.4.29 (Ubuntu) 372 | Access-Control-Allow-Origin: 373 | - "*" 374 | Access-Control-Allow-Methods: 375 | - OPTIONS,GET 376 | Strict-Transport-Security: 377 | - max-age=31536000; includeSubDomains; preload 378 | Expect-Ct: 379 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 380 | Upgrade: 381 | - h2 382 | Connection: 383 | - Upgrade, close 384 | Transfer-Encoding: 385 | - chunked 386 | Content-Type: 387 | - application/json; charset=UTF-8 388 | body: 389 | encoding: ASCII-8BIT 390 | string: !binary |- 391 | W3sicGxhY2VfaWQiOiI4NzE0NjgyIiwibGljZW5jZSI6IkRhdGEgwqkgT3BlblN0cmVldE1hcCBjb250cmlidXRvcnMsIE9EYkwgMS4wLiBodHRwczpcL1wvb3NtLm9yZ1wvY29weXJpZ2h0Iiwib3NtX3R5cGUiOiJub2RlIiwib3NtX2lkIjoiOTEyMjcwNzQ1IiwiYm91bmRpbmdib3giOlsiNDguODcwMDc5NSIsIjQ4Ljg3MDE3OTUiLCIyLjM2MzQ0MTMiLCIyLjM2MzU0MTMiXSwibGF0IjoiNDguODcwMTI5NSIsImxvbiI6IjIuMzYzNDkxMyIsImRpc3BsYXlfbmFtZSI6IjEzLCBSdWUgWXZlcyBUb3VkaWMsIFBvcnRlLVN0LU1hcnRpbiwgMTB0aCBBcnJvbmRpc3NlbWVudCwgUGFyaXMsIElsZS1kZS1GcmFuY2UsIE1ldHJvcG9saXRhbiBGcmFuY2UsIDc1MDEwLCBGcmFuY2UiLCJjbGFzcyI6InBsYWNlIiwidHlwZSI6ImhvdXNlIiwiaW1wb3J0YW5jZSI6MC42MzA5OTk5OTk5OTk5OTk5LCJhZGRyZXNzIjp7ImhvdXNlX251bWJlciI6IjEzIiwicm9hZCI6IlJ1ZSBZdmVzIFRvdWRpYyIsInN1YnVyYiI6IlBvcnRlLVN0LU1hcnRpbiIsImNpdHlfZGlzdHJpY3QiOiIxMHRoIEFycm9uZGlzc2VtZW50IiwiY2l0eSI6IlBhcmlzIiwiY291bnR5IjoiUGFyaXMiLCJzdGF0ZSI6IklsZS1kZS1GcmFuY2UiLCJjb3VudHJ5IjoiRnJhbmNlIiwicG9zdGNvZGUiOiI3NTAxMCIsImNvdW50cnlfY29kZSI6ImZyIn19XQ== 392 | http_version: 393 | recorded_at: Sat, 01 Dec 2018 01:09:02 GMT 394 | - request: 395 | method: get 396 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Infinite%20Loop,%20Cupertino,%20CA%2095014 397 | body: 398 | encoding: US-ASCII 399 | string: '' 400 | headers: 401 | Accept-Encoding: 402 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 403 | Accept: 404 | - "*/*" 405 | User-Agent: 406 | - Ruby 407 | response: 408 | status: 409 | code: 200 410 | message: OK 411 | headers: 412 | Date: 413 | - Sat, 01 Dec 2018 01:09:02 GMT 414 | Server: 415 | - Apache/2.4.29 (Ubuntu) 416 | Access-Control-Allow-Origin: 417 | - "*" 418 | Access-Control-Allow-Methods: 419 | - OPTIONS,GET 420 | Strict-Transport-Security: 421 | - max-age=31536000; includeSubDomains; preload 422 | Expect-Ct: 423 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 424 | Upgrade: 425 | - h2 426 | Connection: 427 | - Upgrade, close 428 | Transfer-Encoding: 429 | - chunked 430 | Content-Type: 431 | - application/json; charset=UTF-8 432 | body: 433 | encoding: ASCII-8BIT 434 | string: !binary |- 435 | W3sicGxhY2VfaWQiOiIxNjAzNTAwOCIsImxpY2VuY2UiOiJEYXRhIMKpIE9wZW5TdHJlZXRNYXAgY29udHJpYnV0b3JzLCBPRGJMIDEuMC4gaHR0cHM6XC9cL29zbS5vcmdcL2NvcHlyaWdodCIsIm9zbV90eXBlIjoibm9kZSIsIm9zbV9pZCI6IjE0Mjk0Nzc1MDQiLCJib3VuZGluZ2JveCI6WyIzNy4zMzEzNTUiLCIzNy4zMzE0NTUiLCItMTIyLjAzMDQ2ODUiLCItMTIyLjAzMDM2ODUiXSwibGF0IjoiMzcuMzMxNDA1IiwibG9uIjoiLTEyMi4wMzA0MTg1IiwiZGlzcGxheV9uYW1lIjoiQXBwbGUgSW5maW5pdGUgTG9vcCwgMSwgSW5maW5pdGUgTG9vcCwgQXBwbGUsIEluYy4sIEN1cGVydGlubywgU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLCA5NTAxNCwgVVNBIiwiY2xhc3MiOiJzaG9wIiwidHlwZSI6ImVsZWN0cm9uaWNzIiwiaW1wb3J0YW5jZSI6MC42MzA5OTk5OTk5OTk5OTk5LCJhZGRyZXNzIjp7ImVsZWN0cm9uaWNzIjoiQXBwbGUgSW5maW5pdGUgTG9vcCIsImhvdXNlX251bWJlciI6IjEiLCJyb2FkIjoiSW5maW5pdGUgTG9vcCIsImNvbW1lcmNpYWwiOiJBcHBsZSwgSW5jLiIsImNpdHkiOiJDdXBlcnRpbm8iLCJjb3VudHkiOiJTYW50YSBDbGFyYSBDb3VudHkiLCJzdGF0ZSI6IkNhbGlmb3JuaWEiLCJwb3N0Y29kZSI6Ijk1MDE0IiwiY291bnRyeSI6IlVTQSIsImNvdW50cnlfY29kZSI6InVzIn19LHsicGxhY2VfaWQiOiIxMDExNTI5NzIiLCJsaWNlbmNlIjoiRGF0YSDCqSBPcGVuU3RyZWV0TWFwIGNvbnRyaWJ1dG9ycywgT0RiTCAxLjAuIGh0dHBzOlwvXC9vc20ub3JnXC9jb3B5cmlnaHQiLCJvc21fdHlwZSI6IndheSIsIm9zbV9pZCI6IjExNDA1NDgyOSIsImJvdW5kaW5nYm94IjpbIjM3LjMzMTE5NTciLCIzNy4zMzIxNjQ5IiwiLTEyMi4wMzA1NTQzIiwiLTEyMi4wMjk3OTY0Il0sImxhdCI6IjM3LjMzMTY3NCIsImxvbiI6Ii0xMjIuMDMwMDg0ODA3ODIxIiwiZGlzcGxheV9uYW1lIjoiSW5maW5pdGUgTG9vcCAxLCAxLCBJbmZpbml0ZSBMb29wLCBBcHBsZSwgSW5jLiwgQ3VwZXJ0aW5vLCBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEsIDk1MDE0LCBVU0EiLCJjbGFzcyI6ImJ1aWxkaW5nIiwidHlwZSI6InllcyIsImltcG9ydGFuY2UiOjAuNjMwOTk5OTk5OTk5OTk5OSwiYWRkcmVzcyI6eyJidWlsZGluZyI6IkluZmluaXRlIExvb3AgMSIsImhvdXNlX251bWJlciI6IjEiLCJyb2FkIjoiSW5maW5pdGUgTG9vcCIsImNvbW1lcmNpYWwiOiJBcHBsZSwgSW5jLiIsImNpdHkiOiJDdXBlcnRpbm8iLCJjb3VudHkiOiJTYW50YSBDbGFyYSBDb3VudHkiLCJzdGF0ZSI6IkNhbGlmb3JuaWEiLCJwb3N0Y29kZSI6Ijk1MDE0IiwiY291bnRyeSI6IlVTQSIsImNvdW50cnlfY29kZSI6InVzIn19XQ== 436 | http_version: 437 | recorded_at: Sat, 01 Dec 2018 01:09:03 GMT 438 | - request: 439 | method: get 440 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 441 | body: 442 | encoding: US-ASCII 443 | string: '' 444 | headers: 445 | Accept-Encoding: 446 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 447 | Accept: 448 | - "*/*" 449 | User-Agent: 450 | - Ruby 451 | response: 452 | status: 453 | code: 200 454 | message: OK 455 | headers: 456 | Date: 457 | - Sat, 01 Dec 2018 01:09:04 GMT 458 | Server: 459 | - Apache/2.4.29 (Ubuntu) 460 | Access-Control-Allow-Origin: 461 | - "*" 462 | Access-Control-Allow-Methods: 463 | - OPTIONS,GET 464 | Strict-Transport-Security: 465 | - max-age=31536000; includeSubDomains; preload 466 | Expect-Ct: 467 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 468 | Upgrade: 469 | - h2 470 | Connection: 471 | - Upgrade, close 472 | Transfer-Encoding: 473 | - chunked 474 | Content-Type: 475 | - application/json; charset=UTF-8 476 | body: 477 | encoding: UTF-8 478 | string: "[]" 479 | http_version: 480 | recorded_at: Sat, 01 Dec 2018 01:09:04 GMT 481 | - request: 482 | method: get 483 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 484 | body: 485 | encoding: US-ASCII 486 | string: '' 487 | headers: 488 | Accept-Encoding: 489 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 490 | Accept: 491 | - "*/*" 492 | User-Agent: 493 | - Ruby 494 | response: 495 | status: 496 | code: 200 497 | message: OK 498 | headers: 499 | Date: 500 | - Sat, 01 Dec 2018 01:09:04 GMT 501 | Server: 502 | - Apache/2.4.29 (Ubuntu) 503 | Access-Control-Allow-Origin: 504 | - "*" 505 | Access-Control-Allow-Methods: 506 | - OPTIONS,GET 507 | Strict-Transport-Security: 508 | - max-age=31536000; includeSubDomains; preload 509 | Expect-Ct: 510 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 511 | Upgrade: 512 | - h2 513 | Connection: 514 | - Upgrade, close 515 | Transfer-Encoding: 516 | - chunked 517 | Content-Type: 518 | - application/json; charset=UTF-8 519 | body: 520 | encoding: UTF-8 521 | string: "[]" 522 | http_version: 523 | recorded_at: Sat, 01 Dec 2018 01:09:04 GMT 524 | - request: 525 | method: get 526 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 527 | body: 528 | encoding: US-ASCII 529 | string: '' 530 | headers: 531 | Accept-Encoding: 532 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 533 | Accept: 534 | - "*/*" 535 | User-Agent: 536 | - Ruby 537 | response: 538 | status: 539 | code: 200 540 | message: OK 541 | headers: 542 | Date: 543 | - Sat, 01 Dec 2018 01:09:05 GMT 544 | Server: 545 | - Apache/2.4.29 (Ubuntu) 546 | Access-Control-Allow-Origin: 547 | - "*" 548 | Access-Control-Allow-Methods: 549 | - OPTIONS,GET 550 | Strict-Transport-Security: 551 | - max-age=31536000; includeSubDomains; preload 552 | Expect-Ct: 553 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 554 | Upgrade: 555 | - h2 556 | Connection: 557 | - Upgrade, close 558 | Transfer-Encoding: 559 | - chunked 560 | Content-Type: 561 | - application/json; charset=UTF-8 562 | body: 563 | encoding: UTF-8 564 | string: "[]" 565 | http_version: 566 | recorded_at: Sat, 01 Dec 2018 01:09:05 GMT 567 | - request: 568 | method: get 569 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 570 | body: 571 | encoding: US-ASCII 572 | string: '' 573 | headers: 574 | Accept-Encoding: 575 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 576 | Accept: 577 | - "*/*" 578 | User-Agent: 579 | - Ruby 580 | response: 581 | status: 582 | code: 200 583 | message: OK 584 | headers: 585 | Date: 586 | - Sat, 01 Dec 2018 01:09:06 GMT 587 | Server: 588 | - Apache/2.4.29 (Ubuntu) 589 | Access-Control-Allow-Origin: 590 | - "*" 591 | Access-Control-Allow-Methods: 592 | - OPTIONS,GET 593 | Strict-Transport-Security: 594 | - max-age=31536000; includeSubDomains; preload 595 | Expect-Ct: 596 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 597 | Upgrade: 598 | - h2 599 | Connection: 600 | - Upgrade, close 601 | Transfer-Encoding: 602 | - chunked 603 | Content-Type: 604 | - application/json; charset=UTF-8 605 | body: 606 | encoding: UTF-8 607 | string: "[]" 608 | http_version: 609 | recorded_at: Sat, 01 Dec 2018 01:09:06 GMT 610 | - request: 611 | method: get 612 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 613 | body: 614 | encoding: US-ASCII 615 | string: '' 616 | headers: 617 | Accept-Encoding: 618 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 619 | Accept: 620 | - "*/*" 621 | User-Agent: 622 | - Ruby 623 | response: 624 | status: 625 | code: 200 626 | message: OK 627 | headers: 628 | Date: 629 | - Sat, 01 Dec 2018 01:09:07 GMT 630 | Server: 631 | - Apache/2.4.29 (Ubuntu) 632 | Access-Control-Allow-Origin: 633 | - "*" 634 | Access-Control-Allow-Methods: 635 | - OPTIONS,GET 636 | Strict-Transport-Security: 637 | - max-age=31536000; includeSubDomains; preload 638 | Expect-Ct: 639 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 640 | Upgrade: 641 | - h2 642 | Connection: 643 | - Upgrade, close 644 | Transfer-Encoding: 645 | - chunked 646 | Content-Type: 647 | - application/json; charset=UTF-8 648 | body: 649 | encoding: UTF-8 650 | string: "[]" 651 | http_version: 652 | recorded_at: Sat, 01 Dec 2018 01:09:07 GMT 653 | - request: 654 | method: get 655 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=1%20Fake%20Loop,%20Cupertino,%20CA%2095014 656 | body: 657 | encoding: US-ASCII 658 | string: '' 659 | headers: 660 | Accept-Encoding: 661 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 662 | Accept: 663 | - "*/*" 664 | User-Agent: 665 | - Ruby 666 | response: 667 | status: 668 | code: 200 669 | message: OK 670 | headers: 671 | Date: 672 | - Sat, 01 Dec 2018 01:09:07 GMT 673 | Server: 674 | - Apache/2.4.29 (Ubuntu) 675 | Access-Control-Allow-Origin: 676 | - "*" 677 | Access-Control-Allow-Methods: 678 | - OPTIONS,GET 679 | Strict-Transport-Security: 680 | - max-age=31536000; includeSubDomains; preload 681 | Expect-Ct: 682 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 683 | Upgrade: 684 | - h2 685 | Connection: 686 | - Upgrade, close 687 | Transfer-Encoding: 688 | - chunked 689 | Content-Type: 690 | - application/json; charset=UTF-8 691 | body: 692 | encoding: UTF-8 693 | string: "[]" 694 | http_version: 695 | recorded_at: Sat, 01 Dec 2018 01:09:08 GMT 696 | - request: 697 | method: get 698 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=99%20Fictitious%20St,%20Westminster,%20London%20SW1A%202AA 699 | body: 700 | encoding: US-ASCII 701 | string: '' 702 | headers: 703 | Accept-Encoding: 704 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 705 | Accept: 706 | - "*/*" 707 | User-Agent: 708 | - Ruby 709 | response: 710 | status: 711 | code: 200 712 | message: OK 713 | headers: 714 | Date: 715 | - Sat, 01 Dec 2018 01:09:08 GMT 716 | Server: 717 | - Apache/2.4.29 (Ubuntu) 718 | Access-Control-Allow-Origin: 719 | - "*" 720 | Access-Control-Allow-Methods: 721 | - OPTIONS,GET 722 | Strict-Transport-Security: 723 | - max-age=31536000; includeSubDomains; preload 724 | Expect-Ct: 725 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 726 | Upgrade: 727 | - h2 728 | Connection: 729 | - Upgrade, close 730 | Transfer-Encoding: 731 | - chunked 732 | Content-Type: 733 | - application/json; charset=UTF-8 734 | body: 735 | encoding: UTF-8 736 | string: "[]" 737 | http_version: 738 | recorded_at: Sat, 01 Dec 2018 01:09:08 GMT 739 | - request: 740 | method: get 741 | uri: https://nominatim.openstreetmap.org/search?accept-language=en&addressdetails=1&format=json&q=99%20Fictitious%20St,%20Westminster,%20London%20SW1A%202AA 742 | body: 743 | encoding: US-ASCII 744 | string: '' 745 | headers: 746 | Accept-Encoding: 747 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 748 | Accept: 749 | - "*/*" 750 | User-Agent: 751 | - Ruby 752 | response: 753 | status: 754 | code: 200 755 | message: OK 756 | headers: 757 | Date: 758 | - Sat, 01 Dec 2018 01:09:09 GMT 759 | Server: 760 | - Apache/2.4.29 (Ubuntu) 761 | Access-Control-Allow-Origin: 762 | - "*" 763 | Access-Control-Allow-Methods: 764 | - OPTIONS,GET 765 | Strict-Transport-Security: 766 | - max-age=31536000; includeSubDomains; preload 767 | Expect-Ct: 768 | - max-age=0, report-uri="https://openstreetmap.report-uri.com/r/d/ct/reportOnly" 769 | Upgrade: 770 | - h2 771 | Connection: 772 | - Upgrade, close 773 | Transfer-Encoding: 774 | - chunked 775 | Content-Type: 776 | - application/json; charset=UTF-8 777 | body: 778 | encoding: UTF-8 779 | string: "[]" 780 | http_version: 781 | recorded_at: Sat, 01 Dec 2018 01:09:09 GMT 782 | recorded_with: VCR 4.0.0 783 | --------------------------------------------------------------------------------