oracle-model-generator 0.2.1 → 0.3.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.
- data/CHANGES +14 -0
- data/README +38 -1
- data/bin/omg +188 -9
- data/lib/oracle/model/generator.rb +67 -9
- data/oracle-model-generator.gemspec +1 -1
- data/test/test_oracle_model_generator.rb +31 -2
- metadata +5 -5
data/CHANGES
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
= 0.3.0 - 12-May-2011
|
2
|
+
* Added automatic test generation. In addition to the active record model file,
|
3
|
+
a test file will be generated that includes a series of stock tests that
|
4
|
+
are based on the model's validations. At the moment only test-unit is
|
5
|
+
supported, but I'll eventually add rspec.
|
6
|
+
* Added the -x/--tests command line option for the new test generation feature.
|
7
|
+
* The dependencies method now returns an array of dependencies for the given
|
8
|
+
table or view.
|
9
|
+
* The table method has been altered. It now returns just the plain, uppercased
|
10
|
+
name of the table. A new method called 'model' now returns the active record
|
11
|
+
model name.
|
12
|
+
* The default output file name will now chop any trailing 's' characters.
|
13
|
+
* More tests and comments added.
|
14
|
+
|
1
15
|
= 0.2.1 - 3-May-2011
|
2
16
|
* Fixed a bug where the omg binary blew up if you didn't have the dbi-dbrc
|
3
17
|
library installed. It's supposed to be optional. Thanks go to Jason Roth
|
data/README
CHANGED
@@ -49,6 +49,43 @@ The omg library will generate this:
|
|
49
49
|
validates :country_id, :length => {:maximum => 2}
|
50
50
|
end
|
51
51
|
|
52
|
+
It will also generate a corresponding test file using test-unit 2 by default.
|
53
|
+
For the above example you will see some tests like this:
|
54
|
+
|
55
|
+
class TC_Location < Test::Unit::TestCase
|
56
|
+
def setup
|
57
|
+
@location = Location.new
|
58
|
+
end
|
59
|
+
|
60
|
+
test 'table name is locations' do
|
61
|
+
assert_equal('locations', Location.table_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
test 'primary key is location_id' do
|
65
|
+
assert_equal('location_id', Location.primary_key)
|
66
|
+
end
|
67
|
+
|
68
|
+
test 'location_id basic functionality' do
|
69
|
+
assert_respond_to(@location, :location_id)
|
70
|
+
assert_nothing_raised{ @location.location_id }
|
71
|
+
assert_kind_of(Numeric, @location.location_id)
|
72
|
+
end
|
73
|
+
|
74
|
+
test 'location_id must be a number' do
|
75
|
+
@location.location_id = 'test_string'
|
76
|
+
assert_false(@location.valid?)
|
77
|
+
assert_true(@location.errors[:location_id].include?('is not a number'))
|
78
|
+
end
|
79
|
+
|
80
|
+
test 'location_id cannot exceed the value 9999' do
|
81
|
+
@location.location_id = 10000
|
82
|
+
assert_false(@location.valid?)
|
83
|
+
assert_true(@location.errors[:location_id].include?('must be less than or equal to 9999'))
|
84
|
+
end
|
85
|
+
|
86
|
+
# ... and so on.
|
87
|
+
end
|
88
|
+
|
52
89
|
= Requirements
|
53
90
|
== Must Have
|
54
91
|
* ruby-oci8
|
@@ -85,7 +122,7 @@ primary keys.
|
|
85
122
|
|
86
123
|
= Future Plans
|
87
124
|
Add support for views.
|
88
|
-
Add automatic test suite generation.
|
125
|
+
Add automatic test suite generation for rspec.
|
89
126
|
Explicitly set :foreign_key if using CPK in belongs_to relationships.
|
90
127
|
The output could use a little formatting love.
|
91
128
|
|
data/bin/omg
CHANGED
@@ -18,7 +18,8 @@ opts = Getopt::Long.getopts(
|
|
18
18
|
['--password', '-p', Getopt::REQUIRED],
|
19
19
|
['--database', '-d', Getopt::REQUIRED],
|
20
20
|
['--output', '-o', Getopt::REQUIRED],
|
21
|
-
['--rails', '-r', Getopt::REQUIRED]
|
21
|
+
['--rails', '-r', Getopt::REQUIRED],
|
22
|
+
['--tests', '-x', Getopt::OPTIONAL]
|
22
23
|
)
|
23
24
|
|
24
25
|
def help
|
@@ -33,6 +34,7 @@ def help
|
|
33
34
|
-u, --user => The user used to establish a connection to the database.
|
34
35
|
-p, --password => The password used to establish a connection to the database.
|
35
36
|
-r, --rails => The version of rails you're using (2 or 3).
|
37
|
+
-x, --tests => Generate tests (the default).
|
36
38
|
|
37
39
|
If no user or password are supplied, then OMG will attempt to glean that
|
38
40
|
information using a combination of the database name and your .dbrc file.
|
@@ -44,6 +46,10 @@ def help
|
|
44
46
|
for me to deal with all possible permutations. Note that the output file
|
45
47
|
name is also used as the basis for the class name
|
46
48
|
|
49
|
+
If no tests option is specified then a test file, using test-unit 2, will
|
50
|
+
be generated that includes some basic tests to backup the builtin
|
51
|
+
validations. Legal options are 'testunit', 'rspec', or 'none'.
|
52
|
+
|
47
53
|
Examples:
|
48
54
|
|
49
55
|
# Create a User model for the users table (rails 3)
|
@@ -109,7 +115,13 @@ connection = OCI8.new(user, pass, opts['database'])
|
|
109
115
|
omg = Oracle::Model::Generator.new(connection)
|
110
116
|
omg.generate(table || view, view)
|
111
117
|
|
112
|
-
ofile = opts['o']
|
118
|
+
ofile = opts['o']
|
119
|
+
|
120
|
+
unless ofile
|
121
|
+
ofile = omg.table.downcase
|
122
|
+
ofile.chop! if ofile[-1].chr.upcase == 'S'
|
123
|
+
ofile += '.rb'
|
124
|
+
end
|
113
125
|
|
114
126
|
# Default to Rails 3
|
115
127
|
rails = (opts['rails'] && opts['rails'].to_i) || 3
|
@@ -120,7 +132,7 @@ if rails < 2 || rails > 3
|
|
120
132
|
end
|
121
133
|
|
122
134
|
File.open(ofile, 'w') do |fh|
|
123
|
-
fh.puts "class #{omg.
|
135
|
+
fh.puts "class #{omg.model} < ActiveRecord::Base"
|
124
136
|
fh.puts " set_table_name :#{table}"
|
125
137
|
|
126
138
|
if omg.primary_keys.size > 1
|
@@ -135,7 +147,7 @@ File.open(ofile, 'w') do |fh|
|
|
135
147
|
fh.puts " belongs_to :#{table.downcase}"
|
136
148
|
}
|
137
149
|
|
138
|
-
fh.puts "\n # Validations\n
|
150
|
+
fh.puts "\n # Validations\n"
|
139
151
|
|
140
152
|
if rails == 2
|
141
153
|
# Character fields, size
|
@@ -185,7 +197,18 @@ File.open(ofile, 'w') do |fh|
|
|
185
197
|
when 'char', 'varchar', 'varchar2'
|
186
198
|
validation = "validates :#{col.name.downcase}, "
|
187
199
|
validation << ":length => {:maximum => #{col.data_size}}"
|
188
|
-
|
200
|
+
|
201
|
+
format_str = ",\n :format => { :with => /[:alpha]/, :message => 'is not a string'"
|
202
|
+
|
203
|
+
if col.nullable?
|
204
|
+
format_str += ", :if => :#{col.name.downcase}? }"
|
205
|
+
else
|
206
|
+
format_str += " }"
|
207
|
+
end
|
208
|
+
|
209
|
+
validation << format_str
|
210
|
+
validation << ",\n :presence => #{!col.nullable?}" unless col.nullable?
|
211
|
+
validation << "\n\n"
|
189
212
|
when 'number'
|
190
213
|
max = "9" * col.precision
|
191
214
|
max.insert(col.precision - col.scale, ".") if col.scale > 0
|
@@ -197,14 +220,14 @@ File.open(ofile, 'w') do |fh|
|
|
197
220
|
end
|
198
221
|
|
199
222
|
validation << ":numericality => {"
|
200
|
-
validation << "\n
|
201
|
-
validation << "\n
|
223
|
+
validation << "\n :less_than_or_equal_to => #{max}, "
|
224
|
+
validation << "\n :greater_than_or_equal_to => -#{max}"
|
202
225
|
|
203
226
|
if col.scale == 0
|
204
|
-
validation << ",\n
|
227
|
+
validation << ",\n :only_integer => true"
|
205
228
|
end
|
206
229
|
|
207
|
-
validation << "\n
|
230
|
+
validation << "\n }\n\n"
|
208
231
|
end
|
209
232
|
|
210
233
|
fh.puts " #{validation}"
|
@@ -238,4 +261,160 @@ File.open(ofile, 'w') do |fh|
|
|
238
261
|
fh.puts "end"
|
239
262
|
end
|
240
263
|
|
264
|
+
if opts['x'].nil? || opts['x'] == 'testunit'
|
265
|
+
test_file = "test_#{ofile}"
|
266
|
+
File.open(test_file, "w") do |fh|
|
267
|
+
setup_var = omg.table.downcase
|
268
|
+
setup_var.chop! if setup_var[-1].chr.downcase == 's'
|
269
|
+
instance_var = "@#{setup_var}"
|
270
|
+
|
271
|
+
# This bit is necessary to force test-unit 2 instead of using the library
|
272
|
+
# that ships as part of the Ruby standard library.
|
273
|
+
fh.puts "require 'rubygems'"
|
274
|
+
fh.puts "gem 'test-unit'"
|
275
|
+
fh.puts "require 'test/unit'\n\n"
|
276
|
+
|
277
|
+
fh.puts "class TC_#{omg.model} < Test::Unit::TestCase\n"
|
278
|
+
fh.puts " def setup"
|
279
|
+
fh.puts " #{instance_var} = #{omg.model}.new"
|
280
|
+
fh.puts " end\n\n"
|
281
|
+
|
282
|
+
fh.puts " test 'table name is #{omg.table.downcase}' do"
|
283
|
+
fh.puts " assert_equal('#{omg.table.downcase}', #{omg.model}.table_name)"
|
284
|
+
fh.puts " end\n\n"
|
285
|
+
|
286
|
+
if omg.primary_keys.size > 1
|
287
|
+
test_string = " test 'primary keys are #{omg.primary_keys.join(', ')}' do"
|
288
|
+
fh.puts test_string
|
289
|
+
fh.puts " assert_equal('#{omg.primary_keys.join(', ')}', #{omg.model}.primary_keys)"
|
290
|
+
else
|
291
|
+
test_string = " test 'primary key is #{omg.primary_keys.first}' do"
|
292
|
+
fh.puts test_string
|
293
|
+
fh.puts " assert_equal('#{omg.primary_keys.first}', #{omg.model}.primary_key)"
|
294
|
+
end
|
295
|
+
|
296
|
+
fh.puts " end\n"
|
297
|
+
|
298
|
+
omg.column_info.each{ |col|
|
299
|
+
data_type = col.data_type.to_s
|
300
|
+
column = col.name.downcase
|
301
|
+
|
302
|
+
fh.puts "\n test '#{column} basic functionality' do"
|
303
|
+
fh.puts " assert_respond_to(#{instance_var}, :#{column})"
|
304
|
+
fh.puts " assert_nothing_raised{ #{instance_var}.#{column} }"
|
305
|
+
|
306
|
+
case data_type
|
307
|
+
when 'char', 'varchar', 'varchar2'
|
308
|
+
if col.nullable?
|
309
|
+
fh.puts " assert_kind_of([NilClass, String], #{instance_var}.#{column})"
|
310
|
+
else
|
311
|
+
fh.puts " assert_kind_of(String, #{instance_var}.#{column})"
|
312
|
+
end
|
313
|
+
when 'number'
|
314
|
+
if col.nullable?
|
315
|
+
fh.puts " assert_kind_of([NilClass, Numeric], #{instance_var}.#{column})"
|
316
|
+
else
|
317
|
+
fh.puts " assert_kind_of(Numeric, #{instance_var}.#{column})"
|
318
|
+
end
|
319
|
+
when 'date'
|
320
|
+
if col.nullable?
|
321
|
+
fh.puts " assert_kind_of([NilClass, DateTime, Time], #{instance_var}.#{column})"
|
322
|
+
else
|
323
|
+
fh.puts " assert_kind_of([DateTime, Time], #{instance_var}.#{column})"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
fh.puts " end\n"
|
328
|
+
|
329
|
+
case data_type
|
330
|
+
when 'char', 'varchar', 'varchar2'
|
331
|
+
test_title = "\n test '#{column} must be a string"
|
332
|
+
test_title += " if present" if col.nullable?
|
333
|
+
test_title += "' do"
|
334
|
+
|
335
|
+
fh.puts test_title
|
336
|
+
fh.puts " #{instance_var}.#{column} = #{rand(100)}"
|
337
|
+
fh.puts " assert_false(#{instance_var}.valid?)"
|
338
|
+
fh.puts " assert_true(#{instance_var}.errors[:#{column}].include?('is not a string'))"
|
339
|
+
fh.puts " end\n"
|
340
|
+
|
341
|
+
max_len = col.data_size
|
342
|
+
err_msg = "is too long (maximum is #{max_len} characters)"
|
343
|
+
|
344
|
+
fh.puts "\n test '#{column} cannot exceed #{max_len} characters' do"
|
345
|
+
fh.puts " #{instance_var}.#{column} = 'a' * #{max_len + 1}"
|
346
|
+
fh.puts " assert_false(#{instance_var}.valid?)"
|
347
|
+
fh.puts " assert_true(#{instance_var}.errors[:#{column}].include?('#{err_msg}'))"
|
348
|
+
fh.puts " end\n"
|
349
|
+
when 'number'
|
350
|
+
test_title = "\n test '#{column} must be a number"
|
351
|
+
test_title += " if present" if col.nullable?
|
352
|
+
test_title += "' do"
|
353
|
+
|
354
|
+
fh.puts test_title
|
355
|
+
fh.puts " #{instance_var}.#{column} = 'test_string'"
|
356
|
+
fh.puts " assert_false(#{instance_var}.valid?)"
|
357
|
+
fh.puts " assert_true(#{instance_var}.errors[:#{column}].include?('is not a number'))"
|
358
|
+
fh.puts " end\n"
|
359
|
+
|
360
|
+
max = "9" * col.precision
|
361
|
+
max.insert(col.precision - col.scale, ".") if col.scale > 0
|
362
|
+
err_msg = "must be less than or equal to #{max}"
|
363
|
+
|
364
|
+
fh.puts "\n test '#{column} cannot exceed the value #{max}' do"
|
365
|
+
|
366
|
+
if col.scale > 0
|
367
|
+
fh.puts " #{instance_var}.#{column} = #{max.to_f.round}"
|
368
|
+
else
|
369
|
+
fh.puts " #{instance_var}.#{column} = #{max.to_i + 1}"
|
370
|
+
end
|
371
|
+
|
372
|
+
fh.puts " assert_false(#{instance_var}.valid?)"
|
373
|
+
fh.puts " assert_true(#{instance_var}.errors[:#{column}].include?('#{err_msg}'))"
|
374
|
+
fh.puts " end\n"
|
375
|
+
|
376
|
+
err_msg = "must be greater than or equal to -#{max}"
|
377
|
+
|
378
|
+
fh.puts "\n test '#{column} cannot be less than the value -#{max}' do"
|
379
|
+
|
380
|
+
if col.scale > 0
|
381
|
+
fh.puts " #{instance_var}.#{column} = -#{max.to_f.round}"
|
382
|
+
else
|
383
|
+
fh.puts " #{instance_var}.#{column} = -#{max.to_i + 1}"
|
384
|
+
end
|
385
|
+
|
386
|
+
fh.puts " assert_false(#{instance_var}.valid?)"
|
387
|
+
fh.puts " assert_true(#{instance_var}.errors[:#{column}].include?('#{err_msg}'))"
|
388
|
+
fh.puts " end\n"
|
389
|
+
end
|
390
|
+
|
391
|
+
unless col.nullable?
|
392
|
+
err_msg = "can't be blank"
|
393
|
+
fh.puts "\n test '#{column} cannot be nil' do"
|
394
|
+
fh.puts " #{instance_var}.#{column} = nil"
|
395
|
+
fh.puts " assert_false(#{instance_var}.valid?)"
|
396
|
+
fh.puts " assert_true(#{instance_var}.errors[:#{column}].include?(\"#{err_msg}\"))"
|
397
|
+
fh.puts " end\n"
|
398
|
+
end
|
399
|
+
}
|
400
|
+
|
401
|
+
fh.puts "\n def teardown"
|
402
|
+
fh.puts " @#{setup_var} = nil"
|
403
|
+
fh.puts " end"
|
404
|
+
|
405
|
+
fh.puts "end"
|
406
|
+
end
|
407
|
+
puts "\nTest file '#{test_file}' generated\n"
|
408
|
+
else
|
409
|
+
if opts['x'] == 'rspec'
|
410
|
+
puts "\nrspec not yet supported for generating tests.\n"
|
411
|
+
elsif opts['x'] != 'none'
|
412
|
+
puts "\nInvalid option to -x/--tests: " + opts['x']
|
413
|
+
else
|
414
|
+
puts "\nSkipping test file genertion.\n"
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
omg.connection.logoff if omg.connection
|
419
|
+
|
241
420
|
puts "\nFile '#{ofile}' generated\n\n"
|
@@ -3,18 +3,43 @@ require 'oci8'
|
|
3
3
|
module Oracle
|
4
4
|
module Model
|
5
5
|
class Generator
|
6
|
-
|
6
|
+
# The version of the oracle-model-generator library
|
7
|
+
VERSION = '0.3.0'
|
7
8
|
|
9
|
+
# The raw OCI8 connection.
|
8
10
|
attr_reader :connection
|
11
|
+
|
12
|
+
# An array of hashes that contain per-column constraint information.
|
9
13
|
attr_reader :constraints
|
14
|
+
|
15
|
+
# An array of foreign key names.
|
10
16
|
attr_reader :foreign_keys
|
17
|
+
|
18
|
+
# An array of parent tables that the table has a foreign key
|
19
|
+
# relationship with.
|
11
20
|
attr_reader :belongs_to
|
21
|
+
|
22
|
+
# The table name associated with the generator.
|
12
23
|
attr_reader :table
|
24
|
+
|
25
|
+
# The name of the active record model to be generated.
|
26
|
+
attr_reader :model
|
27
|
+
|
28
|
+
# Boolean indicating whether the generator is for a regular table or a view.
|
13
29
|
attr_reader :view
|
30
|
+
|
31
|
+
# A list of dependencies for the table.
|
14
32
|
attr_reader :dependencies
|
33
|
+
|
34
|
+
# An array of raw OCI::Metadata::Column objects.
|
15
35
|
attr_reader :column_info
|
36
|
+
|
37
|
+
# An array of primary keys for the column. May contain one or more values.
|
16
38
|
attr_reader :primary_keys
|
17
39
|
|
40
|
+
# Creates and returns a new Oracle::Model::Generator object. It accepts
|
41
|
+
# an Oracle::Connection object, which is what OCI8.new returns.
|
42
|
+
#
|
18
43
|
# Example:
|
19
44
|
#
|
20
45
|
# connection = Oracle::Connection.new(user, password, database)
|
@@ -30,6 +55,7 @@ module Oracle
|
|
30
55
|
@belongs_to = []
|
31
56
|
@column_info = []
|
32
57
|
@table = nil
|
58
|
+
@model = nil
|
33
59
|
end
|
34
60
|
|
35
61
|
# Generates an Oracle::Model::Generator object for +table+. If this is
|
@@ -38,20 +64,33 @@ module Oracle
|
|
38
64
|
# This method does not actually generate a file of any sort. It merely
|
39
65
|
# sets instance variables which you can then use in your own class/file
|
40
66
|
# generation programs.
|
67
|
+
#--
|
68
|
+
# Makes a best guess as to the model name. I'm not going to put too much
|
69
|
+
# effort into this. It's much easier for you to hand edit a class name
|
70
|
+
# than it is for me to parse English.
|
41
71
|
#
|
42
72
|
def generate(table, view = false)
|
43
|
-
@table = table.
|
73
|
+
@table = table.upcase
|
74
|
+
@model = table.split('_').map{ |e| e.downcase.capitalize }.join
|
44
75
|
@view = view
|
45
|
-
|
46
|
-
|
47
|
-
|
76
|
+
|
77
|
+
# Remove trailing 's'
|
78
|
+
@model.chop! if @model[-1].chr.upcase == 'S'
|
79
|
+
|
80
|
+
unless view
|
81
|
+
get_constraints
|
82
|
+
get_foreign_keys
|
83
|
+
get_column_info
|
84
|
+
end
|
85
|
+
|
48
86
|
get_primary_keys
|
87
|
+
get_dependencies
|
49
88
|
end
|
50
89
|
|
51
90
|
private
|
52
91
|
|
53
|
-
def get_column_info
|
54
|
-
table = @connection.describe_table(
|
92
|
+
def get_column_info
|
93
|
+
table = @connection.describe_table(@table)
|
55
94
|
table.columns.each{ |col| @column_info << col }
|
56
95
|
end
|
57
96
|
|
@@ -107,14 +146,14 @@ module Oracle
|
|
107
146
|
|
108
147
|
# Get a list of constraints for a given table.
|
109
148
|
#
|
110
|
-
def get_constraints
|
149
|
+
def get_constraints
|
111
150
|
sql = %Q{
|
112
151
|
select *
|
113
152
|
from all_cons_columns a, all_constraints b
|
114
153
|
where a.owner = b.owner
|
115
154
|
and a.constraint_name = b.constraint_name
|
116
155
|
and a.table_name = b.table_name
|
117
|
-
and b.table_name = '#{
|
156
|
+
and b.table_name = '#{@table}'
|
118
157
|
}
|
119
158
|
|
120
159
|
begin
|
@@ -127,6 +166,25 @@ module Oracle
|
|
127
166
|
end
|
128
167
|
end
|
129
168
|
|
169
|
+
# An array of hashes indicating objects that are dependent on the table.
|
170
|
+
#
|
171
|
+
def get_dependencies
|
172
|
+
sql = %Q{
|
173
|
+
select *
|
174
|
+
from all_dependencies dep
|
175
|
+
where referenced_name = '#{@table}'
|
176
|
+
}
|
177
|
+
|
178
|
+
begin
|
179
|
+
cursor = @connection.exec(sql)
|
180
|
+
while rec = cursor.fetch_hash
|
181
|
+
@dependencies << rec
|
182
|
+
end
|
183
|
+
ensure
|
184
|
+
cursor.close if cursor
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
130
188
|
end
|
131
189
|
end
|
132
190
|
end
|
@@ -1,3 +1,10 @@
|
|
1
|
+
#############################################################################
|
2
|
+
# test_oracle_model_generator.rb
|
3
|
+
#
|
4
|
+
# Test suite for the oracle-model-generator library. For testing purposes
|
5
|
+
# I'm using the 'hr' database that comes as part of the Oracle Express
|
6
|
+
# edition which you can download from oracle.com. Adjust as necessary.
|
7
|
+
#############################################################################
|
1
8
|
require 'rubygems'
|
2
9
|
gem 'test-unit'
|
3
10
|
require 'test/unit'
|
@@ -13,7 +20,7 @@ class TC_Oracle_Model_Generator < Test::Unit::TestCase
|
|
13
20
|
end
|
14
21
|
|
15
22
|
test "version number is correct" do
|
16
|
-
assert_equal('0.
|
23
|
+
assert_equal('0.3.0', Oracle::Model::Generator::VERSION)
|
17
24
|
end
|
18
25
|
|
19
26
|
test "constructor accepts an oci8 connection object" do
|
@@ -26,11 +33,33 @@ class TC_Oracle_Model_Generator < Test::Unit::TestCase
|
|
26
33
|
end
|
27
34
|
|
28
35
|
test "generate method works with a table name or view" do
|
29
|
-
|
36
|
+
@generator = Oracle::Model::Generator.new(@connection)
|
30
37
|
assert_nothing_raised{ @generator.generate('employees') }
|
31
38
|
assert_nothing_raised{ @generator.generate('emp_details_view', true) }
|
32
39
|
end
|
33
40
|
|
41
|
+
test "model method returns active record model name" do
|
42
|
+
@generator = Oracle::Model::Generator.new(@connection)
|
43
|
+
@generator.generate('emp_details_view', true)
|
44
|
+
assert_respond_to(@generator, :model)
|
45
|
+
assert_equal('EmpDetailsView', @generator.model)
|
46
|
+
end
|
47
|
+
|
48
|
+
test "table method returns uppercased table name passed to generate method" do
|
49
|
+
@generator = Oracle::Model::Generator.new(@connection)
|
50
|
+
@generator.generate('emp_details_view', true)
|
51
|
+
assert_respond_to(@generator, :table)
|
52
|
+
assert_equal('EMP_DETAILS_VIEW', @generator.table)
|
53
|
+
end
|
54
|
+
|
55
|
+
test "dependencies method returns an array of hashes" do
|
56
|
+
@generator = Oracle::Model::Generator.new(@connection)
|
57
|
+
@generator.generate('employees', true)
|
58
|
+
assert_respond_to(@generator, :dependencies)
|
59
|
+
assert_kind_of(Array, @generator.dependencies)
|
60
|
+
assert_kind_of(Hash, @generator.dependencies.first)
|
61
|
+
end
|
62
|
+
|
34
63
|
def teardown
|
35
64
|
@username = nil
|
36
65
|
@password = nil
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oracle-model-generator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel J. Berger
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-05-
|
18
|
+
date: 2011-05-12 00:00:00 -06:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|