rgeo-activerecord 0.2.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.
data/History.rdoc ADDED
@@ -0,0 +1,6 @@
1
+ === 0.2.0 / 2010-12-07
2
+
3
+ * Initial public alpha release. Spun rgeo-activerecord off from the core rgeo gem.
4
+ * Support for setting factory by column.
5
+
6
+ For earlier history, see the History file for the rgeo gem.
data/README.rdoc ADDED
@@ -0,0 +1,89 @@
1
+ == RGeo::ActiveRecord
2
+
3
+ RGeo::ActiveRecord is an optional {RGeo}[http://github.com/dazuma/rgeo]
4
+ module providing spatial extensions for \ActiveRecord, as well as a set
5
+ of helpers for writing spatial \ActiveRecord adapters based on \RGeo.
6
+
7
+ === Summary
8
+
9
+ \RGeo is a key component for writing location-aware applications in the
10
+ Ruby programming language. At its core is an implementation of the
11
+ industry standard OGC Simple Features Specification, which provides data
12
+ representations of geometric objects such as points, lines, and polygons,
13
+ along with a set of geometric analysis operations. See the README for the
14
+ "rgeo" gem for more information.
15
+
16
+ RGeo::ActiveRecord is an optional \RGeo add-on module providing spatial
17
+ extensions for \ActiveRecord, as well as a set of helpers for writing
18
+ spatial \ActiveRecord adapters based on \RGeo.
19
+
20
+ === Installation
21
+
22
+ RGeo::ActiveRecord has the following requirements:
23
+
24
+ * Ruby 1.8.7 or later. Ruby 1.9.2 or later preferred.
25
+ * \RGeo 0.2.0 or later.
26
+ * \ActiveRecord 3.0.3 or later. Earlier versions will not work.
27
+
28
+ Generally, \ActiveRecord adapters which depend on this module should be
29
+ installed as gems, and they will install this module automatically as
30
+ a dependency. However, you can also install it manually as a gem:
31
+
32
+ gem install rgeo
33
+ gem install rgeo-activerecord
34
+
35
+ See the README for the "rgeo" gem, a required dependency, for further
36
+ installation information.
37
+
38
+ === To-do list
39
+
40
+ * We want to investigate writing some Arel extensions for constructing
41
+ spatial queries.
42
+
43
+ === Development and support
44
+
45
+ Documentation is available at http://virtuoso.rubyforge.org/rgeo-activerecord/README_rdoc.html
46
+
47
+ Source code is hosted on Github at http://github.com/dazuma/rgeo-activerecord
48
+
49
+ Contributions are welcome. Fork the project on Github.
50
+
51
+ Report bugs on Github issues at http://github.org/dazuma/rgeo-activerecord/issues
52
+
53
+ Contact the author at dazuma at gmail dot com.
54
+
55
+ === Acknowledgments
56
+
57
+ \RGeo is written by Daniel Azuma (http://www.daniel-azuma.com).
58
+
59
+ Development of \RGeo is sponsored by GeoPage, Inc. (http://www.geopage.com).
60
+
61
+ === License
62
+
63
+ Copyright 2010 Daniel Azuma
64
+
65
+ All rights reserved.
66
+
67
+ Redistribution and use in source and binary forms, with or without
68
+ modification, are permitted provided that the following conditions are met:
69
+
70
+ * Redistributions of source code must retain the above copyright notice,
71
+ this list of conditions and the following disclaimer.
72
+ * Redistributions in binary form must reproduce the above copyright notice,
73
+ this list of conditions and the following disclaimer in the documentation
74
+ and/or other materials provided with the distribution.
75
+ * Neither the name of the copyright holder, nor the names of any other
76
+ contributors to this software, may be used to endorse or promote products
77
+ derived from this software without specific prior written permission.
78
+
79
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
80
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
81
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
82
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
83
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
84
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
85
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
86
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
87
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
88
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
89
+ POSSIBILITY OF SUCH DAMAGE.
data/Version ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,66 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # ActiveRecord extensions for RGeo
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ # Dependencies
38
+ require 'rgeo'
39
+ require 'active_record'
40
+
41
+
42
+ # RGeo is a spatial data library for Ruby, provided by the "rgeo" gem.
43
+ #
44
+ # The optional RGeo::ActiveRecord module provides spatial extensions for
45
+ # ActiveRecord, and a set of tools and helpers for writing RGeo-based
46
+ # spatial connection adapters.
47
+
48
+ module RGeo
49
+
50
+
51
+ # This module contains a set of ActiveRecord extensions for RGeo.
52
+ # Generally, you will not need to interact with the contents of this
53
+ # module directly, unless you are writing a spatial ActiveRecord
54
+ # connection adapter.
55
+
56
+ module ActiveRecord
57
+ end
58
+
59
+
60
+ end
61
+
62
+
63
+ # Implementation files
64
+ require 'rgeo/active_record/common.rb'
65
+ require 'rgeo/active_record/arel_modifications'
66
+ require 'rgeo/active_record/ar_modifications'
@@ -0,0 +1,147 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Helper methods for ActiveRecord adapter tests
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ require 'rgeo/active_record'
38
+ require 'yaml'
39
+ require 'logger'
40
+
41
+
42
+ module RGeo
43
+ module ActiveRecord
44
+
45
+
46
+ # A helper module for creating unit tests for adapters.
47
+
48
+ module AdapterTestHelper
49
+
50
+ @class_num = 0
51
+
52
+
53
+ # When this module is included in a test case class, it
54
+ # automatically attempts to load the database config file from the
55
+ # path specified by the class's DATABASE_CONFIG_FILE constant.
56
+ # It then defines the DATABASE_CONFIG and DEFAULT_AR_CLASS constants
57
+ # in the testcase class.
58
+ #
59
+ # When you define your test methods, you should wrap them in a call
60
+ # to the class method define_test_methods. This will cause them to
61
+ # be defined conditionally based on whether the database config is
62
+ # present.
63
+
64
+ def self.included(klass_)
65
+ database_config_ = ::YAML.load_file(klass_.const_get(:DATABASE_CONFIG_PATH)) rescue nil
66
+ if database_config_
67
+ database_config_.symbolize_keys!
68
+ if klass_.respond_to?(:before_open_database)
69
+ klass_.before_open_database(:config => database_config_)
70
+ end
71
+ klass_.const_set(:DATABASE_CONFIG, database_config_)
72
+ ar_class_ = AdapterTestHelper.new_class(database_config_)
73
+ klass_.const_set(:DEFAULT_AR_CLASS, ar_class_)
74
+ if klass_.respond_to?(:initialize_database)
75
+ klass_.initialize_database(:ar_class => ar_class_, :connection => ar_class_.connection)
76
+ end
77
+ def klass_.define_test_methods
78
+ yield
79
+ end
80
+ else
81
+ def klass_.define_test_methods
82
+ def test_warning
83
+ puts "WARNING: Couldn't find database.yml; skipping tests."
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+
90
+ def self.new_class(param_) # :nodoc:
91
+ base_ = param_.kind_of?(::Class) ? param_ : ::ActiveRecord::Base
92
+ config_ = param_.kind_of?(::Hash) ? param_ : nil
93
+ klass_ = ::Class.new(base_)
94
+ @class_num += 1
95
+ self.const_set("Klass#{@class_num}".to_sym, klass_)
96
+ klass_.class_eval do
97
+ establish_connection(config_) if config_
98
+ set_table_name(:spatial_test)
99
+ end
100
+ klass_
101
+ end
102
+
103
+
104
+ # Default setup method that calls cleanup_tables.
105
+ # It also defines a couple of useful factories: @factory (a
106
+ # cartesian factory) and @geographic_factory (a spherical factory)
107
+
108
+ def setup
109
+ @factory = ::RGeo::Cartesian.preferred_factory(:srid => 4326)
110
+ @geographic_factory = ::RGeo::Geographic.spherical_factory(:srid => 4326)
111
+ cleanup_tables
112
+ end
113
+
114
+
115
+ # Default teardown method that calls cleanup_tables.
116
+
117
+ def teardown
118
+ cleanup_tables
119
+ end
120
+
121
+
122
+ # Utility method that attempts to clean up any table that was
123
+ # created by a test method. Normally called automatically at setup
124
+ # and teardown. If you override those methods, you'll need to call
125
+ # this from your method.
126
+
127
+ def cleanup_tables
128
+ klass_ = self.class.const_get(:DEFAULT_AR_CLASS)
129
+ if klass_.connection.tables.include?('spatial_test')
130
+ klass_.connection.drop_table(:spatial_test)
131
+ end
132
+ end
133
+
134
+
135
+ # Utility method that creates and returns a new ActiveRecord class
136
+ # subclassing the DEFAULT_AR_CLASS.
137
+
138
+ def create_ar_class(opts_={})
139
+ @ar_class = AdapterTestHelper.new_class(self.class.const_get(:DEFAULT_AR_CLASS))
140
+ end
141
+
142
+
143
+ end
144
+
145
+
146
+ end
147
+ end
@@ -0,0 +1,149 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Mysqlgeo adapter for ActiveRecord
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ require 'active_record'
38
+
39
+
40
+ # RGeo extensions to ActiveRecord are installed when one of the spatial
41
+ # connection adapters is needed. These modifications require ActiveRecord
42
+ # 3.0.3 or later.
43
+
44
+ module ActiveRecord
45
+
46
+
47
+ # RGeo extends ActiveRecord::Base to include the following new class
48
+ # attributes. These attributes are inherited by subclasses, and can
49
+ # be overridden in subclasses.
50
+ #
51
+ # === ActiveRecord::Base::rgeo_factory_generator
52
+ #
53
+ # The value of this attribute is a RGeo::Feature::FactoryGenerator
54
+ # that is used to generate the proper factory when loading geometry
55
+ # objects from the database. For example, if the data being loaded
56
+ # has M but not Z coordinates, and an embedded SRID, then this
57
+ # FactoryGenerator is called with the appropriate configuration to
58
+ # obtain a factory with those properties. This factory is the one
59
+ # associated with the actual geometry properties of the ActiveRecord
60
+ # object. The result of this generator can be overridden by setting
61
+ # an explicit factory for a given class and column using the
62
+ # column_rgeo_factory method.
63
+
64
+ class Base
65
+
66
+
67
+ self.attribute_types_cached_by_default << :geometry
68
+
69
+
70
+ class_attribute :rgeo_factory_generator, :instance_writer => false
71
+ self.rgeo_factory_generator = nil
72
+
73
+
74
+ class << self
75
+
76
+
77
+ # This is a convenient way to set the rgeo_factory_generator by
78
+ # passing a block.
79
+
80
+ def to_generate_rgeo_factory(&block_)
81
+ self.rgeo_factory_generator = block_
82
+ end
83
+
84
+
85
+ # Set a specific factory for this ActiveRecord class and the given
86
+ # column name. This setting, if present, overrides the result of the
87
+ # rgeo_factory_generator.
88
+
89
+ def set_rgeo_factory_for_column(column_, factory_)
90
+ @rgeo_factory_for_column = {} unless defined?(@rgeo_factory_for_column)
91
+ @rgeo_factory_for_column[column_.to_sym] = factory_
92
+ end
93
+
94
+
95
+ # Returns the factory generator or specific factory to use for this
96
+ # ActiveRecord class and the given column name.
97
+ # If an explicit factory was set for the given column, returns it.
98
+ # Otherwise, if a params hash is given, passes that has to the
99
+ # rgeo_factory_generator for this class, and returns the resulting
100
+ # factory. Otherwise, if no params hash is given, just returns the
101
+ # rgeo_factory_generator for this class.
102
+
103
+ def rgeo_factory_for_column(column_, params_=nil)
104
+ @rgeo_factory_for_column = {} unless defined?(@rgeo_factory_for_column)
105
+ result_ = @rgeo_factory_for_column[column_.to_sym] || rgeo_factory_generator || ::RGeo::ActiveRecord::DEFAULT_FACTORY_GENERATOR
106
+ if params_ && !result_.kind_of?(::RGeo::Feature::Factory::Instance)
107
+ result_ = result_.call(params_)
108
+ end
109
+ result_
110
+ end
111
+
112
+
113
+ # :stopdoc:
114
+ alias_method :columns_without_rgeo_modification, :columns
115
+ def columns
116
+ unless defined?(@columns) && @columns
117
+ columns_without_rgeo_modification.each do |column_|
118
+ column_.set_ar_class(self) if column_.respond_to?(:set_ar_class)
119
+ end
120
+ end
121
+ @columns
122
+ end
123
+ # :startdoc:
124
+
125
+ end
126
+
127
+ end
128
+
129
+
130
+ module ConnectionAdapters # :nodoc:
131
+
132
+ class TableDefinition # :nodoc:
133
+
134
+ ::RGeo::ActiveRecord::GEOMETRY_TYPES.each do |type_|
135
+ method_ = <<-END_METHOD
136
+ def #{type_}(*args_)
137
+ opts_ = args_.extract_options!
138
+ args_.each{ |name_| column(name_, '#{type_}', opts_) }
139
+ end
140
+ END_METHOD
141
+ class_eval(method_, __FILE__, __LINE__-5)
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+
149
+ end
@@ -0,0 +1,73 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Mysqlgeo adapter for ActiveRecord
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ require 'arel'
38
+
39
+
40
+ # :stopdoc:
41
+
42
+ module Arel
43
+
44
+ module Attributes
45
+
46
+ class Geometry < Attribute; end
47
+
48
+ class << self
49
+ alias_method :for_without_geometry, :for
50
+ def for(column_)
51
+ column_.type == :geometry ? Geometry : for_without_geometry(column_)
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ module Visitors
58
+
59
+ class Dot
60
+ alias :visit_Arel_Attributes_Geometry :visit_Arel_Attribute
61
+ alias :visit_RGeo_Feature_Geometry :visit_String
62
+ end
63
+
64
+ class ToSql
65
+ alias :visit_Arel_Attributes_Geometry :visit_Arel_Attributes_Attribute
66
+ alias :visit_RGeo_Feature_Geometry :visit_String
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ # :startdoc:
@@ -0,0 +1,84 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Common tools for spatial adapters for ActiveRecord
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ module RGeo
38
+
39
+ module ActiveRecord
40
+
41
+
42
+ # Additional column types for geometries.
43
+ GEOMETRY_TYPES = [:geometry, :point, :line_string, :polygon, :geometry_collection, :multi_line_string, :multi_point, :multi_polygon].freeze
44
+
45
+ # The default factory generator for ActiveRecord::Base.
46
+ DEFAULT_FACTORY_GENERATOR = ::Proc.new do |config_|
47
+ if config_.delete(:geographic)
48
+ ::RGeo::Geographic.spherical_factory(config_)
49
+ else
50
+ ::RGeo::Cartesian.preferred_factory(config_)
51
+ end
52
+ end
53
+
54
+
55
+ # Index definition struct with a spatial flag field.
56
+
57
+ class SpatialIndexDefinition < ::Struct.new(:table, :name, :unique, :columns, :lengths, :spatial)
58
+ end
59
+
60
+
61
+ class << self
62
+
63
+
64
+ # Returns a feature type module given a string type.
65
+
66
+ def geometric_type_from_name(name_)
67
+ case name_.downcase
68
+ when 'geometry' then ::RGeo::Feature::Geometry
69
+ when 'point' then ::RGeo::Feature::Point
70
+ when 'linestring' then ::RGeo::Feature::LineString
71
+ when 'polygon' then ::RGeo::Feature::Polygon
72
+ when 'geometrycollection' then ::RGeo::Feature::GeometryCollection
73
+ when 'multipoint' then ::RGeo::Feature::MultiPoint
74
+ when 'multilinestring' then ::RGeo::Feature::MultiLineString
75
+ when 'multipolygon' then ::RGeo::Feature::MultiPolygon
76
+ else nil
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+ end
83
+
84
+ end
data/test/tc_basic.rb ADDED
@@ -0,0 +1,90 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Tests for basic ActiveRecord extensions
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ require 'test/unit'
38
+ require 'rgeo/active_record'
39
+
40
+
41
+ module RGeo
42
+ module ActiveRecord
43
+ module Tests # :nodoc:
44
+
45
+ class TestBasic < ::Test::Unit::TestCase # :nodoc:
46
+
47
+
48
+ def test_default_factory_generator
49
+ ::ActiveRecord::Base.rgeo_factory_generator = nil
50
+ factory_ = ::ActiveRecord::Base.rgeo_factory_for_column(:hello).call(:has_z_coordinate => true, :srid => 4326)
51
+ assert_equal(true, factory_.property(:has_z_coordinate))
52
+ assert_equal(true, factory_.property(:is_cartesian))
53
+ assert_nil(factory_.property(:is_geographic))
54
+ assert_equal(4326, factory_.srid)
55
+ end
56
+
57
+
58
+ def test_set_factory_generator
59
+ ::ActiveRecord::Base.rgeo_factory_generator = ::RGeo::Geographic.method(:spherical_factory)
60
+ factory_ = ::ActiveRecord::Base.rgeo_factory_for_column(:hello, :has_z_coordinate => true, :srid => 4326)
61
+ assert_equal(true, factory_.property(:has_z_coordinate))
62
+ assert_equal(true, factory_.property(:is_geographic))
63
+ assert_nil(factory_.property(:is_cartesian))
64
+ assert_equal(false, factory_.has_projection?)
65
+ assert_equal(4326, factory_.srid)
66
+ end
67
+
68
+
69
+ def test_specific_factory_for_column
70
+ ::ActiveRecord::Base.rgeo_factory_generator = nil
71
+ ::ActiveRecord::Base.set_rgeo_factory_for_column(:foo, ::RGeo::Geographic.simple_mercator_factory(:has_z_coordinate => true))
72
+ factory_ = ::ActiveRecord::Base.rgeo_factory_for_column(:foo)
73
+ assert_equal(true, factory_.property(:has_z_coordinate))
74
+ assert_equal(true, factory_.property(:is_geographic))
75
+ assert_nil(factory_.property(:is_cartesian))
76
+ assert_equal(true, factory_.has_projection?)
77
+ assert_equal(4326, factory_.srid)
78
+ end
79
+
80
+
81
+ def test_geometry_types
82
+ [:geometry, :point, :line_string, :polygon, :geometry_collection, :multi_line_string, :multi_point, :multi_polygon].each{ |type_| assert(::RGeo::ActiveRecord::GEOMETRY_TYPES.include?(type_), "Type #{type_.inspect} not found" ) }
83
+ end
84
+
85
+
86
+ end
87
+
88
+ end
89
+ end
90
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rgeo-activerecord
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
10
+ platform: ruby
11
+ authors:
12
+ - Daniel Azuma
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-07 00:00:00 -08:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rgeo
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ - 2
31
+ - 0
32
+ version: 0.2.0
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activerecord
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 3
45
+ - 0
46
+ - 3
47
+ version: 3.0.3
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ description: RGeo is a geospatial data library for Ruby. RGeo::ActiveRecord is an optional RGeo module providing some spatial extensions to ActiveRecord, as well as common tools used by RGeo-based spatial adapters.
51
+ email: dazuma@gmail.com
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files:
57
+ - History.rdoc
58
+ - README.rdoc
59
+ files:
60
+ - lib/rgeo/active_record/adapter_test_helper.rb
61
+ - lib/rgeo/active_record/ar_modifications.rb
62
+ - lib/rgeo/active_record/arel_modifications.rb
63
+ - lib/rgeo/active_record/common.rb
64
+ - lib/rgeo/active_record.rb
65
+ - History.rdoc
66
+ - README.rdoc
67
+ - test/tc_basic.rb
68
+ - Version
69
+ has_rdoc: true
70
+ homepage: http://virtuoso.rubyforge.org/rgeo-activerecord
71
+ licenses: []
72
+
73
+ post_install_message:
74
+ rdoc_options: []
75
+
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ segments:
84
+ - 1
85
+ - 8
86
+ - 7
87
+ version: 1.8.7
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ requirements: []
97
+
98
+ rubyforge_project: virtuoso
99
+ rubygems_version: 1.3.7
100
+ signing_key:
101
+ specification_version: 3
102
+ summary: An RGeo module providing spatial extensions to ActiveRecord.
103
+ test_files:
104
+ - test/tc_basic.rb