location 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f41922279600670cf0eda74410ac5c15252ef970
4
- data.tar.gz: 9090ba682f5b4f59662fa9f6380d265bf881fcbc
3
+ metadata.gz: 5ec5da426070f00af7462e481cc7a3875b20d04b
4
+ data.tar.gz: 8db38ffe3f9756df01c3c2a936d97435d8fd44dc
5
5
  SHA512:
6
- metadata.gz: a7214776f86d06f7b71a0beafba8bfb53ae758e95e23441921b657af8e5a01513f11fe8a62bf921c0f16ea461e8b39bdd206212f8ca3935dd9224303c3a4f5eb
7
- data.tar.gz: 00e312c8dbb1fa5a20049887b0250e6c2de7e23dc579d65409a18bb3e321179a756dff9e36d245a207469c1fc2ee12c81e609647fe238677b5c744c1ee320f0a
6
+ metadata.gz: 03e96a958095e5839bfda023f814848958b33eee8f05820751b43f5b8313a781e713b1c47b092be8ad8baccad636b93218dcd474f0d85dba42bd75fb0b44e035
7
+ data.tar.gz: 0efbafdc4015d8ed4778b09ab10cf5b17c55f172f5b829f8add24e82f393f6a20a0696ae6caf0fff9f3e3221ba29b395a7c84c7915dfa7d93b89482a69842f16
@@ -0,0 +1,20 @@
1
+ module Location
2
+ module FindOrCreate
3
+ def find_or_save!(attributes)
4
+ attributes = self.attributes.select { |k| k =~ /_id$/ }
5
+ .merge(attributes)
6
+
7
+ if attributes[:normalized]
8
+ object = self.class.find_by(attributes)
9
+ end
10
+
11
+ if object
12
+ object
13
+ else
14
+ self.attributes = attributes
15
+ save!
16
+ self
17
+ end
18
+ end
19
+ end
20
+ end
@@ -7,18 +7,13 @@ module Location
7
7
 
8
8
  before_save :format_postal_code
9
9
 
10
- validates :address, length: { maximum: 150 }
11
- validates :number, length: { maximum: 20 }
12
- validates :complement, length: { maximum: 40 }
13
- validates :latitude, :longitude, numericality: true, allow_blank: true
14
-
15
10
  scope :full, ->{ eager_load(:district).eager_load(:city).eager_load(:state) }
16
11
  default_scope { full }
17
12
 
18
13
  def to_hash
