activerecord-spatial 1.0.0 → 2.0.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1670 -0
- data/Gemfile +12 -13
- data/Guardfile +7 -10
- data/MIT-LICENSE +1 -1
- data/README.rdoc +8 -19
- data/Rakefile +2 -1
- data/activerecord-spatial.gemspec +12 -13
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions/active_record.rb +46 -0
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions.rb +7 -38
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/postgis.rb +6 -7
- data/lib/activerecord-spatial/active_record/connection_adapters/postgresql/unknown_srid.rb +4 -5
- data/lib/activerecord-spatial/active_record/models/geography_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/geometry_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/spatial_column.rb +1 -2
- data/lib/activerecord-spatial/active_record/models/spatial_ref_sys.rb +5 -6
- data/lib/activerecord-spatial/active_record.rb +0 -1
- data/lib/activerecord-spatial/associations/active_record.rb +62 -120
- data/lib/activerecord-spatial/associations/base.rb +26 -75
- data/lib/activerecord-spatial/associations/preloader/spatial_association.rb +57 -0
- data/lib/activerecord-spatial/associations/reflection/spatial_reflection.rb +41 -0
- data/lib/activerecord-spatial/associations.rb +26 -4
- data/lib/activerecord-spatial/spatial_columns.rb +85 -94
- data/lib/activerecord-spatial/spatial_function.rb +62 -51
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_2_0.rb +48 -0
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_2_2.rb +46 -0
- data/lib/activerecord-spatial/spatial_scope_constants/postgis_legacy.rb +30 -0
- data/lib/activerecord-spatial/spatial_scope_constants.rb +10 -61
- data/lib/activerecord-spatial/spatial_scopes.rb +47 -49
- data/lib/activerecord-spatial/version.rb +1 -2
- data/lib/activerecord-spatial.rb +2 -6
- data/lib/tasks/test.rake +21 -19
- data/test/.rubocop.yml +35 -0
- data/test/accessors_geographies_tests.rb +19 -19
- data/test/accessors_geometries_tests.rb +19 -19
- data/test/adapter_tests.rb +1 -2
- data/test/associations_tests.rb +181 -203
- data/test/geography_column_tests.rb +2 -3
- data/test/geometry_column_tests.rb +1 -2
- data/test/models/bar.rb +2 -3
- data/test/models/blort.rb +1 -2
- data/test/models/foo.rb +2 -3
- data/test/models/foo3d.rb +2 -3
- data/test/models/foo_geography.rb +2 -3
- data/test/models/zortable.rb +2 -3
- data/test/spatial_function_tests.rb +12 -17
- data/test/spatial_scopes_geographies_tests.rb +17 -20
- data/test/spatial_scopes_tests.rb +84 -75
- data/test/test_helper.rb +66 -79
- metadata +16 -14
- data/lib/activerecord-spatial/associations/active_record_3.rb +0 -123
    
        data/test/test_helper.rb
    CHANGED
    
    | @@ -4,16 +4,19 @@ require 'simplecov' | |
| 4 4 | 
             
            SimpleCov.command_name('Unit Tests')
         | 
| 5 5 | 
             
            SimpleCov.start do
         | 
| 6 6 | 
             
              add_filter '/test/'
         | 
| 7 | 
            +
              add_filter '/.bundle/'
         | 
| 7 8 | 
             
            end
         | 
| 8 9 |  | 
| 9 10 | 
             
            require 'rubygems'
         | 
| 10 11 | 
             
            require 'minitest/autorun'
         | 
| 11 12 | 
             
            require 'minitest/reporters'
         | 
| 13 | 
            +
            require 'rails'
         | 
| 12 14 | 
             
            require 'active_support'
         | 
| 13 15 | 
             
            require 'active_support/core_ext/module/aliasing'
         | 
| 14 16 | 
             
            require 'active_support/dependencies'
         | 
| 15 17 | 
             
            require 'active_record'
         | 
| 16 18 | 
             
            require 'active_record/fixtures'
         | 
| 19 | 
            +
            require 'active_record/test_case'
         | 
| 17 20 | 
             
            require 'logger'
         | 
| 18 21 |  | 
| 19 22 | 
             
            require File.join(File.dirname(__FILE__), %w{ .. lib activerecord-spatial })
         | 
