activerecord-postgis-adapter 5.2.2 → 6.0.2

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: a6467b540dc2494cfe0add8a78d7d04258c6ae7a64b32ef397d7b58703b961d8
4
- data.tar.gz: 508f828273255798e15451a683d331c7488fb2d0840f92ba5dccb7c7d97f2f9b
3
+ metadata.gz: 6f48bf8a031b980aa3b0f5126c348628f06c5d20c7a12d50b4994bb6b118f718
4
+ data.tar.gz: f5bdbb705028bc67f7bd506038e1017de0ada5b96f529db6761977f03f7ec1d2
5
5
  SHA512:
6
- metadata.gz: 198647715bc7f7ed32b996e1dc5be24019d27c65b3cf3085b1b09d0544052b0f302aff527e58de2e75fd43964365af79044f512ee10575102284f82a489222d0
7
- data.tar.gz: dbe312d6930f13c271a0ee82312e05966e645c7d77edb2dd31643e5277b3de755b35f0d55e7e5704ba56ea47a9d10efbb0e57b7b67e9019bb19366fadd2fd579
6
+ metadata.gz: 91939a84b430809a77548cc34c8c792264306fe55219fa2d7ec2328509db0a3345ecb93a4ae742d94f483444ab6bd579e77f551ffbb86e01bda472b4d248239e
7
+ data.tar.gz: 3f02dfbbea496a28d5a529f59628466cd1e146a7e2de8c39510ae5f172f6cbceff2978e7e34e2b2a1e644c4ae43d4bad100bd004971b84e278d7fc50537ca1f7
@@ -6,43 +6,43 @@ module ActiveRecord
6
6
  module ColumnMethods
7
7
  def spatial(name, options = {})
8
8
  raise "You must set a type. For example: 't.spatial type: :st_point'" unless options[:type]
9
- column(name, options[:type], options)
9
+ column(name, options[:type], **options)
10
10
  end
11
11
 
12
12
  def geography(name, options = {})
13
- column(name, :geography, options)
13
+ column(name, :geography, **options)
14
14
  end
15
15
 
16
16
  def geometry(name, options = {})
17
- column(name, :geometry, options)
17
+ column(name, :geometry, **options)
18
18
  end
19
19
 
20
20
  def geometry_collection(name, options = {})
21
- column(name, :geometry_collection, options)
21
+ column(name, :geometry_collection, **options)
22
22
  end
23
23
 
24
24
  def line_string(name, options = {})
25
- column(name, :line_string, options)
25
+ column(name, :line_string, **options)
26
26
  end
27
27
 
28
28
  def multi_line_string(name, options = {})
29
- column(name, :multi_line_string, options)
29
+ column(name, :multi_line_string, **options)
30
30
  end
31
31
 
32
32
  def multi_point(name, options = {})
33
- column(name, :multi_point, options)
33
+ column(name, :multi_point, **options)
34
34
  end
35
35
 
36
36
  def multi_polygon(name, options = {})
37
- column(name, :multi_polygon, options)
37
+ column(name, :multi_polygon, **options)
38
38
  end
39
39
 
40
40
  def st_point(name, options = {})
41
- column(name, :st_point, options)
41
+ column(name, :st_point, **options)
42
42
  end
43
43
 
44
44
  def st_polygon(name, options = {})
45
- column(name, :st_polygon, options)
45
+ column(name, :st_polygon, **options)
46
46
  end
47
47
  end
48
48
  end
@@ -31,13 +31,18 @@ module ActiveRecord # :nodoc:
31
31
  conn_params[:user] = conn_params.delete(:username) if conn_params[:username]
32
32
  conn_params[:dbname] = conn_params.delete(:database) if conn_params[:database]
33
33
 
34
- # Forward only valid config params to PGconn.connect.
34
+ # Forward only valid config params to PG.connect
35
35
  valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:requiressl]
36
36
  conn_params.slice!(*valid_conn_param_keys)
37
37
 
38
- # The postgres drivers don't allow the creation of an unconnected PGconn object,
39
- # so just pass a nil connection object for the time being.
40
- ConnectionAdapters::PostGISAdapter.new(nil, logger, conn_params, config)
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
41
46
  end
42
47
 
43
48
  end
@@ -6,13 +6,14 @@ namespace :db do
6
6
  task setup: [:load_config] do
7
7
  environments = [Rails.env]
8
8
  environments << "test" if Rails.env.development?
9
- ActiveRecord::Base.configurations
10
- .values_at(*environments)
11
- .compact
12
- .reject { |config| config["database"].blank? }
13
- .each do |config|
14
- ActiveRecord::ConnectionAdapters::PostGIS::PostGISDatabaseTasks.new(config).setup_gis
15
- end
9
+ environments.each do |environment|
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
16
+ end
16
17
  end
