mongify 0.0.4

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 (63) hide show
  1. data/.gitignore +20 -0
  2. data/CHANGELOG.rdoc +22 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +68 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +86 -0
  7. data/Rakefile +73 -0
  8. data/bin/mongify +14 -0
  9. data/features/options.feature +46 -0
  10. data/features/print.feature +10 -0
  11. data/features/process.feature +19 -0
  12. data/features/step_definitions/mongify_steps.rb +42 -0
  13. data/features/step_definitions/mongo_steps.rb +7 -0
  14. data/features/support/env.rb +28 -0
  15. data/lib/mongify.rb +22 -0
  16. data/lib/mongify/cli.rb +8 -0
  17. data/lib/mongify/cli/application.rb +43 -0
  18. data/lib/mongify/cli/help_command.rb +16 -0
  19. data/lib/mongify/cli/options.rb +94 -0
  20. data/lib/mongify/cli/report.rb +11 -0
  21. data/lib/mongify/cli/version_command.rb +18 -0
  22. data/lib/mongify/cli/worker_command.rb +93 -0
  23. data/lib/mongify/configuration.rb +46 -0
  24. data/lib/mongify/database.rb +5 -0
  25. data/lib/mongify/database/base_connection.rb +78 -0
  26. data/lib/mongify/database/column.rb +81 -0
  27. data/lib/mongify/database/no_sql_connection.rb +62 -0
  28. data/lib/mongify/database/sql_connection.rb +61 -0
  29. data/lib/mongify/database/table.rb +74 -0
  30. data/lib/mongify/exceptions.rb +13 -0
  31. data/lib/mongify/translation.rb +55 -0
  32. data/lib/mongify/translation/printer.rb +20 -0
  33. data/lib/mongify/translation/process.rb +61 -0
  34. data/lib/mongify/ui.rb +45 -0
  35. data/lib/mongify/version.rb +3 -0
  36. data/mongify.gemspec +42 -0
  37. data/spec/default.watch +199 -0
  38. data/spec/files/base_configuration.rb +9 -0
  39. data/spec/files/empty_translation.rb +0 -0
  40. data/spec/files/simple_translation.rb +26 -0
  41. data/spec/mongify/cli/application_spec.rb +19 -0
  42. data/spec/mongify/cli/help_command_spec.rb +18 -0
  43. data/spec/mongify/cli/options_spec.rb +62 -0
  44. data/spec/mongify/cli/version_command_spec.rb +24 -0
  45. data/spec/mongify/cli/worker_command_spec.rb +115 -0
  46. data/spec/mongify/configuration_spec.rb +25 -0
  47. data/spec/mongify/database/base_connection_spec.rb +59 -0
  48. data/spec/mongify/database/column_spec.rb +103 -0
  49. data/spec/mongify/database/no_sql_connection_spec.rb +131 -0
  50. data/spec/mongify/database/sql_connection_spec.rb +91 -0
  51. data/spec/mongify/database/table_spec.rb +120 -0
  52. data/spec/mongify/translation/printer_spec.rb +34 -0
  53. data/spec/mongify/translation/process_spec.rb +68 -0
  54. data/spec/mongify/translation_spec.rb +59 -0
  55. data/spec/mongify/ui_spec.rb +73 -0
  56. data/spec/mongify_spec.rb +15 -0
  57. data/spec/spec.opts +1 -0
  58. data/spec/spec_helper.rb +22 -0
  59. data/spec/support/config_reader.rb +21 -0
  60. data/spec/support/database.example +17 -0
  61. data/spec/support/database_output.txt +27 -0
  62. data/spec/support/generate_database.rb +91 -0
  63. metadata +370 -0
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe Mongify::Configuration do
4
+ before(:each) do
5
+ Mongify::Translation.stub(:parse)
6
+ @translation_file = File.expand_path(File.dirname(__FILE__) + '/../files/empty_translation.rb')
7
+ @configuration_file = File.expand_path(File.dirname(__FILE__) + '/../files/base_configuration.rb')
8
+ end
9
+ it "should parse file for transaltion" do
10
+ Mongify::Translation.should_receive(:parse).and_return(true)
11
+ Mongify::Configuration.parse_translation(@translation_file)
12
+ end
13
+
14
+ context "configuration file" do
15
+ it "should parse confg file" do
16
+ Mongify::Configuration.should_receive(:parse).and_return(true)
17
+ Mongify::Configuration.parse_configuration(@configuration_file)
18
+ end
19
+
20
+ it "should validate file exists" do
21
+ lambda { Mongify::Configuration.parse_configuration("../missing_file.rb") }.should raise_error(Mongify::FileNotFound)
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongify::Database::BaseConnection do
4
+ before(:each) do
5
+ @base_connection = Mongify::Database::BaseConnection.new
6
+ end
7
+ it "should set any variable name that's passed" do
8
+ @base_connection = Mongify::Database::BaseConnection.new(:apple => 'blue', :car => 'good')
9
+ @base_connection.instance_variables.should =~ ['@apple', '@car']
10
+ end
11
+
12
+ context "validation" do
13
+ it "should be true" do
14
+ @base_connection.host 'localhost'
15
+ @base_connection.host.should == "localhost"
16
+ @base_connection.should be_valid
17
+ end
18
+
19
+ it "should be false" do
20
+ @base_connection.should_not be_valid
21
+ end
22
+ end
23
+
24
+ it "should raise error when trying to call has_connection?" do
25
+ lambda { @base_connection.has_connection? }.should raise_error(NotImplementedError)
26
+ end
27
+ it "should raise error when trying to call setup_connection_adapter" do
28
+ lambda { @base_connection.setup_connection_adapter}.should raise_error(NotImplementedError)
29
+ end
30
+
31
+ it "should raise error on setting unknown variable setting" do
32
+ lambda{@base_connection.connection = "localhost"}.should raise_error
33
+ end
34
+
35
+ it "should respond to available settings" do
36
+ @base_connection.respond_to?(:host).should be_true
37
+ end
38
+
39
+ it "should force adaptor to a string" do
40
+ @base_connection.adapter :sqlite
41
+ @base_connection.adapter.should == 'sqlite'
42
+ end
43
+
44
+ context "hash" do
45
+ before(:each) do
46
+ @adapter = 'baseDB'
47
+ @host = '127.0.0.1'
48
+ @database = 'test_database'
49
+ end
50
+ it "should give settings in a hash" do
51
+ @sql_connection = Mongify::Database::BaseConnection.new(:adapter => @adapter, :host => @host, :database => @database)
52
+ @sql_connection.to_hash.should == {:adapter => @adapter, :host => @host, :database => @database}
53
+ end
54
+ it "should setup from constructor hash" do
55
+ @sql_connection = Mongify::Database::BaseConnection.new(:adapter => @adapter, :host => @host, :database => @database)
56
+ @sql_connection.to_hash.should == {:adapter => @adapter, :host => @host, :database => @database}
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongify::Database::Column do
4
+ before(:each) do
5
+ @column = Mongify::Database::Column.new('first_name')
6
+ end
7
+
8
+ it "should have name" do
9
+ @column.name.should == 'first_name'
10
+ end
11
+
12
+ it "should get setup options" do
13
+ @column = Mongify::Database::Column.new('account_id', :integer, :references => 'accounts')
14
+ @column.options.should == {'references' => 'accounts'}
15
+ end
16
+
17
+ it "should force type to string if nil" do
18
+ @column = Mongify::Database::Column.new('first_name', nil)
19
+ @column.type.should == :string
20
+ end
21
+
22
+ context "key" do
23
+ it "should be true" do
24
+ @column = Mongify::Database::Column.new('id', :key)
25
+ @column.should be_a_key
26
+ end
27
+
28
+ it "should be true" do
29
+ @column = Mongify::Database::Column.new('first_name', :string)
30
+ @column.should_not be_a_key
31
+ end
32
+ end
33
+
34
+ context "options" do
35
+ it "should allow to be set by name" do
36
+ @column = Mongify::Database::Column.new('first_name')
37
+ @column.references = "users"
38
+ @column.references.should == "users"
39
+ end
40
+
41
+ it "should not allow to be set unless they're in the AVAILABLE_OPTIONS" do
42
+ @column = Mongify::Database::Column.new('first_name')
43
+ lambda { @column.unknown = "users" }.should raise_error(NoMethodError)
44
+ end
45
+ end
46
+
47
+ context "auto_detect" do
48
+ context "id" do
49
+ it "should type to key" do
50
+ @column = Mongify::Database::Column.new('id', :integer)
51
+ @column.type.should == :key
52
+ end
53
+ it "should not set type to key if original type is not integer" do
54
+ @column = Mongify::Database::Column.new('id', :string)
55
+ @column.type.should == :string
56
+ end
57
+ end
58
+
59
+ it "should detect references" do
60
+ @column = Mongify::Database::Column.new('user_id', :integer)
61
+ @column.references.should == "users"
62
+ end
63
+ end
64
+
65
+ context :to_print do
66
+ before(:each) do
67
+ @column = Mongify::Database::Column.new('first_name', :string)
68
+ end
69
+ it "should output column name and type" do
70
+ @column.to_print.should == %Q[column "first_name", :string]
71
+ end
72
+ it "should detect references" do
73
+ @column = Mongify::Database::Column.new('user_id', :integer)
74
+ @column.to_print.should == %Q[column "user_id", :integer, :references => "users"]
75
+ end
76
+ it "should output nil options" do
77
+ @column.default = nil
78
+ @column.to_print.should == %Q[column "first_name", :string]
79
+ end
80
+ end
81
+
82
+ context :reference? do
83
+ it "should be true" do
84
+ @column = Mongify::Database::Column.new('user_id', :integer, :references => 'users')
85
+ @column.should be_a_reference
86
+ end
87
+ end
88
+
89
+ context :translate do
90
+ it "should return a hash with the new translation" do
91
+ @column = Mongify::Database::Column.new('first_name', :string)
92
+ @column.translate('bob').should == {'first_name' => 'bob'}
93
+ end
94
+ it "should return a datetime format" do
95
+ @column = Mongify::Database::Column.new('created_at', :datetime)
96
+ @column.translate('2011-01-14 21:23:39').should == {'created_at' => Time.utc(2011, 01, 14, 21, 23,39)}
97
+ end
98
+ it "should return pre_mongified_id when type is a key" do
99
+ @column = Mongify::Database::Column.new('id', :key)
100
+ @column.translate(123123).should == {"pre_mongified_id" => 123123}
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongify::Database::NoSqlConnection do
4
+ before(:each) do
5
+ @host = '127.0.0.1'
6
+ @database = 'mongify_test'
7
+ @mongodb_connection = Mongify::Database::NoSqlConnection.new
8
+ end
9
+
10
+ context "valid?" do
11
+ it "should be true" do
12
+ Mongify::Database::NoSqlConnection.new(:host => 'localhost', :database => 'blue').should be_valid
13
+ end
14
+ it "should be false without any params" do
15
+ Mongify::Database::NoSqlConnection.new().should_not be_valid
16
+ end
17
+
18
+ it "should be false without database" do
19
+ Mongify::Database::NoSqlConnection.new(:host => 'localhost').should_not be_valid
20
+ end
21
+
22
+ it "should be false without host" do
23
+ Mongify::Database::NoSqlConnection.new(:database => 'blue').should_not be_valid
24
+ end
25
+ end
26
+
27
+ context "connection string" do
28
+ before(:each) do
29
+ @mongodb_connection.host @host
30
+ @mongodb_connection.database @database
31
+ end
32
+
33
+ context "without username or password" do
34
+ it "should render correctly" do
35
+ @mongodb_connection.connection_string.should == "mongodb://#{@host}"
36
+ end
37
+
38
+ it "should include port" do
39
+ @mongodb_connection.port 10101
40
+ @mongodb_connection.connection_string.should == "mongodb://#{@host}:10101"
41
+ end
42
+ end
43
+ end
44
+
45
+ context "connection" do
46
+ before(:each) do
47
+ @mock_connection = mock(:connected? => true)
48
+ Mongo::Connection.stub(:new).and_return(@mock_connection)
49
+ end
50
+
51
+ it "should only create a connection once" do
52
+ Mongo::Connection.should_receive(:new).once
53
+ @mongodb_connection.connection
54
+ @mongodb_connection.connection
55
+ end
56
+
57
+ it "should add_auth if username && password is present" do
58
+ @mock_connection.should_receive(:add_auth)
59
+ @mongodb_connection.username "bob"
60
+ @mongodb_connection.password "secret"
61
+ @mongodb_connection.connection
62
+ end
63
+
64
+ it "should reset connection on reset" do
65
+ Mongo::Connection.should_receive(:new).twice
66
+ @mongodb_connection.connection
67
+ @mongodb_connection.reset!
68
+ @mongodb_connection.connection
69
+ end
70
+ end
71
+
72
+
73
+ context "database action:" do
74
+ before(:each) do
75
+ @collection = mock
76
+ @db = mock
77
+ @db.stub(:[]).with('users').and_return(@collection)
78
+ @mongodb_connection.stub(:db).and_return(@db)
79
+ end
80
+ context "insert_into" do
81
+ it "should insert into a table using the mongo driver" do
82
+ @collection.should_receive(:insert).with({'first_name' => 'bob'}, anything)
83
+ @mongodb_connection.insert_into('users', {'first_name' => 'bob'})
84
+ end
85
+ end
86
+
87
+ context "get_id_using_pre_mongified_id" do
88
+ it "should return new id" do
89
+ @collection.should_receive(:find_one).with({"pre_mongified_id"=>1}).and_return({'_id' => '123'})
90
+ @mongodb_connection.get_id_using_pre_mongified_id('users', 1).should == '123'
91
+ end
92
+ it "should return nil if nothing is found" do
93
+ @collection.should_receive(:find_one).with({"pre_mongified_id"=>1}).and_return(nil)
94
+ @mongodb_connection.get_id_using_pre_mongified_id('users', 1).should == nil
95
+ end
96
+ end
97
+
98
+ context "select_rows" do
99
+ it "should return all records" do
100
+ @collection.should_receive(:find).with().and_return([])
101
+ @mongodb_connection.select_rows('users')
102
+ end
103
+ end
104
+
105
+ context "update" do
106
+ it "should update the record" do
107
+ attributes = {'post_id' => 123}
108
+ @collection.should_receive(:update).with({"_id" => 1}, attributes)
109
+ @mongodb_connection.update('users', 1, attributes)
110
+ end
111
+ end
112
+ end
113
+
114
+
115
+ describe "working connection" do
116
+ before(:each) do
117
+ @mongodb_connection = GenerateDatabase.mongo_connection
118
+ end
119
+
120
+ it "should work" do
121
+ @mongodb_connection.should be_valid
122
+ @mongodb_connection.should have_connection
123
+ end
124
+
125
+ it "should return a db" do
126
+ @mongodb_connection.db.should be_a Mongify::Database::NoSqlConnection::DB
127
+ end
128
+ end
129
+
130
+ end
131
+
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongify::Database::SqlConnection do
4
+ before(:all) do
5
+ @db_path = GenerateDatabase.sqlite
6
+ end
7
+
8
+ before(:each) do
9
+ @sql_connection = Mongify::Database::SqlConnection.new(:adapter => 'sqlite3', :database => @db_path)
10
+ end
11
+
12
+ context "Sqlite 3 config" do
13
+ before(:each) do
14
+ @adapter = 'sqlite3'
15
+ @sql_connection = Mongify::Database::SqlConnection.new(:adapter => @adapter, :database => @db_path)
16
+ end
17
+
18
+ context "valid?" do
19
+ it "should be true" do
20
+ @sql_connection.should be_valid
21
+ end
22
+ end
23
+
24
+ context "testing connection" do
25
+ it "should work" do
26
+ @sql_connection.should have_connection
27
+ end
28
+ end
29
+ end
30
+
31
+ context "MySql config" do
32
+ before(:each) do
33
+ @sql_connection = GenerateDatabase.mysql_connection
34
+ end
35
+
36
+ context "valid?" do
37
+ it "should be true" do
38
+ Mongify::Database::SqlConnection.new(:adapter => 'mysql', :host => 'localhost', :database => 'blue').should be_valid
39
+ end
40
+ it "should be false" do
41
+ Mongify::Database::SqlConnection.new(:adapter => 'mysql').should_not be_valid
42
+ end
43
+ end
44
+
45
+ context "testing connection" do
46
+ it "should call setup_connection_adapter before testing connection" do
47
+ @sql_connection.should_receive(:setup_connection_adapter)
48
+ @sql_connection.has_connection?
49
+ end
50
+
51
+ it "should work" do
52
+ @sql_connection.should have_connection
53
+ end
54
+ end
55
+ end
56
+
57
+ context "Sqlite connection" do
58
+ context "testing connection" do
59
+ it "should call setup_connection_adapter before testing connection" do
60
+ @sql_connection.should_receive(:setup_connection_adapter)
61
+ @sql_connection.has_connection?
62
+ end
63
+
64
+ it "should work" do
65
+ @sql_connection.should have_connection
66
+ end
67
+ end
68
+
69
+ context "tables" do
70
+ it "should be able to get a list" do
71
+ @sql_connection.tables.sort.should == ['comments', 'posts', 'users'].sort
72
+ end
73
+ end
74
+
75
+ context "columns" do
76
+ it "should see columns for a table" do
77
+ @sql_connection.columns_for(:users).map{ |column| column.name }.sort.should == ['id', 'first_name', 'last_name', 'created_at', 'updated_at'].sort
78
+ end
79
+ end
80
+ end
81
+
82
+ context "select_all" do
83
+ it "should generate correct select statement" do
84
+ @mock_conn = mock
85
+ @mock_conn.should_receive(:select_all).with('SELECT * FROM users')
86
+ @sql_connection.stub(:connection).and_return(@mock_conn)
87
+ @sql_connection.select_rows('users')
88
+ end
89
+ end
90
+ end
91
+
@@ -0,0 +1,120 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mongify::Database::Table do
4
+ before(:each) do
5
+ @table = Mongify::Database::Table.new('users')
6
+ end
7
+
8
+ it "should have name" do
9
+ @table.name.should == "users"
10
+ end
11
+ it "should allow you to change table name" do
12
+ @table.name = 'accounts'
13
+ @table.name.should == 'accounts'
14
+ end
15
+
16
+ it "should get setup options" do
17
+ @table = Mongify::Database::Table.new('users', :embed_in => 'accounts', :as => 'users')
18
+ @table.options.should == {'embed_in' => 'accounts', 'as' => 'users'}
19
+ end
20
+
21
+ context "column_index (find_column)" do
22
+ it "should add column index on column creation" do
23
+ @table.should_receive(:add_column_index).with('first_name', 0)
24
+ @table.column('first_name', :string)
25
+ end
26
+ end
27
+
28
+ context "column" do
29
+ it "should add to count" do
30
+ lambda { @table.column 'name' }.should change{@table.columns.count}.by(1)
31
+ end
32
+
33
+ it "should work without a type" do
34
+ col = @table.column 'name', :default => '123'
35
+ col.type.should == :string
36
+ end
37
+
38
+ it "should be able to find" do
39
+ @table.column 'another'
40
+ col = @table.column 'dark'
41
+ @table.find_column('dark').should == col
42
+ end
43
+
44
+ it "should return nil if not found" do
45
+ @table.column 'dark'
46
+ @table.find_column('blue').should be_nil
47
+ end
48
+ end
49
+
50
+ context "add_column" do
51
+ it "should require Mongify::Database::Column" do
52
+ lambda { @table.add_column("Not a column") }.should raise_error(Mongify::DatabaseColumnExpected)
53
+ end
54
+ it "shold except Mongify::Database::Column as a parameter" do
55
+ lambda { @table.add_column(Mongify::Database::Column.new('test')) }.should_not raise_error(Mongify::DatabaseColumnExpected)
56
+ end
57
+
58
+ it "should add to the column count" do
59
+ lambda { @table.add_column(Mongify::Database::Column.new('test')) }.should change{@table.columns.count}.by(1)
60
+ end
61
+
62
+ it "should be indexed" do
63
+ col = Mongify::Database::Column.new('test')
64
+ @table.add_column(col)
65
+ @table.find_column('test').should == col
66
+ end
67
+
68
+ context "on initialization" do
69
+ before(:each) do
70
+ @columns = [Mongify::Database::Column.new('test1'), Mongify::Database::Column.new('test2')]
71
+ @table = Mongify::Database::Table.new('users', :columns => @columns)
72
+ end
73
+ it "should add columns" do
74
+ @table.columns.should have(2).columns
75
+ end
76
+ it "should remove columns from the options" do
77
+ @table.options.should_not have_key('columns')
78
+ end
79
+ it "should be indexed" do
80
+ @table.find_column('test1').should == @columns[0]
81
+ end
82
+ end
83
+ end
84
+
85
+ context "reference_colums" do
86
+ before(:each) do
87
+ @col1 = Mongify::Database::Column.new('user_id', :integer, :referneces => :users)
88
+ @col2 = Mongify::Database::Column.new('post_id', :integer, :references => 'posts')
89
+ @columns = [@col1,
90
+ Mongify::Database::Column.new('body'),
91
+ @col2]
92
+ @table = Mongify::Database::Table.new('comments', :columns => @columns)
93
+ end
94
+ it "should return an array of columns" do
95
+ @table.reference_columns.should == [@col1, @col2]
96
+ end
97
+ end
98
+
99
+ context "translate" do
100
+ before(:each) do
101
+ @column1 = mock(:translate => {'first_name' => 'Timmy'}, :name => 'first_name')
102
+ @column2 = mock(:translate => {'last_name' => 'Zuza'}, :name => 'last_name')
103
+ @table.stub(:find_column).with(anything).and_return(nil)
104
+ @table.stub(:find_column).with('first_name').and_return(@column1)
105
+ @table.stub(:find_column).with('last_name').and_return(@column2)
106
+ end
107
+ it "should return a correct hash" do
108
+ @table.translate({'first_name' => 'Timmy', 'last_name' => 'Zuza'}).should == {'first_name' => 'Timmy', 'last_name' => 'Zuza'}
109
+ end
110
+ it "should send translate to both columns with the given value" do
111
+ @column1.should_receive(:translate).with('Timmy').and_return({'first_name' => 'Timmy'})
112
+ @column2.should_receive(:translate).with('Zuza').and_return({'last_name' => 'Zuza'})
113
+ @table.translate({'first_name' => 'Timmy', 'last_name' => 'Zuza'})
114
+ end
115
+
116
+ it "should return same values if column doesn't exist in the translation" do
117
+ @table.translate({'age' => 18}).should == {'age' => 18}
118
+ end
119
+ end
120
+ end