mongify 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.yardopts +3 -0
- data/CHANGELOG.rdoc +5 -0
- data/Gemfile.lock +52 -6
- data/LICENSE +1 -1
- data/README.rdoc +29 -11
- data/Rakefile +37 -9
- data/features/options.feature +2 -0
- data/features/print.feature +1 -1
- data/features/process.feature +10 -1
- data/features/step_definitions/process_steps.rb +11 -1
- data/features/support/env.rb +1 -1
- data/lib/mongify/cli/application.rb +7 -7
- data/lib/mongify/cli/command/worker.rb +18 -14
- data/lib/mongify/cli/options.rb +2 -1
- data/lib/mongify/configuration.rb +5 -5
- data/lib/mongify/database/base_connection.rb +6 -6
- data/lib/mongify/database/column.rb +40 -40
- data/lib/mongify/database/data_row.rb +9 -9
- data/lib/mongify/database/no_sql_connection.rb +61 -35
- data/lib/mongify/database/sql_connection.rb +44 -15
- data/lib/mongify/database/table.rb +62 -46
- data/lib/mongify/exceptions.rb +5 -5
- data/lib/mongify/progressbar.rb +15 -15
- data/lib/mongify/status.rb +8 -8
- data/lib/mongify/translation.rb +19 -17
- data/lib/mongify/translation/process.rb +16 -123
- data/lib/mongify/translation/processor_common.rb +132 -0
- data/lib/mongify/translation/sync.rb +112 -0
- data/lib/mongify/ui.rb +9 -9
- data/lib/mongify/version.rb +1 -1
- data/mongify.gemspec +4 -2
- data/spec/files/deleting_fields_from_embedding_parent_translation.rb +19 -0
- data/spec/files/embedded_parent_translation.rb +1 -1
- data/spec/mongify/cli/application_spec.rb +1 -1
- data/spec/mongify/cli/options_spec.rb +1 -1
- data/spec/mongify/cli/worker_command_spec.rb +46 -17
- data/spec/mongify/database/column_spec.rb +21 -21
- data/spec/mongify/database/data_row_spec.rb +11 -11
- data/spec/mongify/database/no_sql_connection_spec.rb +61 -27
- data/spec/mongify/database/sql_connection_spec.rb +62 -2
- data/spec/mongify/database/table_spec.rb +53 -29
- data/spec/mongify/translation/printer_spec.rb +2 -2
- data/spec/mongify/translation/process_spec.rb +50 -34
- data/spec/mongify/translation/sync_spec.rb +184 -0
- data/spec/mongify/translation_spec.rb +8 -8
- data/spec/mongify/ui_spec.rb +12 -12
- data/spec/mongify_spec.rb +1 -1
- data/spec/spec_helper.rb +8 -1
- data/spec/support/config_reader.rb +2 -2
- data/spec/support/database_generator.rb +68 -25
- data/spec/support/database_output.txt +17 -0
- metadata +41 -6
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'mongify/translation/processor_common'
|
2
|
+
module Mongify
|
3
|
+
class Translation
|
4
|
+
#
|
5
|
+
# This module does the sync processing on the translation object
|
6
|
+
#
|
7
|
+
include ProcessorCommon
|
8
|
+
module Sync
|
9
|
+
attr_accessor :max_updated_at
|
10
|
+
DRAFT_KEY = "__mongify_sync_draft__"
|
11
|
+
SYNC_HELPER_TABLE = "__mongify_sync_helper__"
|
12
|
+
|
13
|
+
class SyncHelperMigrator < ActiveRecord::Migration
|
14
|
+
def up
|
15
|
+
create_table SYNC_HELPER_TABLE, :id => false do |t|
|
16
|
+
t.string :table_name
|
17
|
+
t.datetime :last_updated_at
|
18
|
+
end
|
19
|
+
add_index SYNC_HELPER_TABLE, :table_name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Does the actual act of sync processing the translation.
|
24
|
+
# Takes in both a sql connection and a no sql connection
|
25
|
+
def sync(sql_connection, no_sql_connection)
|
26
|
+
prepare_connections(sql_connection, no_sql_connection)
|
27
|
+
setup_sync_table
|
28
|
+
setup_db_index
|
29
|
+
sync_data
|
30
|
+
set_last_updated_at
|
31
|
+
copy_embedded_tables
|
32
|
+
sync_update_reference_ids
|
33
|
+
copy_polymorphic_tables
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
#######
|
38
|
+
private
|
39
|
+
#######
|
40
|
+
|
41
|
+
def setup_sync_table
|
42
|
+
# make sure table exists
|
43
|
+
begin
|
44
|
+
self.sql_connection.execute("SELECT count(*) FROM #{SYNC_HELPER_TABLE}")
|
45
|
+
rescue
|
46
|
+
SyncHelperMigrator.new.up
|
47
|
+
end
|
48
|
+
# insert missing records for sync tables
|
49
|
+
self.copy_tables.each do |t|
|
50
|
+
if self.sql_connection.count(SYNC_HELPER_TABLE, "table_name = '#{t.sql_name}'") == 0
|
51
|
+
self.sql_connection.execute("INSERT INTO #{SYNC_HELPER_TABLE} (table_name, last_updated_at) VALUES ('#{t.sql_name}', '1970-01-01')")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Does the straight copy (of tables)
|
57
|
+
def sync_data
|
58
|
+
self.copy_tables.each do |t|
|
59
|
+
q = "SELECT t.* FROM #{t.sql_name} t, #{SYNC_HELPER_TABLE} u " +
|
60
|
+
"WHERE t.updated_at > u.last_updated_at AND u.table_name = '#{t.sql_name}'"
|
61
|
+
rows = sql_connection.select_by_query(q)
|
62
|
+
Mongify::Status.publish('copy_data', :size => rows.count, :name => "Syncing #{t.name}", :action => 'add')
|
63
|
+
max_updated_at, max_updated_at_id = Time.new(1970), nil
|
64
|
+
rows.each do |row|
|
65
|
+
row_hash = t.translate(row)
|
66
|
+
updated_at = Time.parse(row['updated_at'])
|
67
|
+
if updated_at > max_updated_at
|
68
|
+
max_updated_at = updated_at
|
69
|
+
max_updated_at_id = row_hash['pre_mongified_id']
|
70
|
+
end
|
71
|
+
no_sql_connection.upsert(t.name, row_hash.merge({DRAFT_KEY => true}))
|
72
|
+
Mongify::Status.publish('copy_data')
|
73
|
+
end
|
74
|
+
(self.max_updated_at ||= {})[t.sql_name] = {'max_updated_at_id' => max_updated_at_id, 'key_column' => t.key_column.name}
|
75
|
+
Mongify::Status.publish('copy_data', :action => 'finish')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Updates the reference ids in the no sql database
|
80
|
+
def sync_update_reference_ids
|
81
|
+
self.copy_tables.each do |t|
|
82
|
+
rows = no_sql_connection.select_by_query(t.name, {DRAFT_KEY => true})
|
83
|
+
Mongify::Status.publish('update_references', :size => rows.count, :name => "Updating References #{t.name}", :action => 'add')
|
84
|
+
rows.each do |row|
|
85
|
+
id = row["_id"]
|
86
|
+
attributes = fetch_reference_ids(t, row)
|
87
|
+
setter = {"$unset" => {DRAFT_KEY => true}}
|
88
|
+
setter["$set"] = attributes unless attributes.blank?
|
89
|
+
no_sql_connection.update(t.name, id, setter)
|
90
|
+
Mongify::Status.publish('update_references')
|
91
|
+
end
|
92
|
+
Mongify::Status.publish('update_references', :action => 'finish')
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Sets the last updated_at flag so that next sync doesn't unnecessarily copy old data
|
97
|
+
def set_last_updated_at
|
98
|
+
tables = self.copy_tables
|
99
|
+
Mongify::Status.publish('set_last_updated_at', :size => tables.length, :name => "Setting last_updated_at", :action => 'add')
|
100
|
+
tables.each do |t|
|
101
|
+
info = self.max_updated_at[t.sql_name]
|
102
|
+
if info && info['max_updated_at_id']
|
103
|
+
sql_connection.execute("UPDATE #{SYNC_HELPER_TABLE} SET last_updated_at = (SELECT updated_at FROM #{t.sql_name} WHERE #{info['key_column']} = '#{info['max_updated_at_id']}') WHERE table_name = '#{t.sql_name}'")
|
104
|
+
end
|
105
|
+
Mongify::Status.publish('set_last_updated_at')
|
106
|
+
end
|
107
|
+
Mongify::Status.publish('set_last_updated_at', :action => 'finish')
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
data/lib/mongify/ui.rb
CHANGED
@@ -8,39 +8,39 @@ module Mongify
|
|
8
8
|
def puts(msg)
|
9
9
|
out_stream.puts(msg) if out_stream
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
# Outputs to stream using print method
|
13
13
|
def print(msg)
|
14
14
|
out_stream.print(msg) if out_stream
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
# Gets input from user
|
18
18
|
def gets
|
19
19
|
in_stream ? in_stream.gets : ''
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
# Outputs a question and gets input
|
23
23
|
def request(msg)
|
24
24
|
print(msg)
|
25
25
|
gets.chomp
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# Asks a yes or no question and waits for reply
|
29
29
|
def ask(msg)
|
30
30
|
request("#{msg} [yn] ") == 'y'
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
# Outputs a Warning (using puts command)
|
34
34
|
def warn(msg)
|
35
35
|
puts "WARNING: #{msg}"
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
# Outputs a message and aborts execution of app
|
39
39
|
def abort(message)
|
40
40
|
UI.puts "PROGRAM HALT: #{message}"
|
41
41
|
Kernel.abort message
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# Incoming stream
|
45
45
|
def in_stream
|
46
46
|
Configuration.in_stream
|
@@ -49,11 +49,11 @@ module Mongify
|
|
49
49
|
def out_stream
|
50
50
|
Configuration.out_stream
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
# Creates an instance of HighLine
|
54
54
|
# which lets us figure out width of console
|
55
55
|
# plus a whole lot more
|
56
|
-
# @return [HighLine] instance
|
56
|
+
# @return [HighLine] instance
|
57
57
|
def terminal_helper
|
58
58
|
@terminal_helper ||= HighLine.new
|
59
59
|
end
|
data/lib/mongify/version.rb
CHANGED
data/mongify.gemspec
CHANGED
@@ -23,10 +23,12 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_development_dependency('cucumber', '>= 0.10')
|
24
24
|
s.add_development_dependency('mocha', '>= 0.9.8')
|
25
25
|
s.add_development_dependency('yard', '>= 0.5.3')
|
26
|
-
s.add_development_dependency('sqlite3
|
27
|
-
s.add_development_dependency('
|
26
|
+
s.add_development_dependency('sqlite3', '>= 1.3')
|
27
|
+
s.add_development_dependency('pg', '>= 0.17')
|
28
|
+
s.add_development_dependency('mysql2', '~> 0.3.1')
|
28
29
|
s.add_development_dependency('watchr', '>= 0.6')
|
29
30
|
s.add_development_dependency('rake')
|
31
|
+
s.add_development_dependency('pry-plus')
|
30
32
|
|
31
33
|
s.files = `git ls-files`.split("\n")
|
32
34
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -0,0 +1,19 @@
|
|
1
|
+
table 'teams' do
|
2
|
+
column 'id', :key
|
3
|
+
column 'name', :string
|
4
|
+
column 'phone', :string
|
5
|
+
column 'created_at', :datetime
|
6
|
+
column 'updated_at', :datetime
|
7
|
+
end
|
8
|
+
|
9
|
+
table 'coaches', :embed_in => 'teams', :as => 'object', :rename_to => 'coach' do
|
10
|
+
column 'id', :key
|
11
|
+
column 'team_id', :integer, :references => "teams"
|
12
|
+
column 'first_name', :string
|
13
|
+
column 'last_name', :string
|
14
|
+
column 'created_at', :datetime
|
15
|
+
column 'updated_at', :datetime
|
16
|
+
before_save do |row, parent_row|
|
17
|
+
row.write_attribute('phone',parent_row.delete('phone'))
|
18
|
+
end
|
19
|
+
end
|
@@ -12,7 +12,7 @@ table "preferences", :embed_in => :users, :as => :array do
|
|
12
12
|
column "notify_by_email", :boolean
|
13
13
|
column "created_at", :datetime, :ignore => true
|
14
14
|
column "updated_at", :datetime, :ignore => true
|
15
|
-
|
15
|
+
|
16
16
|
before_save do |row, parent|
|
17
17
|
parent.notify_by_email = row.delete('notify_by_email')
|
18
18
|
end
|
@@ -7,7 +7,7 @@ describe Mongify::CLI::Application do
|
|
7
7
|
Mongify::Configuration.out_stream = nil
|
8
8
|
@application.execute!.should == 0
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
it "should return a 1 on error" do
|
12
12
|
@application = Mongify::CLI::Application.new(["door"])
|
13
13
|
Mongify::Configuration.out_stream = nil
|
@@ -52,7 +52,7 @@ describe Mongify::CLI::Options do
|
|
52
52
|
it "should call Configuration.parse" do
|
53
53
|
Mongify::Configuration.should_receive(:parse).and_return(Mongify::Configuration.new)
|
54
54
|
@options = Mongify::CLI::Options.new(['check', config_file])
|
55
|
-
@options.parse
|
55
|
+
@options.parse
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -11,19 +11,19 @@ describe Mongify::CLI::Command::Worker do
|
|
11
11
|
@no_sql_connection.stub(:valid?).and_return(true)
|
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
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
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
context "list_commands" do
|
22
22
|
it "should return same number as available" do
|
23
23
|
Mongify::CLI::Command::Worker.list_commands.size.should == Mongify::CLI::Command::Worker::AVAILABLE_COMMANDS.size
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
context "check command" do
|
28
28
|
before(:each) do
|
29
29
|
@command = Mongify::CLI::Command::Worker.new('check', @config)
|
@@ -42,17 +42,17 @@ describe Mongify::CLI::Command::Worker do
|
|
42
42
|
lambda { @command = Mongify::CLI::Command::Worker.new('check').execute(@view) }.should raise_error(Mongify::ConfigurationFileNotFound)
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
context "non-existing command" do
|
47
47
|
before(:each) do
|
48
48
|
@command = Mongify::CLI::Command::Worker.new('unknown')
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
it "should report error" do
|
52
52
|
@view.should_receive(:report_error)
|
53
53
|
@command.execute(@view)
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
it "should output an error" do
|
57
57
|
@view.should_receive(:output).with("Unknown action unknown\n\n")
|
58
58
|
@command.execute(@view)
|
@@ -64,22 +64,22 @@ describe Mongify::CLI::Command::Worker do
|
|
64
64
|
@command = Mongify::CLI::Command::Worker.new('translation', @config)
|
65
65
|
Mongify::Translation.stub(:load).with(@sql_connection).and_return(stub(:print => 'worked'))
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
it "should require configuration file" do
|
69
69
|
lambda { Mongify::CLI::Command::Worker.new('translation').execute(@view) }.should raise_error(Mongify::ConfigurationFileNotFound)
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
it "should check sql connection" do
|
73
73
|
@command.should_receive(:check_sql_connection).and_return(true)
|
74
74
|
@command.execute(@view)
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
it "should call load on Translation" do
|
78
78
|
Mongify::Translation.should_receive(:load).with(@sql_connection).and_return(stub(:print => 'worked'))
|
79
79
|
@command.execute(@view)
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
context "process command" do
|
84
84
|
before(:each) do
|
85
85
|
@command = Mongify::CLI::Command::Worker.new('process', @config, 'spec/files/translation.rb')
|
@@ -90,25 +90,54 @@ describe Mongify::CLI::Command::Worker do
|
|
90
90
|
@view.should_receive(:report_success)
|
91
91
|
@command.execute(@view)
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
it "should require config file" do
|
95
95
|
lambda { @command = Mongify::CLI::Command::Worker.new('process').execute(@view) }.should raise_error(Mongify::ConfigurationFileNotFound)
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
it "should require transaction file" do
|
99
99
|
lambda { @command = Mongify::CLI::Command::Worker.new('process', @config).execute(@view) }.should raise_error(Mongify::TranslationFileNotFound)
|
100
100
|
end
|
101
|
-
|
101
|
+
|
102
102
|
it "should check_connection" do
|
103
103
|
@command.should_receive(:check_connections).and_return(true)
|
104
104
|
@command.execute(@view)
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
it "should call process on translation" do
|
108
108
|
Mongify::Translation.should_receive(:parse).and_return(mock(:process => true))
|
109
109
|
@command.execute(@view)
|
110
110
|
end
|
111
|
-
|
112
|
-
|
113
111
|
end
|
112
|
+
|
113
|
+
context "sync command" do
|
114
|
+
before(:each) do
|
115
|
+
@command = Mongify::CLI::Command::Worker.new('sync', @config, 'spec/files/translation.rb')
|
116
|
+
Mongify::Translation.stub(:parse).and_return(mock(:sync => true))
|
117
|
+
end
|
118
|
+
it "should report success" do
|
119
|
+
@view.should_receive(:report_error).never
|
120
|
+
@view.should_receive(:report_success)
|
121
|
+
@command.execute(@view)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should require config file" do
|
125
|
+
lambda { @command = Mongify::CLI::Command::Worker.new('sync').execute(@view) }.should raise_error(Mongify::ConfigurationFileNotFound)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should require transaction file" do
|
129
|
+
lambda { @command = Mongify::CLI::Command::Worker.new('sync', @config).execute(@view) }.should raise_error(Mongify::TranslationFileNotFound)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should check_connection" do
|
133
|
+
@command.should_receive(:check_connections).and_return(true)
|
134
|
+
@command.execute(@view)
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should call sync on translation" do
|
138
|
+
Mongify::Translation.should_receive(:parse).and_return(mock(:sync => true))
|
139
|
+
@command.execute(@view)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
114
143
|
end
|
@@ -4,41 +4,41 @@ describe Mongify::Database::Column do
|
|
4
4
|
before(:each) do
|
5
5
|
@column = Mongify::Database::Column.new('first_name')
|
6
6
|
end
|
7
|
-
|
7
|
+
|
8
8
|
it "should have name" do
|
9
9
|
@column.name.should == 'first_name'
|
10
10
|
end
|
11
11
|
it "should have a sql_name" do
|
12
12
|
@column.sql_name.should == 'first_name'
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it "should allow you to omit the type while giving options" do
|
16
16
|
@column = Mongify::Database::Column.new('account_id', :references => 'accounts')
|
17
17
|
@column.options.should == {'references' => 'accounts'}
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it "should get setup options" do
|
21
21
|
@column = Mongify::Database::Column.new('account_id', :integer, :references => 'accounts')
|
22
22
|
@column.options.should == {'references' => 'accounts'}
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
it "should force type to string if nil" do
|
26
26
|
@column = Mongify::Database::Column.new('first_name', nil)
|
27
27
|
@column.type.should == :string
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
context "auto_detect!" do
|
31
31
|
it "should not auto detect automatically" do
|
32
32
|
Mongify::Database::Column.should_receive(:auto_detect).never
|
33
33
|
@column = Mongify::Database::Column.new('id', :integer)
|
34
34
|
@column.should_not be_key
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
it "should auto_detect when option is passed in" do
|
38
38
|
@column = Mongify::Database::Column.new('id', :integer, :auto_detect => true)
|
39
39
|
@column.should be_key
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
context "id column" do
|
43
43
|
before(:each) do
|
44
44
|
@col = mock(:sql_name => 'id')
|
@@ -82,19 +82,19 @@ describe Mongify::Database::Column do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
end
|
85
|
-
|
85
|
+
|
86
86
|
context "key?" do
|
87
87
|
it "should be true" do
|
88
88
|
@column = Mongify::Database::Column.new('id', :key)
|
89
89
|
@column.should be_a_key
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
it "should be true" do
|
93
93
|
@column = Mongify::Database::Column.new('first_name', :string)
|
94
94
|
@column.should_not be_a_key
|
95
95
|
end
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
context "rename_to" do
|
99
99
|
before(:each) do
|
100
100
|
@column = Mongify::Database::Column.new('surname', :string, :rename_to => 'last_name')
|
@@ -108,12 +108,12 @@ describe Mongify::Database::Column do
|
|
108
108
|
it "should translate to new name" do
|
109
109
|
@column.translate('value').should == {'last_name' => 'value'}
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
it "should rename this" do
|
113
113
|
@column = Mongify::Database::Column.new("geoCode_longitude", :string, :rename_to => 'longitude')
|
114
114
|
@column.translate(42.2222).should == {'longitude' => '42.2222'}
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
it "should be renamed" do
|
118
118
|
@column.should be_renamed
|
119
119
|
end
|
@@ -122,7 +122,7 @@ describe Mongify::Database::Column do
|
|
122
122
|
col.should_not be_renamed
|
123
123
|
end
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
context "options" do
|
127
127
|
it "should allow to be set by name" do
|
128
128
|
@column = Mongify::Database::Column.new('first_name')
|
@@ -134,8 +134,8 @@ describe Mongify::Database::Column do
|
|
134
134
|
@column = Mongify::Database::Column.new('first_name')
|
135
135
|
lambda { @column.unknown = "users" }.should raise_error(NoMethodError)
|
136
136
|
end
|
137
|
-
end
|
138
|
-
|
137
|
+
end
|
138
|
+
|
139
139
|
context "as" do
|
140
140
|
subject {Mongify::Database::Column.new('total', :decimal)}
|
141
141
|
it "should default to string" do
|
@@ -173,7 +173,7 @@ describe Mongify::Database::Column do
|
|
173
173
|
subject.scale.should be_zero
|
174
174
|
end
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
context :to_print do
|
178
178
|
before(:each) do
|
179
179
|
@column = Mongify::Database::Column.new('first_name', :string)
|
@@ -195,14 +195,14 @@ describe Mongify::Database::Column do
|
|
195
195
|
@column.to_print.should == %q{column "first_name", :key, :as => :integer}
|
196
196
|
end
|
197
197
|
end
|
198
|
-
|
198
|
+
|
199
199
|
context :referenced? do
|
200
200
|
it "should be true" do
|
201
201
|
@column = Mongify::Database::Column.new('user_id', :integer, :references => 'users')
|
202
202
|
@column.should be_a_referenced
|
203
203
|
end
|
204
204
|
end
|
205
|
-
|
205
|
+
|
206
206
|
context :translate do
|
207
207
|
it "should return a hash with the new translation" do
|
208
208
|
@column = Mongify::Database::Column.new('first_name', :string)
|
@@ -213,7 +213,7 @@ describe Mongify::Database::Column do
|
|
213
213
|
@column.should be_ignored
|
214
214
|
@column.translate('bob').should == {}
|
215
215
|
end
|
216
|
-
|
216
|
+
|
217
217
|
it "should return pre_mongified_id when type is a key" do
|
218
218
|
@column = Mongify::Database::Column.new('id', :key)
|
219
219
|
@column.translate(123123).should == {"pre_mongified_id" => 123123}
|
@@ -295,7 +295,7 @@ describe Mongify::Database::Column do
|
|
295
295
|
it "should return a string value" do
|
296
296
|
@column.send(:type_cast, 101.43).should be_a_kind_of String
|
297
297
|
end
|
298
|
-
|
298
|
+
|
299
299
|
context :integer do
|
300
300
|
before(:each) do
|
301
301
|
@column = Mongify::Database::Column.new('price', :decimal, :as => :integer)
|
@@ -387,7 +387,7 @@ describe Mongify::Database::Column do
|
|
387
387
|
@column.send(:type_cast, nil).should == result
|
388
388
|
@column.send(:type_cast, "").should == result
|
389
389
|
end
|
390
|
-
|
390
|
+
|
391
391
|
end
|
392
392
|
end
|
393
393
|
end
|