17
18
  end
18
19
  end
@@ -5,46 +5,37 @@ module ActiveRecord
5
5
  module PostGIS
6
6
  module SchemaStatements
7
7
  # override
8
- # pass table_name to #new_column
9
- def columns(table_name)
10
- # Limit, precision, and scale are all handled by the superclass.
11
- column_definitions(table_name).map do |column_name, type, default, notnull, oid, fmod, collation, comment|
12
- oid = oid.to_i
13
- fmod = fmod.to_i
14
- type_metadata = fetch_type_metadata(column_name, type, oid, fmod)
15
- cast_type = get_oid_type(oid.to_i, fmod.to_i, column_name, type)
16
- default_value = extract_value_from_default(default)
8
+ # https://github.com/rails/rails/blob/6-0-stable/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L624
9
+ # Create a SpatialColumn instead of a PostgreSQL::Column
10
+ def new_column_from_field(table_name, field)
11
+ column_name, type, default, notnull, oid, fmod, collation, comment = field
12
+ type_metadata = fetch_type_metadata(column_name, type, oid.to_i, fmod.to_i)
13
+ default_value = extract_value_from_default(default)
14
+ default_function = extract_default_function(default_value, default)
17
15
 
18
- default_function = extract_default_function(default_value, default)
19
- new_column(table_name, column_name, default_value, cast_type, type_metadata, !notnull,
20
- default_function, collation, comment)
21
- end
22
- end
23
-
24
- # override
25
- def new_column(table_name, column_name, default, cast_type, sql_type_metadata = nil,
26
- null = true, default_function = nil, collation = nil, comment = nil)
27
- # JDBC gets true/false in Rails 4, where other platforms get 't'/'f' strings.
28
- if null.is_a?(String)
29
- null = (null == "t")
30
- end
16
+ serial =
17
+ if (match = default_function&.match(/\Anextval\('"?(?<sequence_name>.+_(?<suffix>seq\d*))"?'::regclass\)\z/))
18
+ sequence_name_from_parts(table_name, column_name, match[:suffix]) == match[:sequence_name]
19
+ end
31
20
 
32
- column_info = spatial_column_info(table_name).get(column_name, sql_type_metadata.sql_type)
21
+ # {:dimension=>2, :has_m=>false, :has_z=>false, :name=>"latlon", :srid=>0, :type=>"GEOMETRY"}
22
+ spatial = spatial_column_info(table_name).get(column_name, type_metadata.sql_type)
33
23
 
34
- SpatialColumn.new(column_name,
35
- default,
36
- sql_type_metadata,
37
- null,
38
- table_name,
39
- default_function,
40
- collation,
41
- comment,
42
- cast_type,
43
- column_info)
24
+ SpatialColumn.new(
25
+ column_name,
26
+ default_value,
27
+ type_metadata,
28
+ !notnull,
29
+ default_function,
30
+ collation: collation,
31
+ comment: comment.presence,
32
+ serial: serial,
33
+ spatial: spatial
34
+ )
44
35
  end
45
36
 
46
37
  # override
47
- # https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L583
38
+ # https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb#L544
48
39
  #
49
40
  # returns Postgresql sql type string
50
41
  # examples:
@@ -54,12 +45,12 @@ module ActiveRecord
54
45
  # note: type alone is not enough to detect the sql type,
55
46
  # so `limit` is used to pass the additional information. :(
56
47
  #
57
- # type_to_sql(:geography, "Point,4326")
48
+ # type_to_sql(:geography, limit: "Point,4326")
58
49
  # => "geography(Point,4326)"
59
- def type_to_sql(type, options = {})
60
- case type
61
- when :geometry, :geography
62
- "#{type}(#{options[:limit]})"
50
+ def type_to_sql(type, limit: nil, precision: nil, scale: nil, array: nil, **)
51
+ case type.to_s
52
+ when "geometry", "geography"
53
+ "#{type}(#{limit})"
63
54
  else
64
55
  super
65
56
  end
@@ -83,8 +74,8 @@ module ActiveRecord
83
74
  end
84
75
 
85
76
  # override
86
- def create_table_definition(*args)
87
- PostGIS::TableDefinition.new(*args)
77
+ def create_table_definition(*args, **kwargs)
78
+ PostGIS::TableDefinition.new(self, *args, **kwargs)
88
79
  end
89
80
 
90
81
  # memoize hash of column infos for tables
@@ -94,8 +85,6 @@ module ActiveRecord
94
85
  end
95
86
 
96
87
  def initialize_type_map(map = type_map)
