marjoree 0.0.1 → 0.0.9
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/Marjoree.iml +14 -0
- data/README +9 -36
- data/bin/create_marj_structure.rb +75 -0
- data/bin/create_odbc_connections.rb +39 -0
- data/bin/odbc_connection_finder.rb +46 -0
- data/examples/contains_example.rb +1 -1
- data/examples/count_and_insert_example.rb +1 -1
- data/examples/select_example.rb +1 -1
- data/html/classes/ExpectedResultSet.html +60 -33
- data/html/classes/ExpectedResultSet.src/M000002.html +6 -5
- data/html/classes/ExpectedResultSet.src/M000003.html +5 -5
- data/html/classes/ExpectedResultSet.src/M000004.html +5 -5
- data/html/classes/ExpectedResultSet.src/M000005.html +18 -0
- data/html/classes/ExpectedResultSet.src/M000006.html +24 -0
- data/html/classes/ExpectedResultSet.src/M000007.html +23 -0
- data/html/classes/ExpectedResultSet.src/M000008.html +29 -0
- data/html/classes/Fixnum.html +287 -0
- data/html/classes/Fixnum.src/M000031.html +18 -0
- data/html/classes/Fixnum.src/M000034.html +18 -0
- data/html/classes/Fixnum.src/M000037.html +18 -0
- data/html/classes/Fixnum.src/M000039.html +18 -0
- data/html/classes/Fixnum.src/M000041.html +18 -0
- data/html/classes/Hash.html +156 -0
- data/html/classes/Hash.src/M000009.html +21 -0
- data/html/classes/Hash.src/M000010.html +20 -0
- data/html/classes/Marjoree.html +268 -151
- data/html/classes/Marjoree.src/M000057.html +19 -0
- data/html/classes/Marjoree.src/M000058.html +18 -0
- data/html/classes/{ExpectedResultSet.src/M000001.html → Marjoree.src/M000059.html} +4 -4
- data/html/classes/Marjoree.src/{M000024.html → M000060.html} +4 -4
- data/html/classes/Marjoree.src/{M000031.html → M000061.html} +4 -4
- data/html/classes/Marjoree.src/{M000026.html → M000062.html} +3 -3
- data/html/classes/Marjoree.src/{M000027.html → M000063.html} +3 -3
- data/html/classes/Marjoree.src/{M000028.html → M000064.html} +3 -3
- data/html/classes/Marjoree.src/{M000029.html → M000065.html} +5 -6
- data/html/classes/Marjoree.src/{M000030.html → M000066.html} +5 -5
- data/html/classes/Marjoree.src/M000067.html +19 -0
- data/html/classes/Marjoree.src/{M000032.html → M000068.html} +3 -3
- data/html/classes/{ResultSetWrapper.src/M000009.html → Marjoree.src/M000069.html} +4 -4
- data/html/classes/{ResultSetWrapper.src/M000010.html → Marjoree.src/M000070.html} +4 -4
- data/html/classes/{ResultSetWrapper.src/M000011.html → Marjoree.src/M000071.html} +4 -4
- data/html/classes/Marjoree.src/M000072.html +20 -0
- data/html/classes/Marjoree.src/M000073.html +20 -0
- data/html/classes/Marjoree.src/M000074.html +20 -0
- data/html/classes/Marjoree.src/{M000033.html → M000075.html} +3 -3
- data/html/classes/Marjoree.src/{M000034.html → M000076.html} +4 -4
- data/html/classes/Marjoree.src/{M000035.html → M000077.html} +2 -2
- data/html/classes/Marjoree.src/{M000036.html → M000078.html} +4 -3
- data/html/classes/Marjoree.src/{M000037.html → M000079.html} +1 -1
- data/html/classes/Marjoree.src/{M000038.html → M000080.html} +3 -3
- data/html/classes/Marjoree.src/{M000039.html → M000081.html} +3 -4
- data/html/classes/Marjoree.src/{M000040.html → M000082.html} +3 -3
- data/html/classes/Marjoree.src/{M000041.html → M000083.html} +3 -3
- data/html/classes/{ResultSetWrapper.src/M000008.html → Marjoree.src/M000084.html} +4 -4
- data/html/classes/ODBC.html +4 -0
- data/html/classes/ODBC/Error.html +12 -12
- data/html/classes/ODBC/Error.src/M000047.html +21 -0
- data/html/classes/ODBC/Error.src/{M000021.html → M000048.html} +2 -2
- data/html/classes/ODBC/TimeStamp.html +48 -18
- data/html/classes/ODBC/TimeStamp.src/{M000017.html → M000042.html} +2 -2
- data/html/classes/ODBC/TimeStamp.src/M000043.html +22 -0
- data/html/classes/ODBC/TimeStamp.src/{M000019.html → M000044.html} +2 -3
- data/html/classes/ODBC/TimeStamp.src/M000045.html +18 -0
- data/html/classes/ODBC/TimeStamp.src/M000046.html +18 -0
- data/html/classes/OdbcConnectionWrapper.html +244 -0
- data/html/classes/OdbcConnectionWrapper.src/M000023.html +18 -0
- data/html/classes/OdbcConnectionWrapper.src/M000024.html +18 -0
- data/html/classes/OdbcConnectionWrapper.src/M000025.html +22 -0
- data/html/classes/OdbcConnectionWrapper.src/M000026.html +25 -0
- data/html/classes/OdbcConnectionWrapper.src/M000027.html +20 -0
- data/html/classes/OdbcConnectionWrapper.src/M000028.html +28 -0
- data/html/classes/OdbcConnectionWrapper.src/M000029.html +24 -0
- data/html/classes/OdbcConnectionWrapper.src/M000030.html +30 -0
- data/html/classes/{ResultSetWrapper.html → ResultSet.html} +71 -94
- data/html/classes/ResultSet.src/M000011.html +27 -0
- data/html/classes/ResultSet.src/M000012.html +21 -0
- data/html/classes/ResultSet.src/M000013.html +23 -0
- data/html/classes/ResultSet.src/M000014.html +18 -0
- data/html/classes/ResultSet.src/M000015.html +18 -0
- data/html/classes/ResultSet.src/M000016.html +18 -0
- data/html/classes/ResultSet.src/M000017.html +18 -0
- data/html/classes/ResultSet.src/M000018.html +20 -0
- data/html/classes/ResultSet.src/M000019.html +18 -0
- data/html/classes/ResultSet.src/M000020.html +22 -0
- data/html/classes/ResultSet.src/M000021.html +23 -0
- data/html/classes/ResultSet.src/M000022.html +22 -0
- data/html/classes/Test.html +107 -0
- data/html/classes/Test/Unit.html +107 -0
- data/html/classes/Test/Unit/TestCase.html +257 -0
- data/html/classes/Test/Unit/TestCase.src/M000049.html +18 -0
- data/html/classes/Test/Unit/TestCase.src/M000050.html +18 -0
- data/html/classes/Test/Unit/TestCase.src/M000051.html +17 -0
- data/html/classes/Test/Unit/TestCase.src/M000052.html +17 -0
- data/html/classes/Test/Unit/TestCase.src/M000053.html +25 -0
- data/html/classes/Test/Unit/TestCase.src/M000054.html +18 -0
- data/html/classes/Test/Unit/TestCase.src/M000055.html +18 -0
- data/html/classes/Test/Unit/TestCase.src/M000056.html +35 -0
- data/html/created.rid +1 -1
- data/html/files/README.html +2 -51
- data/html/files/lib/expected_result_set_rb.html +1 -16
- data/html/files/lib/marjoree/core_rb.html +111 -0
- data/html/files/lib/marjoree/fixtures_rb.html +111 -0
- data/html/files/lib/marjoree/odbc_connection_wrapper_rb.html +109 -0
- data/html/files/lib/marjoree/odbc_rb.html +108 -0
- data/html/files/lib/{odbc_overrides_rb.html → marjoree/result_set_rb.html} +5 -5
- data/html/files/lib/{result_set_wrapper_rb.html → marjoree/time_rb.html} +5 -5
- data/html/files/lib/marjoree_rb.html +3 -4
- data/html/files/lib/run_marjoree_rb.html +145 -0
- data/html/files/lib/run_marjoree_rb.src/M000001.html +34 -0
- data/html/fr_class_index.html +7 -1
- data/html/fr_file_index.html +7 -2
- data/html/fr_method_index.html +84 -42
- data/lib/Marjoree.iml +12 -0
- data/lib/expected_result_set.rb +51 -24
- data/lib/marjoree.rb +2 -344
- data/lib/marjoree/core.rb +388 -0
- data/lib/marjoree/fixtures.rb +156 -0
- data/lib/marjoree/odbc.rb +45 -0
- data/lib/marjoree/odbc_connection_wrapper.rb +79 -0
- data/lib/marjoree/result_set.rb +165 -0
- data/lib/marjoree/sybase_definitions.rb +223 -0
- data/lib/marjoree/time.rb +31 -0
- data/lib/proc_param_info.txt +20 -0
- data/lib/run_marjoree.rb +31 -0
- data/pkg/marjoree-0.0.9.gem +0 -0
- data/rakefile.rb +3 -3
- data/tests/all_cruby_tests.rb +24 -0
- data/tests/all_jruby_tests.rb +22 -0
- data/tests/all_tests.rb +9 -6
- data/tests/fixtures/A.yml +3 -0
- data/tests/fixtures/B.yml +5 -0
- data/tests/fixtures/first_db/FIRST.yml +8 -0
- data/tests/fixtures/second_db/SECOND.yml +9 -0
- data/tests/marjoree/test_assert_results.rb +82 -0
- data/tests/marjoree/test_connection_details.rb +44 -0
- data/tests/{test_contains.rb → marjoree/test_contains.rb} +0 -0
- data/tests/{test_delete.rb → marjoree/test_delete.rb} +0 -0
- data/tests/marjoree/test_drop_user_objects.rb +52 -0
- data/tests/marjoree/test_expected_result_set.rb +111 -0
- data/tests/marjoree/test_fixtures.rb +112 -0
- data/tests/{test_insert.rb → marjoree/test_insert.rb} +0 -0
- data/tests/{test_marjoree.rb → marjoree/test_marjoree.rb} +14 -2
- data/tests/marjoree/test_multiple_db_fixtures.rb +35 -0
- data/tests/{test_num_rows.rb → marjoree/test_num_rows.rb} +0 -0
- data/tests/marjoree/test_odbc_connection_wrapper.rb +47 -0
- data/tests/{test_result_set_wrapper.rb → marjoree/test_result_set_wrapper.rb} +8 -8
- data/tests/marjoree/test_select.rb +55 -0
- data/tests/marjoree/test_single_odbc_connection_wrapper.rb +39 -0
- data/tests/{test_sproc.rb → marjoree/test_sproc.rb} +3 -4
- data/tests/marjoree/test_time.rb +25 -0
- data/tests/{test_time_stamp.rb → marjoree/test_time_stamp.rb} +10 -1
- data/tests/{test_truncate.rb → marjoree/test_truncate.rb} +0 -0
- data/tests/{test_update.rb → marjoree/test_update.rb} +14 -14
- data/tests/multiple_odbc_config/connections.yml +13 -0
- data/tests/single_odbc_config/connections.yml +3 -0
- metadata +214 -112
- data/html/classes/Marjoree.src/M000022.html +0 -19
- data/html/classes/Marjoree.src/M000023.html +0 -20
- data/html/classes/Marjoree.src/M000025.html +0 -18
- data/html/classes/Marjoree.src/M000042.html +0 -25
- data/html/classes/ODBC/Error.src/M000020.html +0 -21
- data/html/classes/ODBC/TimeStamp.src/M000018.html +0 -22
- data/html/classes/ResultSetWrapper.src/M000005.html +0 -27
- data/html/classes/ResultSetWrapper.src/M000006.html +0 -24
- data/html/classes/ResultSetWrapper.src/M000007.html +0 -23
- data/html/classes/ResultSetWrapper.src/M000012.html +0 -20
- data/html/classes/ResultSetWrapper.src/M000013.html +0 -18
- data/html/classes/ResultSetWrapper.src/M000014.html +0 -22
- data/html/classes/ResultSetWrapper.src/M000015.html +0 -23
- data/html/classes/ResultSetWrapper.src/M000016.html +0 -27
- data/lib/odbc_overrides.rb +0 -33
- data/lib/result_set_wrapper.rb +0 -193
- data/tests/test_expected_result_set.rb +0 -40
- data/tests/test_select.rb +0 -30
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require 'test/unit'
|
|
2
2
|
require 'odbc'
|
|
3
|
-
require '
|
|
3
|
+
require 'marjoree/result_set'
|
|
4
4
|
|
|
5
|
-
class
|
|
5
|
+
class TestResultSet < Test::Unit::TestCase
|
|
6
6
|
include Marjoree
|
|
7
7
|
|
|
8
8
|
class StubStatement
|
|
@@ -27,7 +27,7 @@ class TestResultSetWrapper < Test::Unit::TestCase
|
|
|
27
27
|
|
|
28
28
|
statement_rows = [{"id"=>1},{"id"=>2},{"id"=>3},{"id"=>4},{"id"=>5},{"id"=>6}]
|
|
29
29
|
@statement = StubStatement.new( statement_rows )
|
|
30
|
-
@result_set =
|
|
30
|
+
@result_set = ResultSet.new @statement
|
|
31
31
|
load_sproc 'test_sproc.sp'
|
|
32
32
|
load_sproc 'test_sproc_with_output_params.sp'
|
|
33
33
|
end
|
|
@@ -88,7 +88,7 @@ class TestResultSetWrapper < Test::Unit::TestCase
|
|
|
88
88
|
def test_sunny_case_with_larger_map
|
|
89
89
|
result_set_rows = [{"id" => 1, "value" => 'Hello'}]
|
|
90
90
|
expected_row = {:id => 1, :value => 'Hello' }
|
|
91
|
-
@result_set =
|
|
91
|
+
@result_set = ResultSet.new( StubStatement.new( result_set_rows ) )
|
|
92
92
|
|
|
93
93
|
assert( @result_set.contains?( expected_row ) )
|
|
94
94
|
end
|
|
@@ -96,7 +96,7 @@ class TestResultSetWrapper < Test::Unit::TestCase
|
|
|
96
96
|
def test_sunny_case_with_subset_of_larger_map
|
|
97
97
|
result_set_rows = [{"id" => 1, "value" => 'Hello'}]
|
|
98
98
|
expected_row = {:id => 1 }
|
|
99
|
-
@result_set =
|
|
99
|
+
@result_set = ResultSet.new( StubStatement.new( result_set_rows ) )
|
|
100
100
|
|
|
101
101
|
assert( @result_set.contains?( expected_row ) )
|
|
102
102
|
end
|
|
@@ -104,7 +104,7 @@ class TestResultSetWrapper < Test::Unit::TestCase
|
|
|
104
104
|
def test_invalid_case_with_larger_map
|
|
105
105
|
result_set_rows = [{"id" => 1, "value" => 'Hello'}]
|
|
106
106
|
unexpected_row = {"id" => 1, "value" => 'Monkey Hell' }
|
|
107
|
-
@result_set =
|
|
107
|
+
@result_set = ResultSet.new( StubStatement.new( result_set_rows ) )
|
|
108
108
|
|
|
109
109
|
assert( !@result_set.contains?( unexpected_row ) )
|
|
110
110
|
end
|
|
@@ -140,7 +140,7 @@ class TestResultSetWrapper < Test::Unit::TestCase
|
|
|
140
140
|
result_set_rows = [{"first" => 1, "second" => 'first row', "third" => "first value"},
|
|
141
141
|
{"first" => 2, "second" => 'second row', "third" => "second value"}]
|
|
142
142
|
|
|
143
|
-
@result_set =
|
|
143
|
+
@result_set = ResultSet.new( StubStatement.new( result_set_rows ) )
|
|
144
144
|
|
|
145
145
|
expected = "| third | second | first |"
|
|
146
146
|
expected << "\n -------------- ------------ ------- "
|
|
@@ -155,7 +155,7 @@ class TestResultSetWrapper < Test::Unit::TestCase
|
|
|
155
155
|
|
|
156
156
|
def load_sproc( sproc_name )
|
|
157
157
|
dir = File.dirname(__FILE__)
|
|
158
|
-
sproc_contents = IO.readlines( "#{dir}
|
|
158
|
+
sproc_contents = IO.readlines( "#{dir}/../sprocs/#{sproc_name}" ).join
|
|
159
159
|
$db.do sproc_contents
|
|
160
160
|
end
|
|
161
161
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
|
|
3
|
+
class TestSelect < Test::Unit::TestCase
|
|
4
|
+
include Marjoree
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
$db.do( "CREATE TABLE TEST_TABLE( id int NOT NULL, value int NOT NULL )" )
|
|
8
|
+
$db.do( "INSERT INTO TEST_TABLE ( id, value ) VALUES( 0, 10 )" )
|
|
9
|
+
$db.do( "INSERT INTO TEST_TABLE ( id, value ) VALUES( 1, 11 )" )
|
|
10
|
+
$db.do( "CREATE VIEW VW_TEST_TABLE AS SELECT * FROM TEST_TABLE" )
|
|
11
|
+
load_sproc 'test_sproc.sp'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_select
|
|
15
|
+
result_set = select( "TEST_TABLE" )
|
|
16
|
+
|
|
17
|
+
assert_equal( 2, result_set.count )
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_select_with_bad_table
|
|
21
|
+
begin
|
|
22
|
+
resultSet = select( "TABLE_NOT_INT_DB" )
|
|
23
|
+
fail
|
|
24
|
+
rescue ODBC::Error
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_get_user_tables
|
|
29
|
+
assert get_user_tables.include?( "TEST_TABLE" )
|
|
30
|
+
assert !get_user_tables.include?( "MADE_UP_TABLE" )
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_get_user_tables
|
|
34
|
+
assert get_user_views.include?( "VW_TEST_TABLE" )
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def test_get_user_sprocs
|
|
38
|
+
assert get_user_sprocs.include?( "test_sproc" )
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def teardown
|
|
42
|
+
$db.do( "DROP PROCEDURE test_sproc" )
|
|
43
|
+
$db.do( "DROP VIEW VW_TEST_TABLE" )
|
|
44
|
+
$db.do( "TRUNCATE TABLE TEST_TABLE" )
|
|
45
|
+
$db.do( "DROP TABLE TEST_TABLE" )
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def load_sproc( sproc_name )
|
|
51
|
+
dir = File.dirname(__FILE__)
|
|
52
|
+
sproc_contents = IO.readlines( "#{dir}/../sprocs/#{sproc_name}" ).join
|
|
53
|
+
$db.do sproc_contents
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'marjoree/odbc_connection_wrapper'
|
|
3
|
+
|
|
4
|
+
class TestSingleOdbcConnectionWrapper < Test::Unit::TestCase
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@original_odbc_config_path = OdbcConnectionWrapper.odbc_config_path
|
|
8
|
+
OdbcConnectionWrapper.odbc_config_path = './tests/single_odbc_config/connections.yml'
|
|
9
|
+
|
|
10
|
+
@testee = OdbcConnectionWrapper.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test_single_db_connection
|
|
14
|
+
@testee.connect_me_to( "first_db" )
|
|
15
|
+
@testee.execute( "CREATE TABLE WRAPPER_TEST_TABLE( id INT )")
|
|
16
|
+
assert( table_in_db?( "WRAPPER_TEST_TABLE" ) )
|
|
17
|
+
|
|
18
|
+
@testee.connect_me_to( "default" )
|
|
19
|
+
assert( table_in_db?( "WRAPPER_TEST_TABLE" ) )
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def teardown
|
|
23
|
+
@testee.connect_me_to( "first_db" )
|
|
24
|
+
@testee.execute( "DROP TABLE WRAPPER_TEST_TABLE" ) if ( table_in_db?( "WRAPPER_TEST_TABLE" ) )
|
|
25
|
+
@testee.disconnect_me
|
|
26
|
+
OdbcConnectionWrapper.odbc_config_path = @original_odbc_config_path
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def table_in_db?( table_name )
|
|
32
|
+
result_set = @testee.execute( "SELECT * FROM sysobjects WHERE type = 'U'" )
|
|
33
|
+
object_names = []
|
|
34
|
+
result_set.hashes.each do |row|
|
|
35
|
+
object_names << row[:name]
|
|
36
|
+
end
|
|
37
|
+
return object_names.include?( table_name )
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -22,7 +22,7 @@ class TestSproc < Test::Unit::TestCase
|
|
|
22
22
|
expectedResultSet.rows << [1, 11]
|
|
23
23
|
|
|
24
24
|
result_set = run_sproc( "test_sproc" )
|
|
25
|
-
assert( result_set.is_a?(
|
|
25
|
+
assert( result_set.is_a?( ResultSet ) )
|
|
26
26
|
assert_results( expectedResultSet, result_set )
|
|
27
27
|
end
|
|
28
28
|
|
|
@@ -57,8 +57,7 @@ class TestSproc < Test::Unit::TestCase
|
|
|
57
57
|
sql << "EXEC test_sproc_with_output_params @output_number = @number output, @output_text = @text output \n"
|
|
58
58
|
sql << "select @number \n"
|
|
59
59
|
sql << "select @text \n"
|
|
60
|
-
|
|
61
|
-
results = ResultSetWrapper.new( response, ["@output_number", "@output_text" ] )
|
|
60
|
+
results = execute( sql, ["@output_number", "@output_text" ] )
|
|
62
61
|
|
|
63
62
|
assert_equal( 15, results.output_number )
|
|
64
63
|
assert_equal( 'results', results.output_text )
|
|
@@ -93,7 +92,7 @@ class TestSproc < Test::Unit::TestCase
|
|
|
93
92
|
|
|
94
93
|
def load_sproc( sproc_name )
|
|
95
94
|
dir = File.dirname(__FILE__)
|
|
96
|
-
sproc_contents = IO.readlines( "#{dir}
|
|
95
|
+
sproc_contents = IO.readlines( "#{dir}/../sprocs/#{sproc_name}" ).join
|
|
97
96
|
$db.do sproc_contents
|
|
98
97
|
end
|
|
99
98
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'marjoree/time'
|
|
3
|
+
|
|
4
|
+
class TestTime < Test::Unit::TestCase
|
|
5
|
+
def test_secs
|
|
6
|
+
assert_equal 10, 10.secs
|
|
7
|
+
assert_equal 1, 1.sec
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_mins
|
|
11
|
+
assert_equal 60, 1.min
|
|
12
|
+
assert_equal 300, 5.mins
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def test_hours
|
|
16
|
+
assert_equal 3600, 1.hour
|
|
17
|
+
assert_equal 36000, 10.hours
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_ago
|
|
21
|
+
tolerance = 1.sec
|
|
22
|
+
expected = Time.new - 3600
|
|
23
|
+
assert (expected - 1.hour.ago).abs < tolerance
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'test/unit'
|
|
2
|
+
require 'time'
|
|
2
3
|
|
|
3
4
|
class TestTimeStamp < Test::Unit::TestCase
|
|
4
5
|
include Marjoree
|
|
@@ -39,13 +40,21 @@ class TestTimeStamp < Test::Unit::TestCase
|
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
def test_from_date
|
|
42
|
-
date = Time.parse '10/10/06'
|
|
43
|
+
date = Time.parse '10/10/06 15:30:35'
|
|
43
44
|
|
|
44
45
|
testee = ODBC::TimeStamp.from_date(date)
|
|
45
46
|
|
|
46
47
|
assert_equal '2006-10-10 00:00:00', testee.to_s
|
|
47
48
|
end
|
|
48
49
|
|
|
50
|
+
def test_from_time
|
|
51
|
+
time = Time.parse '10/10/06 15:30:35'
|
|
52
|
+
|
|
53
|
+
testee = ODBC::TimeStamp.from_time(time)
|
|
54
|
+
|
|
55
|
+
assert_equal '2006-10-10 15:30:35', testee.to_s
|
|
56
|
+
end
|
|
57
|
+
|
|
49
58
|
def teardown
|
|
50
59
|
$db.do( "DROP TABLE TEST_TABLE" )
|
|
51
60
|
end
|
|
File without changes
|
|
@@ -4,30 +4,30 @@ class TestUpdateOnMarjoree < Test::Unit::TestCase
|
|
|
4
4
|
include Marjoree
|
|
5
5
|
|
|
6
6
|
def setup
|
|
7
|
-
$db.do( "CREATE TABLE TEST_TABLE( id int NOT NULL, value
|
|
8
|
-
$db.do( "INSERT INTO TEST_TABLE ( id, value ) VALUES( 0,
|
|
9
|
-
$db.do( "INSERT INTO TEST_TABLE ( id, value ) VALUES( 1,
|
|
7
|
+
$db.do( "CREATE TABLE TEST_TABLE( id int NOT NULL, value varchar(20) NOT NULL )" )
|
|
8
|
+
$db.do( "INSERT INTO TEST_TABLE ( id, value ) VALUES( 0, 'stuff' )" )
|
|
9
|
+
$db.do( "INSERT INTO TEST_TABLE ( id, value ) VALUES( 1, 'more stuff' )" )
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def test_update
|
|
13
|
-
assert( contains?( "TEST_TABLE", :id => 0, :value =>
|
|
13
|
+
assert( contains?( "TEST_TABLE", :id => 0, :value => 'stuff' ) )
|
|
14
14
|
|
|
15
|
-
update( "TEST_TABLE", { :id => 0 }, :value =>
|
|
16
|
-
assert( !contains?( "TEST_TABLE", :id => 0, :value =>
|
|
17
|
-
assert( contains?( "TEST_TABLE", :id => 0, :value =>
|
|
15
|
+
update( "TEST_TABLE", { :id => 0 }, :value => 'more stuff' )
|
|
16
|
+
assert( !contains?( "TEST_TABLE", :id => 0, :value => 'stuff' ) )
|
|
17
|
+
assert( contains?( "TEST_TABLE", :id => 0, :value => 'more stuff' ) )
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def test_update_with_no_where_clause
|
|
21
|
-
assert( contains?( "TEST_TABLE", :id => 0, :value =>
|
|
21
|
+
assert( contains?( "TEST_TABLE", :id => 0, :value => 'stuff' ) )
|
|
22
22
|
|
|
23
|
-
update( "TEST_TABLE", {}, :value =>
|
|
24
|
-
assert( !contains?( "TEST_TABLE", :id => 0, :value =>
|
|
25
|
-
assert( contains?( "TEST_TABLE", :id => 0, :value =>
|
|
23
|
+
update( "TEST_TABLE", {}, :value => 'more stuff' )
|
|
24
|
+
assert( !contains?( "TEST_TABLE", :id => 0, :value => 'stuff' ) )
|
|
25
|
+
assert( contains?( "TEST_TABLE", :id => 0, :value => 'more stuff' ) )
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def test_update_with_bad_table
|
|
29
29
|
begin
|
|
30
|
-
update( "TABLE_NOT_INT_DB", { :id => 0 }, :value =>
|
|
30
|
+
update( "TABLE_NOT_INT_DB", { :id => 0 }, :value => 'more stuff' )
|
|
31
31
|
fail
|
|
32
32
|
rescue ODBC::Error
|
|
33
33
|
end
|
|
@@ -35,7 +35,7 @@ class TestUpdateOnMarjoree < Test::Unit::TestCase
|
|
|
35
35
|
|
|
36
36
|
def test_update_with_bad_column_header
|
|
37
37
|
begin
|
|
38
|
-
update( "TEST_TABLE", { :jimmy => 0 }, :value =>
|
|
38
|
+
update( "TEST_TABLE", { :jimmy => 0 }, :value => 'more stuff' )
|
|
39
39
|
fail
|
|
40
40
|
rescue ODBC::Error
|
|
41
41
|
end
|
|
@@ -43,7 +43,7 @@ class TestUpdateOnMarjoree < Test::Unit::TestCase
|
|
|
43
43
|
|
|
44
44
|
def test_update_with_column_value_type
|
|
45
45
|
begin
|
|
46
|
-
update( "TEST_TABLE", { :id => 'bad' }, :value =>
|
|
46
|
+
update( "TEST_TABLE", { :id => 'bad' }, :value => 'more stuff' )
|
|
47
47
|
fail
|
|
48
48
|
rescue ODBC::Error
|
|
49
49
|
end
|
metadata
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
|
-
rubygems_version: 0.
|
|
2
|
+
rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
|
4
4
|
name: marjoree
|
|
5
5
|
version: !ruby/object:Gem::Version
|
|
6
|
-
version: 0.0.
|
|
7
|
-
date:
|
|
6
|
+
version: 0.0.9
|
|
7
|
+
date: 2008-07-16 00:00:00 +01:00
|
|
8
8
|
summary: Marjoree is the Stored Procedure Testing Library
|
|
9
9
|
require_paths:
|
|
10
|
-
|
|
10
|
+
- lib
|
|
11
11
|
email: jiggypete@googlemail.com
|
|
12
|
-
homepage: http://
|
|
12
|
+
homepage: http://marjoree.rubyforge.org
|
|
13
13
|
rubyforge_project:
|
|
14
14
|
description:
|
|
15
15
|
autorequire:
|
|
@@ -18,120 +18,222 @@ bindir: bin
|
|
|
18
18
|
has_rdoc: true
|
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
20
20
|
requirements:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
version: 0.0.0
|
|
21
|
+
- - ">"
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: 0.0.0
|
|
25
24
|
version:
|
|
26
25
|
platform: ruby
|
|
26
|
+
signing_key:
|
|
27
|
+
cert_chain:
|
|
28
|
+
post_install_message:
|
|
27
29
|
authors:
|
|
28
|
-
|
|
30
|
+
- Peter Aitken, Ian Davies, Gus MacCuish
|
|
29
31
|
files:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
32
|
+
- ./bin
|
|
33
|
+
- ./bin/create_marj_structure.rb
|
|
34
|
+
- ./bin/create_odbc_connections.rb
|
|
35
|
+
- ./bin/odbc_connection_finder.rb
|
|
36
|
+
- ./examples
|
|
37
|
+
- ./examples/contains_example.rb
|
|
38
|
+
- ./examples/count_and_insert_example.rb
|
|
39
|
+
- ./examples/select_example.rb
|
|
40
|
+
- ./html
|
|
41
|
+
- ./html/classes
|
|
42
|
+
- ./html/classes/ExpectedResultSet.html
|
|
43
|
+
- ./html/classes/ExpectedResultSet.src
|
|
44
|
+
- ./html/classes/ExpectedResultSet.src/M000002.html
|
|
45
|
+
- ./html/classes/ExpectedResultSet.src/M000003.html
|
|
46
|
+
- ./html/classes/ExpectedResultSet.src/M000004.html
|
|
47
|
+
- ./html/classes/ExpectedResultSet.src/M000005.html
|
|
48
|
+
- ./html/classes/ExpectedResultSet.src/M000006.html
|
|
49
|
+
- ./html/classes/ExpectedResultSet.src/M000007.html
|
|
50
|
+
- ./html/classes/ExpectedResultSet.src/M000008.html
|
|
51
|
+
- ./html/classes/Fixnum.html
|
|
52
|
+
- ./html/classes/Fixnum.src
|
|
53
|
+
- ./html/classes/Fixnum.src/M000031.html
|
|
54
|
+
- ./html/classes/Fixnum.src/M000034.html
|
|
55
|
+
- ./html/classes/Fixnum.src/M000037.html
|
|
56
|
+
- ./html/classes/Fixnum.src/M000039.html
|
|
57
|
+
- ./html/classes/Fixnum.src/M000041.html
|
|
58
|
+
- ./html/classes/Hash.html
|
|
59
|
+
- ./html/classes/Hash.src
|
|
60
|
+
- ./html/classes/Hash.src/M000009.html
|
|
61
|
+
- ./html/classes/Hash.src/M000010.html
|
|
62
|
+
- ./html/classes/Marjoree.html
|
|
63
|
+
- ./html/classes/Marjoree.src
|
|
64
|
+
- ./html/classes/Marjoree.src/M000057.html
|
|
65
|
+
- ./html/classes/Marjoree.src/M000058.html
|
|
66
|
+
- ./html/classes/Marjoree.src/M000059.html
|
|
67
|
+
- ./html/classes/Marjoree.src/M000060.html
|
|
68
|
+
- ./html/classes/Marjoree.src/M000061.html
|
|
69
|
+
- ./html/classes/Marjoree.src/M000062.html
|
|
70
|
+
- ./html/classes/Marjoree.src/M000063.html
|
|
71
|
+
- ./html/classes/Marjoree.src/M000064.html
|
|
72
|
+
- ./html/classes/Marjoree.src/M000065.html
|
|
73
|
+
- ./html/classes/Marjoree.src/M000066.html
|
|
74
|
+
- ./html/classes/Marjoree.src/M000067.html
|
|
75
|
+
- ./html/classes/Marjoree.src/M000068.html
|
|
76
|
+
- ./html/classes/Marjoree.src/M000069.html
|
|
77
|
+
- ./html/classes/Marjoree.src/M000070.html
|
|
78
|
+
- ./html/classes/Marjoree.src/M000071.html
|
|
79
|
+
- ./html/classes/Marjoree.src/M000072.html
|
|
80
|
+
- ./html/classes/Marjoree.src/M000073.html
|
|
81
|
+
- ./html/classes/Marjoree.src/M000074.html
|
|
82
|
+
- ./html/classes/Marjoree.src/M000075.html
|
|
83
|
+
- ./html/classes/Marjoree.src/M000076.html
|
|
84
|
+
- ./html/classes/Marjoree.src/M000077.html
|
|
85
|
+
- ./html/classes/Marjoree.src/M000078.html
|
|
86
|
+
- ./html/classes/Marjoree.src/M000079.html
|
|
87
|
+
- ./html/classes/Marjoree.src/M000080.html
|
|
88
|
+
- ./html/classes/Marjoree.src/M000081.html
|
|
89
|
+
- ./html/classes/Marjoree.src/M000082.html
|
|
90
|
+
- ./html/classes/Marjoree.src/M000083.html
|
|
91
|
+
- ./html/classes/Marjoree.src/M000084.html
|
|
92
|
+
- ./html/classes/ODBC
|
|
93
|
+
- ./html/classes/ODBC/Error.html
|
|
94
|
+
- ./html/classes/ODBC/Error.src
|
|
95
|
+
- ./html/classes/ODBC/Error.src/M000047.html
|
|
96
|
+
- ./html/classes/ODBC/Error.src/M000048.html
|
|
97
|
+
- ./html/classes/ODBC/TimeStamp.html
|
|
98
|
+
- ./html/classes/ODBC/TimeStamp.src
|
|
99
|
+
- ./html/classes/ODBC/TimeStamp.src/M000042.html
|
|
100
|
+
- ./html/classes/ODBC/TimeStamp.src/M000043.html
|
|
101
|
+
- ./html/classes/ODBC/TimeStamp.src/M000044.html
|
|
102
|
+
- ./html/classes/ODBC/TimeStamp.src/M000045.html
|
|
103
|
+
- ./html/classes/ODBC/TimeStamp.src/M000046.html
|
|
104
|
+
- ./html/classes/ODBC.html
|
|
105
|
+
- ./html/classes/OdbcConnectionWrapper.html
|
|
106
|
+
- ./html/classes/OdbcConnectionWrapper.src
|
|
107
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000023.html
|
|
108
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000024.html
|
|
109
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000025.html
|
|
110
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000026.html
|
|
111
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000027.html
|
|
112
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000028.html
|
|
113
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000029.html
|
|
114
|
+
- ./html/classes/OdbcConnectionWrapper.src/M000030.html
|
|
115
|
+
- ./html/classes/ResultSet.html
|
|
116
|
+
- ./html/classes/ResultSet.src
|
|
117
|
+
- ./html/classes/ResultSet.src/M000011.html
|
|
118
|
+
- ./html/classes/ResultSet.src/M000012.html
|
|
119
|
+
- ./html/classes/ResultSet.src/M000013.html
|
|
120
|
+
- ./html/classes/ResultSet.src/M000014.html
|
|
121
|
+
- ./html/classes/ResultSet.src/M000015.html
|
|
122
|
+
- ./html/classes/ResultSet.src/M000016.html
|
|
123
|
+
- ./html/classes/ResultSet.src/M000017.html
|
|
124
|
+
- ./html/classes/ResultSet.src/M000018.html
|
|
125
|
+
- ./html/classes/ResultSet.src/M000019.html
|
|
126
|
+
- ./html/classes/ResultSet.src/M000020.html
|
|
127
|
+
- ./html/classes/ResultSet.src/M000021.html
|
|
128
|
+
- ./html/classes/ResultSet.src/M000022.html
|
|
129
|
+
- ./html/classes/Test
|
|
130
|
+
- ./html/classes/Test/Unit
|
|
131
|
+
- ./html/classes/Test/Unit/TestCase.html
|
|
132
|
+
- ./html/classes/Test/Unit/TestCase.src
|
|
133
|
+
- ./html/classes/Test/Unit/TestCase.src/M000049.html
|
|
134
|
+
- ./html/classes/Test/Unit/TestCase.src/M000050.html
|
|
135
|
+
- ./html/classes/Test/Unit/TestCase.src/M000051.html
|
|
136
|
+
- ./html/classes/Test/Unit/TestCase.src/M000052.html
|
|
137
|
+
- ./html/classes/Test/Unit/TestCase.src/M000053.html
|
|
138
|
+
- ./html/classes/Test/Unit/TestCase.src/M000054.html
|
|
139
|
+
- ./html/classes/Test/Unit/TestCase.src/M000055.html
|
|
140
|
+
- ./html/classes/Test/Unit/TestCase.src/M000056.html
|
|
141
|
+
- ./html/classes/Test/Unit.html
|
|
142
|
+
- ./html/classes/Test.html
|
|
143
|
+
- ./html/created.rid
|
|
144
|
+
- ./html/files
|
|
145
|
+
- ./html/files/lib
|
|
146
|
+
- ./html/files/lib/expected_result_set_rb.html
|
|
147
|
+
- ./html/files/lib/marjoree
|
|
148
|
+
- ./html/files/lib/marjoree/core_rb.html
|
|
149
|
+
- ./html/files/lib/marjoree/fixtures_rb.html
|
|
150
|
+
- ./html/files/lib/marjoree/odbc_connection_wrapper_rb.html
|
|
151
|
+
- ./html/files/lib/marjoree/odbc_rb.html
|
|
152
|
+
- ./html/files/lib/marjoree/result_set_rb.html
|
|
153
|
+
- ./html/files/lib/marjoree/time_rb.html
|
|
154
|
+
- ./html/files/lib/marjoree_rb.html
|
|
155
|
+
- ./html/files/lib/run_marjoree_rb.html
|
|
156
|
+
- ./html/files/lib/run_marjoree_rb.src
|
|
157
|
+
- ./html/files/lib/run_marjoree_rb.src/M000001.html
|
|
158
|
+
- ./html/files/README.html
|
|
159
|
+
- ./html/fr_class_index.html
|
|
160
|
+
- ./html/fr_file_index.html
|
|
161
|
+
- ./html/fr_method_index.html
|
|
162
|
+
- ./html/index.html
|
|
163
|
+
- ./html/rdoc-style.css
|
|
164
|
+
- ./lib
|
|
165
|
+
- ./lib/expected_result_set.rb
|
|
166
|
+
- ./lib/marjoree
|
|
167
|
+
- ./lib/marjoree/core.rb
|
|
168
|
+
- ./lib/marjoree/fixtures.rb
|
|
169
|
+
- ./lib/marjoree/odbc.rb
|
|
170
|
+
- ./lib/marjoree/odbc_connection_wrapper.rb
|
|
171
|
+
- ./lib/marjoree/result_set.rb
|
|
172
|
+
- ./lib/marjoree/sybase_definitions.rb
|
|
173
|
+
- ./lib/marjoree/time.rb
|
|
174
|
+
- ./lib/Marjoree.iml
|
|
175
|
+
- ./lib/marjoree.rb
|
|
176
|
+
- ./lib/proc_param_info.txt
|
|
177
|
+
- ./lib/run_marjoree.rb
|
|
178
|
+
- ./Marjoree.iml
|
|
179
|
+
- ./pkg
|
|
180
|
+
- ./pkg/marjoree-0.0.9.gem
|
|
181
|
+
- ./rakefile.rb
|
|
182
|
+
- ./README
|
|
183
|
+
- ./tests
|
|
184
|
+
- ./tests/all_cruby_tests.rb
|
|
185
|
+
- ./tests/all_jruby_tests.rb
|
|
186
|
+
- ./tests/all_tests.rb
|
|
187
|
+
- ./tests/fixtures
|
|
188
|
+
- ./tests/fixtures/A.yml
|
|
189
|
+
- ./tests/fixtures/B.yml
|
|
190
|
+
- ./tests/fixtures/first_db
|
|
191
|
+
- ./tests/fixtures/first_db/FIRST.yml
|
|
192
|
+
- ./tests/fixtures/second_db
|
|
193
|
+
- ./tests/fixtures/second_db/SECOND.yml
|
|
194
|
+
- ./tests/marjoree
|
|
195
|
+
- ./tests/marjoree/test_assert_results.rb
|
|
196
|
+
- ./tests/marjoree/test_connection_details.rb
|
|
197
|
+
- ./tests/marjoree/test_contains.rb
|
|
198
|
+
- ./tests/marjoree/test_delete.rb
|
|
199
|
+
- ./tests/marjoree/test_drop_user_objects.rb
|
|
200
|
+
- ./tests/marjoree/test_expected_result_set.rb
|
|
201
|
+
- ./tests/marjoree/test_fixtures.rb
|
|
202
|
+
- ./tests/marjoree/test_insert.rb
|
|
203
|
+
- ./tests/marjoree/test_marjoree.rb
|
|
204
|
+
- ./tests/marjoree/test_multiple_db_fixtures.rb
|
|
205
|
+
- ./tests/marjoree/test_num_rows.rb
|
|
206
|
+
- ./tests/marjoree/test_odbc_connection_wrapper.rb
|
|
207
|
+
- ./tests/marjoree/test_result_set_wrapper.rb
|
|
208
|
+
- ./tests/marjoree/test_select.rb
|
|
209
|
+
- ./tests/marjoree/test_single_odbc_connection_wrapper.rb
|
|
210
|
+
- ./tests/marjoree/test_sproc.rb
|
|
211
|
+
- ./tests/marjoree/test_time.rb
|
|
212
|
+
- ./tests/marjoree/test_time_stamp.rb
|
|
213
|
+
- ./tests/marjoree/test_truncate.rb
|
|
214
|
+
- ./tests/marjoree/test_update.rb
|
|
215
|
+
- ./tests/multiple_odbc_config
|
|
216
|
+
- ./tests/multiple_odbc_config/connections.yml
|
|
217
|
+
- ./tests/single_odbc_config
|
|
218
|
+
- ./tests/single_odbc_config/connections.yml
|
|
219
|
+
- ./tests/sprocs
|
|
220
|
+
- ./tests/sprocs/test_error_sproc.sp
|
|
221
|
+
- ./tests/sprocs/test_sproc.sp
|
|
222
|
+
- ./tests/sprocs/test_sproc_with_mixed_params.sp
|
|
223
|
+
- ./tests/sprocs/test_sproc_with_output_params.sp
|
|
224
|
+
- ./tests/sprocs/test_sproc_with_params.sp
|
|
225
|
+
- ./tests/sprocs/test_sproc_with_select_and_ops.sp
|
|
131
226
|
test_files: []
|
|
227
|
+
|
|
132
228
|
rdoc_options: []
|
|
229
|
+
|
|
133
230
|
extra_rdoc_files: []
|
|
231
|
+
|
|
134
232
|
executables: []
|
|
233
|
+
|
|
135
234
|
extensions: []
|
|
235
|
+
|
|
136
236
|
requirements: []
|
|
137
|
-
|
|
237
|
+
|
|
238
|
+
dependencies: []
|
|
239
|
+
|