postgres_ext 1.0.0 → 2.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.
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
-