mongify 0.1.7 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,5 @@
1
+ == 0.2.0 / 01 Jun 2011
2
+ * Added the ability to modify parent table when working with embedded tables
1
3
  == 0.1.7 / 03 May 2011
2
4
  * Changed logic to NOT translate columns that are not in the translation file. If column is not listed, it's not moved over.
3
5
  * Fixed issue with case sensitivity of column names
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongify (0.1.7)
4
+ mongify (0.2.0)
5
5
  activerecord (>= 3.0.3)
6
6
  activesupport (>= 3.0.3)
7
7
  bson_ext (>= 1.1.5)
data/README.rdoc CHANGED
@@ -179,6 +179,12 @@ Table Options are as follow:
179
179
  end # Moving records around, renaming records, changing values in row based on
180
180
  end # some values! Checkout Mongify::Database::DataRow to learn more
181
181
 
182
+ table "preferences", :embed_in => "users" do # As of version 0.2, embedded tables with a before_save will take an
183
+ before_save do |pref_row, user_row| # extra argument which is the parent row of the embedded table.
184
+ user_row.email_me = pref_row.delete('email_me') # This gives you the ability to move things from an embedded table row
185
+ end # to the parent row.
186
+ end
187
+
182
188
  More documentation can be found at {Mongify::Database::Table}
183
189
 
184
190
  === Columns
@@ -13,4 +13,12 @@ Feature: Processing a translation
13
13
  And the first post's user_id should be first user
14
14
  And there should be 0 comments in mongodb
15
15
  And the first post should have 1 comment
16
-
16
+
17
+ Scenario: Processing while modifying embedding parent.
18
+ Given a database exists
19
+ And a blank mongodb
20
+ When I run mongify process spec/files/embedded_parent_translation.rb -c spec/files/base_configuration.rb
21
+ Then it succeeds
22
+ And there should be 3 users in mongodb
23
+ And the first user's notify_by_email attribute should be true
24
+ And the third user's notify_by_email attribute should be false
@@ -0,0 +1,4 @@
1
+ Then /^the (first|sencond|third) (.+)'s (.+) attribute should be (.+)$/ do |collection_place, collection_name, field, value|
2
+ DatabaseGenerator.mongo_connection.db[collection_name.pluralize].
3
+ find.to_a.send(collection_place.to_sym)[field].to_s.should == value.to_s
4
+ end
@@ -3,6 +3,7 @@ module Mongify
3
3
  # Class that will be used to allow user to modify data for the given row
4
4
  class DataRow
5
5
  def initialize(hash={})
6
+ hash = {} if hash.nil?
6
7
  @hash = hash.dup.stringify_keys!
7
8
  end
8
9
 
@@ -47,6 +47,14 @@ module Mongify
47
47
  # row.admin = row.delete('permission').to_i > 50 # This gives you the ability to do very powerful things like:
48
48
  # end # Moving records around, renaming records, changing values in row based on
49
49
  # end # some values! Checkout Mongify::Database::DataRow to learn more
50
+ #
51
+ #
52
+ # table "preferences", :embed_in => "users" do # As of version 0.2, embedded tables with a before_save will take an
53
+ # before_save do |pref_row, user_row| # extra argument which is the parent row of the embedded table.
54
+ # user_row.email_me = pref_row.delete('email_me') # This gives you the ability to move things from an embedded table row
55
+ # end # to the parent row.
56
+ # end
57
+ #
50
58
 
51
59
  class Table
52
60
 
@@ -114,13 +122,13 @@ module Mongify
114
122
 
115
123
  # Returns a translated row
116
124
  # Takes in a hash of values
117
- def translate(row)
125
+ def translate(row, parent=nil)
118
126
  new_row = {}
119
127
  row.each do |key, value|
120
128
  c = find_column(key)
121
129
  new_row.merge!(c.translate(value)) if c.present?
122
130
  end
123
- run_before_save(new_row)
131
+ run_before_save(new_row, parent)
124
132
  end
125
133
 
126
134
 
@@ -154,7 +162,12 @@ module Mongify
154
162
 
155
163
  # Used to save a block to be ran after the row has been processed but before it's saved to the no sql database
156
164
  def before_save(&block)
157
- @before_save = block
165
+ @before_save_callback = block
166
+ end
167
+
168
+ #Used to remove any before save filter
169
+ def remove_before_save_filter!
170
+ @before_save_callback = nil
158
171
  end
159
172
 
160
173
  #######
@@ -163,11 +176,15 @@ module Mongify
163
176
 