| @@ -22,11 +25,11 @@ POSTGIS_PATHS = [ | |
| 22 25 | 
             
              ENV['POSTGIS_PATH'],
         | 
| 23 26 | 
             
              '/opt/local/share/postgresql*/contrib/postgis-*',
         | 
| 24 27 | 
             
              '/usr/share/postgresql*/contrib/postgis-*',
         | 
| 25 | 
            -
              '/usr/pgsql-*/share/contrib/postgis-*' | 
| 28 | 
            +
              '/usr/pgsql-*/share/contrib/postgis-*'
         | 
| 26 29 | 
             
            ].compact
         | 
| 27 30 |  | 
| 28 31 | 
             
            puts "ActiveRecordSpatial #{ActiveRecordSpatial::VERSION}"
         | 
| 29 | 
            -
            puts "ActiveRecord #{Gem.loaded_specs['activerecord'].version | 
| 32 | 
            +
            puts "ActiveRecord #{Gem.loaded_specs['activerecord'].version}"
         | 
| 30 33 | 
             
            puts "Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} - #{RbConfig::CONFIG['RUBY_INSTALL_NAME']}"
         | 
| 31 34 | 
             
            puts "Geos library #{Geos::VERSION}" if defined?(Geos::VERSION)
         | 
| 32 35 | 
             
            puts "GEOS #{Geos::GEOS_VERSION}"
         | 
| @@ -35,7 +38,8 @@ if defined?(Geos::FFIGeos) | |
| 35 38 | 
             
              puts "Using #{Geos::FFIGeos.geos_library_paths.join(', ')}"
         | 
| 36 39 | 
             
            end
         | 
| 37 40 |  | 
| 38 | 
            -
             | 
| 41 | 
            +
            ActiveSupport::TestCase.test_order = :random
         | 
| 42 | 
            +
            ActiveRecord::Base.logger = Logger.new('debug.log') if ENV['ENABLE_LOGGER']
         | 
| 39 43 | 
             
            ActiveRecord::Base.configurations = {
         | 
| 40 44 | 
             
              'arunit' => {}
         | 
| 41 45 | 
             
            }
         | 
| @@ -46,9 +50,9 @@ ActiveRecord::Base.configurations = { | |
| 46 50 | 
             
            }.each do |file|
         | 
| 47 51 | 
             
              file = File.join('test', file)
         | 
| 48 52 |  | 
| 49 | 
            -
              next unless File. | 
| 53 | 
            +
              next unless File.exist?(file)
         | 
| 50 54 |  | 
| 51 | 
            -
              configuration = YAML. | 
| 55 | 
            +
              configuration = YAML.safe_load(File.read(file))
         | 
| 52 56 |  | 
| 53 57 | 
             
              if configuration['arunit']
         | 
| 54 58 | 
             
                ActiveRecord::Base.configurations['arunit'].merge!(configuration['arunit'])
         | 