19
14
  {
20
15
  postal_code: self.postal_code,
21
- address: self.address,
16
+ street: self.street,
22
17
  number: self.number,
23
18
  complement: self.complement,
24
19
  district: self.district.try(:name),
@@ -0,0 +1,21 @@
1
+ module Location
2
+ module AddressAttributable
3
+ fields = %i{postal_code street number complement
4
+ district city state latitude longitude}
5
+
6
+ fields.each do |field|
7
+ attr_writer field
8
+
9
+ define_method field do
10
+ instance_value = instance_variable_get("@#{field}")
11
+
12
+ if instance_value.nil? && respond_to?(:address) && !address.nil?
13
+ value = address.send(field)
14
+ value.respond_to?(:name) ? value.name : value
15
+ else
16
+ instance_value
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,19 +1,20 @@
1
1
  require 'super_form'
2
+ require 'location/address_validatable'
3
+ require 'location/address_normalizable'
4
+ require 'location/address_persister'
2
5
 
3
6
  module Location
4
7
  class AddressForm
5
8
  include SuperForm
6
-
7
- def self.normalizable_attributes
8
- %i{state city district}
9
- end
9
+ include AddressValidatable
10
+ include AddressNormalizable
10
11
 
11
12
  def self.default_presence_attributes
12
- %i{postal_code address district}
13
+ %i{postal_code street district}
13
14
  end
14
15
 
15
16
  def self.string_attributes
16
- %i{postal_code address number complement district city state}
17
+ %i{postal_code street number complement district city state}
17
18
  end
18
19
 
19
20
  def self.float_attributes
@@ -27,44 +28,15 @@ module Location
27
28
  validates attr, presence: true, if: ->(a){ a.presence[attr] }
28
29
  end
29
30
 
30
- before_validation :build_finder
31
- validate :ensure_find_address
32
- before_save :normalize_attributes!
33
-
34
- attr_accessor :model
31
+ attr_accessor :address
35
32
 
36
33
  def presence
37
34
  @presence || validate_presence_of(AddressForm.default_presence_attributes)
38
35
  end
39
36
 
40
- def address_attributes
41
- attributes = %w{postal_code address number complement latitude longitude}
42
- values_for_attributes(attributes)
43
- end
44
-
45
- def normalized_attributes=(attributes)
46
- @normalized_attributes = Array(attributes)
47
- ensure_valid_normalized_attributes!
48
- end
49
-
50
- def normalized_attributes
51
- @normalized_attributes ||= Location.configuration.normalized_fields
52
- ensure_valid_normalized_attributes!
53
- @normalized_attributes
54
- end
55
-
56
- def ensure_valid_normalized_attributes!
57
- unless valid_normalized_attributes?
58
- raise ::StandardError.new, "Invalid normalizable attributes"
59
- end
60
- end
61
-
62
- def attribute_normalized?(attr)
63
- normalized_attributes.include?(attr)
64
- end
65
-
66
37
  def validate_presence_of(attributes)
67
38
  attributes = Array(attributes)
39
+
68
40
  @presence = self.attributes.keys.inject({}) do |hash, attr|
69
41
  hash[attr] = attributes.include?(attr)
70
42
  hash
@@ -73,76 +45,8 @@ module Location
73
45
 
74
46
  private
75
47
 
76
- def valid_normalized_attributes?
77
- valid = self.class.normalizable_attributes.slice(0, @normalized_attributes.count)
78
- valid == @normalized_attributes || valid.reverse == @normalized_attributes
79
- end
80
-
81
48
  def persist!
82
- State.transaction(requires_new: true) do
83
- if @model.try(:persisted?)
84
- update
85
- else
86
- create
87
- end
88
- end
89
- end
90
-
91
- def create
92
- state = create_attribute(:state, State)
93
- city = create_attribute(:city, state.cities)
94
- district = create_attribute(:district, city.districts)
95
-
96
- @model = district.addresses.create!(address_attributes)
97
- end
98
-
99
- def update
100
- @model.update(address_attributes)
101
-
102
- district = update_attribute(@model, :district)
103
- city = update_attribute(district, :city)
104
-
105
- update_attribute(city, :state)
106
- end
107
-
108
- def update_attribute(parent, attr)
109
- child = parent.send(attr) || parent.send("build_#{attr.to_s}")
110
- child.update(attributes_for(attr))
111
- child
112
- end
113
-
114
- def attributes_for(attr)
115
- { name: send(attr), normalized: attribute_normalized?(attr) }
116
- end
117
-
118
- def create_attribute(attr, klass)
119
- attrs = attributes_for(attr)
120
- method = attrs[:normalized] ? "first_or_create!" : "create!"
121
- klass.send(method, attrs)
122
- end
123
-
124
- def build_finder
125
- @finder = Finder.build(postal_code)
126
- end
127
-
128
- def ensure_find_address
129
- @finder.find do |f|
130
- unless f.successful?
131
- errors.add :postal_code, %{Can't find address for #{postal_code}}
132
- end
133
- end
134
- end
135
-
136
- def normalize_attributes!
137
- normalized_attributes.each do |f|
138
- send("#{f}=", @finder.address.send(f))
139
- end
140
- end
141
-
142
- def values_for_attributes(attributes)
143
- attributes.each_with_object({}) do |attr, hash|
144
- hash[attr] = send(attr)
145
- end
49
+ AddressPersister.new(address_normalizer, address).persist!
146
50
  end
147
51
  end
148
52
  end
@@ -0,0 +1,29 @@
1
+ require 'active_support/concern'
2
+ require 'location/address_normalizer'
3
+
4
+ module Location
5
+ module AddressNormalizable
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ before_save :normalize_attributes!
10
+ end
11
+
12
+ def normalizable_address_attributes=(attributes)
13
+ address_normalizer.normalizable = attributes
14
+ end
15
+
16
+ def address_normalizer
17
+ (@normalizers ||= {})[postal_code] ||= Location::AddressNormalizer.new(self)
18
+ end
19
+
20
+ private
21
+
22
+ def normalize_attributes!
23
+ unless address_normalizer.normalize!
24
+ errors.add :postal_code, %{Can't find address for #{postal_code}}
25
+ false
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_support/concern'
2
+ require 'location/address_attributable'
3
+ require 'location/address_validatable'
4
+ require 'location/address_normalizable'
5
+
6
+ module Location
7
+ module AddressPersistable
8
+ extend ActiveSupport::Concern
9
+
10
+ attr_writer :address_persister
11
+
12
+ included do
13
+ include Location::AddressAttributable
14
+ include Location::AddressValidatable
15
+ include Location::AddressNormalizable
16
+
17
+ before_save :persist_address!
18
+ end
19
+
20
+ def address_persister
21
+ @address_persister ||= AddressPersister.new(address_normalizer, address)
22
+ end
23
+
24
+ def persist_address!
25
+ address_persister.persist!
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,52 @@
1
+ module Location
2
+ class AddressPersister
3
+ attr_reader :normalizer, :address
4
+
5
+ def initialize(normalizer, address)
6
+ @normalizer = normalizer
7
+ @address = address
8
+ end
9
+
10
+ def persist!
11
+ State.transaction(requires_new: true) do
12
+ if @address && @address.persisted?
13
+ update
14
+ else
15
+ create
16
+ end
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def create
23
+ state = create_attribute(:state, State.new)
24
+ city = create_attribute(:city, state.cities.build)
25
+ district = create_attribute(:district, city.districts.build)
26
+
27
+ @address = district.addresses.create!(@normalizer.attributes)
28
+ @normalizer.address = @address
29
+ end
30
+
31
+ def create_attribute(attribute, object)
32
+ attributes = @normalizer.parameterize_attribute(attribute)
33
+ object.find_or_save!(attributes)
34
+ end
35
+
36
+ def update
37
+ @address.update(@normalizer.attributes)
38
+
39
+ district = update_attribute(@address, :district)
40
+ city = update_attribute(district, :city)
41
+
42
+ update_attribute(city, :state)
43
+ end
44
+
45
+ def update_attribute(parent, attr)
46
+ child = parent.send(attr) || parent.send("build_#{attr.to_s}")
47
+ attributes = @normalizer.parameterize_attribute(attr)
48
+ child.update(attributes)
49
+ child
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,17 @@
1
+ require 'active_support/concern'
2
+
3
+ module Location
4
+ module AddressValidatable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ validates :street, length: { maximum: 150 }
9
+ validates :number, length: { maximum: 20 }
10
+ validates :complement, length: { maximum: 40 }
11
+ validates :latitude, :longitude, numericality: true, allow_blank: true
12
+ validates :district, length: { maximum: 150 }
13
+ validates :city, length: { maximum: 150 }
14
+ validates :state, length: { maximum: 150 }
15
+ end
16
+ end
17
+ end
@@ -1,8 +1,10 @@
1
+ require 'concerns/find_or_create'
2
+
1
3
  module Location
2
4
  class City < ActiveRecord::Base
5
+ include FindOrCreate
6
+
3
7
  has_many :districts
4
8
  belongs_to :state, dependent: :destroy
5
-
6
- validates :name, length: { maximum: 150 }
7
9
  end
8
10
  end
@@ -1,8 +1,10 @@
1
+ require 'concerns/find_or_create'
2
+
1
3
  module Location
2
4
  class District < ActiveRecord::Base
5
+ include FindOrCreate
6
+
3
7
  has_many :addresses
4
8
  belongs_to :city
5
-
6
- validates :name, length: { maximum: 150 }
7
9
  end
8
10
  end
@@ -0,0 +1,23 @@
1
+ module Location
2
+ class NormalizableAddress < Address
3
+ include Location::AddressValidatable
4
+ include Location::AddressNormalizable
5
+
6
+ attr_accessor :district_name, :city_name, :state_name
7
+
8
+ before_create :persist_address!
9
+ after_update :persist_address!
10
+
11
+ def address_persister
12
+ @address_persister ||= AddressPersister.new(address_normalizer, self, true)
13
+ end
14
+
15
+ def persist_address!
16
+ address_persister.persist!
17
+ end
18
+
19
+ def self.inheritance_column
20
+ nil
21
+ end
22
+ end
23
+ end
@@ -1,9 +1,11 @@
1
+ require 'concerns/find_or_create'
2
+
1
3
  module Location
2
4
  class State < ActiveRecord::Base
5
+ include FindOrCreate
6
+
3
7
  has_many :cities, dependent: :destroy
4
8
  has_many :districts, through: :cities
5
9
  has_many :addresses, through: :districts
6
-
7
- validates :name, length: { maximum: 150 }
8
10
  end
9
11
  end
@@ -0,0 +1,5 @@
1
+ class RenameAddressToStreet < ActiveRecord::Migration
2
+ def change
3
+ rename_column :location_addresses, :address, :street
4
+ end
5
+ end
@@ -19,14 +19,14 @@ module Location
19
19
  class Configuration
20
20
  attr_accessor :default_service
21
21
  attr_accessor :service_options
22
- attr_accessor :concat_type_to_address
23
- attr_accessor :normalized_fields
22
+ attr_accessor :concat_type_to_street
23
+ attr_accessor :normalizable_attributes
24
24
 
25
25
  def initialize
26
26
  @default_service = Services::Republica
27
27
  @service_options = {}
28
- @concat_type_to_address = false
29
- @normalized_fields = %i{state city}
28
+ @concat_type_to_street = false
29
+ @normalizable_attributes = %i{state city}
30
30
  end
31
31
  end
32
32
  end
@@ -0,0 +1,78 @@
1
+ require 'delegate'
2
+ require 'location/finder'
3
+
4
+ module Location
5
+ class AddressNormalizer
6
+ extend Forwardable
7
+
8
+ def self.allowed_for_normalization
9
+ %i{state city district}
10
+ end
11
+
12
+ def self.default_normalizable
13
+ Location.configuration.normalizable_attributes
14
+ end
15
+
16
+ attr_reader :model
17
+ def_delegators :model, :address, :address=
18
+
19
+ def initialize(model)
20
+ @model = model
21
+ end
22
+
23
+ def normalize!
24
+ Finder.find(@model.postal_code) do |finder|
25
+ return false unless finder.successful?
26
+
27
+ normalizable.each do |a|
28
+ value = finder.address.send(a)
29
+ @model.send("#{a}=", value) unless value.nil?
30
+ end
31
+ end
32
+ end
33
+
34
+ def normalizable=(attributes)
35
+ @normalizable = Array(attributes)
36
+ ensure_valid_normalizable!
37
+ end
38
+
39
+ def normalizable
40
+ @normalizable ||= self.class.default_normalizable
41
+ ensure_valid_normalizable!
42
+
43
+ @normalizable
44
+ end
45
+
46
+ def normalizable?(attribute)
47
+ normalizable.include?(attribute)
48
+ end
49
+
50
+ def attributes
51
+ attributes = %w{postal_code street number complement latitude longitude}
52
+
53
+ attributes.each_with_object({}) do |attr, hash|
54
+ hash[attr] = @model.send(attr)
55
+ end
56
+ end
57
+
58
+ def parameterize_attribute(attribute)
59
+ {
60
+ name: @model.send(attribute),
61
+ normalized: normalizable?(attribute)
62
+ }
63
+ end
64
+
65
+ private
66
+
67
+ def ensure_valid_normalizable!
68
+ unless valid_normalizable?
69
+ raise ::StandardError.new, "Invalid normalizable attributes"
70
+ end
71
+ end
72
+
73
+ def valid_normalizable?
74
+ valid = self.class.allowed_for_normalization.slice(0, @normalizable.count)
75
+ valid == @normalizable || valid.reverse == @normalizable
76
+ end
77
+ end
78
+ end
@@ -13,8 +13,8 @@ module Location
13
13
 
14
14
  def initialize(postal_code, service)
15
15
  @postal_code = postal_code
16
- @service = service
17
- @address = Address.new
16
+ @service = service
17
+ @address = Address.new
18
18
  end
19
19
 
20
20
  def find
@@ -34,17 +34,17 @@ module Location
34
34
 
35
35
  class Address
36
36
  attr_accessor :type, :postal_code
37
- attr_accessor :address, :number, :complement
37
+ attr_accessor :street, :number, :complement
38
38
  attr_accessor :district, :city, :state
39
39
 
40
40
  def type=(type)
41
41
  @type = type
42
- concat_type_to_address
42
+ concat_type_to_street
43
43
  end
44
44
 
45
- def address=(address)
46
- @address = address
47
- concat_type_to_address
45
+ def street=(street)
46
+ @street = street
47
+ concat_type_to_street
48
48
  end
49
49
 
50
50
  def to_hash(options = {})
@@ -61,17 +61,17 @@ module Location
61
61
 
62
62
  private
63
63
 
64
- def concat_type_to_address
65
- concat_type_to_address! if concat_type_to_address?
64
+ def concat_type_to_street
65
+ concat_type_to_street! if concat_type_to_street?
66
66
  end
67
67
 
68
- def concat_type_to_address?
69
- Location.configuration.concat_type_to_address &&
70
- !type.nil? && !address.nil?
68
+ def concat_type_to_street?
69
+ Location.configuration.concat_type_to_street &&
70
+ !type.nil? && !street.nil?
71
71
  end
72
72
 
73
- def concat_type_to_address!
74
- @address = "#{type} #{address}"
73
+ def concat_type_to_street!
74
+ @street = "#{type} #{street}"
75
75
  end
76
76
  end
77
77
  end
@@ -1,23 +1,20 @@
1
1
  module Location
2
2
  module Services
3
3
  class StubbedService
4
- class << self
5
- attr_writer :attributes
4
+ def self.attributes
5
+ @attributes ||= {}
6
6
  end
7
7
 
8
- def self.attributes
9
- @attributes || {
10
- address: 'R. Barata Ribeiro',
11
- number: '1981',
12
- complement: '',
13
- district: 'Copacabana',
14
- city: 'Rio de Janeiro',
15
- state: 'RJ'
16
- }
8
+ def self.set_result(postal_code, attributes)
9
+ self.attributes[postal_code] ||= attributes
10
+ end
11
+
12
+ def self.attributes_for(postal_code)
13
+ self.attributes[postal_code] || {}
17
14
  end
18
15
 
19
16
  def fetch(postal_code, address)
20
- StubbedService.attributes.each do |k, v|
17
+ self.class.attributes_for(postal_code).each do |k, v|
21
18
  address.send("#{k}=", v)
22
19
  end
23
20
  end
@@ -15,7 +15,7 @@ module Location
15
15
  address.city = res['cidade']
16
16
  address.district = res['bairro']
17
17
  address.type = res['tipo_logradouro']
18
- address.address = res['logradouro']
18
+ address.street = res['logradouro']
19
19
  end
20
20
  end
21
21
 
@@ -38,7 +38,7 @@ module Location
38
38
  end
39
39
 
40
40
  yield eval_result(response.body)
41
- rescue Net::HTTPBadResponse => e
41
+ rescue Net::HTTPBadResponse
42
42
  raise Error.new, 'Got a bad response'
43
43
  rescue SocketError
44
44
  raise Error.new, 'Got a socket error'
@@ -1,3 +1,3 @@
1
1
  module Location
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: location
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thiago A. Silva
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-21 00:00:00.000000000 Z
11
+ date: 2014-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.0'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 4.0.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,37 +24,62 @@ dependencies:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '4.0'
30
- - - ">="
27
+ - !ruby/object:Gem::Dependency
28
+ name: super_form
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
31
32
  - !ruby/object:Gem::Version
32
- version: 4.0.0
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
33
41
  - !ruby/object:Gem::Dependency
34
- name: sqlite3
42
+ name: virtus
35
43
  requirement: !ruby/object:Gem::Requirement
36
44
  requirements:
37
45
  - - '='
38
46
  - !ruby/object:Gem::Version
39
- version: 1.3.8
40
- type: :development
47
+ version: 1.0.1
48
+ type: :runtime
41
49
  prerelease: false
42
50
  version_requirements: !ruby/object:Gem::Requirement
43
51
  requirements:
44
52
  - - '='
45
53
  - !ruby/object:Gem::Version
46
- version: 1.3.8
54
+ version: 1.0.1
47
55
  - !ruby/object:Gem::Dependency
48
- name: super_form
56
+ name: activemodel
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  requirements:
51
- - - "~>"
59
+ - - '='
52
60
  - !ruby/object:Gem::Version
53
- version: '0.1'
61
+ version: 4.0.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 4.0.3
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.3.8
54
76
  type: :development
55
77
  prerelease: false
56
78
  version_requirements: !ruby/object:Gem::Requirement
57
79
  requirements:
58
- - - "~>"
80
+ - - '='
59
81
  - !ruby/object:Gem::Version
60
- version: '0.1'
82
+ version: 1.3.8
61
83
  - !ruby/object:Gem::Dependency
62
84
  name: rspec-rails
63
85
  requirement: !ruby/object:Gem::Requirement
@@ -142,20 +164,6 @@ dependencies:
142
164
  - - '='
143
165
  - !ruby/object:Gem::Version
144
166
  version: 1.16.1
145
- - !ruby/object:Gem::Dependency
146
- name: virtus
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - '='
150
- - !ruby/object:Gem::Version
151
- version: 1.0.1
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - '='
157
- - !ruby/object:Gem::Version
158
- version: 1.0.1
159
167
  - !ruby/object:Gem::Dependency
160
168
  name: pry-rails
161
169
  requirement: !ruby/object:Gem::Requirement
@@ -198,6 +206,20 @@ dependencies:
198
206
  - - '='
199
207
  - !ruby/object:Gem::Version
200
208
  version: 0.8.2
209
+ - !ruby/object:Gem::Dependency
210
+ name: awesome_print
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 1.2.0
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 1.2.0
201
223
  description: Polymorphic address models, address normalization, address web services,
202
224
  address autocomplete, maps
203
225
  email:
@@ -213,11 +235,17 @@ files:
213
235
  - app/controllers/location/application_controller.rb
214
236
  - app/controllers/location/finder_controller.rb
215
237
  - app/helpers/location/application_helper.rb
238
+ - app/models/concerns/find_or_create.rb
216
239
  - app/models/location/address.rb
240
+ - app/models/location/address_attributable.rb
217
241
  - app/models/location/address_form.rb
242
+ - app/models/location/address_normalizable.rb
243
+ - app/models/location/address_persistable.rb
244
+ - app/models/location/address_persister.rb
245
+ - app/models/location/address_validatable.rb
218
246
  - app/models/location/city.rb
219
247
  - app/models/location/district.rb
220
- - app/models/location/form.rb
248
+ - app/models/location/normalizable_address.rb
221
249
  - app/models/location/state.rb
222
250
  - app/views/layouts/location/application.html.erb
223
251
  - app/views/location/finder/show.js.coffee
@@ -233,7 +261,9 @@ files:
233
261
  - db/migrate/20140129154554_add_normalized_to_states.rb
234
262
  - db/migrate/20140129154726_add_normalized_to_cities.rb
235
263
  - db/migrate/20140129154734_add_normalized_to_districts.rb
264
+ - db/migrate/20140223034809_rename_address_to_street.rb
236
265
  - lib/location.rb
266
+ - lib/location/address_normalizer.rb
237
267
  - lib/location/engine.rb
238
268
  - lib/location/finder.rb
239
269
  - lib/location/services/errors.rb
@@ -264,9 +294,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
294
  version: '0'
265
295
  requirements: []
266
296
  rubyforge_project:
267
- rubygems_version: 2.2.0
297
+ rubygems_version: 2.2.2
268
298
  signing_key:
269
299
  specification_version: 4
270
300
  summary: Location and address related utilities
271
301
  test_files: []
272
- has_rdoc:
@@ -1,55 +0,0 @@
1
- require 'virtus'
2
-
3
- module Location
4
- module Form
5
- def self.included(klass)
6
- virtus = @virtus_options ?
7
- Virtus.model(@virtus_options) :
8
- Virtus.model
9
-
10
- klass.include virtus
11
- klass.include ActiveModel::Conversion
12
- klass.include ActiveModel::Validations
13
- klass.extend ActiveModel::Naming
14
- klass.extend ActiveModel::Callbacks
15
-
16
- add_callbacks(klass)
17
-
18
- @virtus_options = nil
19
- end
20
-
21
- def self.add_callbacks(klass)
22
- klass.class_eval do
23
- alias_method :ar_valid?, :valid?
24
-
25
- def valid?
26
- run_callbacks :validation do
27
- ar_valid?
28
- end
29
- end
30
-
31
- define_model_callbacks :validation, :save
32
- end
33
- end
34
-
35
- def self.base(virtus_options = {})
36
- @virtus_options = virtus_options
37
- Form
38
- end
39
-
40
- def persisted?
41
- false
42
- end
43
-
44
- def save
45
- if valid?
46
- run_callbacks :save do
47
- persist!
48
- end
49
- true
50
- else
51
- false
52
- end
53
- end
54
- end
55
- end