diff --git a/app/assets/javascripts/subdivision_select.js b/app/assets/javascripts/subdivision_select.js index 0ada31b..9f07031 100644 --- a/app/assets/javascripts/subdivision_select.js +++ b/app/assets/javascripts/subdivision_select.js @@ -13,7 +13,7 @@ var SubdivisionSelect = (function() { } else { this._countrySelect = $element. closest("form"). - find(SubdivisionSelect.subdivisionSelector); + find(SubdivisionSelect.countrySelector); } }; diff --git a/app/helpers/subdivision_select/subdivisions_helper.rb b/app/helpers/subdivision_select/subdivisions_helper.rb index 61a9998..ff97b2e 100644 --- a/app/helpers/subdivision_select/subdivisions_helper.rb +++ b/app/helpers/subdivision_select/subdivisions_helper.rb @@ -6,11 +6,18 @@ def self.get_subdivisions(alpha2) # and the value is a hash with two key/values: # - "name" is the most popular/most correct name # - "names" is an array of all the names - if ISO3166::Country[alpha2].nil? - {} - else - ISO3166::Country[alpha2].subdivisions.map { |k, v| [k, v["name"]] }.to_h - end + subdivision_hash = + if ISO3166::Country[alpha2].nil? + {} + else + ISO3166::Country[alpha2].subdivisions.map { |k, v| [k, v["name"]] }.to_h + end + + Hash[ + SubdivisionSelect.options.priority_subdivisions.fetch(alpha2&.to_sym, []).map do |sd_code| + [sd_code, subdivision_hash.delete(sd_code)] + end + ].merge(subdivision_hash) end def self.get_subdivisions_for_select(alpha2) diff --git a/lib/subdivision_select.rb b/lib/subdivision_select.rb index a78cea6..4aefb81 100644 --- a/lib/subdivision_select.rb +++ b/lib/subdivision_select.rb @@ -1,3 +1,4 @@ +require "subdivision_select/configuration" require "subdivision_select/tag_helper" require "subdivision_select/subdivision_select_helper" require "subdivision_select/engine" diff --git a/lib/subdivision_select/configuration.rb b/lib/subdivision_select/configuration.rb new file mode 100644 index 0000000..d2d46e4 --- /dev/null +++ b/lib/subdivision_select/configuration.rb @@ -0,0 +1,17 @@ +module SubdivisionSelect + def self.configure + yield(options) + end + + def self.options + @options ||= Configuration.new + end + + class Configuration + attr_accessor :priority_subdivisions + + def initialize + @priority_subdivisions = {} + end + end +end diff --git a/lib/subdivision_select/engine.rb b/lib/subdivision_select/engine.rb index 2fb6506..b0a5ca6 100644 --- a/lib/subdivision_select/engine.rb +++ b/lib/subdivision_select/engine.rb @@ -13,7 +13,7 @@ class Engine < ::Rails::Engine config.generators do |g| g.test_framework :rspec - g.fixture_replacement :factory_girl, dir: "spec/factories" + g.fixture_replacement :factory_bot, dir: "spec/factories" end end end diff --git a/lib/subdivision_select/tag_helper.rb b/lib/subdivision_select/tag_helper.rb index 3fec4fd..110f99f 100644 --- a/lib/subdivision_select/tag_helper.rb +++ b/lib/subdivision_select/tag_helper.rb @@ -1,15 +1,20 @@ module SubdivisionSelect - #class CountryNotFoundError < StandardError;end + # class CountryNotFoundError < StandardError;end module TagHelper + unless respond_to?(:options_for_select) + include ActionView::Helpers::FormOptionsHelper + include ActionView::Helpers::Tags::SelectRenderer if defined?(ActionView::Helpers::Tags::SelectRenderer) + end + def subdivision_option_tags option_tags_options = { - selected: @options.fetch(:selected) { value(@object) }, + selected: @options.fetch(:selected) { value }, disabled: @options[:disabled] } # Actual loading of subdivisions is in a View helper, since the controller # needs to use it, to render the subdivisions of a country in JSON - subdivisions = SubdivisionsHelper::get_subdivisions_for_select(country) + subdivisions = SubdivisionsHelper.get_subdivisions_for_select(country) options_for_select(subdivisions, option_tags_options) end @@ -20,4 +25,3 @@ def country end end end - diff --git a/lib/subdivision_select/version.rb b/lib/subdivision_select/version.rb index 70dc584..2a98396 100644 --- a/lib/subdivision_select/version.rb +++ b/lib/subdivision_select/version.rb @@ -1,3 +1,3 @@ module SubdivisionSelect - VERSION = "0.0.6" + VERSION = "0.0.8" end diff --git a/spec/controllers/subdivision_select/subdivisions_controller_spec.rb b/spec/controllers/subdivision_select/subdivisions_controller_spec.rb index f37c8e2..961c2bc 100644 --- a/spec/controllers/subdivision_select/subdivisions_controller_spec.rb +++ b/spec/controllers/subdivision_select/subdivisions_controller_spec.rb @@ -6,17 +6,16 @@ module SubdivisionSelect describe "GET #get" do it "returns http success in JSON, when correct param supplied" do - get :get, country_code: "IE" - expect(response).to have_http_status(:success) - expect(response.content_type).to eq("application/json") + get :get, params: {country_code: "IE"} + expect(response).to be_successful + expect(response.content_type).to eq("application/json; charset=utf-8") end it "returns http success in JSON, w/o correct param supplied" do get :get - expect(response).to have_http_status(:success) - expect(response.content_type).to eq("application/json") + expect(response).to be_successful + expect(response.content_type).to eq("application/json; charset=utf-8") end - end end end diff --git a/spec/dummy/app/assets/config/manifest.js b/spec/dummy/app/assets/config/manifest.js new file mode 100644 index 0000000..b16e53d --- /dev/null +++ b/spec/dummy/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/spec/dummy/app/controllers/addresses_demo_controller.rb b/spec/dummy/app/controllers/addresses_demo_controller.rb index 1310c37..5f75316 100644 --- a/spec/dummy/app/controllers/addresses_demo_controller.rb +++ b/spec/dummy/app/controllers/addresses_demo_controller.rb @@ -13,7 +13,7 @@ def tags def update @address = Address.find(params[:id]) - if @address.update_attributes(address_params) + if @address.update(address_params) redirect_to root_path, notice: "Updated address!" end end diff --git a/spec/dummy/db/migrate/20150505182454_add_title_to_addresses.rb b/spec/dummy/db/migrate/20150505182454_add_title_to_addresses.rb deleted file mode 100644 index 5375a60..0000000 --- a/spec/dummy/db/migrate/20150505182454_add_title_to_addresses.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTitleToAddresses < ActiveRecord::Migration - def change - add_column :addresses, :title, :string - end -end diff --git a/spec/dummy/db/migrate/20150505181543_create_addresses.rb b/spec/dummy/db/migrate/20241004213846_create_addresses.rb similarity index 55% rename from spec/dummy/db/migrate/20150505181543_create_addresses.rb rename to spec/dummy/db/migrate/20241004213846_create_addresses.rb index d029d09..488667f 100644 --- a/spec/dummy/db/migrate/20150505181543_create_addresses.rb +++ b/spec/dummy/db/migrate/20241004213846_create_addresses.rb @@ -1,10 +1,11 @@ -class CreateAddresses < ActiveRecord::Migration +class CreateAddresses < ActiveRecord::Migration[7.2] def change create_table :addresses do |t| + t.string :title t.string :country t.string :subdivision - t.timestamps null: false + t.timestamps end end end diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index 688f6d5..5052a55 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -1,24 +1,21 @@ -# encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150505182454) do - +ActiveRecord::Schema[7.2].define(version: 2024_10_04_213846) do create_table "addresses", force: :cascade do |t| - t.string "country" - t.string "subdivision" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "title" + t.string "title" + t.string "country" + t.string "subdivision" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - end diff --git a/spec/dummy/db/seeds.rb b/spec/dummy/db/seeds.rb deleted file mode 100644 index 0490917..0000000 --- a/spec/dummy/db/seeds.rb +++ /dev/null @@ -1,16 +0,0 @@ -Address.destroy_all - -Address.create!( - title: "Empty" -) - -Address.create!( - title: "Massachusetts, USA", - country: "US", - subdivision: "MA" -) - -Address.create!( - title: "Ireland, without subdivision", - country: "IE" -) diff --git a/spec/dummy/db/test.sqlite3-shm b/spec/dummy/db/test.sqlite3-shm new file mode 100644 index 0000000..a19b7dd Binary files /dev/null and b/spec/dummy/db/test.sqlite3-shm differ diff --git a/spec/dummy/db/test.sqlite3-wal b/spec/dummy/db/test.sqlite3-wal new file mode 100644 index 0000000..60ea8cb Binary files /dev/null and b/spec/dummy/db/test.sqlite3-wal differ diff --git a/spec/dummy/spec/controllers/addresses_demo_controller_spec.rb b/spec/dummy/spec/controllers/addresses_demo_controller_spec.rb index a672b42..a1bd70d 100644 --- a/spec/dummy/spec/controllers/addresses_demo_controller_spec.rb +++ b/spec/dummy/spec/controllers/addresses_demo_controller_spec.rb @@ -4,21 +4,21 @@ describe "GET #index" do it "returns http success" do get :index - expect(response).to have_http_status(:success) + expect(response).to be_successful end end describe "GET #tags" do it "returns http success" do get :tags - expect(response).to have_http_status(:success) + expect(response).to be_successful end end describe "PATCH #update" do it "returns http success" do @address = create(:address) - patch :update, id: @address.id, address: { subdivision: "D", country: "IE" } + patch :update, params: { id: @address.id, address: { subdivision: "D", country: "IE" } } expect(assigns(:address).country).to eq("IE") expect(assigns(:address).subdivision).to eq("D") end diff --git a/spec/dummy/spec/features/select_boxes_spec.rb b/spec/dummy/spec/features/select_boxes_spec.rb index a272264..da1bd40 100644 --- a/spec/dummy/spec/features/select_boxes_spec.rb +++ b/spec/dummy/spec/features/select_boxes_spec.rb @@ -1,4 +1,5 @@ require "rails_helper" + feature "select boxes via FormBuilder and FormTagHelper" do before(:each) do @address = create(:mass_address) diff --git a/spec/factories.rb b/spec/factories.rb index 4faac53..d5b3ebc 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -1,11 +1,11 @@ -FactoryGirl.define do +FactoryBot.define do factory :address do - title "Blank Address" + title { "Blank Address" } factory :mass_address do - title "Massachusetts Address" - country "US" - subdivision "MA" + title { "Massachusetts Address" } + country { "US" } + subdivision { "MA" } end end end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index bbadd22..4ee32fd 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -5,7 +5,9 @@ require "rspec/rails" require "capybara/rails" require "capybara/rspec" -require "factory_girl_rails" +require "factory_bot_rails" +require "rails-controller-testing" +Rails::Controller::Testing.install require "capybara/poltergeist" Capybara.javascript_driver = :poltergeist @@ -52,5 +54,5 @@ # https://relishapp.com/rspec/rspec-rails/docs config.infer_spec_type_from_file_location! - config.include FactoryGirl::Syntax::Methods + config.include FactoryBot::Syntax::Methods end diff --git a/subdivision_select.gemspec b/subdivision_select.gemspec index 713d6a5..c8a0770 100644 --- a/subdivision_select.gemspec +++ b/subdivision_select.gemspec @@ -19,19 +19,21 @@ Gem::Specification.new do |s| "Rakefile", "README.rdoc" ] - s.test_files = Dir["spec/**/*"] - s.add_dependency "rails", ">= 4.1" - s.add_dependency "country_select", "~> 2.0" - s.add_dependency "countries", "~> 1.1" + s.add_dependency "rails", ">= 7.0" + s.add_dependency "sprockets-rails", ">= 3.5" + s.add_dependency "country_select", "~> 10.0.0" + s.add_dependency "countries", "> 5.0", "< 8.0" s.add_dependency "jquery-rails", ">= 3.0" s.add_development_dependency "sqlite3", "~> 1.3" # Not used but we need an AR adapter - s.add_development_dependency "rspec-rails", "~> 3.2" - s.add_development_dependency "factory_girl_rails", "~> 4.5" + s.add_development_dependency "puma", ">= 6.0" + s.add_development_dependency "rspec-rails", "~> 7.0" + s.add_development_dependency "rails-controller-testing" + s.add_development_dependency "factory_bot_rails", "~> 6.0" s.add_development_dependency "database_cleaner" - s.add_development_dependency "capybara", "~> 2.4" + s.add_development_dependency "capybara", "~> 3.40" s.add_development_dependency "poltergeist", "~> 1.8" end