legacy_data 0.1.8 → 0.1.9
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/Rakefile +37 -1
- data/VERSION +1 -1
- data/examples/blog_migration.rb +26 -0
- data/examples/create_j2ee_petstore.sql +91 -0
- data/examples/delete_j2ee_petstore.sql +14 -0
- data/examples/drupal_6_14.sql +809 -0
- data/examples/generated/blog_mysql/comment.rb +11 -0
- data/examples/generated/blog_mysql/factories.rb +9 -0
- data/examples/generated/blog_mysql/post.rb +11 -0
- data/examples/generated/blog_mysql/tag.rb +11 -0
- data/{spec/functional/expected → examples/generated/blog_sqlite3}/comment.rb +3 -4
- data/examples/generated/blog_sqlite3/factories.rb +12 -0
- data/{spec/functional/expected → examples/generated/blog_sqlite3}/post.rb +3 -3
- data/examples/generated/blog_sqlite3/tag.rb +11 -0
- data/examples/generated/drupal_mysql/access.rb +12 -0
- data/examples/generated/drupal_mysql/action.rb +11 -0
- data/examples/generated/drupal_mysql/actions_aid.rb +11 -0
- data/examples/generated/drupal_mysql/authmap.rb +13 -0
- data/examples/generated/drupal_mysql/batch.rb +12 -0
- data/examples/generated/drupal_mysql/block.rb +13 -0
- data/examples/generated/drupal_mysql/blocks_role.rb +12 -0
- data/examples/generated/drupal_mysql/box.rb +13 -0
- data/examples/generated/drupal_mysql/cache.rb +12 -0
- data/examples/generated/drupal_mysql/cache_block.rb +12 -0
- data/examples/generated/drupal_mysql/cache_filter.rb +12 -0
- data/examples/generated/drupal_mysql/cache_form.rb +12 -0
- data/examples/generated/drupal_mysql/cache_menu.rb +12 -0
- data/examples/generated/drupal_mysql/cache_page.rb +12 -0
- data/examples/generated/drupal_mysql/cache_update.rb +12 -0
- data/examples/generated/drupal_mysql/comment.rb +12 -0
- data/examples/generated/drupal_mysql/factories.rb +370 -0
- data/examples/generated/drupal_mysql/filter.rb +13 -0
- data/examples/generated/drupal_mysql/filter_format.rb +13 -0
- data/examples/generated/drupal_mysql/flood.rb +12 -0
- data/examples/generated/drupal_mysql/history.rb +12 -0
- data/examples/generated/drupal_mysql/menu_custom.rb +11 -0
- data/examples/generated/drupal_mysql/menu_link.rb +12 -0
- data/examples/generated/drupal_mysql/menu_router.rb +12 -0
- data/examples/generated/drupal_mysql/node.rb +13 -0
- data/examples/generated/drupal_mysql/node_access.rb +12 -0
- data/examples/generated/drupal_mysql/node_comment_statistic.rb +12 -0
- data/examples/generated/drupal_mysql/node_counter.rb +12 -0
- data/examples/generated/drupal_mysql/node_revision.rb +12 -0
- data/examples/generated/drupal_mysql/node_type.rb +12 -0
- data/examples/generated/drupal_mysql/permission.rb +12 -0
- data/examples/generated/drupal_mysql/role.rb +12 -0
- data/examples/generated/drupal_mysql/session.rb +12 -0
- data/examples/generated/drupal_mysql/system.rb +12 -0
- data/examples/generated/drupal_mysql/term_data.rb +12 -0
- data/examples/generated/drupal_mysql/term_hierarchy.rb +12 -0
- data/examples/generated/drupal_mysql/term_node.rb +12 -0
- data/examples/generated/drupal_mysql/term_relation.rb +13 -0
- data/examples/generated/drupal_mysql/term_synonym.rb +12 -0
- data/examples/generated/drupal_mysql/uploaded_files.rb +12 -0
- data/examples/generated/drupal_mysql/url_alias.rb +12 -0
- data/examples/generated/drupal_mysql/user.rb +14 -0
- data/examples/generated/drupal_mysql/users_role.rb +12 -0
- data/examples/generated/drupal_mysql/variable.rb +11 -0
- data/examples/generated/drupal_mysql/vocabulary.rb +12 -0
- data/examples/generated/drupal_mysql/vocabulary_node_type.rb +12 -0
- data/examples/generated/drupal_mysql/watchdog.rb +12 -0
- data/examples/generated/j2ee_petstore_mysql/address.rb +11 -0
- data/examples/generated/j2ee_petstore_mysql/category.rb +11 -0
- data/examples/generated/j2ee_petstore_mysql/factories.rb +57 -0
- data/examples/generated/j2ee_petstore_mysql/id_gen.rb +12 -0
- data/examples/generated/j2ee_petstore_mysql/item.rb +12 -0
- data/examples/generated/j2ee_petstore_mysql/product.rb +11 -0
- data/examples/generated/j2ee_petstore_mysql/seller_contact_info.rb +11 -0
- data/examples/generated/j2ee_petstore_mysql/tag.rb +13 -0
- data/examples/generated/j2ee_petstore_mysql/tag_item.rb +13 -0
- data/examples/generated/j2ee_petstore_mysql/ziplocation.rb +11 -0
- data/examples/generated/j2ee_petstore_oracle/address.rb +11 -0
- data/examples/generated/j2ee_petstore_oracle/category.rb +11 -0
- data/examples/generated/j2ee_petstore_oracle/factories.rb +52 -0
- data/examples/generated/j2ee_petstore_oracle/id_gen.rb +12 -0
- data/examples/generated/j2ee_petstore_oracle/item.rb +15 -0
- data/examples/generated/j2ee_petstore_oracle/product.rb +12 -0
- data/examples/generated/j2ee_petstore_oracle/sellercontactinfo.rb +11 -0
- data/examples/generated/j2ee_petstore_oracle/tag.rb +13 -0
- data/examples/generated/j2ee_petstore_oracle/ziplocation.rb +11 -0
- data/examples/generated/j2ee_petstore_sqlite3/address.rb +12 -0
- data/examples/generated/j2ee_petstore_sqlite3/category.rb +12 -0
- data/examples/generated/j2ee_petstore_sqlite3/factories.rb +57 -0
- data/examples/generated/j2ee_petstore_sqlite3/id_gen.rb +13 -0
- data/examples/generated/j2ee_petstore_sqlite3/item.rb +13 -0
- data/examples/generated/j2ee_petstore_sqlite3/product.rb +12 -0
- data/examples/generated/j2ee_petstore_sqlite3/seller_contact_info.rb +12 -0
- data/examples/generated/j2ee_petstore_sqlite3/tag.rb +13 -0
- data/examples/generated/j2ee_petstore_sqlite3/tag_item.rb +14 -0
- data/examples/generated/j2ee_petstore_sqlite3/ziplocation.rb +11 -0
- data/generators/models_from_tables/models_from_tables_generator.rb +5 -36
- data/generators/models_from_tables/templates/model.rb +5 -39
- data/legacy_data.gemspec +187 -11
- data/lib/active_record/connection_adapters/oracleenhanced_adapter.rb +85 -0
- data/lib/legacy_data.rb +5 -2
- data/lib/legacy_data/schema.rb +10 -7
- data/lib/legacy_data/table_class_name_mapper.rb +1 -1
- data/lib/legacy_data/table_definition.rb +120 -5
- data/spec/expected/post.rb +3 -3
- data/spec/functional/blog_adapterspec.rb +45 -0
- data/spec/functional/database.yml +45 -0
- data/spec/functional/drupal_adapterspec.rb +54 -0
- data/spec/functional/functional_spec_helper.rb +24 -0
- data/spec/functional/j2ee_petstore_adapterspec.rb +57 -0
- data/spec/legacy_data/schema_spec.rb +7 -3
- data/spec/legacy_data/table_definition_spec.rb +101 -10
- data/spec/models_from_tables_generator_spec.rb +19 -7
- data/spec/spec_helper.rb +6 -18
- metadata +193 -10
- data/examples/j2ee_petstore.sql +0 -512
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +0 -61
- data/spec/functional/models_from_tables_spec.rb +0 -27
data/lib/legacy_data.rb
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
require 'foreigner' #matthuhiggens-foreigner
|
|
2
|
+
|
|
1
3
|
require 'legacy_data/table_definition'
|
|
2
4
|
require 'legacy_data/schema'
|
|
3
5
|
require 'legacy_data/table_class_name_mapper'
|
|
4
6
|
|
|
5
|
-
|
|
6
7
|
module ActiveRecord
|
|
7
8
|
Base.class_eval do
|
|
8
9
|
if ['OracleEnhanced'].include? connection.adapter_name
|
|
9
|
-
require "#{File.dirname(__FILE__)}/active_record/connection_adapters/#{connection.adapter_name.underscore}_adapter"
|
|
10
|
+
# require "#{File.dirname(__FILE__)}/active_record/connection_adapters/#{connection.adapter_name.underscore}_adapter"
|
|
11
|
+
require "#{File.dirname(__FILE__)}/active_record/connection_adapters/#{connection.adapter_name.downcase}_adapter"
|
|
10
12
|
end
|
|
11
13
|
end
|
|
12
14
|
end
|
|
15
|
+
|
data/lib/legacy_data/schema.rb
CHANGED
|
@@ -28,14 +28,14 @@ module LegacyData
|
|
|
28
28
|
if table_name
|
|
29
29
|
add_pending_table(table_name)
|
|
30
30
|
else
|
|
31
|
-
|
|
31
|
+
self.tables.each {|table| add_pending_table(table) }
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
def self.add_pending_table table_name
|
|
35
35
|
table_definitions[table_name] = :pending if table_definitions[table_name].nil?
|
|
36
36
|
end
|
|
37
37
|
def self.next_table_to_process
|
|
38
|
-
table_definitions.keys.detect {|table_name| table_definitions[table_name] == :pending }
|
|
38
|
+
table_definitions.keys.map(&:to_s).sort.detect {|table_name| table_definitions[table_name] == :pending }
|
|
39
39
|
end
|
|
40
40
|
def self.clear_table_definitions
|
|
41
41
|
@tables = {}
|
|
@@ -88,6 +88,7 @@ module LegacyData
|
|
|
88
88
|
elsif connection.respond_to?(:primary_key)
|
|
89
89
|
@pk = connection.primary_key(table_name)
|
|
90
90
|
end
|
|
91
|
+
@pk = 'no_primary_key' if @pk.nil?
|
|
91
92
|
end
|
|
92
93
|
@pk
|
|
93
94
|
end
|
|
@@ -100,11 +101,13 @@ module LegacyData
|
|
|
100
101
|
end
|
|
101
102
|
|
|
102
103
|
def belongs_to_relations
|
|
103
|
-
return {} unless connection.respond_to? :
|
|
104
|
-
|
|
104
|
+
return {} unless connection.respond_to? :foreign_keys
|
|
105
|
+
|
|
105
106
|
belongs_to = {}
|
|
106
|
-
connection.
|
|
107
|
-
|
|
107
|
+
connection.foreign_keys(table_name).each do |foreign_key|
|
|
108
|
+
options = {:foreign_key=>foreign_key.options[:column].downcase.to_sym}
|
|
109
|
+
options[:dependent] = :destroy if foreign_key.options[:dependent] == :delete
|
|
110
|
+
belongs_to[foreign_key.to_table.downcase] = options
|
|
108
111
|
end
|
|
109
112
|
belongs_to
|
|
110
113
|
end
|
|
@@ -200,7 +203,7 @@ module LegacyData
|
|
|
200
203
|
|
|
201
204
|
private
|
|
202
205
|
def self.connection
|
|
203
|
-
|
|
206
|
+
ActiveRecord::Base.connection
|
|
204
207
|
end
|
|
205
208
|
def connection
|
|
206
209
|
self.class.connection
|
|
@@ -56,7 +56,7 @@ Done analyzing the tables.
|
|
|
56
56
|
def compute_class_name table_name
|
|
57
57
|
table_name =~ /#{naming_convention}/i
|
|
58
58
|
stripped_table_name = $1 || table_name
|
|
59
|
-
dictionary[table_name] = ActiveRecord::Base.class_name(stripped_table_name.downcase.pluralize)
|
|
59
|
+
dictionary[table_name] = ActiveRecord::Base.class_name(stripped_table_name.underscore.downcase.pluralize)
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
def self.log msg
|
|
@@ -10,14 +10,129 @@ module LegacyData
|
|
|
10
10
|
self.send(key)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
def unconventional_table_name?
|
|
14
|
+
table_name != class_name.underscore.pluralize
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def unconventional_primary_key?
|
|
18
|
+
puts self.inspect if primary_key.nil?
|
|
19
|
+
primary_key != 'id'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def relationships_to_s
|
|
23
|
+
relationships_text = []
|
|
24
|
+
[:has_many, :has_one, :belongs_to, :has_and_belongs_to_many].each do |relation_type|
|
|
25
|
+
is_singular_association = [:has_one, :belongs_to].include?(relation_type)
|
|
26
|
+
unless relations[relation_type].nil?
|
|
27
|
+
association_with_longest_name = longest_association_name(relations[relation_type], is_singular_association)
|
|
28
|
+
|
|
29
|
+
relations[relation_type].keys.sort.each do |table_name|
|
|
30
|
+
options = relations[relation_type][table_name]
|
|
31
|
+
class_for_table = TableDefinition.class_name_for(table_name)
|
|
32
|
+
association_name = class_for_table.underscore
|
|
33
|
+
association_name = association_name.pluralize unless is_singular_association
|
|
34
|
+
needs_class_name = (ActiveRecord::Base.class_name(association_name.pluralize) != class_for_table)
|
|
35
|
+
options[:class_name] = class_for_table if needs_class_name
|
|
36
|
+
|
|
37
|
+
spaces = association_with_longest_name.size - association_name.size
|
|
38
|
+
relationships_text << "#{relation_type} #{association_name.to_sym.inspect},#{' ' * spaces} #{options_to_s(options)}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
relationships_text.join "\n "
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def class_name
|
|
46
|
+
TableDefinition.class_name_for table_name
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.class_name_for table_name
|
|
50
|
+
LegacyData::TableClassNameMapper.class_name_for(table_name)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def longest_association_name(associations, is_singular_association)
|
|
54
|
+
association_names = associations.keys.map do |assoc|
|
|
55
|
+
association_name = TableDefinition.class_name_for(assoc).underscore
|
|
56
|
+
association_name = association_name.pluralize unless is_singular_association
|
|
57
|
+
association_name
|
|
58
|
+
end
|
|
59
|
+
association_with_longest_name = association_names.max { |a,b| a.length <=> b.length }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def options_to_s options
|
|
63
|
+
alphabetized_option_keys = options.keys.map(&:to_s).sort
|
|
64
|
+
alphabetized_option_keys.map do |key|
|
|
65
|
+
"#{key.to_sym.inspect} => #{options[key.to_sym].inspect}"
|
|
66
|
+
end.join(', ')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def constraints_to_s
|
|
70
|
+
alphabetized_constraints_types = constraints.keys.map(&:to_s).sort
|
|
71
|
+
constraints_text = alphabetized_constraints_types.map do |constraint_type|
|
|
72
|
+
self.send("#{constraint_type}_constraints_to_s") unless constraints[constraint_type.to_sym].blank?
|
|
73
|
+
end
|
|
74
|
+
constraints_text.flatten.reject(&:nil?).join("\n ")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def unique_constraints_to_s
|
|
78
|
+
cols_list = constraints[:unique].map {|cols| cols.downcase.to_sym.inspect}.join(', ')
|
|
79
|
+
"validates_uniqueness_of #{cols_list}"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def multi_column_unique_constraints_to_s
|
|
83
|
+
constraints[:multi_column_unique].map do |cols|
|
|
84
|
+
"#validates_uniqueness_of_multiple_column_constraint #{cols.inspect}"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def presence_of_constraints_to_s
|
|
89
|
+
cols_list = constraints[:presence_of].map {|cols| cols.downcase.to_sym.inspect}.join(', ')
|
|
90
|
+
"validates_presence_of #{cols_list}"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def inclusion_of_constraints_to_s
|
|
94
|
+
constraints[:inclusion_of].keys.map do |col|
|
|
95
|
+
<<-OUTPUT
|
|
96
|
+
def self.possible_values_for_#{col}
|
|
97
|
+
#{constraints[:inclusion_of][col].inspect}
|
|
98
|
+
end
|
|
99
|
+
validates_inclusion_of #{col.to_sym.inspect},
|
|
100
|
+
:in => possible_values_for_#{col},
|
|
101
|
+
:message => "is not one of (\#{possible_values_for_#{col}.join(', ')})"
|
|
102
|
+
OUTPUT
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def numericality_of_constraints_to_s
|
|
107
|
+
[:allow_nil, :do_not_allow_nil].map do |nullable|
|
|
108
|
+
if constraints[:numericality_of][nullable].blank?
|
|
109
|
+
[]
|
|
110
|
+
else
|
|
111
|
+
cols_list = constraints[:numericality_of][nullable].map {|cols| cols.downcase.to_sym.inspect}.join(', ')
|
|
112
|
+
"validates_numericality_of #{cols_list}#{", {:allow_nil=>true}" if nullable == :allow_nil }"
|
|
113
|
+
end
|
|
114
|
+
end unless constraints[:numericality_of].blank?
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def custom_constraints_to_s
|
|
118
|
+
constraints[:custom].keys.map do |name|
|
|
119
|
+
<<-OUTPUT
|
|
120
|
+
validate #{"validate_#{name}".to_sym.inspect }
|
|
121
|
+
def validate_#{name}
|
|
122
|
+
# TODO: validate this SQL constraint
|
|
123
|
+
<<-SQL
|
|
124
|
+
#{constraints[:custom][name]}
|
|
125
|
+
SQL
|
|
126
|
+
end
|
|
127
|
+
OUTPUT
|
|
128
|
+
end
|
|
17
129
|
end
|
|
18
130
|
|
|
19
131
|
def join_table?
|
|
20
|
-
(columns.size == 2) and relations[:belongs_to] and (relations[:belongs_to].values.
|
|
132
|
+
return false unless (columns.size == 2) and relations[:belongs_to] and (relations[:belongs_to].values.size == 2)
|
|
133
|
+
column_names = columns.map(&:name)
|
|
134
|
+
foreign_key_names = relations[:belongs_to].values.map {|value| value[:foreign_key]}.map(&:to_s)
|
|
135
|
+
return column_names.sort == foreign_key_names.sort
|
|
21
136
|
end
|
|
22
137
|
|
|
23
138
|
def belongs_to_relations
|
data/spec/expected/post.rb
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
class Post < ActiveRecord::Base
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
|
|
4
4
|
|
|
5
5
|
# Relationships
|
|
6
6
|
has_many :comments, :foreign_key => :comment_id
|
|
7
7
|
|
|
8
8
|
# Constraints
|
|
9
|
-
validates_uniqueness_of :title
|
|
10
9
|
validates_presence_of :body
|
|
10
|
+
validates_uniqueness_of :title
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/functional_spec_helper')
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe "Generating models from a blog #{ENV['ADAPTER']} database" do
|
|
5
|
+
before :all do
|
|
6
|
+
@adapter = ENV['ADAPTER']
|
|
7
|
+
@example = :blog
|
|
8
|
+
|
|
9
|
+
connection_info = connection_info_for(@example, @adapter)
|
|
10
|
+
pending("The #{@example} spec does not run for #{@adapter}") if connection_info.nil?
|
|
11
|
+
initialize_connection connection_info
|
|
12
|
+
|
|
13
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../examples/blog_migration')
|
|
14
|
+
create_blog_tables
|
|
15
|
+
|
|
16
|
+
silence_warnings { RAILS_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../output/functional/#{@example}_#{@adapter}") }
|
|
17
|
+
FileUtils.mkdir_p(RAILS_ROOT + '/app/models')
|
|
18
|
+
FileUtils.mkdir_p(RAILS_ROOT + '/spec')
|
|
19
|
+
|
|
20
|
+
LegacyData::Schema.stub!(:log)
|
|
21
|
+
|
|
22
|
+
@expected_directory = File.expand_path("#{File.dirname(__FILE__)}/../../examples/generated/#{@example}_#{@adapter}")
|
|
23
|
+
end
|
|
24
|
+
after :all do
|
|
25
|
+
Object.send(:remove_const, :RAILS_ROOT)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
before :each do #
|
|
29
|
+
pending("oracle does not yet work with t.foreign_key table creation") if @adapter == 'oracle'
|
|
30
|
+
FileUtils.rm(RAILS_ROOT + '/spec/factories.rb', :force => true)
|
|
31
|
+
invoke_generator('models_from_tables', ["--with-factories"], :create)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
%w( post comment tag ).each do |model|
|
|
35
|
+
it "should generate the expected #{model} model" do
|
|
36
|
+
File.read(RAILS_ROOT + "/app/models/#{model}.rb").should == File.read("#{@expected_directory}/#{model}.rb")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should generated the expected factories" do
|
|
41
|
+
File.read(RAILS_ROOT + '/spec/factories.rb').should == File.read("#{@expected_directory}/factories.rb")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# CREATE DATABASE legacy_data_blog;
|
|
2
|
+
mysql_blog:
|
|
3
|
+
adapter: mysql
|
|
4
|
+
database: legacy_data_blog
|
|
5
|
+
username: root
|
|
6
|
+
password:
|
|
7
|
+
|
|
8
|
+
sqlite3_blog:
|
|
9
|
+
adapter: sqlite3
|
|
10
|
+
database: ':memory:'
|
|
11
|
+
|
|
12
|
+
# CREATE USER legacy_data_blog IDENTIFIED BY legacy_data_blog;
|
|
13
|
+
# GRANT ALL PRIVILEGES TO legacy_data_blog;
|
|
14
|
+
oracle_blog:
|
|
15
|
+
adapter: oracle_enhanced
|
|
16
|
+
database: localhost:1521/XE
|
|
17
|
+
username: legacy_data_blog
|
|
18
|
+
password: legacy_data_blog
|
|
19
|
+
|
|
20
|
+
# CREATE DATABASE drupal_6_14;
|
|
21
|
+
mysql_drupal:
|
|
22
|
+
adapter: mysql
|
|
23
|
+
database: drupal_6_14
|
|
24
|
+
username: root
|
|
25
|
+
password:
|
|
26
|
+
|
|
27
|
+
# CREATE DATABASE j2ee_petstore;
|
|
28
|
+
mysql_j2ee_petstore:
|
|
29
|
+
adapter: mysql
|
|
30
|
+
database: j2ee_petstore
|
|
31
|
+
username: root
|
|
32
|
+
password:
|
|
33
|
+
|
|
34
|
+
sqlite3_j2ee_petstore:
|
|
35
|
+
adapter: sqlite3
|
|
36
|
+
database: ':memory:'
|
|
37
|
+
|
|
38
|
+
# CREATE USER petstore IDENTIFIED BY petstore;
|
|
39
|
+
# GRANT ALL PRIVILEGES TO petstore;
|
|
40
|
+
oracle_j2ee_petstore:
|
|
41
|
+
adapter: oracle_enhanced
|
|
42
|
+
database: localhost:1521/XE
|
|
43
|
+
username: petstore
|
|
44
|
+
password: petstore
|
|
45
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/functional_spec_helper')
|
|
2
|
+
|
|
3
|
+
if ENV['ADAPTER'] == 'mysql'
|
|
4
|
+
|
|
5
|
+
def create_drupal_schema
|
|
6
|
+
execute_sql_script(File.expand_path(File.dirname(__FILE__) + '/../../examples/drupal_6_14.sql'))
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "Generating models from a drupal 6.14 #{ENV['ADAPTER']} database" do
|
|
10
|
+
before :all do
|
|
11
|
+
@adapter = ENV['ADAPTER']
|
|
12
|
+
@example = :drupal
|
|
13
|
+
|
|
14
|
+
connection_info = connection_info_for(@example, @adapter)
|
|
15
|
+
pending("The #{@example} spec does not run for #{@adapter}") if connection_info.nil?
|
|
16
|
+
initialize_connection connection_info
|
|
17
|
+
create_drupal_schema
|
|
18
|
+
|
|
19
|
+
silence_warnings { RAILS_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../output/functional/#{@example}_#{@adapter}") }
|
|
20
|
+
FileUtils.mkdir_p(RAILS_ROOT + '/app/models')
|
|
21
|
+
FileUtils.mkdir_p(RAILS_ROOT + '/spec')
|
|
22
|
+
|
|
23
|
+
LegacyData::Schema.stub!(:log)
|
|
24
|
+
|
|
25
|
+
@expected_directory = File.expand_path("#{File.dirname(__FILE__)}/../../examples/generated/#{@example}_#{@adapter}")
|
|
26
|
+
|
|
27
|
+
LegacyData::TableClassNameMapper.dictionary['files'] = 'UploadedFiles' #to avoid collision with Ruby File class
|
|
28
|
+
LegacyData::TableClassNameMapper.dictionary['cache'] = 'Cache' #don't strip the e to make it cach
|
|
29
|
+
|
|
30
|
+
FileUtils.rm(RAILS_ROOT + '/spec/factories.rb', :force => true)
|
|
31
|
+
invoke_generator('models_from_tables', ["--with-factories"], :create)
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
after :all do
|
|
35
|
+
Object.send(:remove_const, :RAILS_ROOT)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
%w( access action actions_aid authmap batch block blocks_role
|
|
39
|
+
box cache cache_block cache_filter cache_form cache_menu cache_page
|
|
40
|
+
cache_update comment filter filter_format flood history menu_custom
|
|
41
|
+
menu_link menu_router node node_access node_comment_statistic node_counter node_revision
|
|
42
|
+
node_type permission role session system term_data term_hierarchy
|
|
43
|
+
term_node term_relation term_synonym uploaded_files url_alias user users_role
|
|
44
|
+
variable vocabulary vocabulary_node_type watchdog ).each do |model|
|
|
45
|
+
it "should generate the expected #{model} model" do
|
|
46
|
+
File.read(RAILS_ROOT + "/app/models/#{model}.rb").should == File.read("#{@expected_directory}/#{model}.rb")
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should generated the expected factories" do
|
|
51
|
+
File.read(RAILS_ROOT + '/spec/factories.rb').should == File.read("#{@expected_directory}/factories.rb")
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -1,3 +1,27 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
2
|
|
|
3
|
+
ADAPTER = ENV['ADAPTER']
|
|
3
4
|
|
|
5
|
+
|
|
6
|
+
def initialize_connection connection_info
|
|
7
|
+
ActiveRecord::Base.establish_connection(connection_info)
|
|
8
|
+
|
|
9
|
+
begin
|
|
10
|
+
require "foreigner/connection_adapters/#{ActiveRecord::Base.connection.adapter_name.downcase}_adapter"
|
|
11
|
+
rescue LoadError
|
|
12
|
+
#foreigner does not support all adapters (i.e. sqlite3)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def connection_info_for example, adapter
|
|
18
|
+
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
|
19
|
+
config["#{adapter}_#{example}"]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def execute_sql_script script_filename
|
|
23
|
+
sql_script = File.read script_filename
|
|
24
|
+
sql_script.split(';').each do |sql_statement|
|
|
25
|
+
ActiveRecord::Base.connection.execute(sql_statement) unless sql_statement.blank?
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/functional_spec_helper')
|
|
2
|
+
|
|
3
|
+
def create_j2ee_petstore_schema
|
|
4
|
+
execute_sql_script(File.expand_path(File.dirname(__FILE__) + '/../../examples/delete_j2ee_petstore.sql') ) unless ENV['ADAPTER'] == 'sqlite3' rescue nil
|
|
5
|
+
execute_sql_script(File.expand_path(File.dirname(__FILE__) + '/../../examples/create_j2ee_petstore.sql') )
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe "Generating models from j2ee petstore #{ENV['ADAPTER']} database" do
|
|
9
|
+
before :all do
|
|
10
|
+
@adapter = ENV['ADAPTER']
|
|
11
|
+
@example = :j2ee_petstore
|
|
12
|
+
|
|
13
|
+
connection_info = connection_info_for(@example, @adapter)
|
|
14
|
+
pending("The #{@example} spec does not run for #{@adapter}") if connection_info.nil?
|
|
15
|
+
initialize_connection connection_info
|
|
16
|
+
create_j2ee_petstore_schema
|
|
17
|
+
|
|
18
|
+
silence_warnings { RAILS_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../output/functional/#{@example}_#{@adapter}") }
|
|
19
|
+
FileUtils.mkdir_p(RAILS_ROOT + '/app/models')
|
|
20
|
+
FileUtils.mkdir_p(RAILS_ROOT + '/spec')
|
|
21
|
+
|
|
22
|
+
LegacyData::Schema.stub!(:log)
|
|
23
|
+
|
|
24
|
+
@expected_directory = File.expand_path("#{File.dirname(__FILE__)}/../../examples/generated/#{@example}_#{@adapter}")
|
|
25
|
+
|
|
26
|
+
LegacyData::TableClassNameMapper.dictionary['files'] = 'UploadedFiles' #to avoid collision with Ruby File class
|
|
27
|
+
LegacyData::TableClassNameMapper.dictionary['cache'] = 'Cache' #don't strip the e to make it cach
|
|
28
|
+
|
|
29
|
+
FileUtils.rm(RAILS_ROOT + '/spec/factories.rb', :force => true)
|
|
30
|
+
invoke_generator('models_from_tables', ["--with-factories"], :create)
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
after :all do
|
|
36
|
+
Object.send(:remove_const, :RAILS_ROOT)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
models = %w( address category id_gen item
|
|
40
|
+
product tag ziplocation )
|
|
41
|
+
|
|
42
|
+
if ENV['ADAPTER'] == 'oracle'
|
|
43
|
+
models + %w( sellercontactinfo )
|
|
44
|
+
else
|
|
45
|
+
models + %w( seller_contact_info tag_info)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
models.each do |model|
|
|
49
|
+
it "should generate the expected #{model} model" do
|
|
50
|
+
File.read(RAILS_ROOT + "/app/models/#{model}.rb").should == File.read("#{@expected_directory}/#{model}.rb")
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should generated the expected factories" do
|
|
55
|
+
File.read(RAILS_ROOT + '/spec/factories.rb').should == File.read("#{@expected_directory}/factories.rb")
|
|
56
|
+
end
|
|
57
|
+
end
|