activerecord-postgis-adapter 6.0.3 → 7.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69cf59b00676a1afdd07f0f6569b267995f5a5a3587fdf52a706876d5e4a1f87
4
- data.tar.gz: d678ad7901ed89fae596ebfef4a48d2f04231a085da840c7fa2c4714f0aca534
3
+ metadata.gz: 40546b155985259941dab5c7fef8ec7f0d4959a29087044a133c4918929d7e2f
4
+ data.tar.gz: b80326260c605d158e4647caa361d07000c622140ae90e505f97a0576f2ce26a
5
5
  SHA512:
6
- metadata.gz: 355f65508295569307ac86dba4970477eb6d41f1f48484bb203a61ff31b7a3ec827b9eea321441c24a83f8706ceead8c916cb833947074b2463e8ffdf0060050
7
- data.tar.gz: ea179ffdf8d4d31a0065001ae396e552732679c7048e48994ef503c8e8ff206e7aa2140f07ffe31f67be5a046f3ee679ba3e8d50e993f54a08512bf214ccceed
6
+ metadata.gz: 8b3aee9a59f53669fe3e44c1f471f30f3e37f20b0a18bb920ac46535e264f573492da49c268d04a037b959517018584aa69c6fe1d9f45b211b3a55ed8d19a1d2
7
+ data.tar.gz: af501e0d2e9e3cc0990c67812fa9fc1fc2202ba9f15ed5f6a69dfe4e73709ef4cc339c9846ee60a804e6f5f2a5bf754d6f4082508a1cbd17dfa3e7c9f985c5f2
@@ -1,5 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ module RGeo
4
+ module ActiveRecord
5
+ ##
6
+ # Extend rgeo-activerecord visitors to use PostGIS specific functionality
7
+ module SpatialToPostGISSql
8
+ def visit_in_spatial_context(node, collector)
9
+ # Use ST_GeomFromEWKT for EWKT geometries
10
+ if node.is_a?(String) && node =~ /SRID=[\d+]{0,};/
11
+ collector << "#{st_func('ST_GeomFromEWKT')}(#{quote(node)})"
12
+ else
13
+ super(node, collector)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ RGeo::ActiveRecord::SpatialToSql.prepend RGeo::ActiveRecord::SpatialToPostGISSql
20
+
3
21
  module Arel # :nodoc:
4
22
  module Visitors # :nodoc:
5
23
  # Different super-class under JRuby JDBC adapter.
@@ -11,22 +29,6 @@ module Arel # :nodoc:
11
29
 
12
30
  class PostGIS < PostGISSuperclass # :nodoc:
13
31
  include RGeo::ActiveRecord::SpatialToSql
14
-
15
- FUNC_MAP = {
16
- "st_wkttosql" => "ST_GeomFromEWKT",
17
- }
18
-
19
- def st_func(standard_name)
20
- FUNC_MAP[standard_name.downcase] || standard_name
21
- end
22
-
23
- def visit_String(node, collector)
24
- collector << "#{st_func('ST_WKTToSQL')}(#{quote(node)})"
25
- end
26
-
27
- def visit_RGeo_ActiveRecord_SpatialNamedFunction(node, collector)
28
- aggregate(st_func(node.name), node, collector)
29
- end
30
32
  end
31
33
  end
32
34
  end
@@ -10,7 +10,11 @@ module ActiveRecord # :nodoc:
10
10
  module ConnectionHandling # :nodoc:
11
11
  if RUBY_ENGINE == "jruby"
12
12
 
13
+ # modified from https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb#L3
13
14
  def postgis_connection(config)
15
+ config = config.deep_dup
16
+ config = symbolize_keys_if_necessary(config)
17
+
14
18
  config[:adapter_class] = ConnectionAdapters::PostGISAdapter
15
19
  postgresql_connection(config)
16
20
  end
@@ -23,9 +27,7 @@ module ActiveRecord # :nodoc:
23
27
  # https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
24
28
  # FULL REPLACEMENT because we need to create a different class.
25
29
  def postgis_connection(config)