| @@ -59,17 +63,21 @@ ActiveRecord::Base.configurations = { | |
| 59 63 | 
             
              end
         | 
| 60 64 | 
             
            end
         | 
| 61 65 |  | 
| 62 | 
            -
            ActiveRecord::Base.establish_connection  | 
| 66 | 
            +
            ActiveRecord::Base.establish_connection :arunit
         | 
| 63 67 | 
             
            ARBC = ActiveRecord::Base.connection
         | 
| 64 68 |  | 
| 65 | 
            -
             | 
| 69 | 
            +
            postgresql_version = ARBC.select_rows('SELECT version()').first.first
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            if postgresql_version.present?
         | 
| 66 72 | 
             
              puts "PostgreSQL info from version(): #{postgresql_version}"
         | 
| 67 73 | 
             
            end
         | 
| 68 74 |  | 
| 69 | 
            -
            puts  | 
| 75 | 
            +
            puts 'Checking for PostGIS install'
         | 
| 70 76 | 
             
            2.times do
         | 
| 71 77 | 
             
              begin
         | 
| 72 | 
            -
                 | 
| 78 | 
            +
                postgis_version = ActiveRecordSpatial::POSTGIS[:lib]
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                if postgis_version.present?
         | 
| 73 81 | 
             
                  puts "PostGIS info from postgis_full_version(): #{postgis_version}"
         | 
| 74 82 | 
             
                  break
         | 
| 75 83 | 
             
                end
         | 
| @@ -77,9 +85,7 @@ puts "Checking for PostGIS install" | |
| 77 85 | 
             
                puts "Trying to install PostGIS. If this doesn't work, you'll have to do this manually!"
         | 
| 78 86 |  | 
| 79 87 | 
             
                plpgsql = ARBC.select_rows(%{SELECT count(*) FROM pg_language WHERE lanname = 'plpgsql'}).first.first.to_i
         | 
| 80 | 
            -
                 | 
| 81 | 
            -
                  ARBC.execute(%{CREATE LANGUAGE plpgsql})
         | 
| 82 | 
            -
                end
         | 
| 88 | 
            +
                ARBC.execute(%{CREATE LANGUAGE plpgsql}) if plpgsql.zero?
         | 
| 83 89 |  | 
| 84 90 | 
             
                %w{
         | 
| 85 91 | 
             
                  postgis.sql
         | 
| @@ -105,35 +111,39 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase | |
| 105 111 |  | 
| 106 112 | 
             
              REGEXP_WKB_HEX = /[A-Fa-f0-9\s]+/
         | 
| 107 113 |  | 
| 108 | 
            -
              POINT_WKT = 'POINT(10 10.01)'
         | 
| 109 | 
            -
              POINT_EWKT = 'SRID=4326; POINT(10 10.01)'
         | 
| 110 | 
            -
              POINT_EWKT_WITH_DEFAULT = 'SRID=default; POINT(10 10.01)'
         | 
| 111 | 
            -
              POINT_WKB =  | 
| 112 | 
            -
              POINT_WKB_BIN = "\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40"
         | 
| 113 | 
            -
              POINT_EWKB =  | 
| 114 | 
            -
              POINT_EWKB_BIN = "\x01\x01\x00\x00\x20\xE6\x10\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40"
         | 
| 115 | 
            -
              POINT_G_LAT_LNG =  | 
| 116 | 
            -
              POINT_G_LAT_LNG_URL_VALUE =  | 
| 117 | 
            -
             | 
| 118 | 
            -
              POLYGON_WKT = 'POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'
         | 
| 119 | 
            -
              POLYGON_EWKT = 'SRID=4326; POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'
         | 
| 120 | 
            -
             | 
| 114 | 
            +
              POINT_WKT = 'POINT(10 10.01)'.freeze
         | 
| 115 | 
            +
              POINT_EWKT = 'SRID=4326; POINT(10 10.01)'.freeze
         | 
| 116 | 
            +
              POINT_EWKT_WITH_DEFAULT = 'SRID=default; POINT(10 10.01)'.freeze
         | 
| 117 | 
            +
              POINT_WKB = '0101000000000000000000244085EB51B81E052440'.freeze
         | 
| 118 | 
            +
              POINT_WKB_BIN = "\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40".freeze
         | 
| 119 | 
            +
              POINT_EWKB = '0101000020E6100000000000000000244085EB51B81E052440'.freeze
         | 
| 120 | 
            +
              POINT_EWKB_BIN = "\x01\x01\x00\x00\x20\xE6\x10\x00\x00\x00\x00\x00\x00\x00\x00\x24\x40\x85\xEB\x51\xB8\x1E\x05\x24\x40".freeze
         | 
| 121 | 
            +
              POINT_G_LAT_LNG = '(10.01, 10)'.freeze
         | 
| 122 | 
            +
              POINT_G_LAT_LNG_URL_VALUE = '10.01,10'.freeze
         | 
| 123 | 
            +
             | 
| 124 | 
            +
              POLYGON_WKT = 'POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'.freeze
         | 
| 125 | 
            +
              POLYGON_EWKT = 'SRID=4326; POLYGON((0 0, 1 1, 2.5 2.5, 5 5, 0 0))'.freeze
         | 
| 126 | 
            +
             | 
| 127 | 
            +
              POLYGON_WKB = '
         | 
| 121 128 | 
             
                0103000000010000000500000000000000000000000000000000000000000000000000F
         | 
| 122 129 | 
             
                03F000000000000F03F0000000000000440000000000000044000000000000014400000
         | 
| 123 130 | 
             
                00000000144000000000000000000000000000000000
         | 
| 124 | 
            -
               | 
| 131 | 
            +
              '.gsub(/\s/, '').freeze
         | 
| 132 | 
            +
             | 
| 125 133 | 
             
              POLYGON_WKB_BIN = [
         | 
| 126 134 | 
             
                "\x01\x03\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00",
         | 
| 127 135 | 
             
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xF0\x3F\x00",
         | 
| 128 136 | 
             
                "\x00\x00\x00\x00\x00\xF0\x3F\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00",
         | 
| 129 137 | 
             
                "\x00\x00\x04\x40\x00\x00\x00\x00\x00\x00\x14\x40\x00\x00\x00\x00\x00\x00\x14",
         | 
| 130 138 | 
             
                "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
         | 
| 131 | 
            -
              ].join
         | 
| 132 | 
            -
             | 
| 139 | 
            +
              ].join.freeze
         | 
| 140 | 
            +
             | 
| 141 | 
            +
              POLYGON_EWKB = '
         | 
| 133 142 | 
             
                0103000020E610000001000000050000000000000000000000000000000000000000000
         | 
| 134 143 | 
             
                0000000F03F000000000000F03F00000000000004400000000000000440000000000000
         | 
| 135 144 | 
             
                1440000000000000144000000000000000000000000000000000
         | 
| 136 | 
            -
               | 
| 145 | 
            +
              '.gsub(/\s/, '').freeze
         | 
| 146 | 
            +
             | 
| 137 147 | 
             
              POLYGON_EWKB_BIN = [
         | 
| 138 148 | 
             
                "\x01\x03\x00\x00\x20\xE6\x10\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00",
         | 
| 139 149 | 
             
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
         | 
| @@ -141,11 +151,11 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase | |
| 141 151 | 
             
                "\x00\x00\x00\x00\x04\x40\x00\x00\x00\x00\x00\x00\x04\x40\x00\x00\x00",
         | 
| 142 152 | 
             
                "\x00\x00\x00\x14\x40\x00\x00\x00\x00\x00\x00\x14\x40\x00\x00\x00\x00",
         | 
| 143 153 | 
             
                "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
         | 
| 144 | 
            -
              ].join
         | 
| 154 | 
            +
              ].join.freeze
         | 
