effective_addresses 0.1 → 1.0.0

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.
@@ -0,0 +1,8 @@
1
+ class EffectiveAddressFullNamePresenceValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ if value.present? && value.full_name.blank?
4
+ record.errors[attribute] << "is invalid"
5
+ value.errors[:full_name] << "can't be blank"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ class EffectiveAddressValidValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ if value.present? && value.valid? == false
4
+ record.errors[attribute] << 'is invalid'
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ - if address.full_name.present?
2
+ = address.full_name
3
+ %br
4
+ = address.address1
5
+ %br
6
+ - if address.address2.present?
7
+ = address.address2
8
+ %br
9
+ = [city.presence, state.presence].compact.join(', ')
10
+ %br
11
+ = [country.presence, postal_code.presence].compact.join(', ')
@@ -0,0 +1,32 @@
1
+ = f.semantic_fields_for method, f.object.send(method) || f.object.addresses.build(:category => method.to_s.gsub('_address', '')) do |fa|
2
+ - uuid = fa.object_id
3
+ - method = method.to_sym
4
+
5
+ - if ((f.object.errors.include?(method) && !f.object.errors.include?(:addresses)) rescue false)
6
+ - fa.object.errors.add(:address1, f.object.errors[method].first)
7
+
8
+ - if f.object._validators[method].any? { |v| v.kind_of?(EffectiveAddressFullNamePresenceValidator) }
9
+ = fa.input :full_name, :required => true, :label => 'Full name', :prompt => 'Full name'
10
+
11
+ = fa.input :address1, :placeholder => 'Address', :label => "Address 1"
12
+ = fa.input :address2, :label => 'Address 2'
13
+ = fa.input :city, :placeholder => 'City'
14
+ = fa.input :country_code,
15
+ :as => :select,
16
+ :label => 'Country',
17
+ :prompt => 'Country...',
18
+ :collection => region_options_for_select(EffectiveAddresses.country_codes == :all ? Carmen::Country.all : Carmen::Country.all.select{ |c| EffectiveAddresses.country_codes.include?(c.code) rescue true}, fa.object.country_code, :priority => EffectiveAddresses.country_codes_priority),
19
+ :input_html => { 'data-effective-address-country' => uuid }
20
+
21
+ - if fa.object.country_code.present?
22
+ = fa.input :state_code, :as => :select, :label => 'Province / State',
23
+ :collection => region_options_for_select(Carmen::Country.coded(fa.object.country_code).subregions, fa.object.state_code),
24
+ :prompt => 'please select a country',
25
+ :input_html => { 'data-effective-address-state' => uuid }
26
+ - else
27
+ = fa.input :state_code, :as => :select, :label => 'Province / State',
28
+ :collection => [],
29
+ :prompt => 'please select a country',
30
+ :input_html => {:disabled => 'disabled', 'data-effective-address-state' => uuid}
31
+
32
+ = fa.input :postal_code, :label => 'Postal / Zip code', :placeholder => 'Postal / Zip code'
@@ -0,0 +1,22 @@
1
+ = f.simple_fields_for method, (f.object.send(method) || f.object.addresses.build(:category => method.to_s.gsub('_address', ''))), (EffectiveAddresses.simple_form_options || {}) do |fa|
2
+ - uuid = fa.object_id
3
+ - method = method.to_sym
4
+
5
+ - if ((f.object.errors.include?(method) && !f.object.errors.include?(:addresses)) rescue false)
6
+ - fa.object.errors.add(:address1, f.object.errors[method].first)
7
+
8
+ - if f.object._validators[method].any? { |v| v.kind_of?(EffectiveAddressFullNamePresenceValidator) }
9
+ = fa.input :full_name, :required => true, :label => 'Full name', :prompt => 'Full name'
10
+
11
+ = fa.input :address1, :placeholder => 'Address', :label => 'Address 1', :required => required
12
+ = fa.input :address2, :label => 'Address 2'
13
+ = fa.input :city, :placeholder => 'City', :required => required
14
+
15
+ = fa.input :country_code, :as => :select, :label => 'Country', :prompt => 'Choose country...', :collection => region_options_for_simple_form_select(), :input_html => {'data-effective-address-country' => uuid}, :required => required
16
+
17
+ - if fa.object.try(:country_code).present?
18
+ = fa.input :state_code, :as => :select, :label => 'Province / State', :prompt => 'Please choose a country first', :collection => region_options_for_simple_form_select(Carmen::Country.coded(fa.object.country_code).subregions), :input_html => {'data-effective-address-state' => uuid}, :required => required
19
+ - else
20
+ = fa.input :state_code, :as => :select, :label => 'Province / State', :disabled => true, :prompt => 'Please choose a country', :collection => [], :input_html => { 'data-effective-address-state' => uuid }, :required => required
21
+
22
+ = fa.input :postal_code, :label => 'Postal / Zip code', :placeholder => 'Postal / Zip code', :required => required
@@ -1 +1 @@
1
- = region_options_for_select(Carmen::Country.coded(country_code).subregions)
1
+ = region_options_for_select(@subregions)
data/config/routes.rb CHANGED
@@ -1,4 +1,9 @@
1
- # These will be just added to the list of routes in the main application
2
1
  Rails.application.routes.draw do