26
- conn_params = config.symbolize_keys
27
-
28
- conn_params.delete_if { |_, v| v.nil? }
30
+ conn_params = config.symbolize_keys.compact
29
31
 
30
32
  # Map ActiveRecords param names to PGs.
31
33
  conn_params[:user] = conn_params.delete(:username) if conn_params[:username]
@@ -35,14 +37,12 @@ module ActiveRecord # :nodoc:
35
37
  valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:requiressl]
36
38
  conn_params.slice!(*valid_conn_param_keys)
37
39
 
38
- conn = PG.connect(conn_params)
39
- ConnectionAdapters::PostGISAdapter.new(conn, logger, conn_params, config)
40
- rescue ::PG::Error => error
41
- if error.message.include?(conn_params[:dbname])
42
- raise ActiveRecord::NoDatabaseError
43
- else
44
- raise
45
- end
40
+ ConnectionAdapters::PostGISAdapter.new(
41
+ ConnectionAdapters::PostGISAdapter.new_client(conn_params),
42
+ logger,
43
+ conn_params,
44
+ config
45
+ )
46
46
  end
47
47
 
48
48
  end
@@ -2,17 +2,17 @@
2
2
 
3
3
  namespace :db do
4
4
  namespace :gis do
5
- desc "Setup PostGIS data in the database"
5
+ desc 'Setup PostGIS data in the database'
6
6
  task setup: [:load_config] do
7
7
  environments = [Rails.env]
8
- environments << "test" if Rails.env.development?
8
+ environments << 'test' if Rails.env.development?
9
9
  environments.each do |environment|
10
10
  ActiveRecord::Base.configurations
11
- .configs_for(env_name: environment)
12
- .reject { |env| env.config["database"].blank? }
13
- .each do |env|
14
- ActiveRecord::ConnectionAdapters::PostGIS::PostGISDatabaseTasks.new(env.config).setup_gis
15
- end
11
+ .configs_for(env_name: environment)
12
+ .reject { |env| env.configuration_hash[:database].blank? }
13
+ .each do |env|
14
+ ActiveRecord::ConnectionAdapters::PostGIS::PostGISDatabaseTasks.new(env).setup_gis
15
+ end
16
16
  end
17
17
  end
18
18
  end
@@ -4,16 +4,17 @@ module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  module PostGIS
6
6
  module OID
7
+ # OID used to represent geometry/geography database types and attributes.
8
+ #
9
+ # Accepts `geo_type`, `srid`, `has_z`, `has_m`, and `geographic` as parameters.
10
+ # Responsible for parsing sql_types returned from the database and WKT features.
7
11
  class Spatial < Type::Value
8
- # sql_type is a string that comes from the database definition
9
- # examples:
10
- # "geometry(Point,4326)"
11
- # "geography(Point,4326)"
12
- # "geometry(Polygon,4326) NOT NULL"
13
- # "geometry(Geography,4326)"
14
- def initialize(oid, sql_type)
15
- @sql_type = sql_type
16
- @geo_type, @srid, @has_z, @has_m = self.class.parse_sql_type(sql_type)
12
+ def initialize(geo_type: 'geometry', srid: 0, has_z: false, has_m: false, geographic: false)
13
+ @geo_type = geo_type
14
+ @srid = srid
15
+ @has_z = has_z
16
+ @has_m = has_m
17
+ @geographic = geographic
17
18
  end
18
19
 
19
20
  # sql_type: geometry, geometry(Point), geometry(Point,4326), ...
@@ -43,30 +44,24 @@ module ActiveRecord
43
44
  # otherType(a,b)
44
45
  geo_type = sql_type
45
46
  end
46
- [geo_type, srid, has_z, has_m]
47
+ geographic = sql_type.match?(/geography/)
48
+
49
+ [geo_type, srid, has_z, has_m, geographic]
47
50
  end
48
51
 
49
52
  def spatial_factory
50
53
  @spatial_factory ||=
51
54
  RGeo::ActiveRecord::SpatialFactoryStore.instance.factory(
52
- geo_type: @geo_type,
53
- has_m: @has_m,
54
- has_z: @has_z,
55
- sql_type: @sql_type,
56
- srid: @srid
55
+ factory_attrs
57
56
  )
