mongify 0.2.2 → 0.3

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.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,10 @@
1
+ == 0.3 / 12 Sep 2012
2
+ * Added ability to work with :key columns that were not :integer values
3
+ * You can now specify :as value for a type :key column
4
+ * Tranlsation generator will prefill :as for :key columns
5
+ * Updated README
6
+ * Improved tests
7
+ * Small refactoring
1
8
  == 0.2.2 / 11 Sep 2012
2
9
  * Fix broken specs (Pranas Kiziela)
3
10
  * Fix translation process when embedding multiple objects (Pranas Kiziela)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mongify (0.2.2)
4
+ mongify (0.3)
5
5
  activerecord (>= 3.0.3)
6
6
  activesupport (>= 3.0.3)
7
7
  bson_ext (>= 1.1.5)
data/README.rdoc CHANGED
@@ -88,7 +88,7 @@ Creating a translation is pretty straight forward. It looks something like this:
88
88
  end
89
89
 
90
90
  table "preferences", :embed_in => :users, :as => :object do
91
- column "id", :key
91
+ column "id", :key, :as => :string
92
92
  column "user_id", :integer, :references => "users"
93
93
  column "notify_by_email", :boolean
94
94
  end
@@ -203,7 +203,7 @@ Leaving a column out when defining a table will result in the column being *igno
203
203
  ==== Types
204
204
 
205
205
  Before we cover the options, you need to know what types of columns are supported:
206
- :key # Columns that are primary keys need to be marked as :key type
206
+ :key # Columns that are primary keys need to be marked as :key type. You can provide an :as if your :key is not an integer column
207
207
  :integer # Will be converted to a integer
208
208
  :float # Will be converted to a float
209
209
  :decimal # Will be converted to a string (due to MongoDB Ruby Drivers not supporting BigDecimal, read details in Mongify::Database::Column under Decimal Storage)