3
- get 'effective/address/subregions/:country_code' => 'effective/addresses#subregions'
2
+ mount EffectiveAddresses::Engine => '/', :as => 'effective_addresses'
3
+ end
4
+
5
+ EffectiveAddresses::Engine.routes.draw do
6
+ scope :module => 'effective' do
7
+ match 'addresses/subregions/:country_code', :to => 'addresses#subregions', :as => 'address_subregions', :via => :get
8
+ end
4
9
  end
@@ -26,3 +26,4 @@ module EffectiveAddresses
26
26
 
27
27
  end
28
28
  end
29
+
@@ -1,3 +1,3 @@
1
1
  module EffectiveAddresses
2
- VERSION = "0.1"
2
+ VERSION = '1.0.0'.freeze
3
3
  end
@@ -1,6 +1,6 @@
1
1
  require "effective_addresses/engine"
2
2
  require "effective_addresses/version"
3
- require 'migrant' # Required for rspec to run properly
3
+ #require 'migrant' # Required for rspec to run properly
4
4
 
5
5
  module EffectiveAddresses
6
6
 
@@ -8,9 +8,16 @@ module EffectiveAddresses
8
8
  mattr_accessor :country_codes
9
9
  mattr_accessor :country_codes_priority
10
10
  mattr_accessor :addresses_table_name
11
+ mattr_accessor :use_full_name
12
+ mattr_accessor :simple_form_options
13
+ mattr_accessor :validate_postal_code_format
11
14
 
12
15
  def self.setup
13
16
  yield self
14
17
  end
15
18
 
19
+ def self.permitted_params
20
+ [:address1, :address2, :city, :country_code, :state_code, :postal_code, :full_name]
21
+ end
22
+
16
23
  end
@@ -2,11 +2,33 @@ EffectiveAddresses.setup do |config|
2
2
  # Database table name to store addresses in. Default is :addresses
3
3
  config.addresses_table_name = :addresses
4
4
 
5
+ # Display Full Name on Address forms, and validate presence by default
6
+ # (can be overridden on a per address basis)
7
+ config.use_full_name = true
8
+
5
9
  # Country codes to display in country_select dropdowns.
6
- config.country_codes = :all
7
- config.country_codes_priority = []
10
+ config.country_codes = :all #
11
+ #config.country_codes = ['US', 'CA'] # Or you can be more selective...
12
+
13
+ # Select these countries ontop of the others
14
+ config.country_codes_priority = ['US', 'CA'] # Leave empty array for no priority countries
15
+
16
+ # Validate that the postal/zip code format is correct for these countries
17
+ # Right now, only US and Canada are supported
18
+ config.validate_postal_code_format = ['US', 'CA']
19
+
20
+ # SimpleForm Options
21
+ # This Hash of options will be passed into any simple_form_for() calls
22
+ config.simple_form_options = {}
23
+
24
+ # config.simple_form_options = {
25
+ # :html => {:class => 'form-horizontal'},
26
+ # :wrapper => :horizontal_form,
27
+ # :wrapper_mappings => {
28
+ # :boolean => :horizontal_boolean,
29
+ # :check_boxes => :horizontal_radio_and_checkboxes,
30
+ # :radio_buttons => :horizontal_radio_and_checkboxes
31
+ # }
32
+ # }
8
33
 