58
57
  end
59
58
 
60
- def geographic?
61
- @sql_type =~ /geography/
62
- end
63
-
64
59
  def spatial?
65
60
  true
66
61
  end
67
62
 
68
63
  def type
69
- geographic? ? :geography : :geometry
64
+ @geographic ? :geography : :geometry
70
65
  end
71
66
 
72
67
  # support setting an RGeo object or a WKT string
@@ -107,6 +102,16 @@ module ActiveRecord
107
102
  RGeo::WKRep::WKTParser.new(spatial_factory, support_ewkt: true, default_srid: @srid)
108
103
  end
109
104
  end
105
+
106
+ def factory_attrs
107
+ {
108
+ geo_type: @geo_type.underscore,
109
+ has_m: @has_m,
110
+ has_z: @has_z,
111
+ srid: @srid,
112
+ sql_type: type.to_s
113
+ }
114
+ end
110
115
  end
111
116
  end
112
117
  end
@@ -4,7 +4,7 @@ module ActiveRecord # :nodoc:
4
4
  module ConnectionAdapters # :nodoc:
5
5
  module PostGIS # :nodoc:
6
6
  class PostGISDatabaseTasks < ::ActiveRecord::Tasks::PostgreSQLDatabaseTasks # :nodoc:
7
- def initialize(config)
7
+ def initialize(db_config)
8
8
  super
9
9
  ensure_installation_configs
10
10
  end
@@ -14,19 +14,19 @@ module ActiveRecord # :nodoc:
14
14
  if extension_names
15
15
  setup_gis_from_extension
16
16
  end
17
- establish_connection(configuration)
17
+ establish_connection(db_config)
18
18
  end
19
19
 
20
20
  # Override to set the database owner and call setup_gis
21
21
  def create(master_established = false)
22
22
  establish_master_connection unless master_established
23
- extra_configs = { "encoding" => encoding }
24
- extra_configs["owner"] = username if has_su?
25
- connection.create_database(configuration["database"], configuration.merge(extra_configs))
23
+ extra_configs = { encoding: encoding }
24
+ extra_configs[:owner] = username if has_su?
25
+ connection.create_database(db_config.database, configuration_hash.merge(extra_configs))
26
26
  setup_gis
27
27
  rescue ::ActiveRecord::StatementInvalid => error
28
28
  if /database .* already exists/ === error.message
29
- raise ::ActiveRecord::Tasks::DatabaseAlreadyExists
29
+ raise ::ActiveRecord::DatabaseAlreadyExists
30
30
  else
31
31
  raise
32
32
  end
@@ -36,24 +36,24 @@ module ActiveRecord # :nodoc:
36
36
 
37
37
  # Override to use su_username and su_password
38
38
  def establish_master_connection
