dumbo 0.0.1 → 0.0.3
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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile +1 -1
- data/bin/dumbo +65 -24
- data/config/boot.rb +2 -3
- data/dumbo.gemspec +1 -2
- data/lib/dumbo.rb +17 -16
- data/lib/dumbo/aggregate.rb +3 -5
- data/lib/dumbo/base_type.rb +17 -17
- data/lib/dumbo/binding_loader.rb +50 -0
- data/lib/dumbo/cast.rb +5 -5
- data/lib/dumbo/composite_type.rb +4 -4
- data/lib/dumbo/db_task.rb +6 -5
- data/lib/dumbo/dependency_resolver.rb +17 -18
- data/lib/dumbo/enum_type.rb +3 -4
- data/lib/dumbo/extension.rb +64 -20
- data/lib/dumbo/extension_migrator.rb +11 -11
- data/lib/dumbo/extension_version.rb +29 -11
- data/lib/dumbo/function.rb +21 -21
- data/lib/dumbo/operator.rb +4 -6
- data/lib/dumbo/pg_object.rb +17 -21
- data/lib/dumbo/rake_task.rb +63 -53
- data/lib/dumbo/range_type.rb +6 -9
- data/lib/dumbo/test.rb +8 -0
- data/lib/dumbo/test/fixture.rb +51 -0
- data/lib/dumbo/test/helper.rb +64 -0
- data/lib/dumbo/test/matchers.rb +76 -0
- data/lib/dumbo/test/regression_helper.rb +20 -0
- data/lib/dumbo/test/silence_unknown_oid.rb +12 -0
- data/lib/dumbo/type.rb +3 -4
- data/lib/dumbo/version.rb +1 -1
- data/spec/aggregate_spec.rb +9 -10
- data/spec/cast_spec.rb +5 -5
- data/spec/{Makefile → dumbo_sample/Makefile} +4 -0
- data/spec/{dumbo_sample--0.0.1.sql → dumbo_sample/dumbo_sample--0.0.1.sql} +0 -0
- data/spec/{dumbo_sample--0.0.2.sql → dumbo_sample/dumbo_sample--0.0.2.sql} +0 -0
- data/spec/dumbo_sample/dumbo_sample--0.0.3.sql +7 -0
- data/spec/dumbo_sample/dumbo_sample--0.0.4.sql +13 -0
- data/spec/{dumbo_sample.control → dumbo_sample/dumbo_sample.control} +0 -0
- data/spec/dumbo_sample/src/dumbo_sample.c +13 -0
- data/spec/dumbo_sample/src/dumbo_sample.h +17 -0
- data/spec/extension_migrator_spec.rb +12 -11
- data/spec/extension_spec.rb +41 -12
- data/spec/extension_version_spec.rb +27 -0
- data/spec/operator_spec.rb +6 -7
- data/spec/spec_helper.rb +15 -9
- data/spec/support/extension_helper.rb +31 -0
- data/spec/support/silence_unknown_oid.rb +12 -0
- data/spec/type_spec.rb +59 -55
- data/template/Rakefile +6 -6
- data/template/spec/sample_spec.rb.erb +1 -1
- metadata +33 -31
- data/config/database.yml +0 -31
- data/lib/tasks/db.rake +0 -52
- data/lib/tasks/dumbo.rake +0 -23
- data/spec/support/sql_helper.rb +0 -23
data/lib/dumbo/type.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Dumbo
|
2
2
|
class Type < PgObject
|
3
|
-
attr_accessor
|
3
|
+
attr_accessor :name, :type, :typrelid
|
4
4
|
identfied_by :name
|
5
5
|
|
6
6
|
def load_attributes
|
@@ -24,8 +24,7 @@ module Dumbo
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def drop
|
27
|
-
"DROP TYPE #{name}"
|
27
|
+
"DROP TYPE #{name};"
|
28
28
|
end
|
29
|
-
|
30
29
|
end
|
31
|
-
end
|
30
|
+
end
|
data/lib/dumbo/version.rb
CHANGED
data/spec/aggregate_spec.rb
CHANGED
@@ -1,24 +1,23 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
describe Dumbo::Aggregate do
|
3
3
|
let(:avg) do
|
4
|
-
oid =
|
4
|
+
oid = query("SELECT p.oid
|
5
5
|
FROM pg_proc p
|
6
6
|
JOIN pg_aggregate ag ON p.oid = ag.aggfnoid
|
7
|
-
WHERE proname='avg' AND pg_get_function_arguments(p.oid) = 'integer'"
|
7
|
+
WHERE proname='avg' AND pg_get_function_arguments(p.oid) = 'integer'").first['oid']
|
8
8
|
Dumbo::Aggregate.new(oid)
|
9
9
|
end
|
10
10
|
|
11
11
|
let(:min) do
|
12
|
-
oid =
|
12
|
+
oid = query("SELECT p.oid
|
13
13
|
FROM pg_proc p
|
14
14
|
JOIN pg_aggregate ag ON p.oid = ag.aggfnoid
|
15
|
-
WHERE proname='min' AND pg_get_function_arguments(p.oid) = 'integer'"
|
15
|
+
WHERE proname='min' AND pg_get_function_arguments(p.oid) = 'integer'").first['oid']
|
16
16
|
Dumbo::Aggregate.new(oid)
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
avg.to_sql.should eq <<-SQL.gsub(/^ {6}/, '')
|
19
|
+
it 'avg should have a sql representation' do
|
20
|
+
expect(avg.to_sql).to eq <<-SQL.gsub(/^ {6}/, '')
|
22
21
|
CREATE AGGREGATE avg(integer) (
|
23
22
|
SFUNC = int4_avg_accum,
|
24
23
|
STYPE = int8[],
|
@@ -28,8 +27,8 @@ describe Dumbo::Aggregate do
|
|
28
27
|
SQL
|
29
28
|
end
|
30
29
|
|
31
|
-
it
|
32
|
-
|
30
|
+
it 'min should have a sql representation' do
|
31
|
+
expect(min.to_sql).to eq <<-SQL.gsub(/^ {6}/, '')
|
33
32
|
CREATE AGGREGATE min(integer) (
|
34
33
|
SFUNC = int4smaller,
|
35
34
|
STYPE = int4,
|
@@ -38,4 +37,4 @@ describe Dumbo::Aggregate do
|
|
38
37
|
SQL
|
39
38
|
end
|
40
39
|
|
41
|
-
end
|
40
|
+
end
|
data/spec/cast_spec.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
describe Dumbo::Cast do
|
3
3
|
let(:cast) do
|
4
|
-
oid =
|
4
|
+
oid = query("SELECT ca.oid
|
5
5
|
FROM pg_cast ca
|
6
6
|
JOIN pg_type st ON st.oid=castsource
|
7
7
|
JOIN pg_type tt ON tt.oid=casttarget
|
8
8
|
WHERE format_type(st.oid,NULL) = 'bigint'
|
9
|
-
AND format_type(tt.oid,tt.typtypmod) = 'integer';"
|
9
|
+
AND format_type(tt.oid,tt.typtypmod) = 'integer';").first['oid']
|
10
10
|
Dumbo::Cast.new(oid)
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
14
|
-
cast.to_sql.
|
13
|
+
it 'should have a sql representation' do
|
14
|
+
expect(cast.to_sql).to eq <<-SQL.gsub(/^ {6}/, '')
|
15
15
|
CREATE CAST (bigint AS integer)
|
16
16
|
WITH FUNCTION int4(bigint)
|
17
17
|
AS ASSIGNMENT;
|
18
18
|
SQL
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,7 @@
|
|
1
|
+
-- Testing Composite, Range, Enum Types handling.
|
2
|
+
|
3
|
+
CREATE TYPE elephant_composite AS (weight integer, name text);
|
4
|
+
|
5
|
+
CREATE TYPE elephant_range AS RANGE (subtype = float8, subtype_diff = float8mi);
|
6
|
+
|
7
|
+
CREATE TYPE elephant_enum AS ENUM ('infant', 'child', 'adult');
|
@@ -0,0 +1,13 @@
|
|
1
|
+
-- Testing Base Types handling.
|
2
|
+
CREATE TYPE elephant_base;
|
3
|
+
|
4
|
+
CREATE FUNCTION elephant_in(cstring) RETURNS elephant_base AS
|
5
|
+
'$libdir/dumbo_sample' LANGUAGE C;
|
6
|
+
|
7
|
+
CREATE FUNCTION elephant_out(elephant_base) RETURNS cstring AS
|
8
|
+
'$libdir/dumbo_sample' LANGUAGE C;
|
9
|
+
|
10
|
+
CREATE TYPE elephant_base (
|
11
|
+
INPUT = elephant_in,
|
12
|
+
OUTPUT = elephant_out
|
13
|
+
);
|
File without changes
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#include "dumbo_sample.h"
|
2
|
+
|
3
|
+
Datum elephant_in(PG_FUNCTION_ARGS)
|
4
|
+
{
|
5
|
+
int *result = palloc0(sizeof(int));
|
6
|
+
PG_RETURN_POINTER(result);
|
7
|
+
}
|
8
|
+
|
9
|
+
Datum elephant_out(PG_FUNCTION_ARGS)
|
10
|
+
{
|
11
|
+
char *result = palloc0(sizeof(char));
|
12
|
+
PG_RETURN_POINTER(result);
|
13
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#ifndef _DUMBO_SAMPLE_H
|
2
|
+
#define _DUMBO_SAMPLE_H
|
3
|
+
|
4
|
+
#include "postgres.h"
|
5
|
+
#include "fmgr.h"
|
6
|
+
|
7
|
+
#ifdef PG_MODULE_MAGIC
|
8
|
+
PG_MODULE_MAGIC;
|
9
|
+
#endif
|
10
|
+
|
11
|
+
PG_FUNCTION_INFO_V1(elephant_in);
|
12
|
+
PG_FUNCTION_INFO_V1(elephant_out);
|
13
|
+
|
14
|
+
Datum elephant_in(PG_FUNCTION_ARGS);
|
15
|
+
Datum elephant_out(PG_FUNCTION_ARGS);
|
16
|
+
|
17
|
+
#endif
|
@@ -1,15 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
1
3
|
describe Dumbo::ExtensionMigrator do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
system('cd spec && make clean && make uninstall')
|
4
|
+
around(:each) do |example|
|
5
|
+
install_testing_extension
|
6
|
+
example.run
|
7
|
+
uninstall_testing_extension
|
7
8
|
end
|
8
9
|
|
9
|
-
let(:migrator){Dumbo::ExtensionMigrator.new('dumbo_sample','0.0.1','0.0.2')}
|
10
|
+
let(:migrator) { Dumbo::ExtensionMigrator.new('dumbo_sample', '0.0.1', '0.0.2') }
|
10
11
|
|
11
|
-
it
|
12
|
-
migrator.upgrade.
|
12
|
+
it 'should provide upgrade sql' do
|
13
|
+
expect(migrator.upgrade).to eq <<-SQL.gsub(/^ {4}/, '')
|
13
14
|
----functions----
|
14
15
|
CREATE OR REPLACE FUNCTION foo(integer)
|
15
16
|
RETURNS integer
|
@@ -23,8 +24,8 @@ describe Dumbo::ExtensionMigrator do
|
|
23
24
|
SQL
|
24
25
|
end
|
25
26
|
|
26
|
-
it
|
27
|
-
migrator.downgrade.
|
27
|
+
it 'should provide downgrade sql' do
|
28
|
+
expect(migrator.downgrade).to eq <<-SQL.gsub(/^ {4}/, '')
|
28
29
|
----functions----
|
29
30
|
CREATE OR REPLACE FUNCTION foo(integer)
|
30
31
|
RETURNS integer
|
@@ -37,4 +38,4 @@ describe Dumbo::ExtensionMigrator do
|
|
37
38
|
$function$
|
38
39
|
SQL
|
39
40
|
end
|
40
|
-
end
|
41
|
+
end
|
data/spec/extension_spec.rb
CHANGED
@@ -1,19 +1,48 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
include ExtensionHelper
|
2
3
|
describe Dumbo::Extension do
|
3
|
-
|
4
|
-
|
5
|
-
Dumbo::Extension.new('hstore','1.1').install
|
6
|
-
end
|
4
|
+
describe 'extension setup' do
|
5
|
+
let(:extension) { described_class.new('dumbo_sample', '0.0.3') }
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
around(:each) do |example|
|
8
|
+
install_testing_extension
|
9
|
+
extension.create
|
10
|
+
example.run
|
11
|
+
uninstall_testing_extension
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should return extension obj_id' do
|
15
|
+
expect(extension.obj_id).to match /\d+/
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should return a list of objects' do
|
19
|
+
expect(extension.objects.size).to be 5
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'handling types' do
|
23
|
+
let(:names) { %w(elephant_composite elephant_range elephant_enum) }
|
11
24
|
|
12
|
-
|
13
|
-
|
25
|
+
let(:classes) { [Dumbo::EnumType, Dumbo::CompositeType, Dumbo::RangeType] }
|
26
|
+
|
27
|
+
subject { extension.types }
|
28
|
+
|
29
|
+
it { expect(subject.map(&:class)).to match_array classes }
|
30
|
+
it { expect(subject.map(&:name)).to match_array names }
|
31
|
+
end
|
14
32
|
end
|
15
33
|
|
16
|
-
|
17
|
-
|
34
|
+
describe '#versions' do
|
35
|
+
let(:releases) do
|
36
|
+
['ext--abc.sql', 'ext--0.10.7.sql', 'ext--0.11.0.sql',
|
37
|
+
'ext--1.0.0.sql', 'ext--0.12.sql', 'ext--0.10.5.sql']
|
38
|
+
end
|
39
|
+
|
40
|
+
before do
|
41
|
+
expect_any_instance_of(described_class).to receive(:releases){releases}
|
42
|
+
end
|
43
|
+
|
44
|
+
subject { described_class.new.versions.map(&:to_s) }
|
45
|
+
|
46
|
+
it { is_expected.to match_array ['0.10.5', '0.10.7', '0.11.0', '0.12', '1.0.0'] }
|
18
47
|
end
|
19
|
-
end
|
48
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe Dumbo::ExtensionVersion do
|
3
|
+
context 'handling full version levels' do
|
4
|
+
let(:version) { described_class.new(0, 1, 11) }
|
5
|
+
|
6
|
+
it { expect(version.to_s).to eq '0.1.11' }
|
7
|
+
|
8
|
+
it { expect(version.bump(:patch).to_s).to eq '0.1.12' }
|
9
|
+
it { expect(version.bump(:minor).to_s).to eq '0.2.0' }
|
10
|
+
it { expect(version.bump(:major).to_s).to eq '1.0.0' }
|
11
|
+
|
12
|
+
it { expect(version).to be < version.bump(:patch) }
|
13
|
+
|
14
|
+
it { expect(version.bump(:patch)).to be < version.bump(:minor) }
|
15
|
+
it { expect(version.bump(:patch)).to be < version.bump(:major) }
|
16
|
+
it { expect(version.bump(:minor)).to be < version.bump(:major) }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'handling incomplete version levels' do
|
20
|
+
let(:version) { described_class.new(0, 1) }
|
21
|
+
|
22
|
+
it { expect(version.to_s).to eq '0.1' }
|
23
|
+
|
24
|
+
it { expect(version.bump(:patch).to_s).to eq '0.1.1' }
|
25
|
+
it { expect(version.bump(:minor).to_s).to eq '0.2.0' }
|
26
|
+
end
|
27
|
+
end
|
data/spec/operator_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
describe Dumbo::Operator do
|
3
3
|
let(:operator) do
|
4
|
-
oid =
|
4
|
+
oid = query("SELECT oid FROM pg_operator WHERE oprname = '&&' AND format_type(oprleft,NULL) = 'box' AND format_type(oprright,NULL) ='box'").first['oid']
|
5
5
|
Dumbo::Operator.new(oid).get
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
9
|
-
operator.to_sql.
|
8
|
+
it 'should have a sql representation' do
|
9
|
+
expect(operator.to_sql).to eq <<-SQL.gsub(/^ {4}/, '')
|
10
10
|
CREATE OPERATOR && (
|
11
11
|
PROCEDURE = box_overlap,
|
12
12
|
LEFTARG = box,
|
@@ -19,11 +19,11 @@ describe Dumbo::Operator do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'should have a uniq identfier' do
|
22
|
-
operator.identify.
|
22
|
+
expect(operator.identify).to eq ['&&', 'box', 'box']
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'should have upgrade sql' do
|
26
|
-
operator.upgrade(nil).
|
26
|
+
expect(operator.upgrade(nil)).to eq <<-SQL.gsub(/^ {4}/, '')
|
27
27
|
CREATE OPERATOR && (
|
28
28
|
PROCEDURE = box_overlap,
|
29
29
|
LEFTARG = box,
|
@@ -36,7 +36,6 @@ describe Dumbo::Operator do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'should have downgrade sql' do
|
39
|
-
operator.downgrade(nil).
|
39
|
+
expect(operator.downgrade(nil)).to eq 'DROP OPERATOR &&;'
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
data/spec/spec_helper.rb
CHANGED
@@ -1,28 +1,34 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require '
|
2
|
+
require 'dumbo/test'
|
3
3
|
|
4
4
|
ENV['DUMBO_ENV'] ||= 'test'
|
5
5
|
require File.expand_path('../../config/boot', __FILE__)
|
6
6
|
|
7
|
+
require 'dumbo/test/silence_unknown_oid'
|
8
|
+
|
7
9
|
ActiveRecord::Base.logger.level = 0 if ActiveRecord::Base.logger
|
8
10
|
|
9
|
-
Dir.glob(
|
11
|
+
Dir.glob('spec/support/**/*.rb').each { |f| require f }
|
10
12
|
|
11
13
|
RSpec.configure do |config|
|
12
14
|
config.fail_fast = false
|
13
|
-
config.order =
|
14
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
15
|
-
config.include FactoryGirl::Syntax::Methods
|
15
|
+
config.order = 'random'
|
16
16
|
config.filter_run focus: true
|
17
17
|
config.run_all_when_everything_filtered = true
|
18
|
+
config.expect_with :rspec do |c|
|
19
|
+
c.syntax = [:should, :expect]
|
20
|
+
end
|
18
21
|
|
19
22
|
# wrap test in transactions
|
20
23
|
config.around(:each) do |example|
|
21
|
-
|
24
|
+
ActiveRecord::Base.transaction do
|
22
25
|
example.run
|
23
|
-
|
24
|
-
|
26
|
+
fail ActiveRecord::Rollback
|
27
|
+
end
|
25
28
|
end
|
26
29
|
|
27
|
-
config.include(
|
30
|
+
config.include(Dumbo::Test::Helper)
|
31
|
+
config.include(Dumbo::Matchers)
|
28
32
|
end
|
33
|
+
|
34
|
+
require 'dumbo/test/regression_helper' if ENV['DUMBO_REGRESSION']
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module ExtensionHelper
|
2
|
+
def install_testing_extension
|
3
|
+
system <<-CMD
|
4
|
+
(
|
5
|
+
mkdir -p #{spec_root}/dumbo_sample_runtime && \
|
6
|
+
cp -R #{spec_root}/dumbo_sample/ #{spec_root}/dumbo_sample_runtime
|
7
|
+
cd #{spec_root}/dumbo_sample_runtime && \
|
8
|
+
make clean && \
|
9
|
+
make && \
|
10
|
+
make install
|
11
|
+
) 1> /dev/null
|
12
|
+
CMD
|
13
|
+
end
|
14
|
+
|
15
|
+
def uninstall_testing_extension
|
16
|
+
system <<-CMD
|
17
|
+
(
|
18
|
+
cd #{spec_root}/dumbo_sample_runtime && \
|
19
|
+
make clean && \
|
20
|
+
make uninstall && \
|
21
|
+
rm -rf #{spec_root}/dumbo_sample_runtime
|
22
|
+
) 1> /dev/null
|
23
|
+
CMD
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def spec_root
|
29
|
+
File.join(File.dirname(__FILE__), '..')
|
30
|
+
end
|
31
|
+
end
|
data/spec/type_spec.rb
CHANGED
@@ -1,64 +1,76 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
|
2
3
|
describe Dumbo::Type do
|
4
|
+
around(:each) do |example|
|
5
|
+
install_testing_extension
|
6
|
+
extension.create
|
7
|
+
example.run
|
8
|
+
uninstall_testing_extension
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:version) { '0.0.3' }
|
12
|
+
|
13
|
+
let(:extension) { Dumbo::Extension.new('dumbo_sample', version) }
|
14
|
+
|
15
|
+
let(:type) do
|
16
|
+
oid = query("SELECT oid FROM pg_type WHERE typname = '#{type_name}'").first['oid']
|
17
|
+
Dumbo::Type.new(oid).get
|
18
|
+
end
|
19
|
+
|
20
|
+
shared_examples_for 'identifiable' do
|
21
|
+
subject { type.identify }
|
22
|
+
|
23
|
+
it { should eq [type_name] }
|
24
|
+
end
|
25
|
+
|
3
26
|
describe 'Base Type' do
|
4
|
-
let(:
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
27
|
+
let(:version) { '0.0.4' }
|
28
|
+
|
29
|
+
let(:type_name) { 'elephant_base' }
|
30
|
+
|
31
|
+
let(:type) { extension.types.select { |t| t.name == type_name }.first }
|
32
|
+
|
33
|
+
it 'should have a sql representation' do
|
34
|
+
expect(type.to_sql).to eq <<-SQL.gsub(/^ {6}/, '')
|
35
|
+
CREATE TYPE elephant_base(
|
36
|
+
INPUT=elephant_in,
|
37
|
+
OUTPUT=elephant_out,
|
38
|
+
RECEIVE=-,
|
39
|
+
SEND=-,
|
16
40
|
ANALYZE=-,
|
17
41
|
CATEGORY='U',
|
18
42
|
DEFAULT='',
|
19
43
|
INTERNALLENGTH=-1,
|
20
44
|
ALIGNMENT=int,
|
21
|
-
STORAGE=
|
45
|
+
STORAGE=PLAIN
|
22
46
|
);
|
23
47
|
SQL
|
24
48
|
end
|
25
49
|
|
26
|
-
|
27
|
-
type.identify.should eq ['hstore']
|
28
|
-
end
|
50
|
+
it_should_behave_like 'identifiable'
|
29
51
|
end
|
30
52
|
|
31
53
|
describe 'Composite Type' do
|
32
|
-
let(:
|
33
|
-
sql "CREATE TYPE compfoo AS (f1 int, f2 text);"
|
34
|
-
oid = sql("SELECT oid FROM pg_type where typname = 'compfoo'",'oid').first
|
35
|
-
Dumbo::Type.new(oid).get
|
36
|
-
end
|
54
|
+
let(:type_name) { 'elephant_composite' }
|
37
55
|
|
38
|
-
it
|
39
|
-
type.to_sql.
|
40
|
-
CREATE TYPE
|
41
|
-
|
42
|
-
|
56
|
+
it 'should have a sql representation' do
|
57
|
+
expect(type.to_sql).to eq <<-SQL.gsub(/^ {6}/, '')
|
58
|
+
CREATE TYPE elephant_composite AS (
|
59
|
+
weight integer,
|
60
|
+
name text
|
43
61
|
);
|
44
62
|
SQL
|
45
63
|
end
|
46
64
|
|
47
|
-
|
48
|
-
type.identify.should eq ['compfoo']
|
49
|
-
end
|
65
|
+
it_should_behave_like 'identifiable'
|
50
66
|
end
|
51
67
|
|
52
68
|
describe 'Range Type' do
|
53
|
-
let(:
|
54
|
-
sql "CREATE TYPE float8_range AS RANGE (subtype = float8, subtype_diff = float8mi);"
|
55
|
-
oid = sql("SELECT oid FROM pg_type where typname = 'float8_range'",'oid').first
|
56
|
-
Dumbo::Type.new(oid).get
|
57
|
-
end
|
69
|
+
let(:type_name) { 'elephant_range' }
|
58
70
|
|
59
|
-
it
|
60
|
-
type.to_sql.
|
61
|
-
CREATE TYPE
|
71
|
+
it 'should have a sql representation' do
|
72
|
+
expect(type.to_sql).to eq <<-SQL.gsub(/^ {6}/, '')
|
73
|
+
CREATE TYPE elephant_range AS RANGE (
|
62
74
|
SUBTYPE=float8,
|
63
75
|
SUBTYPE_OPCLASS=float8_ops,
|
64
76
|
SUBTYPE_DIFF=float8mi
|
@@ -66,30 +78,22 @@ describe Dumbo::Type do
|
|
66
78
|
SQL
|
67
79
|
end
|
68
80
|
|
69
|
-
|
70
|
-
type.identify.should eq ['float8_range']
|
71
|
-
end
|
81
|
+
it_should_behave_like 'identifiable'
|
72
82
|
end
|
73
83
|
|
74
84
|
describe 'Enum Type' do
|
75
|
-
let(:
|
76
|
-
sql "CREATE TYPE bug_status AS ENUM ('new', 'open', 'closed');"
|
77
|
-
oid = sql("SELECT oid FROM pg_type where typname = 'bug_status'",'oid').first
|
78
|
-
Dumbo::Type.new(oid).get
|
79
|
-
end
|
85
|
+
let(:type_name) { 'elephant_enum' }
|
80
86
|
|
81
|
-
it
|
82
|
-
type.to_sql.
|
83
|
-
CREATE TYPE
|
84
|
-
'
|
85
|
-
'
|
86
|
-
'
|
87
|
+
it 'should have a sql representation' do
|
88
|
+
expect(type.to_sql).to eq <<-SQL.gsub(/^ {6}/, '')
|
89
|
+
CREATE TYPE elephant_enum AS ENUM (
|
90
|
+
'infant',
|
91
|
+
'child',
|
92
|
+
'adult'
|
87
93
|
);
|
88
94
|
SQL
|
89
95
|
end
|
90
96
|
|
91
|
-
|
92
|
-
type.identify.should eq ['bug_status']
|
93
|
-
end
|
97
|
+
it_should_behave_like 'identifiable'
|
94
98
|
end
|
95
|
-
end
|
99
|
+
end
|