| 145 155 |  | 
| 146 | 
            -
              POLYGON_WITH_INTERIOR_RING =  | 
| 156 | 
            +
              POLYGON_WITH_INTERIOR_RING = 'POLYGON((0 0, 5 0, 5 5, 0 5, 0 0),(4 4, 4 1, 1 1, 1 4, 4 4))'.freeze
         | 
| 147 157 |  | 
| 148 | 
            -
              LINESTRING_WKT =  | 
| 158 | 
            +
              LINESTRING_WKT = 'LINESTRING (0 0, 5 5, 5 10, 10 10)'.freeze
         | 
| 149 159 |  | 
| 150 160 | 
             
              GEOMETRYCOLLECTION_WKT = 'GEOMETRYCOLLECTION (
         | 
| 151 161 | 
             
                MULTIPOLYGON (
         | 
| @@ -161,20 +171,23 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase | |
| 161 171 | 
             
                LINESTRING (0 0, 2 3),
         | 
| 162 172 | 
             
                MULTIPOINT ((0 0), (2 3)),
         | 
| 163 173 | 
             
                POINT (9 0)
         | 
| 164 | 
            -
              )'
         | 
| 174 | 
            +
              )'.freeze
         | 
| 165 175 |  | 
| 166 | 
            -
              BOUNDS_G_LAT_LNG =  | 
| 167 | 
            -
              BOUNDS_G_LAT_LNG_URL_VALUE = '0.1,0.1,5.2,5.2'
         | 
| 176 | 
            +
              BOUNDS_G_LAT_LNG = '((0.1, 0.1), (5.2, 5.2))'.freeze
         | 
| 177 | 
            +
              BOUNDS_G_LAT_LNG_URL_VALUE = '0.1,0.1,5.2,5.2'.freeze
         | 
| 168 178 |  | 
| 169 179 | 
             
              class << self
         | 
| 170 180 | 
             
                def load_models(*args)
         | 
| 171 | 
            -
                   | 
| 181 | 
            +
                  self.fixture_table_names = args.collect do |arg|
         | 
| 182 | 
            +
                    arg.to_s.pluralize
         | 
| 183 | 
            +
                  end
         | 
| 172 184 |  | 
| 173 185 | 
             
                  args.each do |model|
         | 
| 174 186 | 
             
                    model = model.to_s
         | 
| 175 187 | 
             
                    klass = model.classify
         | 
| 188 | 
            +
                    fixtures model.tableize
         | 