39
- establish_connection(configuration.merge(
40
- "database" => "postgres",
41
- "password" => su_password,
42
- "schema_search_path" => "public",
43
- "username" => su_username
39
+ establish_connection(configuration_hash.merge(
40
+ database: "postgres",
41
+ password: su_password,
42
+ schema_search_path: "public",
43
+ username: su_username
44
44
  ))
45
45
  end
46
46
 
47
47
  def establish_su_connection
48
- establish_connection(configuration.merge(
49
- "password" => su_password,
50
- "schema_search_path" => "public",
51
- "username" => su_username
48
+ establish_connection(configuration_hash.merge(
49
+ password: su_password,
50
+ schema_search_path: "public",
51
+ username: su_username
52
52
  ))
53
53
  end
54
54
 
55
55
  def username
56
- @username ||= configuration["username"]
56
+ @username ||= configuration_hash[:username]
57
57
  end
58
58
 
59
59
  def quoted_username
@@ -61,29 +61,30 @@ module ActiveRecord # :nodoc:
61
61
  end
62
62
 
63
63
  def password
64
- @password ||= configuration["password"]
64
+ @password ||= configuration_hash[:password]
65
65
  end
66
66
 
67
67
  def su_username
68
- @su_username ||= configuration["su_username"] || username
68
+ @su_username ||= configuration_hash.fetch(:su_username, username)
69
69
  end
70
70
 
71
71
  def su_password
72
- @su_password ||= configuration["su_password"] || password
72
+ @su_password ||= configuration_hash.fetch(:su_password, password)
73
73
  end
74
74
 
75
75
  def has_su?
76
- @has_su = configuration.include?("su_username") unless defined?(@has_su)
77
- @has_su
76
+ return @has_su if defined?(@has_su)
77
+
78
+ @has_su = configuration_hash.include?(:su_username)
78
79
  end
79
80
 
80
81
  def search_path
81
- @search_path ||= configuration["schema_search_path"].to_s.strip.split(",").map(&:strip)
82
+ @search_path ||= configuration_hash[:schema_search_path].to_s.strip.split(",").map(&:strip)
82
83
  end
83
84
 
84
85
  def extension_names
85
86
  @extension_names ||= begin
86
- extensions = configuration["postgis_extension"]
87
+ extensions = configuration_hash[:postgis_extension]
87
88
  case extensions
88
89
  when ::String
89
90
  extensions.split(",")
@@ -96,11 +97,11 @@ module ActiveRecord # :nodoc:
96
97
  end
97
98
 
98
99
  def ensure_installation_configs
99
- if configuration["setup"] == "default" && !configuration["postgis_extension"]
100
+ if configuration_hash[:setup] == "default" && !configuration_hash[:postgis_extension]
100
101
  share_dir = `pg_config --sharedir`.strip rescue "/usr/share"
101
102
  control_file = ::File.expand_path("extension/postgis.control", share_dir)
102
103
  if ::File.readable?(control_file)
103
- configuration["postgis_extension"] = "postgis"
104
+ @configuration_hash = configuration_hash.merge(postgis_extension: "postgis").freeze
104
105
  end
105
106
  end
106
107
  end
@@ -113,7 +114,7 @@ module ActiveRecord # :nodoc:
113
114
  end
114
115
  connection.execute("CREATE EXTENSION IF NOT EXISTS #{extname} SCHEMA topology")
115
116
  else
116
- if (postgis_schema = configuration["postgis_schema"])
117
+ if (postgis_schema = configuration_hash[:postgis_schema])
117
118
  schema_clause = "WITH SCHEMA #{postgis_schema}"
118
119
  unless schema_exists?(postgis_schema)
119
120
  connection.execute("CREATE SCHEMA #{postgis_schema}")
@@ -96,8 +96,15 @@ module ActiveRecord
96
96
  st_point
97
97
  st_polygon
98
98
  ).each do |geo_type|
99
- map.register_type(geo_type) do |oid, _, sql_type|
100
- OID::Spatial.new(oid, sql_type)
99
+ map.register_type(geo_type) do |_, _, sql_type|
100
+ # sql_type is a string that comes from the database definition
101
+ # examples:
102
+ # "geometry(Point,4326)"
103
+ # "geography(Point,4326)"
104
+ # "geometry(Polygon,4326) NOT NULL"
105
+ # "geometry(Geography,4326)"
106
+ geo_type, srid, has_z, has_m, geographic = OID::Spatial.parse_sql_type(sql_type)
107
+ OID::Spatial.new(geo_type: geo_type, srid: srid, has_z: has_z, has_m: has_m, geographic: geographic)
101
108
  end
102
109
  end
103
110
 
@@ -67,7 +67,7 @@ module ActiveRecord # :nodoc:
67
67
  end
68
68
 
69
69
  def build_from_sql_type(sql_type)
70
- geo_type, @srid, @has_z, @has_m = OID::Spatial.parse_sql_type(sql_type)
70
+ geo_type, @srid, @has_z, @has_m, @geographic = OID::Spatial.parse_sql_type(sql_type)
71
71
  set_geometric_type_from_name(geo_type)
72
72
  end
73
73
 
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ module PostGIS
6
+ module Type
7
+ # Look for :postgis types first, then check for :postgresql
8
+ # types to simulate a kind of Type inheritance.
9
+ def lookup(*args, adapter: current_adapter_name, **kwargs)
10
+ super(*args, adapter: adapter, **kwargs)
11
+ rescue ArgumentError => e
12
+ raise e unless current_adapter_name == :postgis
13
+
14
+ super(*args, adapter: :postgresql, **kwargs)
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ # Type uses `class << self` syntax so we have to prepend to the singleton_class
21
+ Type.singleton_class.prepend(ActiveRecord::ConnectionAdapters::PostGIS::Type)
22
+ end
@@ -3,7 +3,7 @@
3
3
  module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  module PostGIS
6
- VERSION = "6.0.3"
6
+ VERSION = "7.1.1"
7
7
  end
8
8
  end
9
9
  end
@@ -7,13 +7,7 @@
7
7
 
8
8
  require "rgeo/active_record"
9
9
 
10
- # autoload AbstractAdapter to avoid circular require and void context warnings
11
- module ActiveRecord
12
- module ConnectionAdapters
13
- AbstractAdapter
14
- end
15
- end
16
-
10
+ require "active_record/connection_adapters"
17
11
  require "active_record/connection_adapters/postgresql_adapter"
18
12
  require "active_record/connection_adapters/postgis/version"
19
13
  require "active_record/connection_adapters/postgis/column_methods"
@@ -25,6 +19,7 @@ require "active_record/connection_adapters/postgis/spatial_column"
25
19
  require "active_record/connection_adapters/postgis/arel_tosql"
26
20
  require "active_record/connection_adapters/postgis/setup"
27
21
  require "active_record/connection_adapters/postgis/oid/spatial"
22
+ require "active_record/connection_adapters/postgis/type" # has to be after oid/*
28
23
  require "active_record/connection_adapters/postgis/create_connection"
29
24
  require "active_record/connection_adapters/postgis/postgis_database_tasks"
30
25
 
@@ -103,6 +98,21 @@ module ActiveRecord
103
98
  super
104
99
  end
105
100
  end
101
+
102
+ # PostGIS specific types
103
+ [
104
+ :geography,
105
+ :geometry,
106
+ :geometry_collection,
107
+ :line_string,
108
+ :multi_line_string,
109
+ :multi_point,
110
+ :multi_polygon,
111
+ :st_point,
112
+ :st_polygon,
113
+ ].each do |geo_type|
114
+ ActiveRecord::Type.register(geo_type, PostGIS::OID::Spatial, adapter: :postgis)
115
+ end
106
116
  end
107
117
  end
108
118
  end
@@ -110,7 +120,7 @@ end
110
120
  # if using JRUBY, create ArJdbc::PostGIS module
111
121
  # and prepend it to the PostgreSQL adapter since
112
122
  # it is the default adapter_spec.
113
- # see: https://github.com/jruby/activerecord-jdbc-adapter/blob/60-stable/lib/arjdbc/postgresql/adapter.rb#27
123
+ # see: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/adapter.rb#27
114
124
  if RUBY_ENGINE == "jruby"
115
125
  module ArJdbc
116
126
  module PostGIS
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-postgis-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.3
4
+ version: 7.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Azuma
@@ -17,42 +17,42 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: 6.0.0
20
+ version: '6.1'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: 6.0.0
27
+ version: '6.1'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rgeo-activerecord
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '6.0'
34
+ version: 7.0.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '6.0'
41
+ version: 7.0.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rake
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '13.0'
48
+ version: '12.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '13.0'
55
+ version: '12.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: minitest
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -120,6 +120,7 @@ files:
120
120
  - lib/active_record/connection_adapters/postgis/spatial_column.rb
121
121
  - lib/active_record/connection_adapters/postgis/spatial_column_info.rb
122
122
  - lib/active_record/connection_adapters/postgis/spatial_table_definition.rb
123
+ - lib/active_record/connection_adapters/postgis/type.rb
123
124
  - lib/active_record/connection_adapters/postgis/version.rb
124
125
  - lib/active_record/connection_adapters/postgis_adapter.rb
125
126
  - lib/activerecord-postgis-adapter.rb