solidus_br_common 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +14 -0
  7. data/Gemfile +19 -0
  8. data/LICENSE +26 -0
  9. data/README.md +55 -0
  10. data/Rakefile +21 -0
  11. data/app/assets/javascripts/spree/backend/solidus_br_common.js +2 -0
  12. data/app/assets/javascripts/spree/frontend/address.js +119 -0
  13. data/app/assets/javascripts/spree/frontend/mask.js +21 -0
  14. data/app/assets/javascripts/spree/frontend/plugins/jquery.mask.extension.js +4 -0
  15. data/app/assets/javascripts/spree/frontend/plugins/jquery.mask.js +395 -0
  16. data/app/assets/javascripts/spree/frontend/routes.js.erb +4 -0
  17. data/app/assets/javascripts/spree/frontend/solidus_br_common.js +1 -0
  18. data/app/assets/stylesheets/spree/backend/solidus_br_common.css +4 -0
  19. data/app/assets/stylesheets/spree/frontend/solidus_br_common.css +4 -0
  20. data/app/controllers/spree/addresses_controller.rb +24 -0
  21. data/app/controllers/spree/api/cities_controller.rb +33 -0
  22. data/app/controllers/spree/user_registrations_controller_decorator.rb +13 -0
  23. data/app/helpers/spree/api/api_helpers_decorator.rb +9 -0
  24. data/app/helpers/spree/base_helper_decorator.rb +5 -0
  25. data/app/models/spree/ability_decorator.rb +21 -0
  26. data/app/models/spree/address_decorator.rb +6 -0
  27. data/app/models/spree/city.rb +7 -0
  28. data/app/models/spree/permitted_attributes_decorator.rb +8 -0
  29. data/app/models/spree/state_decorator.rb +3 -0
  30. data/app/models/spree/user_decorator.rb +52 -0
  31. data/app/overrides/spree/address/_form/add_district.html.erb.deface +5 -0
  32. data/app/overrides/spree/address/_form/add_number.html.erb.deface +5 -0
  33. data/app/overrides/spree/address/_form/hide_country.html.erb.deface +4 -0
  34. data/app/overrides/spree/address/_form/move_city_to_after_state.deface +2 -0
  35. data/app/overrides/spree/address/_form/move_zipcode_after_last_name.deface +2 -0
  36. data/app/overrides/spree/address/_form/replace_city_input_text_by_select.html.erb.deface +18 -0
  37. data/app/overrides/spree/address/_form/set_data_uf_to_state.html.erb.deface +15 -0
  38. data/app/overrides/spree/admin/users/_form/add_extras_fields.html.erb.deface +39 -0
  39. data/app/overrides/spree/shared/_user_form/add_extra_fields.html.erb.deface +19 -0
  40. data/app/overrides/spree/users/show/add_details.html.erb.deface +13 -0
  41. data/app/views/spree/api/cities/index.v1.rabl +11 -0
  42. data/app/views/spree/api/cities/show.v1.rabl +2 -0
  43. data/bin/rails +7 -0
  44. data/config/locales/en.yml +11 -0
  45. data/config/locales/pt-BR.yml +14 -0
  46. data/config/routes.rb +7 -0
  47. data/db/default/country.rb +3 -0
  48. data/db/default/shipping_categories.rb +1 -0
  49. data/db/default/shipping_zones.rb +3 -0
  50. data/db/default/states.rb +31 -0
  51. data/db/default/states_cities_of_acre.rb +26 -0
  52. data/db/default/states_cities_of_alagoas.rb +107 -0
  53. data/db/default/states_cities_of_amapa.rb +20 -0
  54. data/db/default/states_cities_of_amazonas.rb +67 -0
  55. data/db/default/states_cities_of_bahia.rb +421 -0
  56. data/db/default/states_cities_of_ceara.rb +188 -0
  57. data/db/default/states_cities_of_distrito_federal.rb +5 -0
  58. data/db/default/states_cities_of_espirito_santo.rb +82 -0
  59. data/db/default/states_cities_of_goias.rb +250 -0
  60. data/db/default/states_cities_of_maranhao.rb +221 -0
  61. data/db/default/states_cities_of_mato_grosso.rb +145 -0
  62. data/db/default/states_cities_of_mato_grosso_do_sul.rb +82 -0
  63. data/db/default/states_cities_of_minas_gerais.rb +857 -0
  64. data/db/default/states_cities_of_para.rb +147 -0
  65. data/db/default/states_cities_of_paraiba.rb +227 -0
  66. data/db/default/states_cities_of_parana.rb +403 -0
  67. data/db/default/states_cities_of_pernambuco.rb +189 -0
  68. data/db/default/states_cities_of_piaui.rb +227 -0
  69. data/db/default/states_cities_of_rio_de_janeiro.rb +96 -0
  70. data/db/default/states_cities_of_rio_grande_do_norte.rb +171 -0
  71. data/db/default/states_cities_of_rio_grande_do_sul.rb +500 -0
  72. data/db/default/states_cities_of_rondonia.rb +56 -0
  73. data/db/default/states_cities_of_roraima.rb +19 -0
  74. data/db/default/states_cities_of_santa_catarina.rb +297 -0
  75. data/db/default/states_cities_of_sao_paulo.rb +649 -0
  76. data/db/default/states_cities_of_sergipe.rb +79 -0
  77. data/db/default/states_cities_of_tocantins.rb +144 -0
  78. data/db/default/stock.rb +1 -0
  79. data/db/default/tax_categories.rb +1 -0
  80. data/db/default/user.rb +100 -0
  81. data/db/migrate/20150503011715_create_spree_cities.rb +13 -0
  82. data/db/migrate/20150504004509_remove_city_from_spree_address.rb +5 -0
  83. data/db/migrate/20150504004648_add_city_to_spree_address.rb +5 -0
  84. data/db/migrate/20150505020218_add_number_and_district_to_spree_address.rb +6 -0
  85. data/db/migrate/20150505031019_add_details_to_spree_user.rb +10 -0
  86. data/db/seeds.rb +5 -0
  87. data/lib/generators/solidus_br_common/install/install_generator.rb +31 -0
  88. data/lib/solidus_br_common/engine.rb +20 -0
  89. data/lib/solidus_br_common/factories/address_factory.rb +7 -0
  90. data/lib/solidus_br_common/factories/city_factory.rb +8 -0
  91. data/lib/solidus_br_common/factories/user_factory.rb +12 -0
  92. data/lib/solidus_br_common/factories.rb +3 -0
  93. data/lib/solidus_br_common.rb +2 -0
  94. data/solidus_br_common.gemspec +33 -0
  95. data/spec/controllers/spree/addresses_controller_spec.rb +27 -0
  96. data/spec/controllers/spree/api/cities_controller_spec.rb +91 -0
  97. data/spec/features/address_checkout_spec.rb +89 -0
  98. data/spec/features/user_account_spec.rb +46 -0
  99. data/spec/features/user_signup_spec.rb +24 -0
  100. data/spec/fixtures/vcr_cassettes/Checkout/visitor_makes_checkout_as_guest_without_registration/full_checkout/does_not_break_the_per-item_shipping_method_calculator.yml +49 -0
  101. data/spec/fixtures/vcr_cassettes/Checkout/visitor_makes_checkout_as_guest_without_registration/full_checkout/in_Brazil/should_autocomplete_zipcode.yml +46 -0
  102. data/spec/fixtures/vcr_cassettes/Spree_AddressesController/_show/does_not_find_an_incorrect_cep.yml +38 -0
  103. data/spec/fixtures/vcr_cassettes/Spree_AddressesController/_show/shows_the_correct_address.yml +46 -0
  104. data/spec/models/spree/address_spec.rb +32 -0
  105. data/spec/models/spree/city_spec.rb +7 -0
  106. data/spec/models/spree/user_spec.rb +88 -0
  107. data/spec/spec_helper.rb +61 -0
  108. data/spec/support/controller_hacks.rb +33 -0
  109. data/spec/support/database_cleaner.rb +24 -0
  110. data/spec/support/shared_context/checkout_setup.rb +9 -0
  111. data/spec/support/shoulda_matchers.rb +6 -0
  112. data/spec/support/vcr.rb +8 -0
  113. metadata +385 -0