9
- # Or you can be more selective...
10
- #config.country_codes = ['US', 'CA']
11
- #config.country_codes_priority = ['US', 'CA']
12
34
  end
@@ -1,10 +1,30 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Effective::AddressesController do
4
- it 'Should return the proper subregion html' do
4
+ it 'should render the subregions partial' do
5
5
  get :subregions, :country_code => 'CA'
6
6
  response.status.should be 200
7
+ response.should render_template 'effective/addresses/_subregions'
7
8
  end
8
9
 
10
+ it 'should assign appropriate Canadian subregions' do
11
+ get :subregions, :country_code => 'CA'
12
+ assigns(:subregions).first.name.should eq 'Alberta'
13
+ end
14
+
15
+ it 'should assign appropriate US subregions' do
16
+ get :subregions, :country_code => 'US'
17
+ assigns(:subregions).first.name.should eq 'Alaska'
18
+ end
19
+
20
+ it 'should assign appropriate SG subregions' do
21
+ get :subregions, :country_code => 'SG' # Singapore
22
+ assigns(:subregions).first.name.should eq 'Central Singapore'
23
+ end
24
+
25
+ it 'Should return an error when passed bad country code' do
26
+ get :subregions, :country_code => 'NOPE'
27
+ response.status.should be 422 # Unprocessable Entity
28
+ end
9
29
 
10
30
  end
