mongify 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +5 -0
- data/Gemfile.lock +1 -1
- data/README.rdoc +16 -4
- data/lib/mongify.rb +1 -0
- data/lib/mongify/database/base_connection.rb +0 -2
- data/lib/mongify/database/column.rb +20 -3
- data/lib/mongify/database/table.rb +13 -3
- data/lib/mongify/translation/process.rb +2 -1
- data/lib/mongify/version.rb +1 -1
- data/spec/files/simple_translation.rb +9 -0
- data/spec/mongify/database/column_spec.rb +9 -1
- data/spec/mongify/database/sql_connection_spec.rb +1 -1
- data/spec/mongify/database/table_spec.rb +22 -0
- data/spec/mongify/translation/process_spec.rb +9 -3
- data/spec/mongify/translation_spec.rb +2 -2
- data/spec/support/database_output.txt +8 -0
- data/spec/support/generate_database.rb +15 -1
- metadata +4 -4
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 0.0.8 / 18 Jan 2011
|
2
|
+
* Added ability to embed as object on an embedded table
|
3
|
+
* Some bugs fixed
|
4
|
+
* Updated README with new table options
|
5
|
+
* Improved data conversion on processing
|
1
6
|
== 0.0.7 / 17 Jan 2011
|
2
7
|
* Added mysql2 as a dependency
|
3
8
|
* Improved error message when configuration file not provided
|
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -79,7 +79,13 @@ Creating a translation is pretty straight forward. It looks something like this:
|
|
79
79
|
column "created_at", :datetime
|
80
80
|
column "updated_at", :datetime
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
|
+
table "preferences", :embed_in => :users, :as => :object do
|
84
|
+
column "id", :key
|
85
|
+
column "user_id", :integer, :references => "users"
|
86
|
+
column "notify_by_email", :boolean
|
87
|
+
end
|
88
|
+
|
83
89
|
Save the file as <tt>"translation_file.rb"</tt> and run the command:
|
84
90
|
|
85
91
|
mongify process translation_file.rb -c database.config
|
@@ -90,8 +96,15 @@ When dealing with a translation, there is a few options you can set
|
|
90
96
|
|
91
97
|
=== Table
|
92
98
|
|
93
|
-
|
94
|
-
|
99
|
+
Table Options are as follow:
|
100
|
+
table "table_name" # Does a straight copy of the table
|
101
|
+
table "table_name", :embed_in => :users # Embeds table_name into users, assuming a user_id is present in table_name.
|
102
|
+
# This will also assume you want the table embedded as an array.
|
103
|
+
table "table_name", :embed_in => :users, :on => 'owner_id'# Embeds table_name into users, linking it via a owner_id
|
104
|
+
# This will also assume you want the table embedded as an array.
|
105
|
+
table "table_name", :embed_in => :users, :as => :object # Embeds table_name into users as a one to one relationship
|
106
|
+
# This also assumes you have a user_id present in table_name
|
107
|
+
<em>You can also specify both +:on+ and +:as+ options when embedding</em>
|
95
108
|
|
96
109
|
=== Columns
|
97
110
|
Columns take a few more options:
|
@@ -122,7 +135,6 @@ More testing will be done once the basic functionality is done
|
|
122
135
|
|
123
136
|
=== while processing
|
124
137
|
|
125
|
-
* Allow the ability to embed_table with a one to one relationship
|
126
138
|
* Allow renaming tables
|
127
139
|
* Allow renaming of columns
|
128
140
|
* Allow deleting of columns
|
data/lib/mongify.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'active_record/connection_adapters/abstract/schema_definitions'
|
1
2
|
module Mongify
|
2
3
|
module Database
|
3
4
|
#
|
@@ -23,10 +24,8 @@ module Mongify
|
|
23
24
|
case type
|
24
25
|
when :key
|
25
26
|
{"pre_mongified_#{name}" => value}
|
26
|
-
when :datetime
|
27
|
-
{"#{name}" => value.blank? ? nil : value.to_time}
|
28
27
|
else
|
29
|
-
{"#{
|
28
|
+
{"#{name}" => type_cast(value)}
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
@@ -62,6 +61,24 @@ module Mongify
|
|
62
61
|
private
|
63
62
|
#######
|
64
63
|
|
64
|
+
def type_cast(value)
|
65
|
+
return nil if value.nil?
|
66
|
+
case type
|
67
|
+
when :string then value
|
68
|
+
when :text then value
|
69
|
+
when :integer then value.to_i rescue value ? 1 : 0
|
70
|
+
when :float then value.to_f
|
71
|
+
when :decimal then ActiveRecord::ConnectionAdapters::Column.value_to_decimal(value)
|
72
|
+
when :datetime then ActiveRecord::ConnectionAdapters::Column.string_to_time(value)
|
73
|
+
when :timestamp then ActiveRecord::ConnectionAdapters::Column.string_to_time(value)
|
74
|
+
when :time then ActiveRecord::ConnectionAdapters::Column.string_to_dummy_time(value)
|
75
|
+
when :date then ActiveRecord::ConnectionAdapters::Column.string_to_date(value)
|
76
|
+
when :binary then ActiveRecord::ConnectionAdapters::Column.binary_to_string(value)
|
77
|
+
when :boolean then ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
|
78
|
+
else value
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
65
82
|
def key?
|
66
83
|
self.type == :key
|
67
84
|
end
|
@@ -8,10 +8,10 @@ module Mongify
|
|
8
8
|
attr_accessor :name
|
9
9
|
attr_reader :options, :columns
|
10
10
|
|
11
|
-
def initialize(name,
|
11
|
+
def initialize(name, options={}, &block)
|
12
12
|
@columns = []
|
13
13
|
@column_lookup = {}
|
14
|
-
@options =
|
14
|
+
@options = options.stringify_keys
|
15
15
|
self.name = name
|
16
16
|
|
17
17
|
self.instance_exec(&block) if block_given?
|
@@ -60,13 +60,23 @@ module Mongify
|
|
60
60
|
@options['embed_in'].to_s unless @options['embed_in'].nil?
|
61
61
|
end
|
62
62
|
|
63
|
+
def embed_as
|
64
|
+
return nil unless embed?
|
65
|
+
return 'object' if @options['as'].to_s.downcase == 'object'
|
66
|
+
'array'
|
67
|
+
end
|
68
|
+
|
69
|
+
def embed_as_object?
|
70
|
+
embed_as == 'object'
|
71
|
+
end
|
72
|
+
|
63
73
|
def embed?
|
64
74
|
embed_in.present?
|
65
75
|
end
|
66
76
|
|
67
77
|
def embed_on
|
68
78
|
return nil unless embed?
|
69
|
-
(@options['on'] || "#{@options['embed_in'].singularize}_id").to_s
|
79
|
+
(@options['on'] || "#{@options['embed_in'].to_s.singularize}_id").to_s
|
70
80
|
end
|
71
81
|
|
72
82
|
#######
|
@@ -47,7 +47,8 @@ module Mongify
|
|
47
47
|
row.delete(t.embed_on)
|
48
48
|
row.merge!(fetch_reference_ids(t, row))
|
49
49
|
row.delete('pre_mongified_id')
|
50
|
-
|
50
|
+
save_function_call = t.embed_as_object? ? '$set' : '$addToSet'
|
51
|
+
no_sql_connection.update(t.embed_in, target_row['_id'], {save_function_call => {t.name => row}})
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
data/lib/mongify/version.rb
CHANGED
@@ -24,3 +24,12 @@ table "comments", :embed_in => :posts, :on => :post_id do
|
|
24
24
|
column "created_at", :datetime
|
25
25
|
column "updated_at", :datetime
|
26
26
|
end
|
27
|
+
|
28
|
+
table "preferences", :embed_in => :users, :as => :object do
|
29
|
+
column "id", :key
|
30
|
+
column "user_id", :integer, :references => "users"
|
31
|
+
column "notify_by_email", :boolean
|
32
|
+
column "created_at", :datetime
|
33
|
+
column "updated_at", :datetime
|
34
|
+
end
|
35
|
+
|
@@ -94,13 +94,21 @@ describe Mongify::Database::Column do
|
|
94
94
|
context "datetime" do
|
95
95
|
it "should return a datetime format" do
|
96
96
|
@column = Mongify::Database::Column.new('created_at', :datetime)
|
97
|
-
@column.translate('2011-01-14 21:23:39').should == {'created_at' => Time.
|
97
|
+
@column.translate('2011-01-14 21:23:39').should == {'created_at' => Time.local(2011, 01, 14, 21, 23,39)}
|
98
98
|
end
|
99
99
|
it "should return nil if input is nil" do
|
100
100
|
@column = Mongify::Database::Column.new('created_at', :datetime)
|
101
101
|
@column.translate(nil).should == {'created_at' => nil}
|
102
102
|
end
|
103
103
|
end
|
104
|
+
context :integer do
|
105
|
+
before(:each) do
|
106
|
+
@column = Mongify::Database::Column.new('account_id', :integer)
|
107
|
+
end
|
108
|
+
it "should return 10" do
|
109
|
+
@column.translate("10").should == {'account_id' => 10}
|
110
|
+
end
|
111
|
+
end
|
104
112
|
|
105
113
|
it "should return pre_mongified_id when type is a key" do
|
106
114
|
@column = Mongify::Database::Column.new('id', :key)
|
@@ -68,7 +68,7 @@ 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.sort.should == ['comments', 'posts', 'users'].sort
|
71
|
+
@sql_connection.tables.sort.should == ['comments', 'posts', 'preferences', 'users'].sort
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -105,6 +105,28 @@ describe Mongify::Database::Table do
|
|
105
105
|
Mongify::Database::Table.new('users').embed_in.should be_nil
|
106
106
|
end
|
107
107
|
end
|
108
|
+
context "embed_as" do
|
109
|
+
it "should return nil if it's not an embed table" do
|
110
|
+
Mongify::Database::Table.new('comments', :as => 'array').embed_as.should be_nil
|
111
|
+
end
|
112
|
+
it "should default to :array" do
|
113
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id').embed_as.should == 'array'
|
114
|
+
end
|
115
|
+
it "should allow Array as a value" do
|
116
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :array).embed_as.should == 'array'
|
117
|
+
end
|
118
|
+
it "should allow Object as a value" do
|
119
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :object).embed_as.should == 'object'
|
120
|
+
end
|
121
|
+
context "embed_as_object?" do
|
122
|
+
it "should be true" do
|
123
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :object).should be_embed_as_object
|
124
|
+
end
|
125
|
+
it "should be false" do
|
126
|
+
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id', :as => :array).should_not be_embed_as_object
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
108
130
|
context "embed?" do
|
109
131
|
it "should be true" do
|
110
132
|
Mongify::Database::Table.new('comments', :embed_in => 'posts', :on => 'post_id').should be_embed
|
@@ -78,7 +78,7 @@ describe Mongify::Translation::Process do
|
|
78
78
|
context "copy_embed_tables" do
|
79
79
|
before(:each) do
|
80
80
|
@target_table = mock(:name => 'posts', :embed? => false)
|
81
|
-
@embed_table = mock(:translate => {}, :name => 'comments', :embed? => true, :embed_on => 'post_id', :embed_in => 'posts')
|
81
|
+
@embed_table = mock(:translate => {}, :name => 'comments', :embed? => true, :embed_on => 'post_id', :embed_in => 'posts', :embed_as_object? => false)
|
82
82
|
@no_sql_connection.stub(:find_one).and_return({'_id' => 500})
|
83
83
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
84
84
|
@translation.stub(:fetch_reference_ids).and_return({})
|
@@ -90,17 +90,23 @@ describe Mongify::Translation::Process do
|
|
90
90
|
@translation.send(:copy_embedded_tables)
|
91
91
|
end
|
92
92
|
it "should remove the pre_mongified_id before embedding" do
|
93
|
-
@embed_table = mock(:translate => {'first_name' => 'bob', 'pre_mongified_id' => 1}, :name => 'comments', :embed? => true, :embed_on => 'post_id', :embed_in => 'posts')
|
93
|
+
@embed_table = mock(:translate => {'first_name' => 'bob', 'pre_mongified_id' => 1}, :name => 'comments', :embed? => true, :embed_on => 'post_id', :embed_in => 'posts', :embed_as_object? => false)
|
94
94
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
95
95
|
@no_sql_connection.should_receive(:update).with("posts", 500, {"$addToSet"=>{"comments"=>{'first_name' => 'bob'}}})
|
96
96
|
@translation.send(:copy_embedded_tables)
|
97
97
|
end
|
98
98
|
it "should remove the parent_id from the embedding row" do
|
99
|
-
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'comments', :embed? => true, :embed_on => 'post_id', :embed_in => 'posts')
|
99
|
+
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'comments', :embed? => true, :embed_on => 'post_id', :embed_in => 'posts', :embed_as_object? => false)
|
100
100
|
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
101
101
|
@no_sql_connection.should_receive(:update).with("posts", 500, {"$addToSet"=>{"comments"=>{'first_name' => 'bob'}}})
|
102
102
|
@translation.send(:copy_embedded_tables)
|
103
103
|
end
|
104
|
+
it "should call $addToSet on update of an embed_as_object table" do
|
105
|
+
@embed_table = mock(:translate => {'first_name' => 'bob', 'post_id' => 1}, :name => 'comments', :embed? => true, :embed_on => 'post_id', :embed_in => 'posts', :embed_as_object? => true)
|
106
|
+
@translation.stub(:tables).and_return([@target_table, @embed_table])
|
107
|
+
@no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"comments"=>{'first_name' => 'bob'}}})
|
108
|
+
@translation.send(:copy_embedded_tables)
|
109
|
+
end
|
104
110
|
end
|
105
111
|
|
106
112
|
context "update_reference_ids" do
|
@@ -35,8 +35,8 @@ describe Mongify::Translation do
|
|
35
35
|
|
36
36
|
context "parsed content" do
|
37
37
|
context "tables" do
|
38
|
-
it "should have
|
39
|
-
@translation.should have(
|
38
|
+
it "should have 4 tables" do
|
39
|
+
@translation.should have(4).tables
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should setup 'comments'" do
|
@@ -25,3 +25,11 @@ table "comments" do
|
|
25
25
|
column "updated_at", :datetime
|
26
26
|
end
|
27
27
|
|
28
|
+
table "preferences" do
|
29
|
+
column "id", :key
|
30
|
+
column "user_id", :integer, :references => "users"
|
31
|
+
column "notify_by_email", :boolean
|
32
|
+
column "created_at", :datetime
|
33
|
+
column "updated_at", :datetime
|
34
|
+
end
|
35
|
+
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'active_record'
|
2
1
|
class GenerateDatabase
|
3
2
|
def self.mysql_connection
|
4
3
|
@sql_connection ||= Mongify::Database::SqlConnection.new( :adapter => CONNECTION_CONFIG.mysql['adapter'],
|
@@ -40,6 +39,12 @@ class GenerateDatabase
|
|
40
39
|
t.timestamps
|
41
40
|
end
|
42
41
|
|
42
|
+
conn.create_table(:preferences) do |t|
|
43
|
+
t.integer :user_id
|
44
|
+
t.boolean :notify_by_email
|
45
|
+
t.timestamps
|
46
|
+
end
|
47
|
+
|
43
48
|
if include_data
|
44
49
|
|
45
50
|
#Users
|
@@ -71,6 +76,15 @@ class GenerateDatabase
|
|
71
76
|
VALUES ('#{v[:body]}', #{v[:post_id]}, #{v[:user_id]}, '#{Time.now.to_s(:db)}', '#{Time.now.to_s(:db)}')")
|
72
77
|
end
|
73
78
|
|
79
|
+
[
|
80
|
+
{:user_id => 1, :notify_by_email => true},
|
81
|
+
{:user_id => 2, :notify_by_email => true},
|
82
|
+
{:user_id => 3, :notify_by_email => false}
|
83
|
+
].each do |v|
|
84
|
+
conn.insert("INSERT INTO preferences (user_id, notify_by_email, created_at, updated_at)
|
85
|
+
VALUES (#{v[:user_id]}, '#{v[:notify_by_email]}', '#{Time.now.to_s(:db)}', '#{Time.now.to_s(:db)}')")
|
86
|
+
end
|
87
|
+
|
74
88
|
end
|
75
89
|
|
76
90
|
sqlite_connection.database
|
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: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
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-18 00:00:00 -05:00
|
19
19
|
default_executable: mongify
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|