97
- super
98
-
99
88
  %w(
100
89
  geography
101
90
  geometry
@@ -111,6 +100,8 @@ module ActiveRecord
111
100
  OID::Spatial.new(oid, sql_type)
112
101
  end
113
102
  end
103
+
104
+ super
114
105
  end
115
106
  end
116
107
  end
@@ -7,19 +7,17 @@ module ActiveRecord # :nodoc:
7
7
  # sql_type examples:
8
8
  # "Geometry(Point,4326)"
9
9
  # "Geography(Point,4326)"
10
- # cast_type example classes:
11
- # OID::Spatial
12
- # OID::Integer
13
- def initialize(name, default, sql_type_metadata = nil, null = true, table_name = nil,
14
- default_function = nil, collation = nil, comment = nil, cast_type = nil, opts = nil)
15
- @cast_type = cast_type
10
+ def initialize(name, default, sql_type_metadata = nil, null = true,
11
+ default_function = nil, collation: nil, comment: nil,
12
+ serial: nil, spatial: nil)
13
+ @sql_type_metadata = sql_type_metadata
16
14
  @geographic = !!(sql_type_metadata.sql_type =~ /geography\(/i)
17
- if opts
15
+ if spatial
18
16
  # This case comes from an entry in the geometry_columns table
19
- set_geometric_type_from_name(opts[:type])
20
- @srid = opts[:srid].to_i
21
- @has_z = !!opts[:has_z]
22
- @has_m = !!opts[:has_m]
17
+ set_geometric_type_from_name(spatial[:type])
18
+ @srid = spatial[:srid].to_i
19
+ @has_z = !!spatial[:has_z]
20
+ @has_m = !!spatial[:has_m]
23
21
  elsif @geographic
24
22
  # Geographic type information is embedded in the SQL type
25
23
  @srid = 4326
@@ -32,7 +30,8 @@ module ActiveRecord # :nodoc:
32
30
  # @geometric_type = geo_type_from_sql_type(sql_type)
33
31
  build_from_sql_type(sql_type_metadata.sql_type)
34
32
  end
35
- super(name, default, sql_type_metadata, null, table_name, default_function, collation, comment: comment)
33
+ super(name, default, sql_type_metadata, null, default_function,
34
+ collation: collation, comment: comment, serial: serial)
36
35
  if spatial?
37
36
  if @srid
38
37
  @limit = { srid: @srid, type: to_type_name(geometric_type) }
@@ -54,15 +53,11 @@ module ActiveRecord # :nodoc:
54
53
  alias :has_m? :has_m
55
54
 
56
55
  def limit
57
- if spatial?
58
- @limit
59
- else
60
- super
61
- end
56
+ spatial? ? @limit : super
62
57
  end
63
58
 
64
59
  def spatial?
65
- @cast_type.respond_to?(:spatial?) && @cast_type.spatial?
60
+ %i[geometry geography].include?(@sql_type_metadata.type)
66
61
  end
67
62
 
68
63
  private
@@ -7,7 +7,7 @@ module ActiveRecord # :nodoc:
7
7
  include ColumnMethods
8
8
 
9
9
  # super: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
10
- def new_column_definition(name, type, options)
10
+ def new_column_definition(name, type, **options)
11
11
  if (info = PostGISAdapter.spatial_column_options(type.to_sym))
12
12
  if (limit = options.delete(:limit))
13
13
  options.merge!(limit) if limit.is_a?(::Hash)
@@ -18,9 +18,9 @@ module ActiveRecord # :nodoc:
18
18
 
19
19
  options[:limit] = ColumnDefinitionUtils.limit_from_options(geo_type, options)
20
20
  options[:spatial_type] = geo_type
21
- column = super(name, base_type, options)
21
+ column = super(name, base_type, **options)
22
22
  else
23
- column = super(name, type, options)
23
+ column = super(name, type, **options)
24
24
  end
25
25
 
26
26
  column
@@ -3,7 +3,7 @@
3
3
  module ActiveRecord
4
4
  module ConnectionAdapters
5
5
  module PostGIS
6
- VERSION = "5.2.2"
6
+ VERSION = "6.0.2"
7
7
  end
8
8
  end
9
9
  end
@@ -38,7 +38,7 @@ end
38
38
  module ActiveRecord
39
39
  module ConnectionAdapters
40
40
  class PostGISAdapter < PostgreSQLAdapter
41
- include PostGIS::SchemaStatements
41
+ ADAPTER_NAME = 'PostGIS'
42
42
 
43
43
  SPATIAL_COLUMN_OPTIONS =
44
44
  {
@@ -57,22 +57,10 @@ module ActiveRecord
57
57
  # http://postgis.17.x6.nabble.com/Default-SRID-td5001115.html
58
58
  DEFAULT_SRID = 0
59
59
 
60
- # def initialize(*args)
61
- def initialize(connection, logger, connection_parameters, config)
62
- super
63
-
64
- @visitor = Arel::Visitors::PostGIS.new(self)
65
- # copy from https://github.com/rails/rails/blob/6ece7df8d80c6d93db43878fa4c0278a0204072c/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb#L199
66
- if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
67
- @prepared_statements = true
68
- @visitor.extend(DetermineIfPreparableVisitor)
69
- else
70
- @prepared_statements = false
71
- end
72
- end
60
+ include PostGIS::SchemaStatements
73
61
 
74
- def adapter_name
75
- "PostGIS"
62
+ def arel_visitor # :nodoc:
63
+ Arel::Visitors::PostGIS.new(self)
76
64
  end
77
65
 
78
66
  def self.spatial_column_options(key)
@@ -108,3 +96,21 @@ module ActiveRecord
108
96
  end
109
97
  end
110
98
  end
99
+
100
+ # if using JRUBY, create ArJdbc::PostGIS module
101
+ # and prepend it to the PostgreSQL adapter since
102
+ # it is the default adapter_spec.
103
+ # see: https://github.com/jruby/activerecord-jdbc-adapter/blob/60-stable/lib/arjdbc/postgresql/adapter.rb#27
104
+ if RUBY_ENGINE == "jruby"
105
+ module ArJdbc
106
+ module PostGIS
107
+ ADAPTER_NAME = 'PostGIS'
108
+
109
+ def adapter_name
110
+ ADAPTER_NAME
111
+ end
112
+ end
113
+ end
114
+
115
+ ArJdbc::PostgreSQL.prepend(ArJdbc::PostGIS)
116
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-postgis-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.2
4
+ version: 6.0.2
5
5
  platform: ruby
6
6
  authors:
7
- - Daniel Azuma, Tee Parham
7
+ - Daniel Azuma
8
+ - Tee Parham
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2018-12-02 00:00:00.000000000 Z
12
+ date: 2021-03-28 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activerecord
@@ -16,14 +17,14 @@ dependencies:
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '5.1'
20
+ version: 6.0.0
20
21
  type: :runtime
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
25
  - - "~>"
25
26
  - !ruby/object:Gem::Version
26
- version: '5.1'
27
+ version: 6.0.0
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: rgeo-activerecord
29
30
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +45,14 @@ dependencies:
44
45
  requirements:
45
46
  - - "~>"
46
47
  - !ruby/object:Gem::Version
47
- version: '12.0'
48
+ version: '13.0'
48
49
  type: :development
49
50
  prerelease: false
50
51
  version_requirements: !ruby/object:Gem::Requirement
51
52
  requirements:
52
53
  - - "~>"
53
54
  - !ruby/object:Gem::Version
54
- version: '12.0'
55
+ version: '13.0'
55
56
  - !ruby/object:Gem::Dependency
56
57
  name: minitest
57
58
  requirement: !ruby/object:Gem::Requirement
@@ -97,7 +98,10 @@ dependencies:
97
98
  description: ActiveRecord connection adapter for PostGIS. It is based on the stock
98
99
  PostgreSQL adapter, and adds built-in support for the spatial extensions provided
99
100
  by PostGIS. It uses the RGeo library to represent spatial data in Ruby.
100
- email: dazuma@gmail.com, parhameter@gmail.com
101
+ email:
102
+ - dazuma@gmail.com
103
+ - parhameter@gmail.com
104
+ - kfdoggett@gmail.com
101
105
  executables: []
102
106
  extensions: []
103
107
  extra_rdoc_files: []
@@ -120,7 +124,7 @@ files:
120
124
  - lib/activerecord-postgis-adapter.rb
121
125
  homepage: http://github.com/rgeo/activerecord-postgis-adapter
122
126
  licenses:
123
- - BSD
127
+ - BSD-3-Clause
124
128
  metadata: {}
125
129
  post_install_message:
126
130
  rdoc_options: []
@@ -130,15 +134,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
134
  requirements:
131
135
  - - ">="
132
136
  - !ruby/object:Gem::Version
133
- version: 2.2.2
137
+ version: 2.5.0
134
138
  required_rubygems_version: !ruby/object:Gem::Requirement
135
139
  requirements:
136
140
  - - ">="
137
141
  - !ruby/object:Gem::Version
138
142
  version: '0'
139
143
  requirements: []
140
- rubyforge_project:
141
- rubygems_version: 2.7.8
144
+ rubygems_version: 3.0.8
142
145
  signing_key:
143
146
  specification_version: 4
144
147
  summary: ActiveRecord adapter for PostGIS, based on RGeo.