postgres_ext 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/README.md +6 -47
  4. data/lib/postgres_ext/active_record/relation/predicate_builder.rb +36 -55
  5. data/lib/postgres_ext/active_record/relation/query_methods.rb +0 -14
  6. data/lib/postgres_ext/active_record.rb +0 -3
  7. data/lib/postgres_ext/version.rb +1 -1
  8. data/postgres_ext.gemspec +6 -5
  9. data/spec/arel/arel_spec.rb +0 -1
  10. data/spec/dummy/app/models/person.rb +0 -1
  11. data/spec/dummy/config/application.rb +0 -3
  12. data/spec/dummy/config/environments/development.rb +2 -7
  13. data/spec/dummy/config/environments/production.rb +1 -0
  14. data/spec/dummy/config/environments/test.rb +1 -5
  15. data/spec/dummy/db/migrate/20120501163758_create_people.rb +3 -3
  16. data/spec/dummy/db/schema.rb +15 -12
  17. data/spec/queries/sanity_spec.rb +1 -1
  18. data/spec/spec_helper.rb +1 -2
  19. metadata +21 -105
  20. data/docs/indexes.md +0 -28
  21. data/docs/migrations.md +0 -92
  22. data/docs/type_casting.md +0 -70
  23. data/lib/postgres_ext/active_record/connection_adapters/postgres_adapter.rb +0 -537
  24. data/lib/postgres_ext/active_record/connection_adapters.rb +0 -1
  25. data/lib/postgres_ext/active_record/sanitization.rb +0 -30
  26. data/lib/postgres_ext/active_record/schema_dumper.rb +0 -157
  27. data/spec/columns/array_spec.rb +0 -119
  28. data/spec/columns/inet_spec.rb +0 -25
  29. data/spec/columns/ranges/daterange_spec.rb +0 -37
  30. data/spec/columns/ranges/int4range_spec.rb +0 -38
  31. data/spec/columns/ranges/int8range_spec.rb +0 -38
  32. data/spec/columns/ranges/numrange_spec.rb +0 -37
  33. data/spec/columns/ranges/tsrange_spec.rb +0 -37
  34. data/spec/migrations/active_record_migration_spec.rb +0 -29
  35. data/spec/migrations/array_spec.rb +0 -214
  36. data/spec/migrations/cidr_spec.rb +0 -26
  37. data/spec/migrations/citext_spec.rb +0 -32
  38. data/spec/migrations/ean13_spec.rb +0 -27
  39. data/spec/migrations/index_spec.rb +0 -67
  40. data/spec/migrations/inet_spec.rb +0 -26
  41. data/spec/migrations/macaddr_spec.rb +0 -26
  42. data/spec/migrations/ranges/daterange_spec.rb +0 -27
  43. data/spec/migrations/ranges/int4range_spec.rb +0 -27
  44. data/spec/migrations/ranges/int8range_spec.rb +0 -27
  45. data/spec/migrations/ranges/numrange_spec.rb +0 -27
  46. data/spec/migrations/ranges/tsrange_spec.rb +0 -27
  47. data/spec/migrations/ranges/tstzrange_spec.rb +0 -27
  48. data/spec/migrations/uuid_spec.rb +0 -26
  49. data/spec/models/array_spec.rb +0 -285
  50. data/spec/models/ean13_spec.rb +0 -57
  51. data/spec/models/inet_spec.rb +0 -88
  52. data/spec/models/ranges/daterange_spec.rb +0 -88
  53. data/spec/models/ranges/int4range_spec.rb +0 -85
  54. data/spec/models/ranges/int8range_spec.rb +0 -85
  55. data/spec/models/ranges/numrange_spec.rb +0 -85
  56. data/spec/models/ranges/tsrange_spec.rb +0 -89
  57. data/spec/models/ranges/tstzrange_spec.rb +0 -89
  58. data/spec/schema_dumper/array_spec.rb +0 -17
  59. data/spec/schema_dumper/cidr_spec.rb +0 -17
  60. data/spec/schema_dumper/citext_spec.rb +0 -17
  61. data/spec/schema_dumper/ean13_spec.rb +0 -17
  62. data/spec/schema_dumper/extension_spec.rb +0 -14
  63. data/spec/schema_dumper/index_spec.rb +0 -46
  64. data/spec/schema_dumper/inet_spec.rb +0 -17
  65. data/spec/schema_dumper/macaddr_spec.rb +0 -17
  66. data/spec/schema_dumper/ranges/daterange_spec.rb +0 -18
  67. data/spec/schema_dumper/ranges/int4range_spec.rb +0 -18
  68. data/spec/schema_dumper/ranges/int8range_spec.rb +0 -18
  69. data/spec/schema_dumper/ranges/numrange_spec.rb +0 -18
  70. data/spec/schema_dumper/ranges/tsrange_spec.rb +0 -18
  71. data/spec/schema_dumper/ranges/tstzrange_spec.rb +0 -17
  72. data/spec/schema_dumper/uuid_spec.rb +0 -17
