solidus_br_common 1.1.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.
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