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.
Files changed (65) hide show
  1. data/LICENSE +340 -0
  2. data/Rakefile +38 -0
  3. data/lib/momomoto.rb +5 -0
  4. data/lib/momomoto/base.rb +162 -0
  5. data/lib/momomoto/database.rb +179 -0
  6. data/lib/momomoto/datatype.rb +20 -0
  7. data/lib/momomoto/datatype/base.rb +78 -0
  8. data/lib/momomoto/datatype/bigint.rb +9 -0
  9. data/lib/momomoto/datatype/boolean.rb +23 -0
  10. data/lib/momomoto/datatype/bytea.rb +13 -0
  11. data/lib/momomoto/datatype/character.rb +7 -0
  12. data/lib/momomoto/datatype/character_varying.rb +7 -0
  13. data/lib/momomoto/datatype/date.rb +22 -0
  14. data/lib/momomoto/datatype/inet.rb +14 -0
  15. data/lib/momomoto/datatype/integer.rb +16 -0
  16. data/lib/momomoto/datatype/interval.rb +30 -0
  17. data/lib/momomoto/datatype/numeric.rb +17 -0
  18. data/lib/momomoto/datatype/real.rb +7 -0
  19. data/lib/momomoto/datatype/smallint.rb +7 -0
  20. data/lib/momomoto/datatype/text.rb +24 -0
  21. data/lib/momomoto/datatype/time_with_time_zone.rb +10 -0
  22. data/lib/momomoto/datatype/time_without_time_zone.rb +30 -0
  23. data/lib/momomoto/datatype/timestamp_with_time_zone.rb +7 -0
  24. data/lib/momomoto/datatype/timestamp_without_time_zone.rb +29 -0
  25. data/lib/momomoto/information_schema/columns.rb +45 -0
  26. data/lib/momomoto/information_schema/fetch_procedure_columns.rb +14 -0
  27. data/lib/momomoto/information_schema/fetch_procedure_parameters.rb +14 -0
  28. data/lib/momomoto/information_schema/key_column_usage.rb +19 -0
  29. data/lib/momomoto/information_schema/routines.rb +12 -0
  30. data/lib/momomoto/information_schema/table_constraints.rb +19 -0
  31. data/lib/momomoto/join.rb +66 -0
  32. data/lib/momomoto/momomoto.rb +10 -0
  33. data/lib/momomoto/order.rb +56 -0
  34. data/lib/momomoto/procedure.rb +129 -0
  35. data/lib/momomoto/row.rb +63 -0
  36. data/lib/momomoto/table.rb +251 -0
  37. data/sql/install.sql +10 -0
  38. data/sql/procedures.sql +54 -0
  39. data/sql/types.sql +11 -0
  40. data/test/test_base.rb +17 -0
  41. data/test/test_bigint.rb +26 -0
  42. data/test/test_boolean.rb +30 -0
  43. data/test/test_bytea.rb +35 -0
  44. data/test/test_character.rb +27 -0
  45. data/test/test_character_varying.rb +17 -0
  46. data/test/test_database.rb +63 -0
  47. data/test/test_datatype.rb +62 -0
  48. data/test/test_date.rb +50 -0
  49. data/test/test_inet.rb +27 -0
  50. data/test/test_information_schema.rb +27 -0
  51. data/test/test_integer.rb +37 -0
  52. data/test/test_interval.rb +38 -0
  53. data/test/test_join.rb +19 -0
  54. data/test/test_numeric.rb +30 -0
  55. data/test/test_procedure.rb +75 -0
  56. data/test/test_real.rb +17 -0
  57. data/test/test_row.rb +47 -0
  58. data/test/test_smallint.rb +26 -0
  59. data/test/test_table.rb +233 -0
  60. data/test/test_text.rb +25 -0
  61. data/test/test_time_with_time_zone.rb +17 -0
  62. data/test/test_time_without_time_zone.rb +40 -0
  63. data/test/test_timestamp_with_time_zone.rb +17 -0
  64. data/test/test_timestamp_without_time_zone.rb +28 -0
  65. metadata +116 -0
@@ -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
+