| 176 189 |  | 
| 177 | 
            -
                    ActiveSupport::Dependencies.load_file(BASE_PATH.join("models/#{model}.rb"), [ | 
| 190 | 
            +
                    ActiveSupport::Dependencies.load_file(BASE_PATH.join("models/#{model}.rb"), [klass])
         | 
| 178 191 | 
             
                  end
         | 
| 179 192 | 
             
                end
         | 
| 180 193 |  | 
| @@ -195,12 +208,16 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase | |
| 195 208 | 
             
                def after_suite
         | 
| 196 209 | 
             
                  ActiveSupport::Dependencies.clear
         | 
| 197 210 | 
             
                end
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                def table_exists?(table)
         | 
| 213 | 
            +
                  ARBC.data_source_exists?(table)
         | 
| 214 | 
            +
                end
         | 
| 198 215 | 
             
              end
         | 
| 199 216 |  | 
| 200 217 | 
             
              def setup
         | 
| 201 | 
            -
                 | 
| 202 | 
            -
             | 
| 203 | 
            -
                 | 
| 218 | 
            +
                return unless ActiveRecord::Base.logger
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                ActiveRecord::Base.logger.debug("Beginning tests for #{self.class.name}##{method_name}")
         | 
| 204 221 | 
             
              end
         | 
| 205 222 |  | 
| 206 223 | 
             
              def assert_saneness_of_point(point)
         | 
| @@ -213,49 +230,20 @@ class ActiveRecordSpatialTestCase < ActiveRecord::TestCase | |
| 213 230 | 
             
                assert_kind_of(Geos::Polygon, polygon)
         | 
| 214 231 | 
             
                cs = polygon.exterior_ring.coord_seq
         | 
| 215 232 | 
             
                assert_equal([
         | 
| 216 | 
            -
                  [ | 
| 217 | 
            -
                  [ | 
| 218 | 
            -
                  [ | 
| 219 | 
            -
                  [ | 
| 220 | 
            -
                  [ | 
| 233 | 
            +
                  [0, 0],
         | 
| 234 | 
            +
                  [1, 1],
         | 
| 235 | 
            +
                  [2.5, 2.5],
         | 
| 236 | 
            +
                  [5, 5],
         | 
| 237 | 
            +
                  [0, 0]
         | 
| 221 238 | 
             
                ], cs.to_a)
         | 
| 222 239 | 
             
              end
         | 
| 223 | 
            -
            end
         | 
| 224 | 
            -
             | 
| 225 | 
            -
            if !defined?(ActiveRecord::SQLCounter)
         | 
| 226 | 
            -
              module ActiveRecord
         | 
| 227 | 
            -
                class SQLCounter
         | 
| 228 | 
            -
                  cattr_accessor :ignored_sql
         | 
| 229 | 
            -
                  self.ignored_sql = [
         | 
| 230 | 
            -
                    /^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/,
         | 
| 231 | 
            -
                    /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/,
         | 
| 232 | 
            -
                    /^SHOW max_identifier_length/, /^BEGIN/, /^COMMIT/, /^ROLLBACK/, /\WFROM pg_/
         | 
| 233 | 
            -
                  ]
         | 
| 234 | 
            -
             | 
| 235 | 
            -
                  cattr_accessor :log
         | 
| 236 | 
            -
                  self.log = []
         | 
| 237 | 
            -
             | 
| 238 | 
            -
                  attr_reader :ignore
         | 
| 239 | 
            -
             | 
| 240 | 
            -
                  def initialize(ignore = self.class.ignored_sql)
         | 
| 241 | 
            -
                    @ignore   = ignore
         | 
| 242 | 
            -
                  end
         | 
| 243 | 
            -
             | 
| 244 | 
            -
                  def call(name, start, finish, message_id, values)
         | 
| 245 | 
            -
                    sql = values[:sql]
         | 
| 246 | 
            -
             | 
| 247 | 
            -
                    # FIXME: this seems bad. we should probably have a better way to indicate
         | 
| 248 | 
            -
                    # the query was cached
         | 
| 249 | 
            -
                    return if 'CACHE' == values[:name] || ignore.any? { |x| x =~ sql }
         | 
| 250 | 
            -
                    self.class.log << sql
         | 
| 251 | 
            -
                  end
         | 
| 252 | 
            -
                end
         | 
| 253 240 |  | 
| 254 | 
            -
             | 
| 241 | 
            +
              def reflection_key(key)
         | 
| 242 | 
            +
                key.to_s
         | 
| 255 243 | 
             
              end
         | 
| 256 244 | 
             
            end
         | 
| 257 245 |  | 
| 258 | 
            -
            class SpatialTestRunner <  | 
| 246 | 
            +
            class SpatialTestRunner < Minitest::Reporters::SpecReporter
         | 
| 259 247 | 
             
              def before_suite(suite)
         | 
| 260 248 | 
             
                super(suite)
         | 
| 261 249 | 
             
                suite.before_suite if suite.respond_to?(:before_suite)
         | 
| @@ -267,5 +255,4 @@ class SpatialTestRunner < MiniTest::Reporters::SpecReporter | |
| 267 255 | 
             
              end
         | 
| 268 256 | 
             
            end
         | 
| 269 257 |  | 
| 270 | 
            -
             | 
| 271 | 
            -
             | 
| 258 | 
            +
            Minitest::Reporters.use!(SpatialTestRunner.new)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: activerecord-spatial
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 2.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - J Smith
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2017-03-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         | 
| @@ -16,34 +16,28 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - ">="
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: ' | 
| 20 | 
            -
                - - "!="
         | 
| 21 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 22 | 
            -
                    version: 4.0.0
         | 
| 19 | 
            +
                    version: '5.0'
         | 
| 23 20 | 
             
              type: :runtime
         | 
| 24 21 | 
             
              prerelease: false
         | 
| 25 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 26 23 | 
             
                requirements:
         | 
| 27 24 | 
             
                - - ">="
         | 
| 28 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            -
                    version: ' | 
| 30 | 
            -
                - - "!="
         | 
| 31 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            -
                    version: 4.0.0
         | 
| 26 | 
            +
                    version: '5.0'
         | 
| 33 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 34 28 | 
             
              name: geos-extensions
         | 
| 35 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 36 30 | 
             
                requirements:
         | 
| 37 31 | 
             
                - - ">="
         | 
| 38 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 39 | 
            -
                    version: 0. | 
| 33 | 
            +
                    version: '0.5'
         | 
| 40 34 | 
             
              type: :runtime
         | 
| 41 35 | 
             
              prerelease: false
         | 
| 42 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 43 37 | 
             
                requirements:
         | 
| 44 38 | 
             
                - - ">="
         | 
| 45 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 46 | 
            -
                    version: 0. | 
| 40 | 
            +
                    version: '0.5'
         | 
| 47 41 | 
             
            description: ActiveRecord Spatial gives AR the ability to work with PostGIS columns.
         | 
| 48 42 | 
             
            email: dark.panda@gmail.com
         | 
| 49 43 | 
             
            executables: []
         | 
| @@ -52,6 +46,7 @@ extra_rdoc_files: | |
| 52 46 | 
             
            - README.rdoc
         | 
| 53 47 | 
             
            files:
         | 
| 54 48 | 
             
            - ".gitignore"
         | 
| 49 | 
            +
            - ".rubocop.yml"
         | 
| 55 50 | 
             
            - Gemfile
         | 
| 56 51 | 
             
            - Guardfile
         | 
| 57 52 | 
             
            - MIT-LICENSE
         | 
| @@ -61,6 +56,7 @@ files: | |
| 61 56 | 
             
            - lib/activerecord-spatial.rb
         | 
| 62 57 | 
             
            - lib/activerecord-spatial/active_record.rb
         | 
| 63 58 | 
             
            - lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions.rb
         | 
| 59 | 
            +
            - lib/activerecord-spatial/active_record/connection_adapters/postgresql/adapter_extensions/active_record.rb
         | 
| 64 60 | 
             
            - lib/activerecord-spatial/active_record/connection_adapters/postgresql/postgis.rb
         | 
| 65 61 | 
             
            - lib/activerecord-spatial/active_record/connection_adapters/postgresql/unknown_srid.rb
         | 
| 66 62 | 
             
            - lib/activerecord-spatial/active_record/models/geography_column.rb
         | 
| @@ -69,14 +65,19 @@ files: | |
| 69 65 | 
             
            - lib/activerecord-spatial/active_record/models/spatial_ref_sys.rb
         | 
| 70 66 | 
             
            - lib/activerecord-spatial/associations.rb
         | 
| 71 67 | 
             
            - lib/activerecord-spatial/associations/active_record.rb
         | 
| 72 | 
            -
            - lib/activerecord-spatial/associations/active_record_3.rb
         | 
| 73 68 | 
             
            - lib/activerecord-spatial/associations/base.rb
         | 
| 69 | 
            +
            - lib/activerecord-spatial/associations/preloader/spatial_association.rb
         | 
| 70 | 
            +
            - lib/activerecord-spatial/associations/reflection/spatial_reflection.rb
         | 
| 74 71 | 
             
            - lib/activerecord-spatial/spatial_columns.rb
         | 
| 75 72 | 
             
            - lib/activerecord-spatial/spatial_function.rb
         | 
| 76 73 | 
             
            - lib/activerecord-spatial/spatial_scope_constants.rb
         | 
| 74 | 
            +
            - lib/activerecord-spatial/spatial_scope_constants/postgis_2_0.rb
         | 
| 75 | 
            +
            - lib/activerecord-spatial/spatial_scope_constants/postgis_2_2.rb
         | 
| 76 | 
            +
            - lib/activerecord-spatial/spatial_scope_constants/postgis_legacy.rb
         | 
| 77 77 | 
             
            - lib/activerecord-spatial/spatial_scopes.rb
         | 
| 78 78 | 
             
            - lib/activerecord-spatial/version.rb
         | 
| 79 79 | 
             
            - lib/tasks/test.rake
         | 
| 80 | 
            +
            - test/.rubocop.yml
         | 
| 80 81 | 
             
            - test/accessors_geographies_tests.rb
         | 
| 81 82 | 
             
            - test/accessors_geometries_tests.rb
         | 
| 82 83 | 
             
            - test/adapter_tests.rb
         | 
| @@ -120,11 +121,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 120 121 | 
             
                  version: '0'
         | 
| 121 122 | 
             
            requirements: []
         | 
| 122 123 | 
             
            rubyforge_project: 
         | 
| 123 | 
            -
            rubygems_version: 2. | 
| 124 | 
            +
            rubygems_version: 2.6.11
         | 
| 124 125 | 
             
            signing_key: 
         | 
| 125 126 | 
             
            specification_version: 4
         | 
| 126 127 | 
             
            summary: ActiveRecord Spatial gives AR the ability to work with PostGIS columns.
         | 
| 127 128 | 
             
            test_files:
         | 
| 129 | 
            +
            - test/.rubocop.yml
         | 
| 128 130 | 
             
            - test/accessors_geographies_tests.rb
         | 
| 129 131 | 
             
            - test/accessors_geometries_tests.rb
         | 
| 130 132 | 
             
            - test/adapter_tests.rb
         | 
| @@ -1,123 +0,0 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
            module ActiveRecord
         | 
| 3 | 
            -
              module Associations
         | 
| 4 | 
            -
                class Builder::Spatial < Builder::HasMany #:nodoc:
         | 
| 5 | 
            -
                  self.macro = SPATIAL_MACRO
         | 
| 6 | 
            -
                  self.valid_options += VALID_SPATIAL_OPTIONS
         | 
| 7 | 
            -
                  self.valid_options -= INVALID_SPATIAL_OPTIONS
         | 
| 8 | 
            -
                end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                class Preloader #:nodoc:
         | 
| 11 | 
            -
                  class SpatialAssociation < HasMany #:nodoc:
         | 
| 12 | 
            -
                    def records_for(ids)
         | 
| 13 | 
            -
                      table_name = reflection.quoted_table_name
         | 
| 14 | 
            -
                      join_name = model.quoted_table_name
         | 
| 15 | 
            -
                      column = %{#{SPATIAL_JOIN_QUOTED_NAME}.#{model.quoted_primary_key}}
         | 
| 16 | 
            -
                      geom = {
         | 
| 17 | 
            -
                        :class => model,
         | 
| 18 | 
            -
                        :table_alias => SPATIAL_JOIN_NAME
         | 
| 19 | 
            -
                      }
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                      if reflection.options[:geom].is_a?(Hash)
         | 
| 22 | 
            -
                        geom.merge!(reflection.options[:geom])
         | 
| 23 | 
            -
                      else
         | 
| 24 | 
            -
                        geom[:column] = reflection.options[:geom]
         | 
| 25 | 
            -
                      end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                      scoped.
         | 
| 28 | 
            -
                        select(%{array_to_string(array_agg(#{column}), ',') AS "#{SPATIAL_FIELD_ALIAS}"}).
         | 
| 29 | 
            -
                        joins(
         | 
| 30 | 
            -
                          "INNER JOIN #{join_name} AS #{SPATIAL_JOIN_QUOTED_NAME} ON (" <<
         | 
| 31 | 
            -
                            klass.send("st_#{reflection.options[:relationship]}",
         | 
| 32 | 
            -
                              geom,
         | 
| 33 | 
            -
                              (reflection.options[:scope_options] || {}).merge(
         | 
| 34 | 
            -
                                :column => reflection.options[:foreign_geom]
         | 
| 35 | 
            -
                              )
         | 
| 36 | 
            -
                            ).where_values.join(' AND ') <<
         | 
| 37 | 
            -
                          ")"
         | 
| 38 | 
            -
                        ).
         | 
| 39 | 
            -
                        where(model.arel_table.alias(SPATIAL_JOIN_NAME)[model.primary_key].in(ids)).
         | 
| 40 | 
            -
                        group(table[klass.primary_key])
         | 
| 41 | 
            -
                    end
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
                end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                class AssociationScope #:nodoc:
         | 
| 46 | 
            -
                  def add_constraints_with_spatial(scope)
         | 
| 47 | 
            -
                    return add_constraints_without_spatial(scope) if !self.association.is_a?(SpatialAssociation)
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                    tables = construct_tables
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                    chain.each_with_index do |reflection, i|
         | 
| 52 | 
            -
                      table, foreign_table = tables.shift, tables.first
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                      conditions = self.conditions[i]
         | 
| 55 | 
            -
                      geom_options = {
         | 
| 56 | 
            -
                        :class => self.association.klass
         | 
| 57 | 
            -
                      }
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                      if self.association.geom.is_a?(Hash)
         | 
| 60 | 
            -
                        geom_options.merge!(
         | 
| 61 | 
            -
                          :value => owner[self.association.geom[:name]]
         | 
| 62 | 
            -
                        )
         | 
| 63 | 
            -
                        geom_options.merge!(self.association.geom)
         | 
| 64 | 
            -
                      else
         | 
| 65 | 
            -
                        geom_options.merge!(
         | 
| 66 | 
            -
                          :value => owner[self.association.geom],
         | 
| 67 | 
            -
                          :name => self.association.geom
         | 
| 68 | 
            -
                        )
         | 
| 69 | 
            -
                      end
         | 
| 70 | 
            -
             | 
| 71 | 
            -
                      if reflection == chain.last
         | 
| 72 | 
            -
                        scope = scope.send("st_#{self.association.relationship}", geom_options, self.association.scope_options)
         | 
| 73 | 
            -
             | 
| 74 | 
            -
                        if reflection.type
         | 
| 75 | 
            -
                          scope = scope.where(table[reflection.type].eq(owner.class.base_class.name))
         | 
| 76 | 
            -
                        end
         | 
| 77 | 
            -
             | 
| 78 | 
            -
                        conditions.each do |condition|
         | 
| 79 | 
            -
                          scope = scope.where(interpolate(condition))
         | 
| 80 | 
            -
                        end
         | 
| 81 | 
            -
                      else
         | 
| 82 | 
            -
                        constraint = scope.where(
         | 
| 83 | 
            -
                          scope.send(
         | 
| 84 | 
            -
                            "st_#{self.association.relationship}",
         | 
| 85 | 
            -
                            owner[self.association.foreign_geom],
         | 
| 86 | 
            -
                            self.association.scope_options
         | 
| 87 | 
            -
                          ).where_values
         | 
| 88 | 
            -
                        ).join(' AND ')
         | 
| 89 | 
            -
             | 
| 90 | 
            -
                        if reflection.type
         | 
| 91 | 
            -
                          type = chain[i + 1].klass.base_class.name
         | 
| 92 | 
            -
                          constraint = table[reflection.type].eq(type).and(constraint)
         | 
| 93 | 
            -
                        end
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                        scope = scope.joins(join(foreign_table, constraint))
         | 
| 96 | 
            -
             | 
| 97 | 
            -
                        unless conditions.empty?
         | 
| 98 | 
            -
                          scope = scope.where(sanitize(conditions, table))
         | 
| 99 | 
            -
                        end
         | 
| 100 | 
            -
                      end
         | 
| 101 | 
            -
                    end
         | 
| 102 | 
            -
             | 
| 103 | 
            -
                    scope
         | 
| 104 | 
            -
                  end
         | 
| 105 | 
            -
                  alias_method_chain :add_constraints, :spatial
         | 
| 106 | 
            -
                end
         | 
| 107 | 
            -
              end
         | 
| 108 | 
            -
            end
         | 
| 109 | 
            -
             | 
| 110 | 
            -
            module ActiveRecordSpatial::Associations
         | 
| 111 | 
            -
              module ClassMethods #:nodoc:
         | 
| 112 | 
            -
                def has_many_spatially(name, options = {}, &extension)
         | 
| 113 | 
            -
                  options = build_options(options)
         | 
| 114 | 
            -
             | 
| 115 | 
            -
                  if !ActiveRecordSpatial::SpatialScopeConstants::RELATIONSHIPS.include?(options[:relationship].to_s)
         | 
| 116 | 
            -
                    raise ArgumentError.new(%{Invalid spatial relationship "#{options[:relationship]}", expected one of #{ActiveRecordSpatial::SpatialScopeConstants::RELATIONSHIPS.inspect}})
         | 
| 117 | 
            -
                  end
         | 
| 118 | 
            -
             | 
| 119 | 
            -
                  ActiveRecord::Associations::Builder::Spatial.build(self, name, options, &extension)
         | 
| 120 | 
            -
                end
         | 
| 121 | 
            -
              end
         | 
| 122 | 
            -
            end
         | 
| 123 | 
            -
             |