mongify 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +6 -0
- data/Gemfile.lock +1 -1
- data/README.rdoc +8 -3
- data/features/process.feature +1 -1
- data/features/step_definitions/mongify_steps.rb +1 -1
- data/features/step_definitions/mongo_steps.rb +4 -4
- data/features/support/env.rb +1 -1
- data/lib/mongify/database/table.rb +22 -4
- data/lib/mongify/translation.rb +12 -3
- data/lib/mongify/translation/process.rb +30 -1
- data/lib/mongify/version.rb +1 -1
- data/spec/files/{simple_translation.rb → translation.rb} +12 -0
- data/spec/mongify/cli/worker_command_spec.rb +2 -2
- data/spec/mongify/database/no_sql_connection_spec.rb +1 -1
- data/spec/mongify/database/sql_connection_spec.rb +4 -4
- data/spec/mongify/database/table_spec.rb +32 -8
- data/spec/mongify/translation/process_spec.rb +60 -11
- data/spec/mongify/translation_spec.rb +27 -6
- data/spec/support/{generate_database.rb → database_generator.rb} +24 -3
- data/spec/support/database_output.txt +10 -0
- metadata +9 -11
- data/spec/files/empty_translation.rb +0 -0
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.1.1 / 28 Jan 2011
|
2
|
+
* Renamed GenerateDatabase to DatabaseGenerator
|
3
|
+
* Renamed Table#embed? to Table#embedded?
|
4
|
+
* Renamed Table#embed_as_object? to Table#embedded_as_object?
|
5
|
+
* Added support for polymorphic tables
|
6
|
+
* Did some file cleanup for unused files
|
1
7
|
== 0.1.0 / 21 Jan 2011
|
2
8
|
* Moved from Alpha to Beta! :)
|
3
9
|
* Improved internal RDocs
|
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -143,11 +143,18 @@ Table Options are as follow:
|
|
143
143
|
table "table_name", :ignore => true # This will ignore the whole table (like it doesn't exist)
|
144
144
|
# This option is good for tables like: schema_migrations
|
145
145
|
|
146
|
+
table "table_name", # This allows you to specify the table as being polymorphic
|
147
|
+
:polymorphic => 'notable', # and provide the name of the polymorphic relationship.
|
148
|
+
:embed_in => true # Setting embed_in => true allows the relationship to be
|
149
|
+
# embedded directly into the parent class.
|
150
|
+
# If you do not embed it, the polymorphic table will be copied in to
|
151
|
+
# MongoDB and the notable_id will be updated to the new BSON::ObjectID
|
152
|
+
|
146
153
|
table "table_name" do # A table can take a before_save block that will be called just
|
147
154
|
before_save do |row| # before the row is saved to the no sql database.
|
148
155
|
row.admin = row.delete('permission').to_i > 50 # This gives you the ability to do very powerful things like:
|
149
156
|
end # Moving records around, renaming records, changing values in row based on
|
150
|
-
end # some values! Checkout
|
157
|
+
end # some values! Checkout Mongify::Database::DataRow to learn more
|
151
158
|
|
152
159
|
=== Columns
|
153
160
|
|
@@ -196,9 +203,7 @@ More testing will be done once the basic functionality is done
|
|
196
203
|
== TODO
|
197
204
|
|
198
205
|
* Allow you to set a :force => true for mongodb_connection, so that it drops existing database before importing
|
199
|
-
* Work with polymorphic tables
|
200
206
|
* Update user on what is being processed
|
201
|
-
* Improve RDoc
|
202
207
|
|
203
208
|
== Development
|
204
209
|
|
data/features/process.feature
CHANGED
@@ -6,7 +6,7 @@ Feature: Processing a translation
|
|
6
6
|
Scenario: Process
|
7
7
|
Given a database exists
|
8
8
|
And a blank mongodb
|
9
|
-
When I run mongify process spec/files/
|
9
|
+
When I run mongify process spec/files/translation.rb -c spec/files/base_configuration.rb
|
10
10
|
Then it succeeds
|
11
11
|
And there should be 3 users in mongodb
|
12
12
|
And there should be 3 posts in mongodb
|
@@ -1,15 +1,15 @@
|
|
1
1
|
Given /^a blank mongodb$/ do
|
2
|
-
|
2
|
+
DatabaseGenerator.clear_mongodb
|
3
3
|
end
|
4
4
|
|
5
5
|
Then /^there should be (\d+) (.*) in mongodb$/ do |count, collection|
|
6
|
-
|
6
|
+
DatabaseGenerator.mongo_connection.db[collection].count.should == count.to_i
|
7
7
|
end
|
8
8
|
|
9
9
|
Then /^the (first|sencond|third) (.+)'s (.+) should be (first|second|thrid) (.+)$/ do |collection_place, collection, field, target_place, target|
|
10
|
-
|
10
|
+
DatabaseGenerator.mongo_connection.db[collection.pluralize].find.to_a.send(collection_place.to_sym)[field].should == DatabaseGenerator.mongo_connection.db[target.pluralize].find.to_a.send(target_place)['_id']
|
11
11
|
end
|
12
12
|
|
13
13
|
Then /^the (first|sencond|third) (.+) should have (\d+) (.+)$/ do |collection_place, collection, count, target|
|
14
|
-
|
14
|
+
DatabaseGenerator.mongo_connection.db[collection.pluralize].find.to_a.send(collection_place.to_sym)[target.pluralize].count == count
|
15
15
|
end
|
data/features/support/env.rb
CHANGED
@@ -5,7 +5,7 @@ require 'tempfile'
|
|
5
5
|
require 'fileutils'
|
6
6
|
require 'mongify/cli/application'
|
7
7
|
require 'mongify'
|
8
|
-
require 'spec/support/
|
8
|
+
require 'spec/support/database_generator'
|
9
9
|
require 'spec/support/config_reader'
|
10
10
|
|
11
11
|
::CONNECTION_CONFIG = ConfigReader.new(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))) + '/spec/support/database.yml')
|
@@ -32,6 +32,14 @@ module Mongify
|
|
32
32
|
# table "table_name", :ignore => true # This will ignore the whole table (like it doesn't exist)
|
33
33
|
# # This option is good for tables like: schema_migrations
|
34
34
|
#
|
35
|
+
# table "table_name", :polymorphic => 'commentable' # This will identfiy the table as polymorphic and the new ids
|
36
|
+
# # will be updated as needed.
|
37
|
+
#
|
38
|
+
# table "table_name", # This allows you to specify the table as being polymorphic
|
39
|
+
# :polymorphic => 'notable', # and provide the name of the polymorphic relationship.
|
40
|
+
# :embed_in => true # Setting embed_in => true allows the relationship to be
|
41
|
+
# # embedded directly into the parent class.
|
42
|
+
#
|
35
43
|
# table "table_name" do # A table can take a before_save block that will be called just
|
36
44
|
# before_save do |row| # before the row is saved to the no sql database.
|
37
45
|
# row.admin = row.delete('permission').to_i > 50 # This gives you the ability to do very powerful things like:
|
@@ -66,6 +74,16 @@ module Mongify
|
|
66
74
|
@options['ignore']
|
67
75
|
end
|
68
76
|
|
77
|
+
# Returns true if table is marked as polymorphic
|
78
|
+
def polymorphic?
|
79
|
+
!!@options['polymorphic']
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns the name of the polymorphic association
|
83
|
+
def polymorphic_as
|
84
|
+
@options['polymorphic'].to_s
|
85
|
+
end
|
86
|
+
|
69
87
|
# Add a Database Column to the table
|
70
88
|
# This expects to get a {Mongify::Database::Column} or it will raise {Mongify::DatabaseColumnExpected} otherwise
|
71
89
|
def add_column(column)
|
@@ -110,24 +128,24 @@ module Mongify
|
|
110
128
|
|
111
129
|
# Returns the type of embed it will be [object or array]
|
112
130
|
def embed_as
|
113
|
-
return nil unless
|
131
|
+
return nil unless embedded?
|
114
132
|
return 'object' if @options['as'].to_s.downcase == 'object'
|
115
133
|
'array'
|
116
134
|
end
|
117
135
|
|
118
136
|
# Returns true if table is being embed as an object
|
119
|
-
def
|
137
|
+
def embedded_as_object?
|
120
138
|
embed_as == 'object'
|
121
139
|
end
|
122
140
|
|
123
141
|
# Returns true if this is an embedded table
|
124
|
-
def
|
142
|
+
def embedded?
|
125
143
|
embed_in.present?
|
126
144
|
end
|
127
145
|
|
128
146
|
# Returns the name of the target column to embed on
|
129
147
|
def embed_on
|
130
|
-
return nil unless
|
148
|
+
return nil unless embedded?
|
131
149
|
(@options['on'] || "#{@options['embed_in'].to_s.singularize}_id").to_s
|
132
150
|
end
|
133
151
|
|
data/lib/mongify/translation.rb
CHANGED
@@ -69,6 +69,11 @@ module Mongify
|
|
69
69
|
@all_tables = []
|
70
70
|
end
|
71
71
|
|
72
|
+
# finds table by name
|
73
|
+
def find(name)
|
74
|
+
all_tables.find{ |t| t.name == name }
|
75
|
+
end
|
76
|
+
|
72
77
|
# Creates a {Mongify::Database::Table} from the given input and adds it to the list of tables
|
73
78
|
def table(table_name, options={}, &block)
|
74
79
|
table = Mongify::Database::Table.new(table_name, options, &block)
|
@@ -88,17 +93,21 @@ module Mongify
|
|
88
93
|
|
89
94
|
# Returns an array of all tables that have not been ingored
|
90
95
|
def tables
|
91
|
-
all_tables.reject{ |t| t.ignored? }
|
96
|
+
all_tables.reject{ |t| t.ignored? || t.polymorphic? }
|
92
97
|
end
|
93
98
|
|
94
99
|
# Returns an array of all tables that have not been ignored and are just straight copy tables
|
95
100
|
def copy_tables
|
96
|
-
tables.reject{|t| t.
|
101
|
+
tables.reject{|t| t.embedded?}
|
102
|
+
end
|
103
|
+
|
104
|
+
def polymorphic_tables
|
105
|
+
all_tables.reject{ |t| t.ignored? || !t.polymorphic? }
|
97
106
|
end
|
98
107
|
|
99
108
|
# Returns an array of all tables that have not been ignored and are to be embedded
|
100
109
|
def embed_tables
|
101
|
-
tables.reject{|t| !t.
|
110
|
+
tables.reject{|t| !t.embedded?}
|
102
111
|
end
|
103
112
|
|
104
113
|
end
|
@@ -20,6 +20,7 @@ module Mongify
|
|
20
20
|
copy_data
|
21
21
|
copy_embedded_tables
|
22
22
|
update_reference_ids
|
23
|
+
copy_polymorphic_tables
|
23
24
|
remove_pre_mongified_ids
|
24
25
|
nil
|
25
26
|
end
|
@@ -47,12 +48,40 @@ module Mongify
|
|
47
48
|
row.delete(t.embed_on)
|
48
49
|
row.merge!(fetch_reference_ids(t, row))
|
49
50
|
row.delete('pre_mongified_id')
|
50
|
-
save_function_call = t.
|
51
|
+
save_function_call = t.embedded_as_object? ? '$set' : '$addToSet'
|
51
52
|
no_sql_connection.update(t.embed_in, target_row['_id'], {save_function_call => {t.name => row}})
|
52
53
|
end
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
57
|
+
# Moves over polymorphic data
|
58
|
+
def copy_polymorphic_tables
|
59
|
+
self.polymorphic_tables.each do |t|
|
60
|
+
polymorphic_id_col, polymorphic_type_col = "#{t.polymorphic_as}_id", "#{t.polymorphic_as}_type"
|
61
|
+
sql_connection.select_rows(t.sql_name).each do |row|
|
62
|
+
table_name = row[polymorphic_type_col].tableize
|
63
|
+
new_id = no_sql_connection.get_id_using_pre_mongified_id(table_name, row[polymorphic_id_col])
|
64
|
+
puts "getting new id for #{table_name}, #{row[polymorphic_id_col]} and getting #{new_id}"
|
65
|
+
if new_id
|
66
|
+
row = t.translate(row)
|
67
|
+
row.merge!(fetch_reference_ids(t, row))
|
68
|
+
row[polymorphic_id_col] = new_id
|
69
|
+
row.delete('pre_mongified_id')
|
70
|
+
if t.embedded?
|
71
|
+
row.delete(polymorphic_id_col)
|
72
|
+
row.delete(polymorphic_type_col)
|
73
|
+
save_function_call = t.embedded_as_object? ? '$set' : '$addToSet'
|
74
|
+
no_sql_connection.update(table_name, new_id, {save_function_call => {t.name => row}})
|
75
|
+
else
|
76
|
+
no_sql_connection.insert_into(t.name, row)
|
77
|
+
end
|
78
|
+
else
|
79
|
+
puts "#{table_name} table not found on #{t.sql_name} polymorphic import"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
56
85
|
# Updates the reference ids in the no sql database
|
57
86
|
def update_reference_ids
|
58
87
|
self.tables.each do |t|
|
data/lib/mongify/version.rb
CHANGED
@@ -33,3 +33,15 @@ table "preferences", :embed_in => :users, :as => :object do
|
|
33
33
|
column "updated_at", :datetime, :ignore => true
|
34
34
|
end
|
35
35
|
|
36
|
+
table "notes", :embed_in => true, :polymorphic => 'notable' do
|
37
|
+
column "id", :key
|
38
|
+
column "user_id", :integer, :references => "users"
|
39
|
+
column "notable_id", :integer
|
40
|
+
column "notable_type", :string
|
41
|
+
column "body", :text
|
42
|
+
column "created_at", :datetime
|
43
|
+
column "updated_at", :datetime
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
@@ -12,7 +12,7 @@ describe Mongify::CLI::WorkerCommand do
|
|
12
12
|
@no_sql_connection.stub(:has_connection?).and_return(true)
|
13
13
|
@config.stub(:no_sql_connection).and_return(@no_sql_connection)
|
14
14
|
|
15
|
-
@translation_file = 'spec/files/
|
15
|
+
@translation_file = 'spec/files/translation.rb'
|
16
16
|
|
17
17
|
Mongify::Translation.stub(:load).and_return(stub(:print => 'worked'))
|
18
18
|
@view = mock('view').as_null_object
|
@@ -82,7 +82,7 @@ describe Mongify::CLI::WorkerCommand do
|
|
82
82
|
|
83
83
|
context "process command" do
|
84
84
|
before(:each) do
|
85
|
-
@command = Mongify::CLI::WorkerCommand.new('process', @config, 'spec/files/
|
85
|
+
@command = Mongify::CLI::WorkerCommand.new('process', @config, 'spec/files/translation.rb')
|
86
86
|
Mongify::Translation.stub(:parse).and_return(mock(:process => true))
|
87
87
|
end
|
88
88
|
it "should report success" do
|
@@ -127,7 +127,7 @@ describe Mongify::Database::NoSqlConnection do
|
|
127
127
|
|
128
128
|
describe "working connection" do
|
129
129
|
before(:each) do
|
130
|
-
@mongodb_connection =
|
130
|
+
@mongodb_connection = DatabaseGenerator.mongo_connection
|
131
131
|
end
|
132
132
|
|
133
133
|
it "should work" do
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mongify::Database::SqlConnection do
|
4
4
|
before(:all) do
|
5
|
-
@db_path =
|
5
|
+
@db_path = DatabaseGenerator.sqlite
|
6
6
|
end
|
7
7
|
|
8
8
|
before(:each) do
|
@@ -30,7 +30,7 @@ describe Mongify::Database::SqlConnection do
|
|
30
30
|
|
31
31
|
context "MySql config" do
|
32
32
|
before(:each) do
|
33
|
-
@sql_connection =
|
33
|
+
@sql_connection = DatabaseGenerator.mysql_connection
|
34
34
|
end
|
35
35
|
|
36
36
|
context "valid?" do
|
@@ -68,13 +68,13 @@ describe Mongify::Database::SqlConnection do
|
|
68
68
|
|
69
69
|
context "tables" do
|
70
70
|
it "should be able to get a list" do
|
71
|
-
@sql_connection.tables.
|
71
|
+
@sql_connection.tables.should =~ ['comments', 'notes', 'posts', 'preferences', 'users']
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
75
|
context "columns" do
|
76
76
|
it "should see columns for a table" do
|
77
|
-
@sql_connection.columns_for(:users).map{ |column| column.name }.
|
77
|
+
@sql_connection.columns_for(:users).map{ |column| column.name }.should =~ ['id', 'first_name', 'last_name', 'created_at', 'updated_at']
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
@@ -150,21 +150,21 @@ describe Mongify::Database::Table do
|
|
150
150
|
it "should allow Object as a value" do
|
151
151
|
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :object).embed_as.should == 'object'
|
152
152
|
end
|
153
|
-
context "
|
153
|
+
context "embedded_as_object?" do
|
154
154
|
it "should be true" do
|
155
|
-
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :object).should
|
155
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :object).should be_embedded_as_object
|
156
156
|
end
|
157
157
|
it "should be false" do
|
158
|
-
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :array).should_not
|
158
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :array).should_not be_embedded_as_object
|
159
159
|
end
|
160
160
|
end
|
161
161
|
end
|
162
|
-
context "
|
162
|
+
context "embedded?" do
|
163
163
|
it "should be true" do
|
164
|
-
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id').should
|
164
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id').should be_embedded
|
165
165
|
end
|
166
166
|
it "should be false" do
|
167
|
-
Mongify::Database::Table.new('users').should_not
|
167
|
+
Mongify::Database::Table.new('users').should_not be_embedded
|
168
168
|
end
|
169
169
|
end
|
170
170
|
|
@@ -172,7 +172,7 @@ describe Mongify::Database::Table do
|
|
172
172
|
it "should be post_id" do
|
173
173
|
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id').embed_on.should == 'post_id'
|
174
174
|
end
|
175
|
-
it "should be nil when not
|
175
|
+
it "should be nil when not embedded?" do
|
176
176
|
Mongify::Database::Table.new('users', :on => 'test').embed_on.should be_nil
|
177
177
|
end
|
178
178
|
it "should calculate embed_on from embed_in" do
|
@@ -185,7 +185,6 @@ describe Mongify::Database::Table do
|
|
185
185
|
before(:each) do
|
186
186
|
@table = Mongify::Database::Table.new('users')
|
187
187
|
@table.before_save do |row|
|
188
|
-
puts "my keys are: #{row.keys}"
|
189
188
|
row.admin = row.delete('permission').to_i > 50
|
190
189
|
end
|
191
190
|
end
|
@@ -202,6 +201,31 @@ describe Mongify::Database::Table do
|
|
202
201
|
end
|
203
202
|
end
|
204
203
|
|
204
|
+
context "polymorphic" do
|
205
|
+
before(:each) do
|
206
|
+
@table = Mongify::Database::Table.new('comments', :polymorphic => :commentable)
|
207
|
+
end
|
208
|
+
it "should be true" do
|
209
|
+
@table.should be_polymorphic
|
210
|
+
end
|
211
|
+
it "should be false" do
|
212
|
+
Mongify::Database::Table.new('users').should_not be_polymorphic
|
213
|
+
end
|
214
|
+
it "should return 'commentable'" do
|
215
|
+
@table.polymorphic_as.should == 'commentable'
|
216
|
+
end
|
217
|
+
|
218
|
+
context "embed" do
|
219
|
+
before(:each) do
|
220
|
+
@table = Mongify::Database::Table.new('comments', :polymorphic => :commentable, :embed_in => true)
|
221
|
+
end
|
222
|
+
it "should be embedded" do
|
223
|
+
@table.should be_embedded
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
205
229
|
context "translate" do
|
206
230
|
before(:each) do
|
207
231
|
@column1 = mock(:translate => {'first_name' => 'Timmy'}, :name => 'first_name')
|
@@ -2,9 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mongify::Translation::Process do
|
4
4
|
before(:each) do
|
5
|
-
|
6
|
-
@sql_connection =
|
7
|
-
@no_sql_connection =
|
5
|
+
DatabaseGenerator.clear_mongodb
|
6
|
+
@sql_connection = DatabaseGenerator.sqlite_connection
|
7
|
+
@no_sql_connection = DatabaseGenerator.mongo_connection
|
8
8
|
@translation = Mongify::Translation.new
|
9
9
|
end
|
10
10
|
|
@@ -47,7 +47,7 @@ describe Mongify::Translation::Process do
|
|
47
47
|
it "should get correct information" do
|
48
48
|
@no_sql_connection = mock()
|
49
49
|
@translation.stub(:no_sql_connection).and_return(@no_sql_connection)
|
50
|
-
@table = mock(:translate => {}, :name => 'users', :
|
50
|
+
@table = mock(:translate => {}, :name => 'users', :embedded? => false)
|
51
51
|
@column = mock(:name => 'user_id', :references => 'users')
|
52
52
|
@table.stub(:reference_columns).and_return([@column])
|
53
53
|
@no_sql_connection.should_receive(:get_id_using_pre_mongified_id).with('users', 1).once.and_return(500)
|
@@ -65,7 +65,7 @@ describe Mongify::Translation::Process do
|
|
65
65
|
|
66
66
|
@table = mock(:translate => {'first_name'=> 'Timmy', 'last_name' => 'Zuza', 'preference_id' => 1},
|
67
67
|
:name => 'users',
|
68
|
-
:
|
68
|
+
:embedded? => false,
|
69
69
|
:sql_name => 'users')
|
70
70
|
|
71
71
|
@translation.stub(:tables).and_return([@table])
|
@@ -85,8 +85,8 @@ describe Mongify::Translation::Process do
|
|
85
85
|
|
86
86
|
context "copy_embed_tables" do
|
87
87
|
before(:each) do
|
88
|
-
@target_table = mock(:name => 'posts', :
|
89
|
-
@embed_table = mock(:translate => {}, :name => 'comments', :
|
88
|
+
@target_table = mock(:name => 'posts', :embedded? => false, :sql_name => 'posts')
|
89
|
+
@embed_table = mock(:translate => {}, :name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false, :sql_name => 'comments')
|
90
90
|
@no_sql_connection.stub(:find_one).and_return({'_id' => 500})
|
91
91
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
92
92
|
@translation.stub(:fetch_reference_ids).and_return({})
|
@@ -98,25 +98,25 @@ describe Mongify::Translation::Process do
|
|
98
98
|
@translation.send(:copy_embedded_tables)
|
99
99
|
end
|
100
100
|
it "should remove the pre_mongified_id before embedding" do
|
101
|
-
@embed_table = mock(:translate => {'first_name' => 'bob', 'pre_mongified_id' => 1}, :name => 'comments', :sql_name => 'comments', :
|
101
|
+
@embed_table = mock(:translate => {'first_name' => 'bob', 'pre_mongified_id' => 1}, :name => 'comments', :sql_name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false)
|
102
102
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
103
103
|
@no_sql_connection.should_receive(:update).with("posts", 500, {"$addToSet"=>{"comments"=>{'first_name' => 'bob'}}})
|
104
104
|
@translation.send(:copy_embedded_tables)
|
105
105
|
end
|
106
106
|
it "should remove the parent_id from the embedding row" do
|
107
|
-
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'comments', :sql_name => 'comments', :
|
107
|
+
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'comments', :sql_name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false)
|
108
108
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
109
109
|
@no_sql_connection.should_receive(:update).with("posts", 500, {"$addToSet"=>{"comments"=>{'first_name' => 'bob'}}})
|
110
110
|
@translation.send(:copy_embedded_tables)
|
111
111
|
end
|
112
112
|
it "should call $addToSet on update of an embed_as_object table" do
|
113
|
-
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'comments', :sql_name => 'comments', :
|
113
|
+
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'comments', :sql_name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => true)
|
114
114
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
115
115
|
@no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"comments"=>{'first_name' => 'bob'}}})
|
116
116
|
@translation.send(:copy_embedded_tables)
|
117
117
|
end
|
118
118
|
it "should allow rename of table" do
|
119
|
-
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'notes', :sql_name => 'comments', :
|
119
|
+
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'notes', :sql_name => 'comments', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => true)
|
120
120
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
121
121
|
@no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"notes"=>{'first_name' => 'bob'}}})
|
122
122
|
@translation.send(:copy_embedded_tables)
|
@@ -140,6 +140,55 @@ describe Mongify::Translation::Process do
|
|
140
140
|
end
|
141
141
|
end
|
142
142
|
|
143
|
+
context "copy_polymorphic_tables" do
|
144
|
+
before(:each) do
|
145
|
+
@ref_table = mock(:name => 'user_accounts',
|
146
|
+
:embedded? => false,
|
147
|
+
:ignored? => false,
|
148
|
+
:sql_name => 'user_accounts')
|
149
|
+
@translation.stub(:find).with('user_accounts').and_return([@ref_table])
|
150
|
+
|
151
|
+
@sql_connection.should_receive(:select_rows).with('comments').and_return([{'commentable_id' => 1, 'commentable_type' => 'UserAccount', 'data' => 'good'}])
|
152
|
+
@no_sql_connection.should_receive(:get_id_using_pre_mongified_id).with('user_accounts', 1).and_return(500)
|
153
|
+
end
|
154
|
+
context "embedded" do
|
155
|
+
it "should work correctly" do
|
156
|
+
@table = mock(:translate => {'data' => 123},
|
157
|
+
:name => 'comments',
|
158
|
+
:embedded? => true,
|
159
|
+
:polymorphic_as => 'commentable',
|
160
|
+
:polymorphic? => true,
|
161
|
+
:ignored? => false,
|
162
|
+
:embedded_as_object? => false,
|
163
|
+
:sql_name => 'comments',
|
164
|
+
:reference_columns => [])
|
165
|
+
|
166
|
+
@translation.stub(:all_tables).and_return([@table])
|
167
|
+
|
168
|
+
@no_sql_connection.should_receive(:update).with('user_accounts', 500, {'$addToSet' => {'comments' => {'data' => 123}}})
|
169
|
+
@translation.send(:copy_polymorphic_tables)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
context "not embedded" do
|
173
|
+
it "should work" do
|
174
|
+
@table = mock(:translate => {'data' => 123, 'commentable_type' => 'UserAccount', 'commentable_id' => 1},
|
175
|
+
:name => 'comments',
|
176
|
+
:embedded? => false,
|
177
|
+
:polymorphic_as => 'commentable',
|
178
|
+
:polymorphic? => true,
|
179
|
+
:ignored? => false,
|
180
|
+
:embedded_as_object? => false,
|
181
|
+
:sql_name => 'comments',
|
182
|
+
:reference_columns => [])
|
183
|
+
|
184
|
+
@translation.stub(:all_tables).and_return([@table])
|
185
|
+
|
186
|
+
@no_sql_connection.should_receive(:insert_into).with('comments', {'data' => 123, 'commentable_type' => 'UserAccount', 'commentable_id' => 500})
|
187
|
+
@translation.send(:copy_polymorphic_tables)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
143
192
|
context "remove_pre_mongified_ids" do
|
144
193
|
it "should remove_pre_mongified_ids on no_sql_connection" do
|
145
194
|
@no_sql_connection.should_receive(:remove_pre_mongified_ids).with(anything)
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mongify::Translation do
|
4
4
|
before(:all) do
|
5
|
-
@file_path = File.expand_path(File.dirname(__FILE__) + '/../files/
|
5
|
+
@file_path = File.expand_path(File.dirname(__FILE__) + '/../files/translation.rb')
|
6
6
|
@translation = Mongify::Translation.parse(@file_path)
|
7
7
|
end
|
8
8
|
|
@@ -48,17 +48,35 @@ describe Mongify::Translation do
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
+
context "find" do
|
52
|
+
before(:each) do
|
53
|
+
@user_table = mock(:name => 'users')
|
54
|
+
@translation.stub(:all_tables).and_return([mock(:name => 'comments'),
|
55
|
+
@user_table,
|
56
|
+
mock(:name => 'posts')])
|
57
|
+
end
|
58
|
+
it "should work" do
|
59
|
+
|
60
|
+
@translation.find('users').should == @user_table
|
61
|
+
end
|
62
|
+
it "should return nil if nothing is found" do
|
63
|
+
@translation.find('apples').should be_nil
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
51
67
|
context "tables reference" do
|
52
68
|
before(:each) do
|
53
|
-
@copy_table = mock(:name => 'users', :
|
54
|
-
@embed_table = mock(:name => 'comments', :
|
55
|
-
@ignored_table = mock(:name => 'apples', :ignored? => true, :
|
69
|
+
@copy_table = mock(:name => 'users', :ignored? => false, :embedded? => false, :polymorphic? => false)
|
70
|
+
@embed_table = mock(:name => 'comments', :ignored? => false, :embedded? => true, :polymorphic? => false)
|
71
|
+
@ignored_table = mock(:name => 'apples', :ignored? => true, :embedded? => false, :polymorphic? => false)
|
72
|
+
@polymorphic_table = mock(:name => 'comments', :ignored? => false, :embedded? => false, :polymorphic? => true)
|
56
73
|
@translation = Mongify::Translation.new()
|
57
|
-
@
|
74
|
+
@all_tables = [@copy_table, @embed_table, @ignored_table, @polymorphic_table]
|
75
|
+
@translation.stub(:all_tables).and_return(@all_tables)
|
58
76
|
end
|
59
77
|
context "tables" do
|
60
78
|
it "should not show ignored" do
|
61
|
-
|
79
|
+
@translation.tables.count == @all_tables.count - 1
|
62
80
|
end
|
63
81
|
end
|
64
82
|
context "copy_tables" do
|
@@ -71,6 +89,9 @@ describe Mongify::Translation do
|
|
71
89
|
@translation.embed_tables.should == [@embed_table]
|
72
90
|
end
|
73
91
|
end
|
92
|
+
it "should return only polymorphic tables" do
|
93
|
+
@translation.polymorphic_tables.should == [@polymorphic_table]
|
94
|
+
end
|
74
95
|
end
|
75
96
|
|
76
97
|
context "add_table" do
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Used during testing to generate and load database information and connection strings
|
2
|
-
class
|
2
|
+
class DatabaseGenerator
|
3
3
|
# Returns a mysql connection (using the database.yml)
|
4
4
|
def self.mysql_connection
|
5
5
|
@sql_connection ||= Mongify::Database::SqlConnection.new( :adapter => CONNECTION_CONFIG.mysql['adapter'],
|
@@ -10,6 +10,7 @@ class GenerateDatabase
|
|
10
10
|
:database => CONNECTION_CONFIG.mysql['database']
|
11
11
|
)
|
12
12
|
end
|
13
|
+
|
13
14
|
# Returns a sqlite connection (using the database.yml )
|
14
15
|
def self.sqlite_connection
|
15
16
|
@db_path = File.join(File.dirname(File.dirname(File.dirname(File.expand_path(__FILE__)))), CONNECTION_CONFIG.sqlite['database'])
|
@@ -50,6 +51,14 @@ class GenerateDatabase
|
|
50
51
|
t.timestamps
|
51
52
|
end
|
52
53
|
|
54
|
+
conn.create_table(:notes) do |t|
|
55
|
+
t.integer :user_id
|
56
|
+
t.integer :notable_id
|
57
|
+
t.string :notable_type
|
58
|
+
t.text :body
|
59
|
+
t.timestamps
|
60
|
+
end
|
61
|
+
|
53
62
|
if include_data
|
54
63
|
|
55
64
|
#Users
|
@@ -75,21 +84,33 @@ class GenerateDatabase
|
|
75
84
|
[
|
76
85
|
{:post_id => 1, :user_id => 1, :body => 'First Comment Body'},
|
77
86
|
{:post_id => 2, :user_id => 1, :body => 'Second Comment Body'},
|
78
|
-
{:post_id => 2, :user_id => 2, :body => 'Thrid Comment Body'}
|
87
|
+
{:post_id => 2, :user_id => 2, :body => 'Thrid Comment Body'},
|
79
88
|
].each do |v|
|
80
89
|
conn.insert("INSERT INTO comments (body, post_id, user_id, created_at, updated_at)
|
81
90
|
VALUES ('#{v[:body]}', #{v[:post_id]}, #{v[:user_id]}, '#{Time.now.to_s(:db)}', '#{Time.now.to_s(:db)}')")
|
82
91
|
end
|
83
92
|
|
93
|
+
#Preferences
|
84
94
|
[
|
85
95
|
{:user_id => 1, :notify_by_email => true},
|
86
96
|
{:user_id => 2, :notify_by_email => true},
|
87
|
-
{:user_id => 3, :notify_by_email => false}
|
97
|
+
{:user_id => 3, :notify_by_email => false},
|
88
98
|
].each do |v|
|
89
99
|
conn.insert("INSERT INTO preferences (user_id, notify_by_email, created_at, updated_at)
|
90
100
|
VALUES (#{v[:user_id]}, '#{v[:notify_by_email]}', '#{Time.now.to_s(:db)}', '#{Time.now.to_s(:db)}')")
|
91
101
|
end
|
92
102
|
|
103
|
+
#Notes
|
104
|
+
[
|
105
|
+
{:user_id => 1, :body => 'note 1', :notable_id => 1, :notable_type => 'Post'},
|
106
|
+
{:user_id => 2, :body => 'note 2', :notable_id => 2, :notable_type => 'Post'},
|
107
|
+
{:user_id => 2, :body => 'note 3', :notable_id => 1, :notable_type => 'User'},
|
108
|
+
{:user_id => 3, :body => 'note 4', :notable_id => 2, :notable_type => 'User'},
|
109
|
+
].each do |v|
|
110
|
+
conn.insert("INSERT INTO notes (user_id, body, notable_id, notable_type, created_at, updated_at)
|
111
|
+
VALUES (#{v[:user_id]}, '#{v[:body]}', #{v[:notable_id]}, '#{v[:notable_type]}', '#{Time.now.to_s(:db)}', '#{Time.now.to_s(:db)}')")
|
112
|
+
end
|
113
|
+
|
93
114
|
end
|
94
115
|
|
95
116
|
sqlite_connection.database
|
@@ -33,3 +33,13 @@ table "preferences" do
|
|
33
33
|
column "updated_at", :datetime
|
34
34
|
end
|
35
35
|
|
36
|
+
table "notes" do
|
37
|
+
column "id", :key
|
38
|
+
column "user_id", :integer, :references => "users"
|
39
|
+
column "notable_id", :integer, :references => "notables"
|
40
|
+
column "notable_type", :string
|
41
|
+
column "body", :text
|
42
|
+
column "created_at", :datetime
|
43
|
+
column "updated_at", :datetime
|
44
|
+
end
|
45
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Kalek
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-28 00:00:00 -05:00
|
19
19
|
default_executable: mongify
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -284,8 +284,7 @@ files:
|
|
284
284
|
- mongify.gemspec
|
285
285
|
- spec/default.watch
|
286
286
|
- spec/files/base_configuration.rb
|
287
|
-
- spec/files/
|
288
|
-
- spec/files/simple_translation.rb
|
287
|
+
- spec/files/translation.rb
|
289
288
|
- spec/mongify/cli/application_spec.rb
|
290
289
|
- spec/mongify/cli/help_command_spec.rb
|
291
290
|
- spec/mongify/cli/options_spec.rb
|
@@ -307,8 +306,8 @@ files:
|
|
307
306
|
- spec/spec_helper.rb
|
308
307
|
- spec/support/config_reader.rb
|
309
308
|
- spec/support/database.example
|
309
|
+
- spec/support/database_generator.rb
|
310
310
|
- spec/support/database_output.txt
|
311
|
-
- spec/support/generate_database.rb
|
312
311
|
- spec/tmp/.gitignore
|
313
312
|
has_rdoc: true
|
314
313
|
homepage: http://github.com/anlek/mongify
|
@@ -345,7 +344,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
345
344
|
requirements: []
|
346
345
|
|
347
346
|
rubyforge_project:
|
348
|
-
rubygems_version: 1.4.
|
347
|
+
rubygems_version: 1.4.2
|
349
348
|
signing_key:
|
350
349
|
specification_version: 3
|
351
350
|
summary: Translate your SQL data to MongoDB
|
@@ -358,8 +357,7 @@ test_files:
|
|
358
357
|
- features/support/env.rb
|
359
358
|
- spec/default.watch
|
360
359
|
- spec/files/base_configuration.rb
|
361
|
-
- spec/files/
|
362
|
-
- spec/files/simple_translation.rb
|
360
|
+
- spec/files/translation.rb
|
363
361
|
- spec/mongify/cli/application_spec.rb
|
364
362
|
- spec/mongify/cli/help_command_spec.rb
|
365
363
|
- spec/mongify/cli/options_spec.rb
|
@@ -381,6 +379,6 @@ test_files:
|
|
381
379
|
- spec/spec_helper.rb
|
382
380
|
- spec/support/config_reader.rb
|
383
381
|
- spec/support/database.example
|
382
|
+
- spec/support/database_generator.rb
|
384
383
|
- spec/support/database_output.txt
|
385
|
-
- spec/support/generate_database.rb
|
386
384
|
- spec/tmp/.gitignore
|
File without changes
|