mainstreet 0.1.0 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d572831c5d0c80c6580ac885edf6c1ea8137589d
4
- data.tar.gz: 3f50e8e84d9edad8918aa83e9b87ca6f450bc196
2
+ SHA256:
3
+ metadata.gz: '08e1a7061a00946e499902c0eab2b4a9ab51971a69ab722626b89047aa4c1eca'
4
+ data.tar.gz: e7696455f9372bdb90b889fb8193a499f992a6ecc3b1a6c51fc2c1cf732ca0ce
5
5
  SHA512:
6
- metadata.gz: f9b58c621595ee590c924beb58aa5f4c6402c9df339fc62fd78ea3789ca8ec23accc756f5dabc41a5733c42d98271431db6e1eba007d21ed8dbf2c232fe69134
7
- data.tar.gz: 954950d8881fd942e1f159e540eb1634780bb36350720402df09f6f25326490d35e1f38d85f9dd98aa4e2ec0fcf0fccc1d34b5a7024d9dc1d9438ada00558e15
6
+ metadata.gz: e9a5c7b6147226624d4492df51bde93d1ae3c35f3da48a3f2e5730f8e649011e1108e13bdf2469e32feae23e722140721907a029d9343c3d8d52f9aef653cc3f
7
+ data.tar.gz: 52038f683d0fa478446c4a04d1a74aa545bac6f75b54d9bc98a5827855374ca88383e9deb32ae3479269e742765bb06b75dca6249f7dad786ce601cb69f480ed
data/CHANGELOG.md ADDED
@@ -0,0 +1,29 @@
1
+ ## 0.2.3 (2022-02-08)
2
+
3
+ - Added `lookup` option
4
+ - Fixed duplicate API calls for invalid addresses
5
+
6
+ ## 0.2.2 (2020-04-16)
7
+
8
+ - Fixed bug with SmartyStreets and ZIP code only addresses
9
+
10
+ ## 0.2.1 (2019-10-04)
11
+
12
+ - Added support for i18n
13
+ - Added support for more validation options like `if` and `on`
14
+ - Specified minimum Geocoder version
15
+
16
+ ## 0.2.0 (2018-11-30)
17
+
18
+ - Added `AddressVerifier`
19
+ - Added `validates_address` method
20
+ - Removed `acts_as_address` method
21
+
22
+ ## 0.1.0 (2017-05-01)
23
+
24
+ - Added more validation
25
+ - Fixed model generator for Rails 5
26
+
27
+ ## 0.0.1 (2015-03-14)
28
+
29
+ - First release
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015 Andrew Kane
3
+ Copyright (c) 2015-2022 Andrew Kane
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,95 +1,163 @@
1
1
  # MainStreet
2
2
 
3
- A standard US address model for Rails
3
+ Address verification for Ruby and Rails
4
4
 
5
- You get:
5
+ :earth_americas: Supports international addresses
6
6
 