@@ -249,6 +249,7 @@ If you have any issues, please feel free to report them here: {issue tracker}[ht
249
249
  == TODO
250
250
  * Allow deeper embedding
251
251
  * Test in different databases
252
+ * Give an ability to mark source DB columns as imported (allowing Mongify to run as a on going converter)
252
253
 
253
254
  == Known Issues
254
255
  * Can't do anything to an embedded table
@@ -16,7 +16,7 @@ module Mongify
16
16
  # ==== Types
17
17
  #
18
18
  # Types of columns are supported:
19
- # :key # Columns that are primary keys need to be marked as :key type
19
+ # :key # Columns that are primary keys need to be marked as :key type. You can provide an :as if your :key is not an integer column
20
20
  # :integer # Will be converted to a integer
21
21
  # :float # Will be converted to a float
22
22
  # :decimal # Will be converted to a string *(you can change default behaviour read below)
@@ -86,9 +86,10 @@ module Mongify
86
86
  def self.auto_detect(column)
87
87
  case column.sql_name.downcase
88
88
  when 'id'
89
- column.type = :key if column.type == :integer
89
+ column.as = column.type
90
+ column.type = :key
90
91
  when /(.*)_id/
91
- column.references = $1.to_s.pluralize unless column.referenced? || column.type != :integer
92
+ column.references = $1.to_s.pluralize unless column.referenced?
92
93
  end
93
94
  end
94
95
 
@@ -122,7 +123,7 @@ module Mongify
122
123
  return {} if ignored?
123
124
  case type
124
125
  when :key
125
- {"pre_mongified_id" => value.to_i}
126
+ {"pre_mongified_id" => type_cast(value)}
126
127
  else
127
128
  {"#{self.name}" => type_cast(value)}
128
129
  end
@@ -132,7 +133,10 @@ module Mongify
132
133
  # Mainly used during print out of translation file
133
134
  def to_print
134
135
  "column \"#{sql_name}\", :#{type}".tap do |output|
135
- output_options = options.map{|k, v| (v == nil) ? nil : ":#{k} => \"#{v}\""}.compact
136
+ output_options = options.map do |k, v|
137
+ next if v.nil?
138
+ ":#{k} => #{v.is_a?(Symbol) ? ":#{v}" : %Q["#{v}"] }"
139
+ end.compact
136
140
  output << ", #{output_options.join(', ')}" unless output_options.blank?
137
141
  end
138
142
  end
@@ -197,17 +201,17 @@ module Mongify
197
201
  # Used when trying to figure out how to convert a decimal value
198
202
  # @return [String] passed option['as'] or defaults to 'string'
199
203
  def as
200
- options['as'] ||= 'string'
204
+ options['as'] ||= :string
201
205
  end
202
206
  # Sets option['as'] to either 'string' or 'integer', defults to 'string' for unknown values
203
207
  # @param [String|Symbol] value, can be either 'string' or 'integer
204
208
  def as=(value)
205
- value = value.to_s.downcase
206
- options['as'] = ['string', 'integer'].include?(value) ? value : 'string'
209
+ value = value.to_s.downcase.to_sym
210
+ options['as'] = [:string, :integer].include?(value) ? value : :string
207
211
  end
208
212
  # Returns true if :as was passed as integer
209
213
  def as_integer?
210
- self.as == 'integer'
214
+ self.as == :integer
211
215
  end
212
216
 
213
217
  # Get the scale option for decimal to integer conversion
@@ -230,6 +234,7 @@ module Mongify
230
234
  def type_cast(value)
231
235
  return nil if value.nil?
232
236
  case type
237
+ when :key then options['as'] == :string ? value.to_s : value.to_i #If :as is provided, check if it's string, otherwise integer
233
238
  when :string then value.to_s
234
239
  when :text then value.to_s
235
240
  when :integer then value.to_i
@@ -142,7 +142,6 @@ module Mongify
142
142
  Mongify::Status.publish('remove_pre_mongified', :size => 1, :name => "Removing pre_mongified_id #{t.name}", :action => 'add')
143
143
  no_sql_connection.remove_pre_mongified_ids(t.name)
144
144
  Mongify::Status.publish('remove_pre_mongified', :action => 'finish')
145
- # Mongify::Status.publish('remove_pre_mongified')
146
145
  end
147
146
  end
148
147
 
@@ -1,4 +1,4 @@
1
1
  module Mongify
2
2
  # Mongify's Current Version Number
3
- VERSION = "0.2.2"
3
+ VERSION = "0.3"
4
4
  end
@@ -41,17 +41,26 @@ describe Mongify::Database::Column do
41
41
 
42
42
  context "id column" do
43
43
  before(:each) do
44
- @col = mock(:sql_name => 'id', :type => :integer)
44
+ @col = mock(:sql_name => 'id')
45
45
  end
46
46
  it "should detect column with type :integer as a :key column" do
47
+ @col.stub(:type).and_return(:integer)
47
48
  @col.should_receive('type=').with(:key)
49
+ @col.should_receive('as=').with(:integer)
48
50
  Mongify::Database::Column.auto_detect(@col)
49
51
  end
50
- it "should not detect column with type other then :integer as a :key column" do
51
- @col.stub(:type).and_return(:string)
52
- @col.should_receive('type=').never
53
- Mongify::Database::Column.auto_detect(@col)
52
+ it "should detected as a :key even if type is :string" do
53
+ @column = Mongify::Database::Column.new('id', :string, :auto_detect => true)
54
+ @column.should be_key
55
+ @column.as.should == :string
56
+ end
57
+
58
+ it "should detect as a :key with as == integer " do
59
+ @column = Mongify::Database::Column.new('id', :integer, :auto_detect => true)
60
+ @column.should be_key
61
+ @column.as.should == :integer
54
62
  end
63
+
55
64
  end
56
65
  context "references" do
57
66
  before(:each) do
@@ -66,9 +75,9 @@ describe Mongify::Database::Column do
66
75
  @col.should_receive('references=').never
67
76
  Mongify::Database::Column.auto_detect(@col)
68
77
  end
69
- it "should not detect column references if column type is not :integer" do
78
+ it "should detect column references even if column type is not :integer" do
70
79
  @col.stub(:type).and_return(:string)
71
- @col.should_receive('references=').never
80
+ @col.should_receive('references=').once
72
81
  Mongify::Database::Column.auto_detect(@col)
73
82
  end
74
83
  end
@@ -130,17 +139,26 @@ describe Mongify::Database::Column do
130
139
  context "as" do
131
140
  subject {Mongify::Database::Column.new('total', :decimal)}
132
141
  it "should default to string" do
133
- subject.as.should == 'string'
142
+ subject.as.should == :string
134
143
  end
135
144
  it "should allow it to be set to integer" do
136
- subject.as = 'integer'
145
+ subject.as = :integer
137
146
  subject.should be_as_integer
138
147
  end
139
148
  it "should not allow other values" do
140
149
  subject.as = "zuza"
141
- subject.as.should == 'string'
150
+ subject.as.should == :string
151
+ end
152
+ it "should not allow other values even as sym" do
153
+ subject.as = :zuza
154
+ subject.as.should == :string
155
+ end
156
+ it "should convert to symble" do
157
+ subject.as = 'integer'
158
+ subject.as.should == :integer
142
159
  end
143
160
  end
161
+
144
162
  context "scale" do
145
163
  subject {Mongify::Database::Column.new('total', :decimal, :as => 'integer')}
146
164
  it "should be defaulted to 0" do
@@ -170,6 +188,12 @@ describe Mongify::Database::Column do
170
188
  @column = Mongify::Database::Column.new('user_id', :integer, :auto_detect => true)
171
189
  @column.to_print.should == %Q[column "user_id", :integer, :references => "users"]
172
190
  end
191
+
192
+ it "should print :key with :as" do
193
+ @column.as = :integer
194
+ @column.type = :key
195
+ @column.to_print.should == %q{column "first_name", :key, :as => :integer}
196
+ end
173
197
  end
174
198
 
175
199
  context :referenced? do
@@ -194,9 +218,18 @@ describe Mongify::Database::Column do
194
218
  @column = Mongify::Database::Column.new('id', :key)
195
219
  @column.translate(123123).should == {"pre_mongified_id" => 123123}
196
220
  end
197
- it "should return an integer for pre_mongified_id" do
221
+ it "should return an integer for pre_mongified_id (by default)" do
198
222
  @column = Mongify::Database::Column.new('id', :key)
199
- @column.translate('123123').should == {"pre_mongified_id" => 123123}
223
+ result = @column.translate('123123')
224
+ result.should == {"pre_mongified_id" => 123123}
225
+ result['pre_mongified_id'].should be_a_kind_of Integer
226
+
227
+ end
228
+ it "should return a string for pre_mongified_id when :as => :string is provided" do
229
+ @column = Mongify::Database::Column.new('id', :key, :as => :string)
230
+ result = @column.translate('p123')
231
+ result.should == {"pre_mongified_id" => 'p123'}
232
+ result['pre_mongified_id'].should be_a_kind_of String
200
233
  end
201
234
  end
202
235
  context :type_cast do
@@ -265,7 +298,7 @@ describe Mongify::Database::Column do
265
298
 
266
299
  context :integer do
267
300
  before(:each) do
268
- @column = Mongify::Database::Column.new('price', :decimal, :as => 'integer')
301
+ @column = Mongify::Database::Column.new('price', :decimal, :as => :integer)
269
302
  @value = 101.123455
270
303
  end
271
304
  it "should be as_integer" do
@@ -45,7 +45,8 @@ class DatabaseGenerator
45
45
  t.timestamps
46
46
  end
47
47
 
48
- conn.create_table(:preferences) do |t|
48
+ conn.create_table(:preferences, :id => false) do |t|
49
+ t.string :id
49
50
  t.integer :user_id
50
51
  t.boolean :notify_by_email
51
52
  t.timestamps
@@ -95,9 +96,9 @@ class DatabaseGenerator
95
96
  {:user_id => 1, :notify_by_email => true},
96
97
  {:user_id => 2, :notify_by_email => true},
97
98
  {:user_id => 3, :notify_by_email => false},
98
- ].each do |v|
99
- conn.insert("INSERT INTO preferences (user_id, notify_by_email, created_at, updated_at)
100
- VALUES (#{v[:user_id]}, '#{v[:notify_by_email]}', '#{Time.now.to_s(:db)}', '#{Time.now.to_s(:db)}')")
99
+ ].each_with_index do |v, idx|
100
+ conn.insert("INSERT INTO preferences (id, user_id, notify_by_email, created_at, updated_at)
101
+ VALUES ('p#{idx+1}',#{v[:user_id]}, '#{v[:notify_by_email]}', '#{Time.now.to_s(:db)}', '#{Time.now.to_s(:db)}')")
101
102
  end
102
103
 
103
104
  #Notes
@@ -1,5 +1,5 @@
1
1
  table "users" do
2
- column "id", :key
2
+ column "id", :key, :as => :integer
3
3
  column "first_name", :string
4
4
  column "last_name", :string
5
5
  column "created_at", :datetime
@@ -7,7 +7,7 @@ table "users" do
7
7
  end
8
8
 
9
9
  table "posts" do
10
- column "id", :key
10
+ column "id", :key, :as => :integer
11
11
  column "title", :string
12
12
  column "owner_id", :integer, :references => "owners"
13
13
  column "body", :text
@@ -17,7 +17,7 @@ table "posts" do
17
17
  end
18
18
 
19
19
  table "comments" do
20
- column "id", :key
20
+ column "id", :key, :as => :integer
21
21
  column "body", :text
22
22
  column "post_id", :integer, :references => "posts"
23
23
  column "user_id", :integer, :references => "users"
@@ -26,7 +26,7 @@ table "comments" do
26
26
  end
27
27
 
28
28
  table "preferences" do
29
- column "id", :key
29
+ column "id", :key, :as => :string
30
30
  column "user_id", :integer, :references => "users"
31
31
  column "notify_by_email", :boolean
32
32
  column "created_at", :datetime
@@ -34,7 +34,7 @@ table "preferences" do
34
34
  end
35
35
 
36
36
  table "notes" do
37
- column "id", :key
37
+ column "id", :key, :as => :integer
38
38
  column "user_id", :integer, :references => "users"
39
39
  column "notable_id", :integer, :references => "notables"
40
40
  column "notable_type", :string
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.2.2
4
+ version: '0.3'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-11 00:00:00.000000000 Z
12
+ date: 2012-09-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -356,7 +356,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
356
356
  version: '0'
357
357
  segments:
358
358
  - 0
359
- hash: -558955689900705187
359
+ hash: 993534914857598805
360
360
  requirements: []
361
361
  rubyforge_project:
362
362
  rubygems_version: 1.8.23