@@ -1,30 +0,0 @@
1
- require 'active_record/sanitization'
2
-
3
- module ActiveRecord
4
- module Sanitization
5
- extend ActiveSupport::Concern
6
-
7
- module ClassMethods
8
- def sanitize_sql_hash_for_assignment(attrs)
9
- attrs.map do |attr, value|
10
- "#{connection.quote_column_name(attr)} = #{quote_bound_value(value, attr)}"
11
- end.join(', ')
12
- end
13
-
14
- def quote_bound_value(value, column = nil, c = connection)
15
- if column.present? && column != c
16
- record_column = self.columns.select {|col| col.name == column}.first
17
- c.quote(value, record_column)
18
- elsif value.respond_to?(:map) && !value.acts_like?(:string)
19
- if value.respond_to?(:empty?) && value.empty?
20
- c.quote(nil)
21
- else
22
- value.map { |v| c.quote(v) }.join(',')
23
- end
24
- else
25
- c.quote(value)
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,157 +0,0 @@
1
- require 'active_record/schema_dumper'
2
-
3
- module ActiveRecord
4
- class SchemaDumper
5
- VALID_COLUMN_SPEC_KEYS = [:name, :limit, :precision, :scale, :default, :null, :array]
6
- def self.valid_column_spec_keys
7
- VALID_COLUMN_SPEC_KEYS
8
- end
9
-
10
- def dump(stream)
11
- header(stream)
12
- # added
13
- extensions(stream) if @connection.respond_to?(:supports_extensions?) &&
14
- @connection.supports_extensions?
15
- # /added
16
- tables(stream)
17
- trailer(stream)
18
- stream
19
- end
20
-
21
- private
22
-
23
- def extensions(stream)
24
- exts = @connection.extensions
25
-
26
- unless exts.empty?
27
- stream.puts exts.map { |name| " add_extension \"#{name}\""}.join("\n") + "\n\n"
28
- end
29
- end
30
-
31
- def table(table, stream)
32
- columns = @connection.columns(table)
33
- begin
34
- tbl = StringIO.new
35
-
36
- # first dump primary key column
37
- if @connection.respond_to?(:pk_and_sequence_for)
38
- pk, _ = @connection.pk_and_sequence_for(table)
39
- elsif @connection.respond_to?(:primary_key)
40
- pk = @connection.primary_key(table)
41
- end
42
-
43
- tbl.print " create_table #{table.inspect}"
44
- if columns.detect { |c| c.name == pk }
45
- if pk != 'id'
46
- tbl.print %Q(, :primary_key => "#{pk}")
47
- end
48
- else
49
- tbl.print ", :id => false"
50
- end
51
- tbl.print ", :force => true"
52
- tbl.puts " do |t|"
53
-
54
- # then dump all non-primary key columns
55
- column_specs = columns.map do |column|
56
- raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" if @types[column.type].nil?
57
- next if column.name == pk
58
- spec = column_spec(column)
59
- (spec.keys - [:name, :type]).each{ |k| spec[k].insert(0, "#{k.inspect} => ")}
60
- spec
61
- end.compact
62
-
63
- # find all migration keys used in this table
64
- keys = self.class.valid_column_spec_keys & column_specs.map{ |k| k.keys }.flatten
65
-
66
- # figure out the lengths for each column based on above keys
67
- lengths = keys.map{ |key| column_specs.map{ |spec| spec[key] ? spec[key].length + 2 : 0 }.max }
68
-
69
- # the string we're going to sprintf our values against, with standardized column widths
70
- format_string = lengths.map{ |len| "%-#{len}s" }
71
-
72
- # find the max length for the 'type' column, which is special
73
- type_length = column_specs.map{ |column| column[:type].length }.max
74
-
75
- # add column type definition to our format string
76
- format_string.unshift " t.%-#{type_length}s "
77
-
78
- format_string *= ''
79
-
80
- column_specs.each do |colspec|
81
- values = keys.zip(lengths).map{ |key, len| colspec.key?(key) ? colspec[key] + ", " : " " * len }
82
- values.unshift colspec[:type]
83
- tbl.print((format_string % values).gsub(/,\s*$/, ''))
84
- tbl.puts
85
- end
86
-
87
- tbl.puts " end"
88
- tbl.puts
89
-
90
- indexes(table, tbl)
91
-
92
- tbl.rewind
93
- stream.print tbl.read
94
- rescue => e
95
- stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
96
- stream.puts "# #{e.message}"
97
- stream.puts
98
- end
99
-
100
- stream
101
- end
102
-
103
- #mostly rails 3.2 code
104
- def indexes(table, stream)
105
- if (indexes = @connection.indexes(table)).any?
106
- add_index_statements = indexes.map do |index|
107
- statement_parts = [
108
- ('add_index ' + index.table.inspect),
109
- index.columns.inspect,
110
- (':name => ' + index.name.inspect),
111
- ]
112
- statement_parts << ':unique => true' if index.unique
113
-
114
- index_lengths = (index.lengths || []).compact
115
- statement_parts << (':length => ' + Hash[index.columns.zip(index.lengths)].inspect) unless index_lengths.empty?
116
-
117
- index_orders = (index.orders || {})
118
- statement_parts << (':order => ' + index.orders.inspect) unless index_orders.empty?
119
-
120
- # changed from rails 2.3
121
- statement_parts << (':where => ' + index.where.inspect) if index.where
122
- statement_parts << (':using => ' + index.using.inspect) if index.using
123
- statement_parts << (':index_opclass => ' + index.index_opclass.inspect) if index.index_opclass.present?
124
- # /changed
125
-
126
- ' ' + statement_parts.join(', ')
127
- end
128
-
129
- stream.puts add_index_statements.sort.join("\n")
130
- stream.puts
131
- end
132
- end
133
-
134
- #mostly rails 3.2 code (pulled out of table method)
135
- def column_spec(column)
136
- spec = {}
137
- spec[:name] = column.name.inspect
138
-
139
- # AR has an optimization which handles zero-scale decimals as integers. This
140
- # code ensures that the dumper still dumps the column as a decimal.
141
- spec[:type] = if column.type == :integer && [/^numeric/, /^decimal/].any? { |e| e.match(column.sql_type) }
142
- 'decimal'
143
- else
144
- column.type.to_s
145
- end
146
- spec[:limit] = column.limit.inspect if column.limit != @types[column.type][:limit] && spec[:type] != 'decimal'
147
- spec[:precision] = column.precision.inspect if column.precision
148
- spec[:scale] = column.scale.inspect if column.scale
149
- spec[:null] = 'false' unless column.null
150
- spec[:default] = default_string(column.default) if column.has_default?
151
- # changed from rails 3.2 code
152
- spec[:array] = 'true' if column.respond_to?(:array) && column.array
153
- # /changed
154
- spec
155
- end
156
- end
157
- end
@@ -1,119 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- describe 'Array column' do
6
- let!(:integer_array_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'integer[]'}
7
- let!(:string_array_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'character varying(255)[]'}
8
- let!(:text_array_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'text[]'}
9
- let!(:adapter) { ActiveRecord::Base.connection }
10
-
11
- context 'string array' do
12
- describe '#type_cast' do
13
- context 'has null value' do
14
- it 'converts the PostgreSQL value to an array with a nil value' do
15
- string_array_column.type_cast('{1,NULL,"NULL"}').should eq ['1',nil,'NULL']
16
- end
17
- end
18
-
19
- context 'utf8' do
20
- it "handles incoming UTF8 as UTF8" do
21
- string_array_column.type_cast('{"Аркалио"}').should eq ['Аркалио']
22
- end
23
- end
24
-
25
- context 'corner cases, strings with commas and quotations' do
26
- it 'converts the PostgreSQL value containing escaped " to an array' do
27
- string_array_column.type_cast('{"has \" quote",another value}').should eq ['has " quote', 'another value']
28
- end
29
-
30
- it 'converts the PostgreSQL value containing commas to an array' do
31
- string_array_column.type_cast('{"has , comma",another value,"more, commas"}').should eq ['has , comma', 'another value', 'more, commas']
32
- end
33
-
34
- it 'converts strings containing , to the proper value' do
35
- adapter.type_cast(['c,'], string_array_column).should eq '{"c,"}'
36
- end
37
-
38
- it "handles strings with double quotes" do
39
- adapter.type_cast(['a"b'], string_array_column).should eq '{"a\\"b"}'
40
- end
41
-
42
- it 'converts arrays of strings containing nil to the proper value' do
43
- adapter.type_cast(['one', nil, 'two'], string_array_column).should eq '{"one",NULL,"two"}'
44
- end
45
- end
46
- end
47
- end
48
-
49
- context 'text array' do
50
- describe '#type_cast' do
51
- context 'has null value' do
52
- it 'converts the PostgreSQL value to an array with a nil value' do
53
- text_array_column.type_cast('{1,NULL,"NULL"}').should eq ['1',nil,'NULL']
54
- end
55
- end
56
-
57
- context 'utf8' do
58
- it "handles incoming UTF8 as UTF8" do
59
- text_array_column.type_cast('{"Аркалио"}').should eq ['Аркалио']
60
- end
61
- end
62
-
63
- context 'corner cases, strings with commas and quotations' do
64
- it 'converts one element, 2 dimensional arrays' do
65
- adapter.type_cast([['one','two']], text_array_column).should eq '{{"one","two"}}'
66
- end
67
- it 'converts the PostgreSQL value containing escaped " to an array' do
68
- text_array_column.type_cast('{"has \" quote",another value}').should eq ['has " quote', 'another value']
69
- end
70
-
71
- it 'converts the PostgreSQL value containing commas to an array' do
72
- text_array_column.type_cast('{"has , comma",another value,"more, commas"}').should eq ['has , comma', 'another value', 'more, commas']
73
- end
74
-
75
- it 'converts strings containing , to the proper value' do
76
- adapter.type_cast(['c,'], text_array_column).should eq '{"c,"}'
77
- end
78
-
79
- it "handles strings with double quotes" do
80
- adapter.type_cast(['a"b'], text_array_column).should eq '{"a\\"b"}'
81
- end
82
-
83
- it 'converts arrays of strings containing nil to the proper value' do
84
- adapter.type_cast(['one', nil, 'two'], text_array_column).should eq '{"one",NULL,"two"}'
85
- end
86
- end
87
- end
88
- end
89
-
90
- context 'integer array' do
91
- describe '#type_cast' do
92
- context 'has null value' do
93
- it 'converts a Postgres Array with nulls in it' do
94
- integer_array_column.type_cast('{1,NULL,2}').should eq [1,nil,2]
95
- end
96
- end
97
- context 'one dimensional array' do
98
- it 'converts a PostgreSQL array value to an array of integers' do
99
- integer_array_column.type_cast('{1,2,3,4}').should eq [1,2,3,4]
100
- end
101
- end
102
- end
103
-
104
- describe 'integer array to SQL statment conversion' do
105
- context 'contains a nil value' do
106
- it 'returns a PostgreSQL array' do
107
- value = integer_array_column.type_cast('{1,NULL,2}')
108
- adapter.type_cast(value, integer_array_column).should eq '{1,NULL,2}'
109
- end
110
- end
111
- context 'one dimensional array' do
112
- it 'returns a PostgreSQL array' do
113
- value = integer_array_column.type_cast('{1,2,3,4}')
114
- adapter.type_cast(value, integer_array_column).should eq '{1,2,3,4}'
115
- end
116
- end
117
- end
118
- end
119
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'INET column' do
4
- let!(:column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'inet'}
5
- let!(:adapter) { ActiveRecord::Base.connection }
6
-
7
- describe '#type_class_code' do
8
- it 'returns code for converting strings to IPAddr' do
9
- column.type_cast_code('v').should eq 'ActiveRecord::ConnectionAdapters::PostgreSQLColumn.string_to_cidr_address(v)'
10
- end
11
- end
12
-
13
- describe 'inet type casting' do
14
- it 'converts ip strings to NetAddr::CIDR objects' do
15
- column.type_cast('127.0.0.1').should be_a_kind_of IPAddr
16
- end
17
- end
18
-
19
- describe 'inet value conversion for SQL statments' do
20
- it 'returns the string value of the IPAddr address' do
21
- value = column.type_cast('127.0.0.1')
22
- adapter.type_cast(value, column).should eq '127.0.0.1/32'
23
- end
24
- end
25
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'daterange column' do
4
- let!(:adapter) { ActiveRecord::Base.connection }
5
- let!(:date_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'daterange'}
6
-
7
- describe '#type_class' do
8
- it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
9
- date_range_column.type_cast('[2011-01-01,2012-01-31]').should eq Date.new(2011,01,01)..Date.new(2012,01,31)
10
- end
11
-
12
- it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
13
- date_range_column.type_cast('[2011-01-01,2012-01-31)').should eq Date.new(2011,01,01)...Date.new(2012,01,31)
14
- end
15
-
16
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
17
- # Cannot have a range from -Infinity to a date
18
- # date_range_column.type_cast('(,2011-01-01)').should eq -(1.0/0.0)...4
19
- date_range_column.type_cast('[2011-01-01,)').should eq Date.new(2011,01,01)..(1.0/0.0)
20
- end
21
- end
22
-
23
- describe 'date range to SQL statment conversion' do
24
- it 'returns an end-inclusive PostgreSQL range' do
25
- value = date_range_column.type_cast('[2011-01-01,2012-01-31]')
26
- adapter.type_cast(value, date_range_column).should eq '[2011-01-01,2012-01-31]'
27
- end
28
- it 'returns an end-exclusive PostgreSQL range' do
29
- value = date_range_column.type_cast('[2011-01-01,2012-01-31)')
30
- adapter.type_cast(value, date_range_column).should eq '[2011-01-01,2012-01-31)'
31
- end
32
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
33
- value = date_range_column.type_cast('[2011-01-01,)')
34
- adapter.type_cast(value, date_range_column).should eq '[2011-01-01,)'
35
- end
36
- end
37
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'int4range column' do
4
- let!(:adapter) { ActiveRecord::Base.connection }
5
- let!(:int4_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'int4range'}
6
-
7
- describe '#type_class' do
8
- it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
9
- int4_range_column.type_cast('[0,4]').should eq 0..4
10
- end
11
-
12
- it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
13
- int4_range_column.type_cast('[0,4)').should eq 0...4
14
- end
15
-
16
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
17
- int4_range_column.type_cast('(,4)').should eq -(1.0/0.0)...4
18
- int4_range_column.type_cast('[0,)').should eq 0..(1.0/0.0)
19
- end
20
- end
21
-
22
- describe 'int4 range to SQL statment conversion' do
23
- it 'returns an end-inclusive PostgreSQL range' do
24
- value = int4_range_column.type_cast('[0,4]')
25
- adapter.type_cast(value, int4_range_column).should eq '[0,4]'
26
- end
27
- it 'returns an end-exclusive PostgreSQL range' do
28
- value = int4_range_column.type_cast('[0,4)')
29
- adapter.type_cast(value, int4_range_column).should eq '[0,4)'
30
- end
31
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
32
- value = int4_range_column.type_cast('(,4)')
33
- adapter.type_cast(value, int4_range_column).should eq '(,4)'
34
- value = int4_range_column.type_cast('[0,)')
35
- adapter.type_cast(value, int4_range_column).should eq '[0,)'
36
- end
37
- end
38
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'int8range column' do
4
- let!(:adapter) { ActiveRecord::Base.connection }
5
- let!(:int8_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'int8range'}
6
-
7
- describe '#type_class' do
8
- it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
9
- int8_range_column.type_cast('[0,4]').should eq 0..4
10
- end
11
-
12
- it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
13
- int8_range_column.type_cast('[0,4)').should eq 0...4
14
- end
15
-
16
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
17
- int8_range_column.type_cast('(,4)').should eq -(1.0/0.0)...4
18
- int8_range_column.type_cast('[0,)').should eq 0..(1.0/0.0)
19
- end
20
- end
21
-
22
- describe 'int8 range to SQL statment conversion' do
23
- it 'returns an end-inclusive PostgreSQL range' do
24
- value = int8_range_column.type_cast('[0,4]')
25
- adapter.type_cast(value, int8_range_column).should eq '[0,4]'
26
- end
27
- it 'returns an end-exclusive PostgreSQL range' do
28
- value = int8_range_column.type_cast('[0,4)')
29
- adapter.type_cast(value, int8_range_column).should eq '[0,4)'
30
- end
31
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
32
- value = int8_range_column.type_cast('(,4)')
33
- adapter.type_cast(value, int8_range_column).should eq '(,4)'
34
- value = int8_range_column.type_cast('[0,)')
35
- adapter.type_cast(value, int8_range_column).should eq '[0,)'
36
- end
37
- end
38
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'numrange column' do
4
- let!(:adapter) { ActiveRecord::Base.connection }
5
- let!(:numeric_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'numrange'}
6
- describe '#type_class' do
7
- it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
8
- numeric_range_column.type_cast('[0,4.1]').should eq 0.0..4.1
9
- end
10
-
11
- it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
12
- numeric_range_column.type_cast('[0,4)').should eq 0.0...4.0
13
- end
14
-
15
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
16
- numeric_range_column.type_cast('(,4)').should eq -(1.0/0.0)...4.0
17
- numeric_range_column.type_cast('[0,)').should eq 0.0..(1.0/0.0)
18
- end
19
- end
20
-
21
- describe 'Numeric range to SQL statment conversion' do
22
- it 'returns an end-inclusive PostgreSQL range' do
23
- value = numeric_range_column.type_cast('[0,4.0]')
24
- adapter.type_cast(value, numeric_range_column).should eq '[0.0,4.0]'
25
- end
26
- it 'returns an end-exclusive PostgreSQL range' do
27
- value = numeric_range_column.type_cast('[0,4.0)')
28
- adapter.type_cast(value, numeric_range_column).should eq '[0.0,4.0)'
29
- end
30
- it 'converts an infinite PostgreSQL integer range to a Ruby range' do
31
- value = numeric_range_column.type_cast('(,4.0)')
32
- adapter.type_cast(value, numeric_range_column).should eq '(,4.0)'
33
- value = numeric_range_column.type_cast('[0,)')
34
- adapter.type_cast(value, numeric_range_column).should eq '[0.0,)'
35
- end
36
- end
37
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'tsrange column' do
4
- let!(:adapter) { ActiveRecord::Base.connection }
5
- let!(:ts_range_column) { ActiveRecord::ConnectionAdapters::PostgreSQLColumn.new 'field', nil, 'tsrange'}
6
-
7
- describe '#type_class' do
8
- it 'converts an end-inclusive PostgreSQL integer range to a Ruby range' do
9
- ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01]').should eq Time.new(2011, 01, 01, 12, 34)..Time.new(2012, 01, 31, 8, 0, 1)
10
- end
11
-
12
- it 'converts an end-exclusive PostgreSQL integer range to a Ruby range' do
13
- ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01)').should eq Time.new(2011, 01, 01, 12, 34)...Time.new(2012, 01, 31, 8, 0, 1)
14
- end
15
-
16
- #it 'converts an infinite PostgreSQL integer range to a Ruby range' do
17
- ## Cannot have a range from -Infinity to a ts
18
- ## ts_range_column.type_cast('(,2011-01-01)').should eq -(1.0/0.0)...4
19
- #ts_range_column.type_cast('[2011-01-01 12:34:00,)').should eq Time.new(2011,01,01, 12, 34)..(1.0/0.0)
20
- #end
21
- end
22
-
23
- describe 'Time range to SQL statment conversion' do
24
- it 'returns an end-inclusive PostgreSQL range' do
25
- value = ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01]')
26
- adapter.type_cast(value, ts_range_column).should eq '[2011-01-01 12:34:00,2012-01-31 08:00:01]'
27
- end
28
- it 'returns an end-exclusive PostgreSQL range' do
29
- value = ts_range_column.type_cast('[2011-01-01 12:34:00,2012-01-31 08:00:01)')
30
- adapter.type_cast(value, ts_range_column).should eq '[2011-01-01 12:34:00,2012-01-31 08:00:01)'
31
- end
32
- #it 'converts an infinite PostgreSQL integer range to a Ruby range' do
33
- #value = ts_range_column.type_cast('[2011-01-01 12:34:00,)')
34
- #adapter.type_cast(value, ts_range_column).should eq '[2011-01-01 12:34:00,)'
35
- #end
36
- end
37
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'ActiveRecord Migrations' do
4
- let!(:connection) { ActiveRecord::Base.connection }
5
- after { connection.drop_table :generic_data_types }
6
- it 'creates non-postgres_ext columns' do
7
- lambda do
8
- connection.create_table :generic_data_types do |t|
9
- t.integer :col_1
10
- t.string :col_2
11
- t.datetime :col_3
12
- end
13
- connection.add_column :generic_data_types, :col_4, :text
14
- end.should_not raise_exception
15
-
16
- columns = connection.columns(:generic_data_types)
17
- col_1 = columns.detect { |c| c.name == 'col_1'}
18
- col_2 = columns.detect { |c| c.name == 'col_2'}
19
- col_3 = columns.detect { |c| c.name == 'col_3'}
20
- col_4 = columns.detect { |c| c.name == 'col_4'}
21
-
22
-
23
- col_1.sql_type.should eq 'integer'
24
- col_2.sql_type.should eq 'character varying(255)'
25
- col_3.sql_type.should eq 'timestamp without time zone'
26
- col_4.sql_type.should eq 'text'
27
- end
28
- end
29
-