momomoto 0.1.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.
- data/LICENSE +340 -0
- data/Rakefile +38 -0
- data/lib/momomoto.rb +5 -0
- data/lib/momomoto/base.rb +162 -0
- data/lib/momomoto/database.rb +179 -0
- data/lib/momomoto/datatype.rb +20 -0
- data/lib/momomoto/datatype/base.rb +78 -0
- data/lib/momomoto/datatype/bigint.rb +9 -0
- data/lib/momomoto/datatype/boolean.rb +23 -0
- data/lib/momomoto/datatype/bytea.rb +13 -0
- data/lib/momomoto/datatype/character.rb +7 -0
- data/lib/momomoto/datatype/character_varying.rb +7 -0
- data/lib/momomoto/datatype/date.rb +22 -0
- data/lib/momomoto/datatype/inet.rb +14 -0
- data/lib/momomoto/datatype/integer.rb +16 -0
- data/lib/momomoto/datatype/interval.rb +30 -0
- data/lib/momomoto/datatype/numeric.rb +17 -0
- data/lib/momomoto/datatype/real.rb +7 -0
- data/lib/momomoto/datatype/smallint.rb +7 -0
- data/lib/momomoto/datatype/text.rb +24 -0
- data/lib/momomoto/datatype/time_with_time_zone.rb +10 -0
- data/lib/momomoto/datatype/time_without_time_zone.rb +30 -0
- data/lib/momomoto/datatype/timestamp_with_time_zone.rb +7 -0
- data/lib/momomoto/datatype/timestamp_without_time_zone.rb +29 -0
- data/lib/momomoto/information_schema/columns.rb +45 -0
- data/lib/momomoto/information_schema/fetch_procedure_columns.rb +14 -0
- data/lib/momomoto/information_schema/fetch_procedure_parameters.rb +14 -0
- data/lib/momomoto/information_schema/key_column_usage.rb +19 -0
- data/lib/momomoto/information_schema/routines.rb +12 -0
- data/lib/momomoto/information_schema/table_constraints.rb +19 -0
- data/lib/momomoto/join.rb +66 -0
- data/lib/momomoto/momomoto.rb +10 -0
- data/lib/momomoto/order.rb +56 -0
- data/lib/momomoto/procedure.rb +129 -0
- data/lib/momomoto/row.rb +63 -0
- data/lib/momomoto/table.rb +251 -0
- data/sql/install.sql +10 -0
- data/sql/procedures.sql +54 -0
- data/sql/types.sql +11 -0
- data/test/test_base.rb +17 -0
- data/test/test_bigint.rb +26 -0
- data/test/test_boolean.rb +30 -0
- data/test/test_bytea.rb +35 -0
- data/test/test_character.rb +27 -0
- data/test/test_character_varying.rb +17 -0
- data/test/test_database.rb +63 -0
- data/test/test_datatype.rb +62 -0
- data/test/test_date.rb +50 -0
- data/test/test_inet.rb +27 -0
- data/test/test_information_schema.rb +27 -0
- data/test/test_integer.rb +37 -0
- data/test/test_interval.rb +38 -0
- data/test/test_join.rb +19 -0
- data/test/test_numeric.rb +30 -0
- data/test/test_procedure.rb +75 -0
- data/test/test_real.rb +17 -0
- data/test/test_row.rb +47 -0
- data/test/test_smallint.rb +26 -0
- data/test/test_table.rb +233 -0
- data/test/test_text.rb +25 -0
- data/test/test_time_with_time_zone.rb +17 -0
- data/test/test_time_without_time_zone.rb +40 -0
- data/test/test_timestamp_with_time_zone.rb +17 -0
- data/test/test_timestamp_without_time_zone.rb +28 -0
- metadata +116 -0
data/test/test_bytea.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
class TestBytea < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_escaping_null
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_bytea'
|
7
|
+
data = ''
|
8
|
+
data.concat 0
|
9
|
+
data.concat "'"
|
10
|
+
r = c.new
|
11
|
+
r.data = data
|
12
|
+
r.write
|
13
|
+
r2 = c.select(:id=>r.id)
|
14
|
+
assert_equal( 1, r2.length )
|
15
|
+
assert_equal( data, r2[0].data )
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_escaping_file
|
19
|
+
c = Class.new( Momomoto::Table )
|
20
|
+
c.table_name = 'test_bytea'
|
21
|
+
r = c.new
|
22
|
+
data = File.new('test/bytea-test-file').read
|
23
|
+
r.data = data
|
24
|
+
assert_equal( data.length, r.data.length )
|
25
|
+
assert_equal( data, r.data )
|
26
|
+
r.write
|
27
|
+
r2 = c.select(:id=>r.id)
|
28
|
+
assert_equal( 1, r2.length )
|
29
|
+
assert_equal( data.length , r2[0].data.length )
|
30
|
+
assert_equal( data, r2[0].data )
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class TestCharacter < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_character'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_samples
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_character'
|
17
|
+
['a',"'","''","\\","a'b"].each do | value |
|
18
|
+
r = c.new( :data => value )
|
19
|
+
assert_equal( value, r.data )
|
20
|
+
r.write
|
21
|
+
r2 = c.select(:id=>r.id).first
|
22
|
+
assert_equal( value, r2.data.rstrip )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
class TestCharacter_varying < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_samples
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_character_varying'
|
7
|
+
[nil,'a',"'","''","\\","a'b"].each do | value |
|
8
|
+
r = c.new( :data => value )
|
9
|
+
assert_equal( value, r.data )
|
10
|
+
r.write
|
11
|
+
r2 = c.select(:id=>r.id).first
|
12
|
+
assert_equal( value, r2.data )
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
class TestDatabase < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_begin
|
5
|
+
db = Momomoto::Database.instance
|
6
|
+
assert_nothing_raised do db.begin end
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_commit
|
10
|
+
db = Momomoto::Database.instance
|
11
|
+
db.begin
|
12
|
+
assert_nothing_raised do db.commit end
|
13
|
+
assert_raise( Momomoto::Error ) do db.commit end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_connect
|
17
|
+
db = Momomoto::Database.instance
|
18
|
+
db.disconnect
|
19
|
+
old_config = db.send( :instance_variable_get, :@config )
|
20
|
+
db.config( :port => 65535 )
|
21
|
+
assert_raise( Momomoto::CriticalError ) do
|
22
|
+
db.connect
|
23
|
+
end
|
24
|
+
db.config( old_config )
|
25
|
+
db.connect
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_execute
|
29
|
+
db = Momomoto::Database.instance
|
30
|
+
db.execute("SELECT version();")
|
31
|
+
assert_raise( Momomoto::CriticalError ) do
|
32
|
+
db.execute( "chunky bacon;")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_fetch_primary_keys
|
37
|
+
db = Momomoto::Database.instance
|
38
|
+
pk = db.fetch_primary_keys( 'test_nodefault' )
|
39
|
+
assert_equal( 1, pk.length )
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_rollback
|
43
|
+
db = Momomoto::Database.instance
|
44
|
+
db.begin
|
45
|
+
assert_nothing_raised do db.rollback end
|
46
|
+
assert_raise( Momomoto::Error ) do db.rollback end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_transaction
|
50
|
+
db = Momomoto::Database.instance
|
51
|
+
assert_nothing_raised do
|
52
|
+
db.transaction do end
|
53
|
+
end
|
54
|
+
assert_raise( Momomoto::CriticalError ) do
|
55
|
+
db.transaction do
|
56
|
+
db.execute( "chunky bacon;")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
|
2
|
+
class TestDatatype < Test::Unit::TestCase
|
3
|
+
|
4
|
+
DATATYPES = Momomoto::Datatype.constants.map do | t |
|
5
|
+
Momomoto::Datatype.const_get( t )
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_default
|
9
|
+
DATATYPES.each do | type |
|
10
|
+
row = Momomoto::Information_schema::Columns.new
|
11
|
+
row.column_default = 'default-value'
|
12
|
+
a = type.new( row )
|
13
|
+
assert_equal( 'default-value', a.default )
|
14
|
+
assert_equal( false, type.new.default )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_not_null
|
19
|
+
DATATYPES.each do | type |
|
20
|
+
row = Momomoto::Information_schema::Columns.new
|
21
|
+
row.is_nullable = "YES"
|
22
|
+
assert_equal( false, type.new( row ).not_null? )
|
23
|
+
row.is_nullable = "NO"
|
24
|
+
assert_equal( true, type.new( row ).not_null? )
|
25
|
+
row.is_nullable = nil
|
26
|
+
assert_equal( false, type.new( row ).not_null? )
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_compile_rule
|
31
|
+
DATATYPES.each do | type |
|
32
|
+
t = type.new
|
33
|
+
tests = [ nil, [], [nil], [nil,nil], {}, {:eq=>nil}, {nil=>nil}]
|
34
|
+
tests.each do | test |
|
35
|
+
assert_raise( Momomoto::Error ) do
|
36
|
+
t.compile_rule( :field_name, test )
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_operator_sign
|
43
|
+
DATATYPES.each do | type |
|
44
|
+
assert_equal( '<=', type.operator_sign( :le ) )
|
45
|
+
assert_equal( '<', type.operator_sign( :lt ) )
|
46
|
+
assert_equal( '>=', type.operator_sign( :ge ) )
|
47
|
+
assert_equal( '>', type.operator_sign( :gt ) )
|
48
|
+
assert_equal( '=', type.operator_sign( :eq ) )
|
49
|
+
assert_equal( '<>', type.operator_sign( :ne ) )
|
50
|
+
assert_raise( Momomoto::CriticalError ) { type.operator_sign( :foo ) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_escape
|
55
|
+
DATATYPES.each do | type |
|
56
|
+
t = type.new
|
57
|
+
assert_equal( 'NULL', t.escape( nil ))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
data/test/test_date.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
class TestDate < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_date'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_samples
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_date'
|
17
|
+
[ Date.parse("2005-5-23"), ::Date.today].each do | value |
|
18
|
+
r = c.new( :data => value )
|
19
|
+
assert_equal( value, r.data )
|
20
|
+
r.write
|
21
|
+
r2 = c.select(:id=>r.id).first
|
22
|
+
assert_equal( value, r2.data )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_string_conversion
|
27
|
+
c = Class.new( Momomoto::Table )
|
28
|
+
c.table_name = 'test_date'
|
29
|
+
[ "2005-5-23", "2006-06-06"].each do | value |
|
30
|
+
r = c.new( :data => value )
|
31
|
+
assert_equal( Date.parse( value ), r.data )
|
32
|
+
r.write
|
33
|
+
r2 = c.select(:id=>r.id).first
|
34
|
+
assert_equal( Date.parse( value ), r2.data )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_invalid_dates
|
39
|
+
c = Class.new( Momomoto::Table )
|
40
|
+
c.table_name = 'test_date'
|
41
|
+
[ "2005-5-43", "2006-16-06"].each do | value |
|
42
|
+
r = c.new
|
43
|
+
assert_raise( Momomoto::ConversionError ) do
|
44
|
+
r.data = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
data/test/test_inet.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class TestInet < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_inet'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_samples
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_inet'
|
17
|
+
[ '127.0.0.1', '172.22.64.1', '::1' ].each do | value |
|
18
|
+
r = c.new( :data => value )
|
19
|
+
assert_equal( value, r.data )
|
20
|
+
r.write
|
21
|
+
r2 = c.select(:id=>r.id).first
|
22
|
+
assert_equal( value, r2.data )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
class TestInformationSchema < Test::Unit::TestCase
|
3
|
+
|
4
|
+
# test for working information_schema.columns class
|
5
|
+
def test_information_schema_columns
|
6
|
+
a = Momomoto::Information_schema::Columns.select(:table_schema => 'pg_catalog', :table_name => 'pg_tables')
|
7
|
+
assert_operator( 0, :<, a.length )
|
8
|
+
end
|
9
|
+
|
10
|
+
# test for working information_schema.key_column_usage class
|
11
|
+
def test_information_schema_key_column_usage
|
12
|
+
a = Momomoto::Information_schema::Key_column_usage.select(:table_schema => 'pg_catalog', :table_name => 'pg_class')
|
13
|
+
assert_equal( 0, a.length )
|
14
|
+
a = Momomoto::Information_schema::Key_column_usage.select(:table_schema => 'public')
|
15
|
+
assert_operator( 0, :<, a.length )
|
16
|
+
end
|
17
|
+
|
18
|
+
# test for working information_schema.table_constraints class
|
19
|
+
def test_information_schema_table_constraints
|
20
|
+
a = Momomoto::Information_schema::Table_constraints.select(:table_schema => 'pg_catalog', :table_name => 'pg_class')
|
21
|
+
assert_equal( 0, a.length )
|
22
|
+
a = Momomoto::Information_schema::Table_constraints.select(:table_schema => 'public')
|
23
|
+
assert_operator( 0, :<, a.length )
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
class TestInteger < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_samples
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_integer'
|
7
|
+
[nil,1,2,2147483647].each do | number |
|
8
|
+
r = c.new( :data => number )
|
9
|
+
assert_equal( number, r.data )
|
10
|
+
r.write
|
11
|
+
r2 = c.select(:id=>r.id).first
|
12
|
+
assert_equal( number, r2.data )
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_invalid
|
17
|
+
c = Class.new( Momomoto::Table )
|
18
|
+
c.table_name = 'test_integer'
|
19
|
+
[ "2005-5-43", "a"].each do | value |
|
20
|
+
r = c.new
|
21
|
+
assert_raise( Momomoto::ConversionError ) do
|
22
|
+
r.data = value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_compile_rule
|
28
|
+
t = Momomoto::Datatype::Integer.new
|
29
|
+
input = [ 1, '1', [1], ['1'], [1,2,3],['1','2','3'], {:eq=>1}, {:eq=>'1'}, {:lt=>10, :gt=>5}, {:lt=>'10', :gt=>'5'} ]
|
30
|
+
|
31
|
+
input.each do | test_input |
|
32
|
+
assert_instance_of( String, t.compile_rule( :field, test_input ) )
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
class TestInterval < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_nil
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_interval'
|
7
|
+
r = c.new( :data => nil )
|
8
|
+
assert_equal( nil, r.data )
|
9
|
+
r.write
|
10
|
+
r2 = c.select( :id => r.id ).first
|
11
|
+
assert_equal( nil, r2.data )
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_invalid
|
15
|
+
c = Class.new( Momomoto::Table )
|
16
|
+
c.table_name = 'test_interval'
|
17
|
+
[ :x, 2.3 ].each do | value |
|
18
|
+
r = c.new
|
19
|
+
assert_raise( Momomoto::ConversionError ) do
|
20
|
+
r.data = value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_samples
|
26
|
+
c = Class.new( Momomoto::Table )
|
27
|
+
c.table_name = 'test_interval'
|
28
|
+
[Time.parse("00:00:00"), Time.parse("01:00:00"), Time.parse("23:00:00")].each do | number |
|
29
|
+
r = c.new( :data => number )
|
30
|
+
assert_equal( number, r.data )
|
31
|
+
r.write
|
32
|
+
r2 = c.select(:id=>r.id).first
|
33
|
+
assert_equal( number, r2.data )
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
data/test/test_join.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
class Person < Momomoto::Table; end
|
3
|
+
class Event_Person < Momomoto::Table; end
|
4
|
+
|
5
|
+
class TestJoin < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_initialize
|
8
|
+
a = Momomoto::Join.new( Person, {Event_Person=>:person_id})
|
9
|
+
assert_equal( true, a.respond_to?( :event_person ) )
|
10
|
+
assert_equal( true, a.respond_to?( :person ) )
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_select
|
14
|
+
a = Momomoto::Join.new( Person, {Event_Person=>:person_id})
|
15
|
+
a.select
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
class TestNumeric < Test::Unit::TestCase
|
3
|
+
|
4
|
+
def test_samples
|
5
|
+
c = Class.new( Momomoto::Table )
|
6
|
+
c.table_name = 'test_numeric'
|
7
|
+
[nil,1.0,1.5,2.0,2.3].each do | number |
|
8
|
+
number = BigDecimal.new(number.to_s)
|
9
|
+
r = c.new( :data => number )
|
10
|
+
assert_equal( number, r.data )
|
11
|
+
r.write
|
12
|
+
r2 = c.select(:id=>r.id).first
|
13
|
+
assert_equal( number, r2.data )
|
14
|
+
assert( number == r2.data )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_invalid
|
19
|
+
c = Class.new( Momomoto::Table )
|
20
|
+
c.table_name = 'test_numeric'
|
21
|
+
[ "2005-5-43", "a"].each do | value |
|
22
|
+
r = c.new
|
23
|
+
assert_raise( Momomoto::ConversionError ) do
|
24
|
+
r.data = value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|