postgres_ext 0.0.10 → 0.1.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/Gemfile +8 -0
- data/lib/postgres_ext/active_record/connection_adapters/postgres_adapter.rb +25 -12
- data/lib/postgres_ext/active_record/schema_dumper.rb +3 -3
- data/lib/postgres_ext/version.rb +1 -1
- data/postgres_ext.gemspec +0 -8
- data/spec/migrations/index_spec.rb +2 -2
- data/spec/schema_dumper/extension_spec.rb +1 -1
- data/spec/schema_dumper/index_spec.rb +2 -1
- data/spec/spec_helper.rb +2 -1
- metadata +4 -36
data/Gemfile
CHANGED
@@ -11,6 +11,7 @@ module ActiveRecord
|
|
11
11
|
class PostgreSQLColumn
|
12
12
|
include PgArrayParser
|
13
13
|
attr_accessor :array
|
14
|
+
|
14
15
|
def initialize_with_extended_types(name, default, sql_type = nil, null = true)
|
15
16
|
if sql_type =~ /\[\]$/
|
16
17
|
@array = true
|
@@ -21,6 +22,7 @@ module ActiveRecord
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
alias_method_chain :initialize, :extended_types
|
25
|
+
|
24
26
|
def klass_with_extended_types
|
25
27
|
case type
|
26
28
|
when :inet, :cidr then IPAddr
|
@@ -29,6 +31,7 @@ module ActiveRecord
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
alias_method_chain :klass, :extended_types
|
34
|
+
|
32
35
|
def type_cast_with_extended_types(value)
|
33
36
|
return nil if value.nil?
|
34
37
|
return coder.load(value) if encoded?
|
@@ -47,6 +50,7 @@ module ActiveRecord
|
|
47
50
|
end
|
48
51
|
end
|
49
52
|
alias_method_chain :type_cast, :extended_types
|
53
|
+
|
50
54
|
def string_to_array(value)
|
51
55
|
if Array === value
|
52
56
|
value
|
@@ -119,22 +123,14 @@ module ActiveRecord
|
|
119
123
|
end
|
120
124
|
|
121
125
|
class PostgreSQLAdapter
|
126
|
+
class UnsupportedFeature < Exception; end
|
127
|
+
|
122
128
|
EXTENDED_TYPES = {:inet => {:name => 'inet'}, :cidr => {:name => 'cidr'}, :macaddr => {:name => 'macaddr'}, :uuid => {:name => 'uuid'}}
|
129
|
+
|
123
130
|
class ColumnDefinition < ActiveRecord::ConnectionAdapters::ColumnDefinition
|
124
131
|
attr_accessor :array
|
125
132
|
end
|
126
133
|
|
127
|
-
# Translate from the current database encoding to the encoding we
|
128
|
-
# will force string array components into on retrievial.
|
129
|
-
def encoding_for_ruby
|
130
|
-
@database_encoding ||= case ActiveRecord::Base.connection.encoding
|
131
|
-
when 'UTF8'
|
132
|
-
'UTF-8'
|
133
|
-
else
|
134
|
-
ActiveRecord::Base.connection.encoding
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
134
|
class TableDefinition
|
139
135
|
EXTENDED_TYPES.keys.map(&:to_s).each do |column_type|
|
140
136
|
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
@@ -157,6 +153,7 @@ module ActiveRecord
|
|
157
153
|
end
|
158
154
|
|
159
155
|
private
|
156
|
+
|
160
157
|
def new_column_definition(base, name, type)
|
161
158
|
definition = ColumnDefinition.new base, name, type
|
162
159
|
@columns << definition
|
@@ -192,6 +189,21 @@ module ActiveRecord
|
|
192
189
|
|
193
190
|
NATIVE_DATABASE_TYPES.merge!(EXTENDED_TYPES)
|
194
191
|
|
192
|
+
# Translate from the current database encoding to the encoding we
|
193
|
+
# will force string array components into on retrievial.
|
194
|
+
def encoding_for_ruby
|
195
|
+
@database_encoding ||= case ActiveRecord::Base.connection.encoding
|
196
|
+
when 'UTF8'
|
197
|
+
'UTF-8'
|
198
|
+
else
|
199
|
+
ActiveRecord::Base.connection.encoding
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
def supports_extensions?
|
204
|
+
postgresql_version > 90100
|
205
|
+
end
|
206
|
+
|
195
207
|
def add_column_options!(sql, options)
|
196
208
|
if options[:array] || options[:column].try(:array)
|
197
209
|
sql << '[]'
|
@@ -210,7 +222,8 @@ module ActiveRecord
|
|
210
222
|
end
|
211
223
|
|
212
224
|
def add_extension(extension_name, options={})
|
213
|
-
|
225
|
+
raise UnsupportedFeature.new('Extensions are not support by this version of PostgreSQL') unless supports_extensions?
|
226
|
+
execute "CREATE extension IF NOT EXISTS \"#{extension_name}\""
|
214
227
|
end
|
215
228
|
|
216
229
|
def change_table(table_name, options = {})
|
@@ -10,7 +10,7 @@ module ActiveRecord
|
|
10
10
|
def dump(stream)
|
11
11
|
header(stream)
|
12
12
|
# added
|
13
|
-
extensions(stream)
|
13
|
+
extensions(stream) if @connection.supports_extensions?
|
14
14
|
# /added
|
15
15
|
tables(stream)
|
16
16
|
trailer(stream)
|
@@ -20,7 +20,7 @@ module ActiveRecord
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def extensions(stream)
|
23
|
-
exts
|
23
|
+
exts = @connection.extensions
|
24
24
|
|
25
25
|
unless exts.empty?
|
26
26
|
stream.puts exts.map { |name| " add_extension \"#{name}\""}.join("\n") + "\n\n"
|
@@ -119,7 +119,7 @@ module ActiveRecord
|
|
119
119
|
# changed from rails 2.3
|
120
120
|
statement_parts << (':where => ' + index.where.inspect) if index.where
|
121
121
|
statement_parts << (':index_type => ' + index.index_type.inspect) if index.index_type
|
122
|
-
statement_parts << (':index_opclass => ' + index.index_opclass.inspect) if index.index_opclass
|
122
|
+
statement_parts << (':index_opclass => ' + index.index_opclass.inspect) if index.index_opclass.present?
|
123
123
|
# /changed
|
124
124
|
|
125
125
|
' ' + statement_parts.join(', ')
|
data/lib/postgres_ext/version.rb
CHANGED
data/postgres_ext.gemspec
CHANGED
@@ -26,12 +26,4 @@ Gem::Specification.new do |gem|
|
|
26
26
|
else
|
27
27
|
gem.add_development_dependency 'pg', '~> 0.13.2'
|
28
28
|
end
|
29
|
-
unless ENV['CI']
|
30
|
-
if RUBY_PLATFORM =~ /java/
|
31
|
-
gem.add_development_dependency 'ruby-debug'
|
32
|
-
elsif RUBY_VERSION == '1.9.3'
|
33
|
-
gem.add_development_dependency 'debugger', '~> 1.1.2'
|
34
|
-
end
|
35
|
-
end
|
36
|
-
gem.add_development_dependency 'fivemat'
|
37
29
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe '
|
3
|
+
describe 'Index migrations' do
|
4
4
|
let!(:connection) { ActiveRecord::Base.connection }
|
5
5
|
|
6
6
|
before do
|
@@ -35,7 +35,7 @@ describe 'index migrations' do
|
|
35
35
|
index_2.where.should match /col2 > 50/
|
36
36
|
end
|
37
37
|
|
38
|
-
it 'creates indexes with operator classes' do
|
38
|
+
it 'creates indexes with operator classes', :if => ActiveRecord::Base.connection.supports_extensions? do
|
39
39
|
lambda do
|
40
40
|
connection.add_index(:index_types, :col3, :index_type => :gin, :index_opclass => :gin_trgm_ops)
|
41
41
|
end.should_not raise_exception
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe 'extension schema dump' do
|
3
|
+
describe 'extension schema dump', :if => ActiveRecord::Base.connection.supports_extensions? do
|
4
4
|
let!(:connection) { ActiveRecord::Base.connection }
|
5
5
|
it 'correctly creates and exports database extensions' do
|
6
6
|
stream = StringIO.new
|
@@ -22,6 +22,7 @@ describe 'Index schema dumper' do
|
|
22
22
|
|
23
23
|
output.should match /:index_type => :gin/
|
24
24
|
output.should_not match /:index_type => :btree/
|
25
|
+
output.should_not match /:index_opclass =>/
|
25
26
|
end
|
26
27
|
|
27
28
|
it 'handles index where clauses' do
|
@@ -34,7 +35,7 @@ describe 'Index schema dumper' do
|
|
34
35
|
output.should match /:where => "\(col2 > 50\)"/
|
35
36
|
end
|
36
37
|
|
37
|
-
it 'dumps index operator classes' do
|
38
|
+
it 'dumps index operator classes', :if => ActiveRecord::Base.connection.supports_extensions? do
|
38
39
|
connection.add_index(:index_types, :col3, :index_type => :gin, :index_opclass => :gin_trgm_ops)
|
39
40
|
|
40
41
|
stream = StringIO.new
|
data/spec/spec_helper.rb
CHANGED
@@ -12,9 +12,10 @@ ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
|
|
12
12
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
13
13
|
# in spec/support/ and its subdirectories.
|
14
14
|
Dir[File.join(ENGINE_RAILS_ROOT, 'spec/support/**/*.rb')].each { |f| require f }
|
15
|
+
require 'postgres_ext'
|
15
16
|
|
16
17
|
RSpec.configure do |config|
|
17
|
-
config.before(:suite) { ActiveRecord::Base.connection.add_extension('pg_trgm') }
|
18
|
+
config.before(:suite) { ActiveRecord::Base.connection.add_extension('pg_trgm') if ActiveRecord::Base.connection.supports_extensions?}
|
18
19
|
config.use_transactional_fixtures = false
|
19
20
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
20
21
|
config.mock_with :mocha
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postgres_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -107,38 +107,6 @@ dependencies:
|
|
107
107
|
- - ~>
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: 0.13.2
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: debugger
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ~>
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 1.1.2
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ~>
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: 1.1.2
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: fivemat
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: '0'
|
134
|
-
type: :development
|
135
|
-
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ! '>='
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: '0'
|
142
110
|
description: Adds missing native PostgreSQL data types to ActiveRecord
|
143
111
|
email:
|
144
112
|
- git@danmcclain.net
|
@@ -256,7 +224,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
256
224
|
version: '0'
|
257
225
|
segments:
|
258
226
|
- 0
|
259
|
-
hash:
|
227
|
+
hash: -3677858070850987585
|
260
228
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
261
229
|
none: false
|
262
230
|
requirements:
|
@@ -265,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
265
233
|
version: '0'
|
266
234
|
segments:
|
267
235
|
- 0
|
268
|
-
hash:
|
236
|
+
hash: -3677858070850987585
|
269
237
|
requirements: []
|
270
238
|
rubyforge_project:
|
271
239
|
rubygems_version: 1.8.23
|