7
- - verification
8
- - standardization
9
- - geocoding
7
+ [![Build Status](https://github.com/ankane/mainstreet/workflows/build/badge.svg?branch=master)](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
+ ```
10
16
 
11
17
  ## How It Works
12
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
+
13
23
  ```ruby
14
- Address.create!(street: "1 infinite loop", zip_code: "95014")
24
+ ENV["SMARTY_STREETS_AUTH_ID"] = "auth-id"
25
+ ENV["SMARTY_STREETS_AUTH_TOKEN"] = "auth-token"
15
26
  ```
16
27
 
17
- This creates an address with:
28
+ ## How to Use
18
29
 
19
- - street - `1 Infinite Loop`
20
- - city - `Cupertino`
21
- - state - `CA`
22
- - zip_code - `95014`
23
- - latitude - `37.33053`
24
- - longitude - `-122.02887`
25
- - original_attributes - `{"street"=>"1 infinite loop", "street2"=>nil, "city"=>nil, "state"=>nil, "zip_code"=>"95014"}`
26
- - verification_info
30
+ Check an address with:
27
31
 
28
- ### Verification
32
+ ```ruby
33
+ address = "1600 Pennsylvania Ave NW, Washington DC 20500"
34
+ verifier = MainStreet::AddressVerifier.new(address)
35
+ verifier.success?
36
+ ```
29
37
 
30
- By default, MainStreet performs ZIP code verification.
38
+ If verification fails, get the failure message with:
31
39
 
32
40
  ```ruby
33
- address = Address.new(street:"1 infinite loop", zip_code: "95015")
34
- address.valid?
35
- # false
36
- address.errors.full_messages
37
- # ["Did you mean 95014?"]
41
+ verifier.failure_message
38
42
  ```
39
43
 
40
- For full verification, including unit number, [see below](#full-verification).
44
+ Get details about the result with:
41
45
 
42
- ## Installation
46
+ ```ruby
47
+ verifier.result
48
+ ```
43
49
 
44
- Add this line to your application’s Gemfile:
50
+ Get the latitude and longitude with:
45
51
 
46
52
  ```ruby
47
- gem 'mainstreet'
53
+ verifier.latitude
54
+ verifier.longitude
48
55
  ```
49
56
 
50
- To create a new address model, run:
57
+ ## Active Record
51
58
 
52
- ```sh
53
- rails g mainstreet:address
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
54
65
  ```
55
66
 
56
- This creates an `Address` model with:
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:
57
70
 
58
- - street
59
- - street2
60
- - city
61
- - state
62
- - zip_code
63
- - latitude
64
- - longitude
65
- - original_attributes
66
- - verification_info
71
+ ```ruby
72
+ class User < ApplicationRecord
73
+ validates_address if: -> { something_changed? }, ...
74
+ end
75
+ ```
67
76
 
68
- To add to an existing model:
77
+ Geocode the address with:
69
78
 
70
- 1. Use `alias_attribute` to map existing field names
71
- 2. Add new fields like `original_attributes` and `verification_info`
72
- 3. Add `acts_as_address` to your model
79
+ ```ruby
80
+ class User < ApplicationRecord
81
+ validates_address geocode: true, ...
82
+ end
83
+ ```
73
84
 
74
- ## Full Verification
85
+ The `latitude` and `longitude` fields are used by default. Specify the fields with:
75
86
 
76
- [SmartyStreets](https://smartystreets.com/features) is required for full verification. The free plan supports 250 lookups per month.
87
+ ```ruby
88
+ class User < ApplicationRecord
89
+ validates_address geocode: {latitude: :lat, longitude: :lon}, ...
90
+ end
91
+ ```
77
92
 
78
- Set:
93
+ Empty addresses are not verified. To require an address, add your own validation.
79
94
 
80
95
  ```ruby
81
- ENV["SMARTY_STREETS_AUTH_ID"] = "auth-id"
82
- ENV["SMARTY_STREETS_AUTH_TOKEN"] = "auth-token"
96
+ class User < ApplicationRecord
97
+ validates :street, presence: true
98
+ end
83
99
  ```
84
100
 
85
- To test it, run:
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.
86
144
 
87
145
  ```ruby
88
- address = Address.new(street: "122 Mast Rd", zip_code: "03861")
89
- address.valid?
90
- # should get false
146
+ class User < ApplicationRecord
147
+ encrypts :street, :postal_code
148
+ end
91
149
  ```
92
150
 
151
+ ## Upgrading
152
+
153
+ ### 0.2.0
154
+
155
+ See the [upgrade guide](docs/0-2-Upgrade.md)
156
+
157
+ ## History
158
+
159
+ View the [changelog](https://github.com/ankane/mainstreet/blob/master/CHANGELOG.md)
160
+
93
161
  ## Contributing
94
162
 
95
163
  Everyone is encouraged to help improve this project. Here are a few ways you can help:
@@ -98,3 +166,12 @@ Everyone is encouraged to help improve this project. Here are a few ways you can
98
166
  - Fix bugs and [submit pull requests](https://github.com/ankane/mainstreet/pulls)
99
167
  - Write, clarify, or fix documentation
100
168
  - Suggest or add new features
169
+
170
+ To get started with development:
171
+
172
+ ```sh
173
+ git clone https://github.com/ankane/mainstreet.git
174
+ cd mainstreet
175
+ bundle install
176
+ bundle exec rake test
177
+ ```
@@ -0,0 +1,82 @@
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
@@ -0,0 +1,35 @@
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
@@ -1,3 +1,3 @@
1
- module Mainstreet
2
- VERSION = "0.1.0"
1
+ module MainStreet
2
+ VERSION = "0.2.3"
3
3
  end
data/lib/mainstreet.rb CHANGED
@@ -1,95 +1,32 @@
1
- require "mainstreet/version"
1
+ # dependencies
2
2
  require "geocoder"
3
3
 
4
- module Mainstreet
4
+ # modules
5
+ require "mainstreet/address_verifier"
6
+ require "mainstreet/version"
7
+
8
+ module MainStreet
5
9
  class << self
6
10
  attr_writer :lookup
7
11
 
8
12
  def lookup
9
- @lookup ||= begin
10
- if ENV["SMARTY_STREETS_AUTH_ID"] && ENV["SMARTY_STREETS_AUTH_TOKEN"]
11
- Geocoder.config[:smarty_streets] ||= {api_key: [ENV["SMARTY_STREETS_AUTH_ID"], ENV["SMARTY_STREETS_AUTH_TOKEN"]]}
12
- end
13
- Geocoder.config[:smarty_streets] ? :smarty_streets : nil
14
- end
13
+ @lookup ||= ENV["SMARTY_STREETS_AUTH_ID"] ? :smarty_streets : nil
15
14
  end
16
15
  end
16
+ end
17
17
 
18
- module Model
19
- def acts_as_address(_options = {})
20
- class_eval do
21
- serialize :original_attributes
22
- serialize :verification_info
23
-
24
- validates :street, presence: true
25
- validate :verify_address, if: -> { address_fields_changed? }
26
- before_save :standardize_address, if: -> { address_fields_changed? }
27
-
28
- def verify_address
29
- if zip_code.blank? && (city.blank? || state.blank?)
30
- errors.add(:base, "Address can't be confirmed")
31
- end
32
- if errors.empty?
33
- @verification_result = fetch_verification_info
34
- if @verification_result
35
- if @verification_result.respond_to?(:analysis)
36
- case @verification_result.analysis["dpv_match_code"]
37
- when "N"
38
- errors.add(:base, "Address can't be confirmed")
39
- when "S"
40
- errors.add(:base, "Apartment or suite can't be confirmed")
41
- when "D"
42
- errors.add(:base, "Apartment or suite is missing")
43
- end
44
- end
45
-
46
- correct_zip_code = @verification_result.postal_code
47
- if zip_code != correct_zip_code
48
- errors.add(:base, "Did you mean #{correct_zip_code}?")
49
- end
50
- else
51
- errors.add(:base, "Address can't be confirmed")
52
- end
53
- end
54
- errors.full_messages
55
- end
56
-
57
- def standardize_address
58
- result = @verification_result
59
- if result
60
- info = result.data
61
- self.original_attributes = attributes.slice(*address_fields)
62
- self.verification_info = result.data.to_hash
63
- self.street =
64
- if result.respond_to?(:delivery_line_1)
65
- result.delivery_line_1
66
- else
67
- result.formatted_address.split(",").first
68
- end
69
- self.street2 = nil
70
- self.city = result.city
71
- self.state = result.state_code
72
- self.zip_code = result.postal_code
73
- self.latitude = result.latitude
74
- self.longitude = result.longitude
75
- end
76
- true
77
- end
78
-
79
- def fetch_verification_info
80
- Geocoder.search("#{street} #{street2} #{city}, #{state} #{zip_code}", lookup: Mainstreet.lookup).first
81
- end
82
-
83
- def address_fields_changed?
84
- address_fields.any? { |f| send("#{f}_changed?") }
85
- end
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
86
26
 
87
- def address_fields
88
- attributes.keys & %w(street street2 city state zip_code)
89
- end
90
- end
91
- end
27
+ if defined?(ActiveSupport.on_load)
28
+ ActiveSupport.on_load(:active_record) do
29
+ require "mainstreet/model"
30
+ extend MainStreet::Model
92
31
  end
93
32
  end
94
-
95
- ActiveRecord::Base.send(:extend, Mainstreet::Model) if defined?(ActiveRecord)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mainstreet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
9
- bindir: exe
8
+ autorequire:
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-01 00:00:00.000000000 Z
11
+ date: 2022-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: geocoder
@@ -16,147 +16,32 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 1.5.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.8'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.8'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '10.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '10.0'
55
- - !ruby/object:Gem::Dependency
56
- name: minitest
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: activerecord
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: sqlite3
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: smartystreets
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: vcr
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: webmock
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - ">="
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- description: A standard US address model for Rails
140
- email:
141
- - andrew@chartkick.com
26
+ version: 1.5.1
27
+ description:
28
+ email: andrew@ankane.org
142
29
  executables: []
143
30
  extensions: []
144
31
  extra_rdoc_files: []
145
32
  files:
146
- - ".gitignore"
147
- - Gemfile
33
+ - CHANGELOG.md
148
34
  - LICENSE.txt
149
35
  - README.md
150
- - Rakefile
151
- - lib/generators/mainstreet/address_generator.rb
152
36
  - lib/mainstreet.rb
37
+ - lib/mainstreet/address_verifier.rb
38
+ - lib/mainstreet/model.rb
153
39
  - lib/mainstreet/version.rb
154
- - mainstreet.gemspec
155
40
  homepage: https://github.com/ankane/mainstreet
156
41
  licenses:
157
42
  - MIT
158
43
  metadata: {}
159
- post_install_message:
44
+ post_install_message:
160
45
  rdoc_options: []
161
46
  require_paths:
162
47
  - lib
@@ -164,16 +49,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
164
49
  requirements:
165
50
  - - ">="
166
51
  - !ruby/object:Gem::Version
167
- version: '0'
52
+ version: '2.2'
168
53
  required_rubygems_version: !ruby/object:Gem::Requirement
169
54
  requirements:
170
55
  - - ">="
171
56
  - !ruby/object:Gem::Version
172
57
  version: '0'
173
58
  requirements: []
174
- rubyforge_project:
175
- rubygems_version: 2.5.1
176
- signing_key:
59
+ rubygems_version: 3.3.3
60
+ signing_key:
177
61
  specification_version: 4
178
- summary: A standard US address model for Rails
62
+ summary: Address verification for Ruby and Rails
179
63
  test_files: []
data/.gitignore DELETED
@@ -1,10 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
- /test/fixtures/
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in mainstreet.gemspec
4
- gemspec
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
-
4
- task default: :test
5
- Rake::TestTask.new do |t|
6
- t.libs << "test"
7
- t.pattern = "test/**/*_test.rb"
8
- end
@@ -1,10 +0,0 @@
1
- require "rails/generators"
2
-
3
- module Mainstreet
4
- class AddressGenerator < Rails::Generators::Base
5
- def boom
6
- invoke "model", ["Address", "street:string", "street2:string", "city:string", "state:string", "zip_code:string", "latitude:decimal{15.10}", "longitude:decimal{15.10}", "verification_info:text", "original_attributes:text"], options
7
- insert_into_file "app/models/address.rb", " acts_as_address\n", after: "ApplicationRecord\n"
8
- end
9
- end
10
- end
data/mainstreet.gemspec DELETED
@@ -1,32 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "mainstreet/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "mainstreet"
8
- spec.version = Mainstreet::VERSION
9
- spec.authors = ["Andrew Kane"]
10
- spec.email = ["andrew@chartkick.com"]
11
-
12
- spec.summary = "A standard US address model for Rails"
13
- spec.description = "A standard US address model for Rails"
14
- spec.homepage = "https://github.com/ankane/mainstreet"
15
- spec.license = "MIT"
16
-
17
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
- spec.bindir = "exe"
19
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
- spec.require_paths = ["lib"]
21
-
22
- spec.add_dependency "geocoder"
23
-
24
- spec.add_development_dependency "bundler", "~> 1.8"
25
- spec.add_development_dependency "rake", "~> 10.0"
26
- spec.add_development_dependency "minitest"
27
- spec.add_development_dependency "activerecord"
28
- spec.add_development_dependency "sqlite3"
29
- spec.add_development_dependency "smartystreets"
30
- spec.add_development_dependency "vcr"
31
- spec.add_development_dependency "webmock"
32
- end