164
177
  # Runs the before save
165
178
  # Returns: a new modified row
166
- def run_before_save(row)
167
- return row unless @before_save
179
+ def run_before_save(row, parent=nil)
180
+ parentrow = Mongify::Database::DataRow.new(parent) unless parent.nil?
168
181
  datarow = Mongify::Database::DataRow.new(row)
169
- @before_save.call(datarow)
170
- datarow.to_hash
182
+ @before_save_callback.call(datarow, parentrow) unless @before_save_callback.nil?
183
+ if parentrow
184
+ [datarow.to_hash, parentrow.to_hash]
185
+ else
186
+ datarow.to_hash
187
+ end
171
188
  end
172
189
 
173
190
  # Indexes the column on the sql_name and adds column to the array
@@ -59,12 +59,16 @@ module Mongify
59
59
  rows.each do |row|
60
60
  target_row = no_sql_connection.find_one(t.embed_in, {:pre_mongified_id => row[t.embed_on]})
61
61
  next unless target_row.present?
62
- row = t.translate(row)
62
+ # puts "target_row = #{target_row.inspect}", "---"
63
+ row, parent_row = t.translate(row, target_row)
64
+ parent_row ||= {}
65
+ parent_row.delete("_id")
66
+ #puts "parent_row = #{parent_row.inspect}", "---"
63
67
  row.delete(t.embed_on)
64
68
  row.merge!(fetch_reference_ids(t, row))
65
69
  row.delete('pre_mongified_id')
66
70
  save_function_call = t.embedded_as_object? ? '$set' : '$addToSet'
67
- no_sql_connection.update(t.embed_in, target_row['_id'], {save_function_call => {t.name => row}})
71
+ no_sql_connection.update(t.embed_in, target_row['_id'], append_parent_object({save_function_call => {t.name => row}}, parent_row))
68
72
  Mongify::Status.publish('copy_embedded')
69
73
  end
70
74
  Mongify::Status.publish('copy_embedded', :action => 'finish')
@@ -125,7 +129,7 @@ module Mongify
125
129
  def fetch_reference_ids(table, row)
126
130
  attributes = {}
127
131
  table.reference_columns.each do |c|
128
- new_id = no_sql_connection.get_id_using_pre_mongified_id(c.references.to_s, row[c.name])
132
+ new_id = no_sql_connection.get_id_using_pre_mongified_id(c.references.to_s, row[c.name.to_s])
129
133
  attributes.merge!(c.name => new_id) unless new_id.nil?
130
134
  end
131
135
  attributes
@@ -141,6 +145,14 @@ module Mongify
141
145
  end
142
146
  end
143
147
 
148
+ # Used to append parent object values to an embedded update call
149
+ def append_parent_object(object, parent)
150
+ return object if parent.blank?
151
+ object["$set"] = object.has_key?('$set') ? object["$set"].merge(parent) : parent
152
+ object
153
+ end
154
+
155
+
144
156
  end
145
157
  end
146
158
  end
@@ -1,4 +1,4 @@
1
1
  module Mongify
2
2
  # Mongify's Current Version Number
3
- VERSION = "0.1.7"
3
+ VERSION = "0.2.0"
4
4
  end
@@ -0,0 +1,21 @@
1
+ table "users" do
2
+ column "id", :key
3
+ column "first_name", :string
4
+ column "last_name", :string
5
+ column "created_at", :datetime
6
+ column "updated_at", :datetime
7
+ end
8
+
9
+ table "preferences", :embed_in => :users, :as => :array do
10
+ column "id", :key
11
+ column "user_id", :integer, :references => "users"
12
+ column "notify_by_email", :boolean
13
+ column "created_at", :datetime, :ignore => true
14
+ column "updated_at", :datetime, :ignore => true
15
+
16
+ before_save do |row, parent|
17
+ parent.notify_by_email = row.delete('notify_by_email')
18
+ end
19
+ end
20
+
21
+
@@ -195,6 +195,14 @@ describe Mongify::Database::Table do
195
195
  row.admin = row.delete('permission').to_i > 50
196
196
  end
197
197
  end
198
+ it "should be resetable" do
199
+ @table.before_save do |row|
200
+ row.test = "removed!"
201
+ end
202
+ @table.remove_before_save_filter!
203
+ result = @table.send(:run_before_save, {'test'=>true})
204
+ result.should == {'test' => true}
205
+ end
198
206
  context "run_before_save" do
199
207
  it "should create a new DataRow" do
200
208
  row = {'first_name' => 'Bob'}