@@ -0,0 +1,79 @@
1
+ sergipe = Spree::State.find_by! abbr: 'SE'
2
+
3
+ Spree::City.create!([
4
+ {state: sergipe, ibge_code: 2801306, name: "Capela"},
5
+ {state: sergipe, ibge_code: 2802007, name: "Divina Pastora"},
6
+ {state: sergipe, ibge_code: 2806503, name: "Santa Rosa de Lima"},
7
+ {state: sergipe, ibge_code: 2803302, name: "Japaratuba"},
8
+ {state: sergipe, ibge_code: 2803401, name: "Japoatã"},
9
+ {state: sergipe, ibge_code: 2804904, name: "Pacatuba"},
10
+ {state: sergipe, ibge_code: 2805307, name: "Pirambu"},
11
+ {state: sergipe, ibge_code: 2806909, name: "São Francisco"},
12
+ {state: sergipe, ibge_code: 2803609, name: "Laranjeiras"},
13
+ {state: sergipe, ibge_code: 2804003, name: "Maruim"},
14
+ {state: sergipe, ibge_code: 2805901, name: "Riachuelo"},
15
+ {state: sergipe, ibge_code: 2804300, name: "Muribeca"},
16
+ {state: sergipe, ibge_code: 2807204, name: "Siriri"},
17
+ {state: sergipe, ibge_code: 2802601, name: "Gracho Cardoso"},
18
+ {state: sergipe, ibge_code: 2804607, name: "Nossa Senhora das Dores"},
19
+ {state: sergipe, ibge_code: 2805703, name: "Propriá"},
20
+ {state: sergipe, ibge_code: 2802502, name: "General Maynard"},
21
+ {state: sergipe, ibge_code: 2806305, name: "Santa Luzia do Itanhy"},
22
+ {state: sergipe, ibge_code: 2801504, name: "Carmópolis"},
23
+ {state: sergipe, ibge_code: 2806107, name: "Rosário do Catete"},
24
+ {state: sergipe, ibge_code: 2806701, name: "São Cristóvão"},
25
+ {state: sergipe, ibge_code: 2805109, name: "Pedrinhas"},
26
+ {state: sergipe, ibge_code: 2802106, name: "Estância"},
27
+ {state: sergipe, ibge_code: 2806602, name: "Santo Amaro das Brotas"},
28
+ {state: sergipe, ibge_code: 2800308, name: "Aracaju"},
29
+ {state: sergipe, ibge_code: 2800605, name: "Barra dos Coqueiros"},
30
+ {state: sergipe, ibge_code: 2804805, name: "Nossa Senhora do Socorro"},
31
+ {state: sergipe, ibge_code: 2800407, name: "Arauá"},
32
+ {state: sergipe, ibge_code: 2800670, name: "Boquim"},
33
+ {state: sergipe, ibge_code: 2801702, name: "Cristinápolis"},
34
+ {state: sergipe, ibge_code: 2803005, name: "Itabaianinha"},
35
+ {state: sergipe, ibge_code: 2806206, name: "Salgado"},
36
+ {state: sergipe, ibge_code: 2807501, name: "Tomar do Geru"},
37
+ {state: sergipe, ibge_code: 2807600, name: "Umbaúba"},
38
+ {state: sergipe, ibge_code: 2802809, name: "Indiaroba"},
39
+ {state: sergipe, ibge_code: 2803203, name: "Itaporanga d'Ajuda"},
40
+ {state: sergipe, ibge_code: 2801207, name: "Canindé de São Francisco"},
41
+ {state: sergipe, ibge_code: 2802205, name: "Feira Nova"},
42
+ {state: sergipe, ibge_code: 2802403, name: "Gararu"},
43
+ {state: sergipe, ibge_code: 2803104, name: "Itabi"},
44
+ {state: sergipe, ibge_code: 2804201, name: "Monte Alegre de Sergipe"},
45
+ {state: sergipe, ibge_code: 2804508, name: "Nossa Senhora da Glória"},
46
+ {state: sergipe, ibge_code: 2805406, name: "Poço Redondo"},
47
+ {state: sergipe, ibge_code: 2805604, name: "Porto da Folha"},
48
+ {state: sergipe, ibge_code: 2801405, name: "Carira"},
49
+ {state: sergipe, ibge_code: 2802304, name: "Frei Paulo"},
50
+ {state: sergipe, ibge_code: 2804458, name: "Nossa Senhora Aparecida"},
51
+ {state: sergipe, ibge_code: 2805000, name: "Pedra Mole"},
52
+ {state: sergipe, ibge_code: 2805208, name: "Pinhão"},
53
+ {state: sergipe, ibge_code: 2806008, name: "Ribeirópolis"},
54
+ {state: sergipe, ibge_code: 2800209, name: "Aquidabã"},
55
+ {state: sergipe, ibge_code: 2801900, name: "Cumbe"},
56
+ {state: sergipe, ibge_code: 2803807, name: "Malhada dos Bois"},
57
+ {state: sergipe, ibge_code: 2807006, name: "São Miguel do Aleixo"},
58
+ {state: sergipe, ibge_code: 2800506, name: "Areia Branca"},
59
+ {state: sergipe, ibge_code: 2801009, name: "Campo do Brito"},
60
+ {state: sergipe, ibge_code: 2802908, name: "Itabaiana"},
61
+ {state: sergipe, ibge_code: 2803708, name: "Macambira"},
62
+ {state: sergipe, ibge_code: 2803906, name: "Malhador"},
63
+ {state: sergipe, ibge_code: 2804102, name: "Moita Bonita"},
64
+ {state: sergipe, ibge_code: 2806800, name: "São Domingos"},
65
+ {state: sergipe, ibge_code: 2805505, name: "Poço Verde"},
66
+ {state: sergipe, ibge_code: 2807105, name: "Simão Dias"},
67
+ {state: sergipe, ibge_code: 2807402, name: "Tobias Barreto"},
68
+ {state: sergipe, ibge_code: 2803500, name: "Lagarto"},
69
+ {state: sergipe, ibge_code: 2805802, name: "Riachão do Dantas"},
70
+ {state: sergipe, ibge_code: 2800100, name: "Amparo de São Francisco"},
71
+ {state: sergipe, ibge_code: 2800704, name: "Brejo Grande"},
72
+ {state: sergipe, ibge_code: 2801108, name: "Canhoba"},
73
+ {state: sergipe, ibge_code: 2801603, name: "Cedro de São João"},
74
+ {state: sergipe, ibge_code: 2802700, name: "Ilha das Flores"},
75
+ {state: sergipe, ibge_code: 2804409, name: "Neópolis"},
76
+ {state: sergipe, ibge_code: 2804706, name: "Nossa Senhora de Lourdes"},
77
+ {state: sergipe, ibge_code: 2806404, name: "Santana do São Francisco"},
78
+ {state: sergipe, ibge_code: 2807303, name: "Telha"}
79
+ ])
@@ -0,0 +1,144 @@
1
+ tocantins = Spree::State.find_by! abbr: 'TO'
2
+
3
+ Spree::City.create!([
4
+ {state: tocantins, ibge_code: 1713957, name: "Muricilândia"},
5
+ {state: tocantins, ibge_code: 1715507, name: "Oliveira de Fátima"},
6
+ {state: tocantins, ibge_code: 1707009, name: "Dianópolis"},
7
+ {state: tocantins, ibge_code: 1706506, name: "Darcinópolis"},
8
+ {state: tocantins, ibge_code: 1721208, name: "Tocantinópolis"},
9
+ {state: tocantins, ibge_code: 1722081, name: "Wanderlândia"},
10
+ {state: tocantins, ibge_code: 1713700, name: "Monte Santo do Tocantins"},
11
+ {state: tocantins, ibge_code: 1707652, name: "Figueirópolis"},
12
+ {state: tocantins, ibge_code: 1721109, name: "Tocantínia"},
13
+ {state: tocantins, ibge_code: 1702703, name: "Aurora do Tocantins"},
14
+ {state: tocantins, ibge_code: 1718451, name: "Pugmil"},
15
+ {state: tocantins, ibge_code: 1700350, name: "Aliança do Tocantins"},
16
+ {state: tocantins, ibge_code: 1700707, name: "Alvorada"},
17
+ {state: tocantins, ibge_code: 1703701, name: "Brejinho de Nazaré"},
18
+ {state: tocantins, ibge_code: 1703867, name: "Cariri do Tocantins"},
19
+ {state: tocantins, ibge_code: 1709500, name: "Gurupi"},
20
+ {state: tocantins, ibge_code: 1711506, name: "Jaú do Tocantins"},
21
+ {state: tocantins, ibge_code: 1715754, name: "Palmeirópolis"},
22
+ {state: tocantins, ibge_code: 1716604, name: "Peixe"},
23
+ {state: tocantins, ibge_code: 1720259, name: "São Salvador do Tocantins"},
24
+ {state: tocantins, ibge_code: 1720853, name: "Sucupira"},
25
+ {state: tocantins, ibge_code: 1720978, name: "Talismã"},
26
+ {state: tocantins, ibge_code: 1701101, name: "Aparecida do Rio Negro"},
27
+ {state: tocantins, ibge_code: 1703305, name: "Bom Jesus do Tocantins"},
28
+ {state: tocantins, ibge_code: 1712009, name: "Lajeado"},
29
+ {state: tocantins, ibge_code: 1713601, name: "Monte do Carmo"},
30
+ {state: tocantins, ibge_code: 1716505, name: "Pedro Afonso"},
31
+ {state: tocantins, ibge_code: 1718881, name: "Santa Maria do Tocantins"},
32
+ {state: tocantins, ibge_code: 1720655, name: "Silvanópolis"},
33
+ {state: tocantins, ibge_code: 1721000, name: "Palmas"},
34
+ {state: tocantins, ibge_code: 1703842, name: "Campos Lindos"},
35
+ {state: tocantins, ibge_code: 1704105, name: "Centenário"},
36
+ {state: tocantins, ibge_code: 1709005, name: "Goiatins"},
37
+ {state: tocantins, ibge_code: 1710508, name: "Itacajá"},
38
+ {state: tocantins, ibge_code: 1711951, name: "Lagoa do Tocantins"},
39
+ {state: tocantins, ibge_code: 1712405, name: "Lizarda"},
40
+ {state: tocantins, ibge_code: 1712702, name: "Mateiros"},
41
+ {state: tocantins, ibge_code: 1715101, name: "Novo Acordo"},
42
+ {state: tocantins, ibge_code: 1718501, name: "Recursolândia"},
43
+ {state: tocantins, ibge_code: 1718758, name: "Rio Sono"},
44
+ {state: tocantins, ibge_code: 1719004, name: "Santa Tereza do Tocantins"},
45
+ {state: tocantins, ibge_code: 1720150, name: "São Félix do Tocantins"},
46
+ {state: tocantins, ibge_code: 1700400, name: "Almas"},
47
+ {state: tocantins, ibge_code: 1705102, name: "Chapada da Natividade"},
48
+ {state: tocantins, ibge_code: 1705557, name: "Combinado"},
49
+ {state: tocantins, ibge_code: 1712157, name: "Lavandeira"},
50
+ {state: tocantins, ibge_code: 1714203, name: "Natividade"},
51
+ {state: tocantins, ibge_code: 1715150, name: "Novo Alegre"},
52
+ {state: tocantins, ibge_code: 1715259, name: "Novo Jardim"},
53
+ {state: tocantins, ibge_code: 1717008, name: "Pindorama do Tocantins"},
54
+ {state: tocantins, ibge_code: 1717800, name: "Ponte Alta do Bom Jesus"},
55
+ {state: tocantins, ibge_code: 1718006, name: "Porto Alegre do Tocantins"},
56
+ {state: tocantins, ibge_code: 1718907, name: "Santa Rosa do Tocantins"},
57
+ {state: tocantins, ibge_code: 1720499, name: "São Valério da Natividade"},
58
+ {state: tocantins, ibge_code: 1720903, name: "Taguatinga"},
59
+ {state: tocantins, ibge_code: 1720937, name: "Taipas do Tocantins"},
60
+ {state: tocantins, ibge_code: 1700251, name: "Abreulândia"},
61
+ {state: tocantins, ibge_code: 1703602, name: "Brasilândia do Tocantins"},
62
+ {state: tocantins, ibge_code: 1709302, name: "Guaraí"},
63
+ {state: tocantins, ibge_code: 1713205, name: "Miracema do Tocantins"},
64
+ {state: tocantins, ibge_code: 1718709, name: "Rio dos Bois"},
65
+ {state: tocantins, ibge_code: 1706100, name: "Cristalândia"},
66
+ {state: tocantins, ibge_code: 1715002, name: "Nova Rosalândia"},
67
+ {state: tocantins, ibge_code: 1718840, name: "Sandolândia"},
68
+ {state: tocantins, ibge_code: 1706258, name: "Crixás do Tocantins"},
69
+ {state: tocantins, ibge_code: 1718659, name: "Rio da Conceição"},
70
+ {state: tocantins, ibge_code: 1718899, name: "Santa Rita do Tocantins"},
71
+ {state: tocantins, ibge_code: 1709807, name: "Ipueiras"},
72
+ {state: tocantins, ibge_code: 1718204, name: "Porto Nacional"},
73
+ {state: tocantins, ibge_code: 1703073, name: "Barra do Ouro"},
74
+ {state: tocantins, ibge_code: 1710904, name: "Itapiratins"},
75
+ {state: tocantins, ibge_code: 1717909, name: "Ponte Alta do Tocantins"},
76
+ {state: tocantins, ibge_code: 1702406, name: "Arraias"},
77
+ {state: tocantins, ibge_code: 1705607, name: "Conceição do Tocantins"},
78
+ {state: tocantins, ibge_code: 1716208, name: "Paranã"},
79
+ {state: tocantins, ibge_code: 1700301, name: "Aguiarnópolis"},
80
+ {state: tocantins, ibge_code: 1701002, name: "Ananás"},
81
+ {state: tocantins, ibge_code: 1701051, name: "Angico"},
82
+ {state: tocantins, ibge_code: 1702208, name: "Araguatins"},
83
+ {state: tocantins, ibge_code: 1702554, name: "Augustinópolis"},
84
+ {state: tocantins, ibge_code: 1702901, name: "Axixá do Tocantins"},
85
+ {state: tocantins, ibge_code: 1703800, name: "Buriti do Tocantins"},
86
+ {state: tocantins, ibge_code: 1703826, name: "Cachoeirinha"},
87
+ {state: tocantins, ibge_code: 1703891, name: "Carrasco Bonito"},
88
+ {state: tocantins, ibge_code: 1707405, name: "Esperantina"},
89
+ {state: tocantins, ibge_code: 1710706, name: "Itaguatins"},
90
+ {state: tocantins, ibge_code: 1712454, name: "Luzinópolis"},
91
+ {state: tocantins, ibge_code: 1712801, name: "Maurilândia do Tocantins"},
92
+ {state: tocantins, ibge_code: 1713809, name: "Palmeiras do Tocantins"},
93
+ {state: tocantins, ibge_code: 1714302, name: "Nazaré"},
94
+ {state: tocantins, ibge_code: 1718303, name: "Praia Norte"},
95
+ {state: tocantins, ibge_code: 1718550, name: "Riachinho"},
96
+ {state: tocantins, ibge_code: 1718808, name: "Sampaio"},
97
+ {state: tocantins, ibge_code: 1720002, name: "Santa Terezinha do Tocantins"},
98
+ {state: tocantins, ibge_code: 1720101, name: "São Bento do Tocantins"},
99
+ {state: tocantins, ibge_code: 1720200, name: "São Miguel do Tocantins"},
100
+ {state: tocantins, ibge_code: 1720309, name: "São Sebastião do Tocantins"},
101
+ {state: tocantins, ibge_code: 1720804, name: "Sítio Novo do Tocantins"},
102
+ {state: tocantins, ibge_code: 1701309, name: "Aragominas"},
103
+ {state: tocantins, ibge_code: 1702109, name: "Araguaína"},
104
+ {state: tocantins, ibge_code: 1702158, name: "Araguanã"},
105
+ {state: tocantins, ibge_code: 1702307, name: "Arapoema"},
106
+ {state: tocantins, ibge_code: 1703008, name: "Babaçulândia"},
107
+ {state: tocantins, ibge_code: 1703057, name: "Bandeirantes do Tocantins"},
108
+ {state: tocantins, ibge_code: 1703883, name: "Carmolândia"},
109
+ {state: tocantins, ibge_code: 1705508, name: "Colinas do Tocantins"},
110
+ {state: tocantins, ibge_code: 1707702, name: "Filadélfia"},
111
+ {state: tocantins, ibge_code: 1714880, name: "Nova Olinda"},
112
+ {state: tocantins, ibge_code: 1715705, name: "Palmeirante"},
113
+ {state: tocantins, ibge_code: 1716307, name: "Pau D'Arco"},
114
+ {state: tocantins, ibge_code: 1717206, name: "Piraquê"},
115
+ {state: tocantins, ibge_code: 1718865, name: "Santa Fé do Araguaia"},
116
+ {state: tocantins, ibge_code: 1722107, name: "Xambioá"},
117
+ {state: tocantins, ibge_code: 1701903, name: "Araguacema"},
118
+ {state: tocantins, ibge_code: 1703107, name: "Barrolândia"},
119
+ {state: tocantins, ibge_code: 1703206, name: "Bernardo Sayão"},
120
+ {state: tocantins, ibge_code: 1703909, name: "Caseara"},
121
+ {state: tocantins, ibge_code: 1706001, name: "Couto de Magalhães"},
122
+ {state: tocantins, ibge_code: 1707108, name: "Divinópolis do Tocantins"},
123
+ {state: tocantins, ibge_code: 1707207, name: "Dois Irmãos do Tocantins"},
124
+ {state: tocantins, ibge_code: 1708254, name: "Fortaleza do Tabocão"},
125
+ {state: tocantins, ibge_code: 1708304, name: "Goianorte"},
126
+ {state: tocantins, ibge_code: 1711100, name: "Itaporã do Tocantins"},
127
+ {state: tocantins, ibge_code: 1711803, name: "Juarina"},
128
+ {state: tocantins, ibge_code: 1712504, name: "Marianópolis do Tocantins"},
129
+ {state: tocantins, ibge_code: 1713304, name: "Miranorte"},
130
+ {state: tocantins, ibge_code: 1716653, name: "Pequizeiro"},
131
+ {state: tocantins, ibge_code: 1716703, name: "Colméia"},
132
+ {state: tocantins, ibge_code: 1718402, name: "Presidente Kennedy"},
133
+ {state: tocantins, ibge_code: 1721257, name: "Tupirama"},
134
+ {state: tocantins, ibge_code: 1721307, name: "Tupiratins"},
135
+ {state: tocantins, ibge_code: 1702000, name: "Araguaçu"},
136
+ {state: tocantins, ibge_code: 1704600, name: "Chapada de Areia"},
137
+ {state: tocantins, ibge_code: 1707306, name: "Dueré"},
138
+ {state: tocantins, ibge_code: 1707553, name: "Fátima"},
139
+ {state: tocantins, ibge_code: 1708205, name: "Formoso do Araguaia"},
140
+ {state: tocantins, ibge_code: 1711902, name: "Lagoa da Confusão"},
141
+ {state: tocantins, ibge_code: 1716109, name: "Paraíso do Tocantins"},
142
+ {state: tocantins, ibge_code: 1717503, name: "Pium"}
143
+ ])
144
+
@@ -0,0 +1 @@
1
+ Spree::StockLocation.create! name: 'Padrão', country: Spree::Country.first!
@@ -0,0 +1 @@
1
+ Spree::TaxCategory.create!(:name => 'Padrão', :description => 'Padrão', :is_default => true)
@@ -0,0 +1,100 @@
1
+ require 'highline/import'
2
+
3
+ # see last line where we create an admin if there is none, asking for email and password
4
+ def prompt_for_admin_password
5
+ if ENV['ADMIN_PASSWORD']
6
+ password = ENV['ADMIN_PASSWORD'].dup
7
+ say "Admin Password #{password}"
8
+ else
9
+ password = ask('Password [spree123]: ') do |q|
10
+ q.echo = false
11
+ q.validate = /^(|.{5,40})$/
12
+ q.responses[:not_valid] = 'Invalid password. Must be at least 5 characters long.'
13
+ q.whitespace = :strip
14
+ end
15
+ password = 'spree123' if password.blank?
16
+ end
17
+
18
+ password
19
+ end
20
+
21
+ def prompt_for_admin_field(field_description, var_env, default_value)
22
+
23
+ if ENV[var_env]
24
+ field = ENV[var_env].dup
25
+ say "Admin #{field_description} #{field}"
26
+ else
27
+ field = ask("#{field_description} [#{default_value}]: ") do |q|
28
+ q.echo = true
29
+ q.whitespace = :strip
30
+ end
31
+ field = default_value if field.blank?
32
+ end
33
+
34
+ field
35
+
36
+ end
37
+
38
+ def create_admin_user
39
+ attributes = {
40
+ :password => 'spree123',
41
+ :email => 'spree@example.com',
42
+ :first_name => 'admin',
43
+ :last_name => 'admin',
44
+ :phone => '11 12212122',
45
+ :date_of_birth => 22.years.ago,
46
+ :cpf => CPF.generate,
47
+ :password_confirmation => nil,
48
+ :login => nil
49
+ }
50
+
51
+ if ENV['AUTO_ACCEPT']
52
+ puts 'User will be created with the properties:'
53
+ puts attributes
54
+ else
55
+ puts 'Create the admin user (press enter for defaults).'
56
+ attributes = {
57
+ :email => prompt_for_admin_field('Email', 'ADMIN_EMAIL', 'spree@example.com'),
58
+ :password => prompt_for_admin_password,
59
+ :first_name => prompt_for_admin_field('First Name', 'ADMIN_FIRST_NAME', 'admin'),
60
+ :last_name => prompt_for_admin_field('Last Name', 'ADMIN_LAST_NAME', 'admin'),
61
+ :phone => prompt_for_admin_field('Phone', 'ADMIN_PHONE', '11 12212122'),
62
+ :date_of_birth => prompt_for_admin_field('Date Of Birth', 'ADMIN_DATE_OF_BIRTH', 22.years.ago),
63
+ :cpf => prompt_for_admin_field('CPF', 'ADMIN_CPF', CPF.generate)
64
+ }
65
+ end
66
+
67
+ attributes[:password_confirmation] = attributes[:password]
68
+ attributes[:login] = attributes[:email]
69
+
70
+ load 'spree/user.rb'
71
+
72
+ if Spree::User.find_by_email(attributes[:email])
73
+ say "\nWARNING: There is already a user with the email: #{attributes[:email]}, so no account changes were made. If you wish to create an additional admin user, please run rake spree_auth:admin:create again with a different email.\n\n"
74
+ else
75
+ admin = Spree::User.new(attributes)
76
+ if admin.save
77
+ role = Spree::Role.find_or_create_by(name: 'admin')
78
+ admin.spree_roles << role
79
+ admin.save
80
+ admin.generate_spree_api_key!
81
+ say "Done!"
82
+ else
83
+ say "There was some problems with persisting new admin user:"
84
+ admin.errors.full_messages.each do |error|
85
+ say error
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ if Spree::User.admin.empty?
92
+ create_admin_user
93
+ else
94
+ puts 'Admin user has already been previously created.'
95
+ if agree('Would you like to create a new admin user? (yes/no)')
96
+ create_admin_user
97
+ else
98
+ puts 'No admin user created.'
99
+ end
100
+ end
@@ -0,0 +1,13 @@
1
+ class CreateSpreeCities < ActiveRecord::Migration
2
+ def change
3
+ create_table :spree_cities do |t|
4
+ t.references :state
5
+ t.string :name
6
+ t.integer :ibge_code
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :spree_cities, :state_id
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ class RemoveCityFromSpreeAddress < ActiveRecord::Migration
2
+ def change
3
+ remove_column :spree_addresses, :city, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddCityToSpreeAddress < ActiveRecord::Migration
2
+ def change
3
+ add_reference :spree_addresses, :city, index: true
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddNumberAndDistrictToSpreeAddress < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_addresses, :number, :integer
4
+ add_column :spree_addresses, :district, :string
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ class AddDetailsToSpreeUser < ActiveRecord::Migration
2
+ def change
3
+ unless defined?(User)
4
+ change_table :spree_users do |t|
5
+ t.string :first_name, :last_name, :cpf, :phone, :alternative_phone
6
+ t.datetime :date_of_birth
7
+ end
8
+ end
9
+ end
10
+ end
data/db/seeds.rb ADDED
@@ -0,0 +1,5 @@
1
+ # Loads seed data out of default dir
2
+ default_path = File.join(File.dirname(__FILE__), 'default')
3
+
4
+ Rake::Task['db:load_dir'].reenable
5
+ Rake::Task['db:load_dir'].invoke(default_path)
@@ -0,0 +1,31 @@
1
+ module SolidusBrCommon
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+
5
+ class_option :auto_run_migrations, :type => :boolean, :default => false
6
+
7
+ def add_javascripts
8
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/solidus_br_common\n"
9
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/solidus_br_common\n"
10
+ end
11
+
12
+ def add_stylesheets
13
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/solidus_br_common\n", :before => /\*\//, :verbose => true
14
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/solidus_br_common\n", :before => /\*\//, :verbose => true
15
+ end
16
+
17
+ def add_migrations
18
+ run 'bundle exec rake railties:install:migrations FROM=solidus_br_common'
19
+ end
20
+
21
+ def run_migrations
22
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
23
+ if run_migrations
24
+ run 'bundle exec rake db:migrate'
25
+ else
26
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ module SolidusBrCommon
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'solidus_br_common'
6
+
7
+ # use rspec for tests
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ end
11
+
12
+ def self.activate
13
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
14
+ Rails.configuration.cache_classes ? require(c) : load(c)
15
+ end
16
+ end
17
+
18
+ config.to_prepare &method(:activate).to_proc
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ FactoryGirl.modify do
2
+ factory :address do
3
+ number 122
4
+ district 'Carville'
5
+ city {|address| address.association(:city)}
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :city, class: Spree::City do
3
+ name 'Ashville'
4
+ ibge_code 32323
5
+
6
+ state { |city| city.association(:state) }
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ require "cpf_cnpj"
2
+
3
+ FactoryGirl.modify do
4
+ factory :user do
5
+ first_name 'Diego'
6
+ last_name 'Domingues'
7
+ date_of_birth { 18.years.ago }
8
+ cpf CPF.generate.to_s
9
+ phone '11-12211221'
10
+ alternative_phone '11-12211221'
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ Dir["#{File.dirname(__FILE__)}/factories/**"].each do |f|
2
+ require File.expand_path(f)
3
+ end
@@ -0,0 +1,2 @@
1
+ require 'spree_core'
2
+ require 'solidus_br_common/engine'
@@ -0,0 +1,33 @@
1
+ # encoding: UTF-8
2
+ Gem::Specification.new do |s|
3
+ s.platform = Gem::Platform::RUBY
4
+ s.name = 'solidus_br_common'
5
+ s.version = '1.1.0'
6
+ s.summary = 'Brazil commons aspects'
7
+ s.description = 'This extension has goal to provide common aspects as cities, extras address information and some seeds to Brazil'
8
+ s.required_ruby_version = '>= 2.0.0'
9
+
10
+ s.author = 'Diego Domingues'
11
+ s.email = 'diego.domingues16@gmail.com'
12
+ s.homepage = 'https://github.com/ddomingues/solidus_br_common'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- spec/*`.split("\n")
16
+ s.require_path = 'lib'
17
+ s.requirements << 'none'
18
+
19
+ s.add_runtime_dependency 'solidus_core', '~> 1.1'
20
+ s.add_runtime_dependency 'cpf_cnpj', '~> 0.2', '>= 0.2.1'
21
+ s.add_runtime_dependency 'jc-validates_timeliness', '~> 3.1', '>= 3.1.1'
22
+ s.add_runtime_dependency 'rest-client', '~> 1.8', '>= 1.8.0'
23
+
24
+ s.add_development_dependency 'capybara', '~> 2.4'
25
+ s.add_development_dependency 'coffee-rails', '~> 4.1', '>= 4.1.0'
26
+ s.add_development_dependency 'database_cleaner', '~> 1.5', '>= 1.5.1'
27
+ s.add_development_dependency 'factory_girl', '~> 4.5'
28
+ s.add_development_dependency 'ffaker'
29
+ s.add_development_dependency 'rspec-rails', '~> 3.4'
30
+ s.add_development_dependency 'sass-rails', '~> 5.0.4'
31
+ s.add_development_dependency 'selenium-webdriver'
32
+ s.add_development_dependency 'sqlite3'
33
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::AddressesController, :type => :controller do
4
+ context '#show', :vcr do
5
+ it 'shows the correct address' do
6
+ api_get :show, {cep: '04089000'}
7
+
8
+ expect(json_response['cep']).to eq('04089000')
9
+ expect(json_response['bairro']).to eq('Indianópolis')
10
+ expect(json_response['logradouro']).to eq('Alameda dos Maracatins')
11
+ expect(json_response['estado']).to eq('SP')
12
+ expect(json_response['cidade']).to eq('São Paulo')
13
+ end
14
+
15
+ it 'does not find an incorrect cep' do
16
+ api_get :show, {cep: '00000000'}
17
+
18
+ expect(response).to have_http_status(:not_found)
19
+ end
20
+
21
+ it 'requires :cep parameter' do
22
+ expect {
23
+ api_get :show
24
+ }.to raise_error ActionController::ParameterMissing
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Api::CitiesController do
4
+ render_views
5
+
6
+ let!(:city) { create(:city) }
7
+ let(:attributes) { Spree::Api::ApiHelpers.city_attributes }
8
+
9
+ before { stub_authentication! }
10
+
11
+ describe 'GET index' do
12
+ it 'gets all cities' do
13
+ api_get :index
14
+
15
+ expect(json_response['cities'].first).to include(*attributes)
16
+ expect(json_response['cities'].first['name']).to eq(city.name)
17
+ end
18
+
19
+ it 'gets all the cities for a particular state' do
20
+ api_get :index, state_id: city.state.id
21
+
22
+ expect(json_response['cities'].first).to include(*attributes)
23
+ expect(json_response['cities'].first['name']).to eq(city.name)
24
+ end
25
+
26
+ context 'pagination' do
27
+ before do
28
+ @scope = double
29
+ allow(Spree::City).to receive(:accessible_by).and_return(@scope)
30
+ allow(@scope).to receive_message_chain(:ransack, :result, :includes, :order).and_return(@scope)
31
+ end
32
+
33
+ it 'does not paginate cities results when asked not to do so' do
34
+ expect(@scope).to receive(:page).with(nil).and_return(@scope)
35
+ expect(@scope).to receive(:per).with(nil)
36
+
37
+ api_get :index
38
+ end
39
+
40
+ it 'paginates when page parameter is passed through' do
41
+ expect(@scope).to receive(:page).with(1).and_return(@scope)
42
+ expect(@scope).to receive(:per).with(nil)
43
+
44
+ api_get :index, page: 1
45
+ end
46
+
47
+ it 'paginates when per_page parameter is passed through' do
48
+ expect(@scope).to receive(:page).with(nil).and_return(@scope)
49
+ expect(@scope).to receive(:per).with(25)
50
+
51
+ api_get :index, per_page: 25
52
+ end
53
+ end
54
+
55
+ context 'with two cities' do
56
+ before { create(:city, name: 'Attalla') }
57
+
58
+ it 'gets all cities for a state' do
59
+ state = create(:state, name: 'Amazonas', abbr: 'AM')
60
+ city.state = state
61
+ city.save
62
+
63
+ api_get :index, state_id: state.id
64
+
65
+ expect(json_response['cities'].first).to include(*attributes)
66
+ expect(json_response['cities'].count).to eq 1
67
+ end
68
+
69
+ it 'can view all cities' do
70
+ api_get :index
71
+
72
+ expect(json_response['cities'].first).to include(*attributes)
73
+ expect(json_response['cities'].count).to eq 2
74
+ end
75
+
76
+ it 'can query the results through a parameter' do
77
+ api_get :index, q: {name_cont: 'Ash'}
78
+
79
+ expect(json_response['cities'].first['name']).to eq('Ashville')
80
+ end
81
+ end
82
+ end
83
+
84
+ describe 'GET show' do
85
+ it 'can view a city' do
86
+ api_get :show, id: city.id
87
+
88
+ expect(json_response).to include(*attributes)
89
+ end
90
+ end
91
+ end