@@ -1,125 +0,0 @@
1
- Connecting to database specified by database.yml
2
- Connecting to database specified by database.yml
3
- Connecting to database specified by database.yml
4
- Connecting to database specified by database.yml
5
- Connecting to database specified by database.yml
6
- Connecting to database specified by database.yml
7
- Connecting to database specified by database.yml
8
- Connecting to database specified by database.yml
9
- Connecting to database specified by database.yml
10
- Connecting to database specified by database.yml
11
- Connecting to database specified by database.yml
12
- Connecting to database specified by database.yml
13
- Connecting to database specified by database.yml
14
- Connecting to database specified by database.yml
15
- Connecting to database specified by database.yml
16
- Connecting to database specified by database.yml
17
- Connecting to database specified by database.yml
18
- Connecting to database specified by database.yml
19
- Connecting to database specified by database.yml
20
- Connecting to database specified by database.yml
21
- Connecting to database specified by database.yml
22
- Connecting to database specified by database.yml
23
- Connecting to database specified by database.yml
24
- Connecting to database specified by database.yml
25
- Connecting to database specified by database.yml
26
- Connecting to database specified by database.yml
27
- Connecting to database specified by database.yml
28
- Connecting to database specified by database.yml
29
- Connecting to database specified by database.yml
30
- Connecting to database specified by database.yml
31
- Connecting to database specified by database.yml
32
- Connecting to database specified by database.yml
33
- Connecting to database specified by database.yml
34
- Connecting to database specified by database.yml
35
- Connecting to database specified by database.yml
36
- Connecting to database specified by database.yml
37
- Connecting to database specified by database.yml
38
- Connecting to database specified by database.yml
39
- Connecting to database specified by database.yml
40
- Connecting to database specified by database.yml
41
- Connecting to database specified by database.yml
42
- Connecting to database specified by database.yml
43
- Connecting to database specified by database.yml
44
- Connecting to database specified by database.yml
45
- Connecting to database specified by database.yml
46
- Connecting to database specified by database.yml
47
- Connecting to database specified by database.yml
48
- Connecting to database specified by database.yml
49
- Connecting to database specified by database.yml
50
- Connecting to database specified by database.yml
51
- Connecting to database specified by database.yml
52
- Connecting to database specified by database.yml
53
- Connecting to database specified by database.yml
54
- Connecting to database specified by database.yml
55
- Connecting to database specified by database.yml
56
- Connecting to database specified by database.yml
57
- Connecting to database specified by database.yml
58
- Connecting to database specified by database.yml
59
- Connecting to database specified by database.yml
60
- Connecting to database specified by database.yml
61
- Connecting to database specified by database.yml
62
- Connecting to database specified by database.yml
63
- Connecting to database specified by database.yml
64
- Connecting to database specified by database.yml
65
- Connecting to database specified by database.yml
66
- Connecting to database specified by database.yml
67
- Connecting to database specified by database.yml
68
- Connecting to database specified by database.yml
69
- Connecting to database specified by database.yml
70
- Connecting to database specified by database.yml
71
- Connecting to database specified by database.yml
72
- Connecting to database specified by database.yml
73
- Connecting to database specified by database.yml
74
- Connecting to database specified by database.yml
75
- Connecting to database specified by database.yml
76
- Connecting to database specified by database.yml
77
- Connecting to database specified by database.yml
78
- Connecting to database specified by database.yml
79
- Connecting to database specified by database.yml
80
- Connecting to database specified by database.yml
81
- Connecting to database specified by database.yml
82
- Connecting to database specified by database.yml
83
- Connecting to database specified by database.yml
84
- Connecting to database specified by database.yml
85
- Connecting to database specified by database.yml
86
- Connecting to database specified by database.yml
87
- Connecting to database specified by database.yml
88
- Connecting to database specified by database.yml
89
- Connecting to database specified by database.yml
90
- Connecting to database specified by database.yml
91
- Connecting to database specified by database.yml
92
- Connecting to database specified by database.yml
93
- Connecting to database specified by database.yml
94
- Connecting to database specified by database.yml
95
- Connecting to database specified by database.yml
96
- Connecting to database specified by database.yml
97
- Connecting to database specified by database.yml
98
- Connecting to database specified by database.yml
99
- Connecting to database specified by database.yml
100
- Connecting to database specified by database.yml
101
- Connecting to database specified by database.yml
102
- Connecting to database specified by database.yml
103
- Connecting to database specified by database.yml
104
- Connecting to database specified by database.yml
105
- Connecting to database specified by database.yml
106
- Connecting to database specified by database.yml
107
- Connecting to database specified by database.yml
108
- Connecting to database specified by database.yml
109
- Connecting to database specified by database.yml
110
- Connecting to database specified by database.yml
111
- Connecting to database specified by database.yml
112
- Connecting to database specified by database.yml
113
- Connecting to database specified by database.yml
114
- Connecting to database specified by database.yml
115
- Connecting to database specified by database.yml
116
- Connecting to database specified by database.yml
117
- Connecting to database specified by database.yml
118
- Connecting to database specified by database.yml
119
- Connecting to database specified by database.yml
120
- Connecting to database specified by database.yml
121
- Connecting to database specified by database.yml
122
- Connecting to database specified by database.yml
123
- Connecting to database specified by database.yml
124
- Connecting to database specified by database.yml
125
- Connecting to database specified by database.yml
data/spec/spec_helper.rb CHANGED
@@ -14,6 +14,7 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f }
14
14
  Carmen.i18n_backend.load_path << (Carmen.root_path.to_s + '/locale/en/world.yml')
15
15
  Carmen.i18n_backend.load_path << (Carmen.root_path.to_s + '/locale/en/world/ca.yml')
16
16
  Carmen.i18n_backend.load_path << (Carmen.root_path.to_s + '/locale/en/world/us.yml')
17
+ Carmen.i18n_backend.load_path << (Carmen.root_path.to_s + '/locale/en/world/sg.yml')
17
18
 
18
19
  RSpec.configure do |config|
19
20
  config.fixture_path = "#{::Rails.root}/spec/fixtures"