@@ -207,6 +215,25 @@ describe Mongify::Database::Table do
207
215
  @table.translate({'permission' => 51}).should == {'admin' => true}
208
216
  end
209
217
  end
218
+ context "before_save sending parent" do
219
+ before(:each) do
220
+ @parent_table = Mongify::Database::Table.new('users')
221
+ @table = Mongify::Database::Table.new('preferences')
222
+ @table.column "preferences"
223
+ @table.before_save do |row, parent|
224
+ parent.preferences = row.delete('preferences')
225
+ end
226
+ end
227
+ it "should work" do
228
+ @table.translate({'preferences' => 'yes'}, {}).should == [{}, {'preferences' => 'yes'}]
229
+ end
230
+ it "should return blank hash if parent is unchanged" do
231
+ @table.remove_before_save_filter!
232
+ @table.translate({'preferences' => "true"}, {}).should == [{'preferences' => "true"}, {}]
233
+ end
234
+ end
235
+
236
+
210
237
 
211
238
  context "polymorphic" do
212
239
  before(:each) do
@@ -136,6 +136,40 @@ describe Mongify::Translation::Process do
136
136
  @no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"notes"=>{'first_name' => 'bob'}}})
137
137
  @translation.send(:copy_embedded_tables)
138
138
  end
139
+
140
+ context "parent modification" do
141
+ it "should work with embedded objects" do
142
+ @embed_table = mock(:translate => [{}, {'email' => 'true'}], :name => 'preferences', :sql_name => 'preferences', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => true)
143
+ @translation.stub(:tables).and_return([@target_table, @embed_table])
144
+ @no_sql_connection.should_receive(:update).with("posts", 500, {"$set"=>{"preferences"=>{}, "email"=>"true"}})
145
+ @translation.send(:copy_embedded_tables)
146
+ end
147
+ it "should work with embedded arrays" do
148
+ @embed_table = mock(:translate => [{}, {'email' => 'true'}], :name => 'preferences', :sql_name => 'preferences', :embedded? => true, :embed_on => 'post_id', :embed_in => 'posts', :embedded_as_object? => false)
149
+ @translation.stub(:tables).and_return([@target_table, @embed_table])
150
+ @no_sql_connection.should_receive(:update).with("posts", 500, {"$addToSet"=>{"preferences"=>{}}, "$set" => {"email"=>"true"}})
151
+ @translation.send(:copy_embedded_tables)
152
+ end
153
+ end
154
+ end
155
+
156
+ context "append_parent_object" do
157
+ before(:each) do
158
+ @parent = {"preference" => "email"}
159
+ end
160
+ it "should work when $set is already present" do
161
+ @obj = {"$set" => {"existing" => true}}
162
+ @translation.send(:append_parent_object, @obj, @parent).should == {"$set" => {"existing" => true, "preference" => "email"}}
163
+ end
164
+ it "should create $set if one is missing" do
165
+ @obj = {"$setAppend" => {"existing" => "true"}}
166
+ @translation.send(:append_parent_object, @obj, @parent).should == {"$set" => {"preference" => "email"}, "$setAppend" => {"existing" => "true"}}
167
+ end
168
+ it "should do nothing if no parent is given" do
169
+ @parent = {}
170
+ @obj = {"$setAppend" => {"existing" => "true"}}
171
+ @translation.send(:append_parent_object, @obj, @parent).should == {"$setAppend" => {"existing" => "true"}}
172
+ end
139
173
  end
140
174
 
141
175
  context "update_reference_ids" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-05-03 00:00:00.000000000Z
12
+ date: 2011-06-25 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &2153452920 !ruby/object:Gem::Requirement
16
+ requirement: &2153201840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.0.3
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2153452920
24
+ version_requirements: *2153201840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &2153452460 !ruby/object:Gem::Requirement
27
+ requirement: &2153201280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2153452460
35
+ version_requirements: *2153201280
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: mysql2
38
- requirement: &2153452080 !ruby/object:Gem::Requirement
38
+ requirement: &2153200840 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2153452080
46
+ version_requirements: *2153200840
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: mongo
49
- requirement: &2153451540 !ruby/object:Gem::Requirement
49
+ requirement: &2153200200 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.1.5
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2153451540
57
+ version_requirements: *2153200200
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bson_ext
60
- requirement: &2153451040 !ruby/object:Gem::Requirement
60
+ requirement: &2153199640 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.5
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2153451040
68
+ version_requirements: *2153199640
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: highline
71
- requirement: &2153450580 !ruby/object:Gem::Requirement
71
+ requirement: &2153130820 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.6.1
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *2153450580
79
+ version_requirements: *2153130820
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &2153450120 !ruby/object:Gem::Requirement
82
+ requirement: &2153130320 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '2.0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2153450120
90
+ version_requirements: *2153130320
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rcov
93
- requirement: &2153449660 !ruby/object:Gem::Requirement
93
+ requirement: &2153129740 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.9.9
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2153449660
101
+ version_requirements: *2153129740
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: cucumber
104
- requirement: &2153449200 !ruby/object:Gem::Requirement
104
+ requirement: &2153129180 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0.10'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2153449200
112
+ version_requirements: *2153129180
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: mocha
115
- requirement: &2153448740 !ruby/object:Gem::Requirement
115
+ requirement: &2153128680 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 0.9.8
121
121
  type: :development
