postgres_ext 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ ## 0.0.6
2
+
3
+ Lots of array related fixes:
4
+ * Model creation should no longer fail when not assigning a value to an
5
+ array column
6
+ * Array columns follow database defaults
7
+ Migration fix (rn0 and gilltots)
8
+ Typos in README (bcardarella)
data/README.md CHANGED
@@ -142,9 +142,9 @@ person.favorite_numbers
142
142
  person.save
143
143
 
144
144
  person_2 = Person.first
145
- person_2.favoite_numbers
145
+ person_2.favorite_numbers
146
146
  # => [1,2,3]
147
- person_2.favoite_numbers.first.class
147
+ person_2.favorite_numbers.first.class
148
148
  # => Fixnum
149
149
  ```
150
150
 
@@ -30,8 +30,10 @@ module ActiveRecord
30
30
  return coder.load(value) if encoded?
31
31
 
32
32
  klass = self.class
33
- if self.array && value.start_with?('{') && value.end_with?('}')
33
+ if self.array && String === value && value.start_with?('{') && value.end_with?('}')
34
34
  string_to_array value
35
+ elsif self.array && Array === value
36
+ value
35
37
  else
36
38
  case type
37
39
  when :inet, :cidr then klass.string_to_cidr_address(value)
@@ -42,11 +44,15 @@ module ActiveRecord
42
44
  end
43
45
  alias_method_chain :type_cast, :extended_types
44
46
  def string_to_array(value)
45
- string_array = parse_pg_array value
46
- if type == :string
47
- string_array
47
+ if Array === value
48
+ value
48
49
  else
49
- type_cast_array(string_array)
50
+ string_array = parse_pg_array value
51
+ if type == :string
52
+ string_array
53
+ else
54
+ type_cast_array(string_array)
55
+ end
50
56
  end
51
57
  end
52
58
 
@@ -65,10 +71,14 @@ module ActiveRecord
65
71
  def type_cast_code_with_extended_types(var_name)
66
72
  klass = self.class.name
67
73
 
68
- case type
69
- when :inet, :cidr then "#{klass}.string_to_cidr_address(#{var_name})"
74
+ if self.array
75
+ "#{klass}.new('#{self.name}', #{self.default.nil? ? 'nil' : "'#{self.default}'"}, '#{self.sql_type}').string_to_array(#{var_name})"
70
76
  else
71
- type_cast_code_without_extended_types(var_name)
77
+ case type
78
+ when :inet, :cidr then "#{klass}.string_to_cidr_address(#{var_name})"
79
+ else
80
+ type_cast_code_without_extended_types(var_name)
81
+ end
72
82
  end
73
83
  end
74
84
  alias_method_chain :type_cast_code, :extended_types
@@ -165,17 +175,19 @@ module ActiveRecord
165
175
  NATIVE_DATABASE_TYPES.merge!(EXTENDED_TYPES)
166
176
 
167
177
  def add_column_options!(sql, options)
168
- if options[:column].array
178
+ if options[:array] || options[:column].try(:array)
169
179
  sql << '[]'
170
180
  end
171
181
  super
172
182
  end
173
183
 
174
- def type_cast_with_extended_types(value, column)
184
+ def type_cast_with_extended_types(value, column, part_array = false)
175
185
  case value
176
186
  when NilClass
177
- if column.array
187
+ if column.array && part_array
178
188
  'NULL'
189
+ elsif column.array && !part_array
190
+ value
179
191
  else
180
192
  type_cast_without_extended_types(value, column)
181
193
  end
@@ -200,7 +212,7 @@ module ActiveRecord
200
212
  end
201
213
 
202
214
  def array_to_string(value, column)
203
- "{#{value.map{|val| type_cast(val, column)}.join(',')}}"
215
+ "{#{value.map{|val| type_cast(val, column, true)}.join(',')}}"
204
216
  end
205
217
  end
206
218
  end
@@ -1,3 +1,3 @@
1
1
  module PostgresExt
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
@@ -54,4 +54,5 @@ describe 'Array column' do
54
54
  end
55
55
  end
56
56
  end
57
+
57
58
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'activerecord migrations' do
4
+ let!(:connection) { ActiveRecord::Base.connection }
5
+ it 'creates non-postgres_ext columns' do
6
+
7
+ lambda do
8
+ DoMigration.new.up
9
+ end.should_not raise_exception
10
+
11
+ columns = connection.columns(:generic_data_types)
12
+ col_1 = columns.detect { |c| c.name == 'col_1'}
13
+ col_2 = columns.detect { |c| c.name == 'col_2'}
14
+ col_3 = columns.detect { |c| c.name == 'col_3'}
15
+ col_4 = columns.detect { |c| c.name == 'col_4'}
16
+
17
+
18
+ col_1.sql_type.should eq 'integer'
19
+ col_2.sql_type.should eq 'character varying(255)'
20
+ col_3.sql_type.should eq 'timestamp without time zone'
21
+ col_4.sql_type.should eq 'text'
22
+ end
23
+ end
24
+
25
+
26
+ class DoMigration < ActiveRecord::Migration
27
+ def up
28
+ create_table :generic_data_types do |t|
29
+ t.integer :col_1
30
+ t.string :col_2
31
+ t.datetime :col_3
32
+ end
33
+ add_column :generic_data_types, :col_4, :text
34
+ end
35
+ end
36
+
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Models with array columns' do
4
+ context 'no default value, string array' do
5
+ let!(:adapter) { ActiveRecord::Base.connection }
6
+
7
+ before do
8
+ adapter.create_table :users, :force => true do |t|
9
+ t.string :nick_names, :array => true
10
+ end
11
+ class User < ActiveRecord::Base
12
+ attr_accessible :nick_names
13
+ end
14
+ end
15
+
16
+ after do
17
+ adapter.drop_table :users
18
+ Object.send(:remove_const, :User)
19
+ end
20
+
21
+ describe '#create' do
22
+ it 'creates a user when there is no array assignment' do
23
+ u = User.create()
24
+ u.reload
25
+ u.nick_names.should eq nil
26
+ end
27
+
28
+ it 'creates a user with an empty array' do
29
+ u = User.create(:nick_names => [])
30
+ u.reload
31
+ u.nick_names.should eq []
32
+ end
33
+
34
+ it 'creates a user with an array of some values' do
35
+ u = User.create(:nick_names => ['some', 'things'])
36
+ u.reload
37
+ u.nick_names.should eq ['some', 'things']
38
+ end
39
+ end
40
+ end
41
+
42
+ context 'default value, string array' do
43
+ let!(:adapter) { ActiveRecord::Base.connection }
44
+ before do
45
+ adapter.create_table :defaulted_users, :force => true do |t|
46
+ t.string :nick_names, :array => true, :default => '{}'
47
+ end
48
+ class DefaultedUser < ActiveRecord::Base
49
+ attr_accessible :nick_names
50
+ end
51
+ end
52
+
53
+ after do
54
+ adapter.drop_table :defaulted_users
55
+ Object.send(:remove_const, :DefaultedUser)
56
+ end
57
+
58
+ describe '#create' do
59
+ it 'creates a user when there is no array assignment' do
60
+ u = DefaultedUser.create()
61
+ u.reload
62
+ u.nick_names.should eq []
63
+ end
64
+
65
+ it 'creates a user with an nil' do
66
+ u = DefaultedUser.create(:nick_names => nil)
67
+ u.reload
68
+ u.nick_names.should eq nil
69
+ end
70
+
71
+ it 'creates a user with an array of some values' do
72
+ u = DefaultedUser.create(:nick_names => ['some', 'things'])
73
+ u.reload
74
+ u.nick_names.should eq ['some', 'things']
75
+ end
76
+ end
77
+ end
78
+ end
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.5
4
+ version: 0.0.6
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-06-26 00:00:00.000000000 Z
12
+ date: 2012-07-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -165,6 +165,7 @@ files:
165
165
  - .gitignore
166
166
  - .rspec
167
167
  - .travis.yml
168
+ - CHANGELOG.md
168
169
  - Gemfile
169
170
  - LICENSE
170
171
  - README.md
@@ -235,11 +236,13 @@ files:
235
236
  - spec/dummy/vendor/assets/javascripts/.gitkeep
236
237
  - spec/dummy/vendor/assets/stylesheets/.gitkeep
237
238
  - spec/dummy/vendor/plugins/.gitkeep
239
+ - spec/migrations/active_record_migration_spec.rb
238
240
  - spec/migrations/array_spec.rb
239
241
  - spec/migrations/cidr_spec.rb
240
242
  - spec/migrations/inet_spec.rb
241
243
  - spec/migrations/macaddr_spec.rb
242
244
  - spec/migrations/uuid_spec.rb
245
+ - spec/models/array_spec.rb
243
246
  - spec/schema_dumper/array_spec.rb
244
247
  - spec/schema_dumper/cidr_spec.rb
245
248
  - spec/schema_dumper/inet_spec.rb
@@ -260,7 +263,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
260
263
  version: '0'
261
264
  segments:
262
265
  - 0
263
- hash: -2955778538883923768
266
+ hash: -1872786162985157385
264
267
  required_rubygems_version: !ruby/object:Gem::Requirement
265
268
  none: false
266
269
  requirements:
@@ -269,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
269
272
  version: '0'
270
273
  segments:
271
274
  - 0
272
- hash: -2955778538883923768
275
+ hash: -1872786162985157385
273
276
  requirements: []
274
277
  rubyforge_project:
275
278
  rubygems_version: 1.8.23
@@ -330,11 +333,13 @@ test_files:
330
333
  - spec/dummy/vendor/assets/javascripts/.gitkeep
331
334
  - spec/dummy/vendor/assets/stylesheets/.gitkeep
332
335
  - spec/dummy/vendor/plugins/.gitkeep
336
+ - spec/migrations/active_record_migration_spec.rb
333
337
  - spec/migrations/array_spec.rb
334
338
  - spec/migrations/cidr_spec.rb
335
339
  - spec/migrations/inet_spec.rb
336
340
  - spec/migrations/macaddr_spec.rb
337
341
  - spec/migrations/uuid_spec.rb
342
+ - spec/models/array_spec.rb
338
343
  - spec/schema_dumper/array_spec.rb
339
344
  - spec/schema_dumper/cidr_spec.rb
340
345
  - spec/schema_dumper/inet_spec.rb