diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6c596dd2..8a66dfd0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,7 +31,7 @@ jobs: pg: [11-3.0, 12-master, 13-master, 14-master, 15-master] steps: - name: Set Up Actions - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Install GEOS run: sudo apt-get install libgeos-dev - name: Set Up Ruby diff --git a/Gemfile b/Gemfile index ce972f08..e5b1ac54 100644 --- a/Gemfile +++ b/Gemfile @@ -33,10 +33,8 @@ end # Need to install for tests gem "rails", github: "rails/rails", tag: "v#{activerecord_version}" - group :development do # Gems used by the ActiveRecord test suite gem "bcrypt" gem "mocha" - gem "sqlite3" end diff --git a/activerecord-postgis-adapter.gemspec b/activerecord-postgis-adapter.gemspec index 0c9a8b6e..8efe5193 100644 --- a/activerecord-postgis-adapter.gemspec +++ b/activerecord-postgis-adapter.gemspec @@ -19,13 +19,13 @@ Gem::Specification.new do |spec| spec.required_ruby_version = ">= 2.7.0" - spec.add_dependency "activerecord", "~> 7.0.0" + spec.add_dependency "activerecord", "~> 7.1.0" spec.add_dependency "rgeo-activerecord", "~> 7.0.0" spec.add_development_dependency "rake", "~> 13.0" spec.add_development_dependency "minitest", "~> 5.4" spec.add_development_dependency "mocha", "~> 1.1" - spec.add_development_dependency "benchmark-ips", "~> 2.9.1" + spec.add_development_dependency "benchmark-ips", "~> 2.12" spec.add_development_dependency "rubocop", "~> 1.50" spec.metadata = { diff --git a/lib/active_record/connection_adapters/postgis/column_methods.rb b/lib/active_record/connection_adapters/postgis/column_methods.rb index bef9a0ac..559294bc 100644 --- a/lib/active_record/connection_adapters/postgis/column_methods.rb +++ b/lib/active_record/connection_adapters/postgis/column_methods.rb @@ -4,6 +4,7 @@ module ActiveRecord module ConnectionAdapters module PostGIS module ColumnMethods + def spatial(name, options = {}) raise "You must set a type. For example: 't.spatial type: :st_point'" unless options[:type] column(name, options[:type], **options) @@ -44,6 +45,11 @@ def st_point(name, options = {}) def st_polygon(name, options = {}) column(name, :st_polygon, **options) end + + private + def valid_column_definition_options + super + [:srid, :has_z, :has_m, :geographic, :spatial_type] + end end end diff --git a/lib/active_record/connection_adapters/postgis/oid/spatial.rb b/lib/active_record/connection_adapters/postgis/oid/spatial.rb index 9a292cae..46ed619f 100644 --- a/lib/active_record/connection_adapters/postgis/oid/spatial.rb +++ b/lib/active_record/connection_adapters/postgis/oid/spatial.rb @@ -25,7 +25,10 @@ def initialize(geo_type: "geometry", srid: 0, has_z: false, has_m: false, geogra # has_z: false # has_m: false def self.parse_sql_type(sql_type) - geo_type, srid, has_z, has_m = nil, 0, false, false + geo_type = nil + srid = 0 + has_z = false + has_m = false if sql_type =~ /(geography|geometry)\((.*)\)$/i # geometry(Point) diff --git a/lib/active_record/connection_adapters/postgis/schema_statements.rb b/lib/active_record/connection_adapters/postgis/schema_statements.rb index 46c50477..863ff0e5 100644 --- a/lib/active_record/connection_adapters/postgis/schema_statements.rb +++ b/lib/active_record/connection_adapters/postgis/schema_statements.rb @@ -7,7 +7,7 @@ module SchemaStatements # override # https://github.com/rails/rails/blob/7-0-stable/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L662 # Create a SpatialColumn instead of a PostgreSQL::Column - def new_column_from_field(table_name, field) + def new_column_from_field(table_name, field, _definitions) column_name, type, default, notnull, oid, fmod, collation, comment, attgenerated = field type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i) default_value = extract_value_from_default(default) @@ -18,7 +18,7 @@ def new_column_from_field(table_name, field) default_function = extract_default_function(default_value, default) end - if match = default_function&.match(/\Anextval\('"?(?.+_(?seq\d*))"?'::regclass\)\z/) + if (match = default_function&.match(/\Anextval\('"?(?.+_(?seq\d*))"?'::regclass\)\z/)) serial = sequence_name_from_parts(table_name, column_name, match[:suffix]) == match[:sequence_name] end diff --git a/lib/active_record/connection_adapters/postgis/spatial_table_definition.rb b/lib/active_record/connection_adapters/postgis/spatial_table_definition.rb index 606a980e..6842f5b4 100644 --- a/lib/active_record/connection_adapters/postgis/spatial_table_definition.rb +++ b/lib/active_record/connection_adapters/postgis/spatial_table_definition.rb @@ -43,11 +43,11 @@ def geo_type(type = "GEOMETRY") end def limit_from_options(type, options = {}) - spatial_type = geo_type(type) - spatial_type << "Z" if options[:has_z] - spatial_type << "M" if options[:has_m] - spatial_type << ",#{options[:srid] || default_srid(options)}" - spatial_type + has_z = options[:has_z] ? 'Z' : '' + has_m = options[:has_m] ? 'M' : '' + srid = options[:srid] || default_srid(options) + field_type = [geo_type(type), has_z, has_m].compact.join + "#{field_type},#{srid}" end def default_srid(options) diff --git a/lib/active_record/connection_adapters/postgis_adapter.rb b/lib/active_record/connection_adapters/postgis_adapter.rb index 125ab7e1..13ccab7f 100644 --- a/lib/active_record/connection_adapters/postgis_adapter.rb +++ b/lib/active_record/connection_adapters/postgis_adapter.rb @@ -9,18 +9,18 @@ require "active_record/connection_adapters" require "active_record/connection_adapters/postgresql_adapter" -require "active_record/connection_adapters/postgis/version" -require "active_record/connection_adapters/postgis/column_methods" -require "active_record/connection_adapters/postgis/schema_statements" -require "active_record/connection_adapters/postgis/database_statements" -require "active_record/connection_adapters/postgis/spatial_column_info" -require "active_record/connection_adapters/postgis/spatial_table_definition" -require "active_record/connection_adapters/postgis/spatial_column" -require "active_record/connection_adapters/postgis/arel_tosql" -require "active_record/connection_adapters/postgis/oid/spatial" -require "active_record/connection_adapters/postgis/oid/date_time" -require "active_record/connection_adapters/postgis/type" # has to be after oid/* -require "active_record/connection_adapters/postgis/create_connection" +require_relative "postgis/version" +require_relative "postgis/column_methods" +require_relative "postgis/schema_statements" +require_relative "postgis/database_statements" +require_relative "postgis/spatial_column_info" +require_relative "postgis/spatial_table_definition" +require_relative "postgis/spatial_column" +require_relative "postgis/arel_tosql" +require_relative "postgis/oid/spatial" +require_relative "postgis/oid/date_time" +require_relative "postgis/type" # has to be after oid/* +require_relative "postgis/create_connection" # :startdoc: module ActiveRecord diff --git a/lib/activerecord-postgis-adapter.rb b/lib/activerecord-postgis-adapter.rb index 8e6d27b4..edcac15f 100644 --- a/lib/activerecord-postgis-adapter.rb +++ b/lib/activerecord-postgis-adapter.rb @@ -1,3 +1,3 @@ # frozen_string_literal: true -require "active_record/connection_adapters/postgis_adapter" +require_relative "active_record/connection_adapters/postgis_adapter" diff --git a/test/cases/setup_test.rb b/test/cases/setup_test.rb index a28fc421..e7fe33ff 100644 --- a/test/cases/setup_test.rb +++ b/test/cases/setup_test.rb @@ -5,7 +5,7 @@ module PostGIS class SpatialQueriesTest < ActiveSupport::TestCase def test_ignore_tables - expect_to_ignore = %w( + expect_to_ignore = %w[ geography_columns geometry_columns layer @@ -13,7 +13,7 @@ def test_ignore_tables raster_overviews spatial_ref_sys topology - ) + ] assert_equal expect_to_ignore, ::ActiveRecord::SchemaDumper.ignore_tables end end diff --git a/test/test_helper.rb b/test/test_helper.rb index dda8837b..db3a6620 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,7 +2,6 @@ require "bundler/setup" Bundler.require :development - require "minitest/autorun" require "minitest/pride" require "mocha/minitest"