postgres_ext 0.4.0 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e8eff00c75c70dcf28c108a470e187fb6c62d01
4
- data.tar.gz: 41af271c607addeee1883185aa52602f37227767
3
+ metadata.gz: 04e9453088f60586e98a2f2213afe6e64c075aa7
4
+ data.tar.gz: 25d1bf9062740090514152e513cc684b4e42a582
5
5
  SHA512:
6
- metadata.gz: 17fa65379b957864bb359d6ccccd85672422361b6f5126c78f113d8c05ea0c39595fa790d991c3d79d6778b1ce790f133fdb65458f9da8f99f395c2f5fe19bdf
7
- data.tar.gz: 80a96500066d32ac9547f5960b3bced0a27a47a20a3c233f7a4c0d78ae06b7febd03be367b901b9ef62747d3f6258da5839ff9ed5d464c8055c6b7a9fe122c1c
6
+ metadata.gz: 22a8dd126361df619dbd44c45ecaf645ef90f8eb5b23c08b5b4252a2faad6a1d92ec490c7c705645f273c9a8c08ba4154714d466967baed2a0203d1f06868d59
7
+ data.tar.gz: 45f1d420e3dcb6a3cf295fe60cabcdf35a40dbc8239d50832f4b9c2d5e54adcfa6db0aced323b397a0f7a017251fbcd7d8ddc6d22890cdb1a13c8befb158334f
data/README.md CHANGED
@@ -8,15 +8,11 @@ Adds support for missing PostgreSQL data types to ActiveRecord.
8
8
  ## Looking for help? ##
9
9
 
10
10
  If it is a bug [please open an issue on
11
- Github](https://github.com/dockyard/party_foul/issues). If you need help using
11
+ Github](https://github.com/dockyard/postgres_ext/issues). If you need help using
12
12
  the gem please ask the question on
13
13
  [Stack Overflow](http://stackoverflow.com). Be sure to tag the
14
14
  question with `DockYard` so we can find it.
15
15
 
16
- ## Note ##
17
- PostgresExt is dropping support for Ruby 1.8.7 with the next minor
18
- release.
19
-
20
16
  ## Installation
21
17
 
22
18
  Add this line to your application's Gemfile:
@@ -84,7 +80,6 @@ supported in postgres\_ext at this time.
84
80
 
85
81
 
86
82
 
87
-
88
83
  ## Authors
89
84
 
90
85
  Dan McClain [twitter](http://twitter.com/_danmcclain) [github](http://github.com/danmcclain)
@@ -30,7 +30,7 @@ would be:
30
30
  User.where.overlap(:nick_names => ['Bob', 'Fred'])
31
31
  ```
32
32
 
33
- Postgres\_ext defines `array_overlap`, an [Arel](https://github.com/rails/arel)
33
+ Postgres\_ext defines `overlap`, an [Arel](https://github.com/rails/arel)
34
34
  predicate for the `&&` operator. This is utilized by the `where.overlap`
35
35
  call above.
36
36
 
@@ -38,7 +38,7 @@ call above.
38
38
  user_arel = User.arel_table
39
39
 
40
40
  # Execute the query
41
- User.where(user_arel[:tags].array_overlap(['one','two']))
41
+ User.where(user_arel[:tags].overlap(['one','two']))
42
42
  # => SELECT \"users\".* FROM \"users\" WHERE \"users\".\"tags\" && '{one,two}'
43
43
  ```
44
44
 
@@ -62,15 +62,15 @@ adding a `contains` method. To make a contains query, you can do:
62
62
  User.where.contains(:nick_names => ['Bob', 'Fred'])
63
63
  ```
64
64
 
65
- Postgres\_ext defines `array_contains`, an [Arel](https://github.com/rails/arel)
66
- predicate for the `@>` operator. This is utilized by the
67
- `where.array_contains` call above.
65
+ Postgres\_ext overrides `contains`, an [Arel](https://github.com/rails/arel)
66
+ predicate, to use the `@>` operator for arrays. This is utilized by the
67
+ `where.contains` call above.
68
68
 
69
69
  ```ruby
70
70
  user_arel = User.arel_table
71
71
 
72
72
  # Execute the query
73
- User.where(user_arel[:tags].array_contains(['one','two']))
73
+ User.where(user_arel[:tags].contains(['one','two']))
74
74
  # => SELECT "users".* FROM "users" WHERE "users"."tags" @> '{"one","two"}'
75
75
  ```
76
76
 
@@ -59,11 +59,7 @@ module ActiveRecord
59
59
  value
60
60
  else
61
61
  string_array = parse_pg_array value
62
- if type == :string || type == :text
63
- force_character_encoding(string_array)
64
- else
65
- type_cast_array(string_array)
66
- end
62
+ type_cast_array(string_array)
67
63
  end
68
64
  end
69
65
 
@@ -178,12 +174,6 @@ module ActiveRecord
178
174
 
179
175
  private
180
176
 
181
- def force_character_encoding(string_array)
182
- string_array.map do |item|
183
- item.respond_to?(:force_encoding) ? item.force_encoding(ActiveRecord::Base.connection.encoding_for_ruby) : item
184
- end
185
- end
186
-
187
177
  def simplified_type_with_extended_types(field_type)
188
178
  case field_type
189
179
  when 'uuid'
@@ -287,19 +277,6 @@ module ActiveRecord
287
277
 
288
278
  NATIVE_DATABASE_TYPES.merge!(EXTENDED_TYPES)
289
279
 
290
- # Translate from the current database encoding to the encoding we
291
- # will force string array components into on retrievial.
292
- def encoding_for_ruby
293
- @database_encoding ||= case ActiveRecord::Base.connection.encoding
294
- when 'UTF8'
295
- 'UTF-8'
296
- when 'SQL_ASCII'
297
- 'ASCII'
298
- else
299
- ActiveRecord::Base.connection.encoding
300
- end
301
- end
302
-
303
280
  def supports_extensions?
304
281
  postgresql_version > 90100
305
282
  end
@@ -485,7 +462,11 @@ module ActiveRecord
485
462
  clear_cache!
486
463
  quoted_table_name = quote_table_name(table_name)
487
464
 
488
- execute "ALTER TABLE #{quoted_table_name} ALTER COLUMN #{quote_column_name(column_name)} TYPE #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}[]"
465
+ if type.to_s =~ /string|text/
466
+ execute "ALTER TABLE #{quoted_table_name} ALTER COLUMN #{quote_column_name(column_name)} TYPE #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}[] USING string_to_array(#{quote_column_name(column_name)}, ',')"
467
+ else
468
+ execute "ALTER TABLE #{quoted_table_name} ALTER COLUMN #{quote_column_name(column_name)} TYPE #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}[]"
469
+ end
489
470
 
490
471
  change_column_default(table_name, column_name, options[:default]) if options_include_default?(options)
491
472
  change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
@@ -1,3 +1,3 @@
1
1
  module PostgresExt
2
- VERSION = '0.4.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -7,6 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.description = %q{Adds missing native PostgreSQL data types to ActiveRecord}
8
8
  gem.summary = %q{Extends ActiveRecord to handle native PostgreSQL data types}
9
9
  gem.homepage = ""
10
+ gem.licenses = ['MIT']
10
11
 
11
12
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
13
  gem.files = `git ls-files`.split("\n")
@@ -16,7 +17,7 @@ Gem::Specification.new do |gem|
16
17
  gem.version = PostgresExt::VERSION
17
18
 
18
19
  gem.add_dependency 'activerecord', '~> 3.2.0'
19
- gem.add_dependency 'pg_array_parser', '~> 0.0.8'
20
+ gem.add_dependency 'pg_array_parser', '~> 0.0.9'
20
21
 
21
22
  gem.add_development_dependency 'rails', '~> 3.2.0'
22
23
  gem.add_development_dependency 'rspec-rails', '~> 2.12.0'
@@ -83,22 +83,80 @@ describe 'Array migrations' do
83
83
  end
84
84
 
85
85
  context 'Change Column' do
86
- after { connection.drop_table :data_types }
87
- it 'updates the column definitions' do
88
- lambda do
89
- connection.create_table :data_types do |t|
90
- t.integer :array_1, :array => true, :default => []
86
+ describe 'Change with column existing as array' do
87
+ after { connection.drop_table :data_types }
88
+ it 'updates the column definitions' do
89
+ lambda do
90
+ connection.create_table :data_types do |t|
91
+ t.integer :array_1, :array => true, :default => []
92
+ end
93
+
94
+ connection.change_column :data_types, :array_1, :integer, :array => true, :default => [], :null => false
95
+ end.should_not raise_exception
96
+
97
+ columns = connection.columns(:data_types)
98
+
99
+ array_1 = columns.detect { |c| c.name == 'array_1'}
100
+ array_1.sql_type.should eq 'integer[]'
101
+ array_1.default.should eq []
102
+ array_1.null.should be_false
103
+ end
104
+ end
105
+
106
+ describe 'Change string column to array' do
107
+ after { connection.drop_table :data_types }
108
+ it 'updates the column definitions' do
109
+ lambda do
110
+ connection.create_table :data_types do |t|
111
+ t.string :string_1
112
+ end
113
+
114
+ connection.exec_query "INSERT INTO data_types (string_1) VALUES ('some,values,here')"
115
+ connection.change_column :data_types, :string_1, :string, :array => true, :default => [], :null => false
116
+ end.should_not raise_exception
117
+
118
+ columns = connection.columns(:data_types)
119
+
120
+ string_1 = columns.detect { |c| c.name == 'string_1'}
121
+ string_1.sql_type.should eq 'character varying(255)[]'
122
+ string_1.default.should eq []
123
+ string_1.null.should be_false
124
+
125
+ new_string_value = connection.exec_query "SELECT array_length(string_1, 1) FROM data_types LIMIT 1"
126
+ if RUBY_PLATFORM =~ /java/
127
+ new_string_value.first['array_length'].should eq 3
128
+ else
129
+ new_string_value.rows.first.should == ['3']
91
130
  end
131
+ end
132
+ end
133
+
134
+ describe 'Change text column to array' do
135
+ after { connection.drop_table :data_types }
136
+ it 'updates the column definitions' do
137
+ lambda do
138
+ connection.create_table :data_types do |t|
139
+ t.text :text_1
140
+ end
141
+
142
+ connection.exec_query "INSERT INTO data_types (text_1) VALUES ('some,values,here')"
143
+ connection.change_column :data_types, :text_1, :text, :array => true, :default => [], :null => false
144
+ end.should_not raise_exception
92
145
 
93
- connection.change_column :data_types, :array_1, :integer, :array => true, :default => [], :null => false
94
- end.should_not raise_exception
146
+ columns = connection.columns(:data_types)
95
147
 
96
- columns = connection.columns(:data_types)
148
+ text_1 = columns.detect { |c| c.name == 'text_1'}
149
+ text_1.sql_type.should eq 'text[]'
150
+ text_1.default.should eq []
151
+ text_1.null.should be_false
97
152
 
98
- array_1 = columns.detect { |c| c.name == 'array_1'}
99
- array_1.sql_type.should eq 'integer[]'
100
- array_1.default.should eq []
101
- array_1.null.should be_false
153
+ new_text_value = connection.exec_query "SELECT array_length(text_1, 1) FROM data_types LIMIT 1"
154
+ if RUBY_PLATFORM =~ /java/
155
+ new_text_value.first['array_length'].should eq 3
156
+ else
157
+ new_text_value.rows.first.should eq ['3']
158
+ end
159
+ end
102
160
  end
103
161
  end
104
162
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: postgres_ext
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan McClain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-21 00:00:00.000000000 Z
11
+ date: 2013-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.8
33
+ version: 0.0.9
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: 0.0.8
40
+ version: 0.0.9
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rails
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -107,7 +107,6 @@ files:
107
107
  - CHANGELOG.md
108
108
  - CONTRIBUTING.md
109
109
  - Gemfile
110
- - LICENSE
111
110
  - README.md
112
111
  - Rakefile
113
112
  - docs/indexes.md
@@ -238,7 +237,8 @@ files:
238
237
  - spec/schema_dumper/uuid_spec.rb
239
238
  - spec/spec_helper.rb
240
239
  homepage: ''
241
- licenses: []
240
+ licenses:
241
+ - MIT
242
242
  metadata: {}
243
243
  post_install_message:
244
244
  rdoc_options: []
@@ -256,7 +256,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
256
256
  version: '0'
257
257
  requirements: []
258
258
  rubyforge_project:
259
- rubygems_version: 2.0.2
259
+ rubygems_version: 2.0.3
260
260
  signing_key:
261
261
  specification_version: 4
262
262
  summary: Extends ActiveRecord to handle native PostgreSQL data types
data/LICENSE DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2012 Dan Seaver
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.