122
122
  prerelease: false
123
- version_requirements: *2153448740
123
+ version_requirements: *2153128680
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: yard
126
- requirement: &2153448280 !ruby/object:Gem::Requirement
126
+ requirement: &2153128100 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 0.5.3
132
132
  type: :development
133
133
  prerelease: false
134
- version_requirements: *2153448280
134
+ version_requirements: *2153128100
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: watchr
137
- requirement: &2153464180 !ruby/object:Gem::Requirement
137
+ requirement: &2153127600 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '0.6'
143
143
  type: :development
144
144
  prerelease: false
145
- version_requirements: *2153464180
145
+ version_requirements: *2153127600
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: sqlite3-ruby
148
- requirement: &2153463720 !ruby/object:Gem::Requirement
148
+ requirement: &2153127020 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: '1.3'
154
154
  type: :development
155
155
  prerelease: false
156
- version_requirements: *2153463720
156
+ version_requirements: *2153127020
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: mysql
159
- requirement: &2153463260 !ruby/object:Gem::Requirement
159
+ requirement: &2153126440 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ! '>='
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 2.8.1
165
165
  type: :development
166
166
  prerelease: false
167
- version_requirements: *2153463260
167
+ version_requirements: *2153126440
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: rake
170
- requirement: &2153462880 !ruby/object:Gem::Requirement
170
+ requirement: &2153126000 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ! '>='
@@ -175,7 +175,7 @@ dependencies:
175
175
  version: '0'
176
176
  type: :development
177
177
  prerelease: false
178
- version_requirements: *2153462880
178
+ version_requirements: *2153126000
179
179
  description: Mongify allows you to map your sql data into a mongodb document database
180
180
  with a simple DSL.
181
181
  email:
@@ -200,6 +200,7 @@ files:
200
200
  - features/process.feature
201
201
  - features/step_definitions/mongify_steps.rb
202
202
  - features/step_definitions/mongo_steps.rb
203
+ - features/step_definitions/process_steps.rb
203
204
  - features/support/env.rb
204
205
  - lib/mongify.rb
205
206
  - lib/mongify/cli.rb
@@ -227,6 +228,7 @@ files:
227
228
  - mongify.gemspec
228
229
  - spec/default.watch
229
230
  - spec/files/base_configuration.rb
231
+ - spec/files/embedded_parent_translation.rb
230
232
  - spec/files/translation.rb
231
233
  - spec/mongify/cli/application_spec.rb
232
234
  - spec/mongify/cli/help_command_spec.rb
@@ -279,7 +281,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
279
281
  version: '0'
280
282
  requirements: []
281
283
  rubyforge_project:
282
- rubygems_version: 1.7.2
284
+ rubygems_version: 1.8.5
283
285
  signing_key:
284
286
  specification_version: 3
285
287
  summary: Translate your SQL data to MongoDB with ease
@@ -289,9 +291,11 @@ test_files:
289
291
  - features/process.feature
290
292
  - features/step_definitions/mongify_steps.rb
291
293
  - features/step_definitions/mongo_steps.rb
294
+ - features/step_definitions/process_steps.rb
292
295
  - features/support/env.rb
293
296
  - spec/default.watch
294
297
  - spec/files/base_configuration.rb
298
+ - spec/files/embedded_parent_translation.rb
295
299
  - spec/files/translation.rb
296
300
  - spec/mongify/cli/application_spec.rb
297
301
  - spec/mongify/cli/help_command_spec.rb
@@ -318,4 +322,3 @@ test_files:
318
322
  - spec/support/database_generator.rb
319
323
  - spec/support/database_output.txt
320
324
  - spec/tmp/.gitignore
321
- has_rdoc: