legacy_data 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/Rakefile +37 -1
  2. data/VERSION +1 -1
  3. data/examples/blog_migration.rb +26 -0
  4. data/examples/create_j2ee_petstore.sql +91 -0
  5. data/examples/delete_j2ee_petstore.sql +14 -0
  6. data/examples/drupal_6_14.sql +809 -0
  7. data/examples/generated/blog_mysql/comment.rb +11 -0
  8. data/examples/generated/blog_mysql/factories.rb +9 -0
  9. data/examples/generated/blog_mysql/post.rb +11 -0
  10. data/examples/generated/blog_mysql/tag.rb +11 -0
  11. data/{spec/functional/expected → examples/generated/blog_sqlite3}/comment.rb +3 -4
  12. data/examples/generated/blog_sqlite3/factories.rb +12 -0
  13. data/{spec/functional/expected → examples/generated/blog_sqlite3}/post.rb +3 -3
  14. data/examples/generated/blog_sqlite3/tag.rb +11 -0
  15. data/examples/generated/drupal_mysql/access.rb +12 -0
  16. data/examples/generated/drupal_mysql/action.rb +11 -0
  17. data/examples/generated/drupal_mysql/actions_aid.rb +11 -0
  18. data/examples/generated/drupal_mysql/authmap.rb +13 -0
  19. data/examples/generated/drupal_mysql/batch.rb +12 -0
  20. data/examples/generated/drupal_mysql/block.rb +13 -0
  21. data/examples/generated/drupal_mysql/blocks_role.rb +12 -0
  22. data/examples/generated/drupal_mysql/box.rb +13 -0
  23. data/examples/generated/drupal_mysql/cache.rb +12 -0
  24. data/examples/generated/drupal_mysql/cache_block.rb +12 -0
  25. data/examples/generated/drupal_mysql/cache_filter.rb +12 -0
  26. data/examples/generated/drupal_mysql/cache_form.rb +12 -0
  27. data/examples/generated/drupal_mysql/cache_menu.rb +12 -0
  28. data/examples/generated/drupal_mysql/cache_page.rb +12 -0
  29. data/examples/generated/drupal_mysql/cache_update.rb +12 -0
  30. data/examples/generated/drupal_mysql/comment.rb +12 -0
  31. data/examples/generated/drupal_mysql/factories.rb +370 -0
  32. data/examples/generated/drupal_mysql/filter.rb +13 -0
  33. data/examples/generated/drupal_mysql/filter_format.rb +13 -0
  34. data/examples/generated/drupal_mysql/flood.rb +12 -0
  35. data/examples/generated/drupal_mysql/history.rb +12 -0
  36. data/examples/generated/drupal_mysql/menu_custom.rb +11 -0
  37. data/examples/generated/drupal_mysql/menu_link.rb +12 -0
  38. data/examples/generated/drupal_mysql/menu_router.rb +12 -0
  39. data/examples/generated/drupal_mysql/node.rb +13 -0
  40. data/examples/generated/drupal_mysql/node_access.rb +12 -0
  41. data/examples/generated/drupal_mysql/node_comment_statistic.rb +12 -0
  42. data/examples/generated/drupal_mysql/node_counter.rb +12 -0
  43. data/examples/generated/drupal_mysql/node_revision.rb +12 -0
  44. data/examples/generated/drupal_mysql/node_type.rb +12 -0
  45. data/examples/generated/drupal_mysql/permission.rb +12 -0
  46. data/examples/generated/drupal_mysql/role.rb +12 -0
  47. data/examples/generated/drupal_mysql/session.rb +12 -0
  48. data/examples/generated/drupal_mysql/system.rb +12 -0
  49. data/examples/generated/drupal_mysql/term_data.rb +12 -0
  50. data/examples/generated/drupal_mysql/term_hierarchy.rb +12 -0
  51. data/examples/generated/drupal_mysql/term_node.rb +12 -0
  52. data/examples/generated/drupal_mysql/term_relation.rb +13 -0
  53. data/examples/generated/drupal_mysql/term_synonym.rb +12 -0
  54. data/examples/generated/drupal_mysql/uploaded_files.rb +12 -0
  55. data/examples/generated/drupal_mysql/url_alias.rb +12 -0
  56. data/examples/generated/drupal_mysql/user.rb +14 -0
  57. data/examples/generated/drupal_mysql/users_role.rb +12 -0
  58. data/examples/generated/drupal_mysql/variable.rb +11 -0
  59. data/examples/generated/drupal_mysql/vocabulary.rb +12 -0
  60. data/examples/generated/drupal_mysql/vocabulary_node_type.rb +12 -0
  61. data/examples/generated/drupal_mysql/watchdog.rb +12 -0
  62. data/examples/generated/j2ee_petstore_mysql/address.rb +11 -0
  63. data/examples/generated/j2ee_petstore_mysql/category.rb +11 -0
  64. data/examples/generated/j2ee_petstore_mysql/factories.rb +57 -0
  65. data/examples/generated/j2ee_petstore_mysql/id_gen.rb +12 -0
  66. data/examples/generated/j2ee_petstore_mysql/item.rb +12 -0
  67. data/examples/generated/j2ee_petstore_mysql/product.rb +11 -0
  68. data/examples/generated/j2ee_petstore_mysql/seller_contact_info.rb +11 -0
  69. data/examples/generated/j2ee_petstore_mysql/tag.rb +13 -0
  70. data/examples/generated/j2ee_petstore_mysql/tag_item.rb +13 -0
  71. data/examples/generated/j2ee_petstore_mysql/ziplocation.rb +11 -0
  72. data/examples/generated/j2ee_petstore_oracle/address.rb +11 -0
  73. data/examples/generated/j2ee_petstore_oracle/category.rb +11 -0
  74. data/examples/generated/j2ee_petstore_oracle/factories.rb +52 -0
  75. data/examples/generated/j2ee_petstore_oracle/id_gen.rb +12 -0
  76. data/examples/generated/j2ee_petstore_oracle/item.rb +15 -0
  77. data/examples/generated/j2ee_petstore_oracle/product.rb +12 -0
  78. data/examples/generated/j2ee_petstore_oracle/sellercontactinfo.rb +11 -0
  79. data/examples/generated/j2ee_petstore_oracle/tag.rb +13 -0
  80. data/examples/generated/j2ee_petstore_oracle/ziplocation.rb +11 -0
  81. data/examples/generated/j2ee_petstore_sqlite3/address.rb +12 -0
  82. data/examples/generated/j2ee_petstore_sqlite3/category.rb +12 -0
  83. data/examples/generated/j2ee_petstore_sqlite3/factories.rb +57 -0
  84. data/examples/generated/j2ee_petstore_sqlite3/id_gen.rb +13 -0
  85. data/examples/generated/j2ee_petstore_sqlite3/item.rb +13 -0
  86. data/examples/generated/j2ee_petstore_sqlite3/product.rb +12 -0
  87. data/examples/generated/j2ee_petstore_sqlite3/seller_contact_info.rb +12 -0
  88. data/examples/generated/j2ee_petstore_sqlite3/tag.rb +13 -0
  89. data/examples/generated/j2ee_petstore_sqlite3/tag_item.rb +14 -0
  90. data/examples/generated/j2ee_petstore_sqlite3/ziplocation.rb +11 -0
  91. data/generators/models_from_tables/models_from_tables_generator.rb +5 -36
  92. data/generators/models_from_tables/templates/model.rb +5 -39
  93. data/legacy_data.gemspec +187 -11
  94. data/lib/active_record/connection_adapters/oracleenhanced_adapter.rb +85 -0
  95. data/lib/legacy_data.rb +5 -2
  96. data/lib/legacy_data/schema.rb +10 -7
  97. data/lib/legacy_data/table_class_name_mapper.rb +1 -1
  98. data/lib/legacy_data/table_definition.rb +120 -5
  99. data/spec/expected/post.rb +3 -3
  100. data/spec/functional/blog_adapterspec.rb +45 -0
  101. data/spec/functional/database.yml +45 -0
  102. data/spec/functional/drupal_adapterspec.rb +54 -0
  103. data/spec/functional/functional_spec_helper.rb +24 -0
  104. data/spec/functional/j2ee_petstore_adapterspec.rb +57 -0
  105. data/spec/legacy_data/schema_spec.rb +7 -3
  106. data/spec/legacy_data/table_definition_spec.rb +101 -10
  107. data/spec/models_from_tables_generator_spec.rb +19 -7
  108. data/spec/spec_helper.rb +6 -18
  109. metadata +193 -10
  110. data/examples/j2ee_petstore.sql +0 -512
  111. data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +0 -61
  112. data/spec/functional/models_from_tables_spec.rb +0 -27
@@ -0,0 +1,12 @@
1
+ class SellerContactInfo < ActiveRecord::Base
2
+ set_table_name :sellercontactinfo
3
+ set_primary_key :contactinfoid
4
+
5
+ # Relationships
6
+
7
+
8
+ # Constraints
9
+ validates_presence_of :lastname, :firstname, :email
10
+ validates_uniqueness_of :contactinfoid
11
+ end
12
+
@@ -0,0 +1,13 @@
1
+ class Tag < ActiveRecord::Base
2
+ set_table_name :tag
3
+ set_primary_key :tagid
4
+
5
+ # Relationships
6
+
7
+
8
+ # Constraints
9
+ validates_numericality_of :refcount
10
+ validates_presence_of :tag, :refcount
11
+ validates_uniqueness_of :tag
12
+ end
13
+
@@ -0,0 +1,14 @@
1
+ class TagItem < ActiveRecord::Base
2
+ set_table_name :tag_item
3
+
4
+
5
+ # Relationships
6
+
7
+
8
+ # Constraints
9
+
10
+ #validates_uniqueness_of_multiple_column_constraint :["tagid", "itemid"]
11
+ validates_numericality_of :tagid
12
+ validates_presence_of :tagid, :itemid
13
+ end
14
+
@@ -0,0 +1,11 @@
1
+ class Ziplocation < ActiveRecord::Base
2
+ set_table_name :ziplocation
3
+ set_primary_key :zipcode
4
+
5
+ # Relationships
6
+
7
+
8
+ # Constraints
9
+ validates_presence_of :city, :state
10
+ end
11
+
@@ -1,8 +1,4 @@
1
1
  require File.dirname(__FILE__) + '/../../lib/legacy_data'
2
- # require File.dirname(__FILE__) + '/../../lib/legacy_data/table_definition'
3
- # require File.dirname(__FILE__) + '/../../lib/legacy_data/schema'
4
- # require File.dirname(__FILE__) + '/../../lib/legacy_data/table_class_name_mapper'
5
- # require File.dirname(__FILE__) + '/../../lib/active_record/connection_adapters/oracle_enhanced_adapter'
6
2
 
7
3
  class ModelsFromTablesGenerator < Rails::Generator::Base
8
4
  def manifest
@@ -21,39 +17,10 @@ class ModelsFromTablesGenerator < Rails::Generator::Base
21
17
  m.class_collisions :class_path, analyzed_table[:class_name]
22
18
  m.template 'model.rb',
23
19
  File.join('app/models', "#{analyzed_table[:class_name].underscore}.rb"),
24
- :assigns => analyzed_table.to_hash
20
+ :assigns => {:definition => analyzed_table}
21
+
22
+ add_factory_girl_factory analyzed_table if options[:with_factories]
25
23
 
26
- add_factory_girl_factory analyzed_table.to_hash
27
-
28
- # # puts m.source_root
29
- # # factory_template = m.source_path('factory.rb')
30
- #
31
- # factory_template = File.dirname(__FILE__) + '/templates/factory.rb'
32
- # puts "factory_template #{factory_template}"
33
- # new_factory = m.send(:render_file, factory_template) do |file|
34
- # # vars = analyzed_table.to_hash
35
- # # b = binding
36
- # # vars.each { |k,v| eval "#{k} = vars[:#{k}] || vars['#{k}']", b }
37
- # # puts 'in block'
38
- # "in block"
39
- # # Render the source file with the temporary binding.
40
- # # ERB.new(file.read, nil, '-').result(b)
41
- # end
42
- # puts 'after new_factory'
43
- # puts " its... #{new_factory}"
44
- #
45
- # m.gsub_file 'spec/factories.rb', /\Z/ do |match|
46
- # # # # puts match
47
- # # # puts 'BEFORE'
48
- # # # # puts m.source_path('factory.rb')
49
- # # # # puts analyzed_table.to_hash.inspect
50
- # # # puts 'BEFORE'
51
- # puts 'before'
52
- # puts new_factory
53
- # puts "DONE"
54
- # "#{match}\n #{new_factory}\n"
55
- # # "#{match}\n ok \n"
56
- # end
57
24
  end
58
25
  end
59
26
  rescue => e
@@ -69,6 +36,8 @@ protected
69
36
  'Naming convention for tables in the database - will not be used when generating naming the models') { |value| options[:table_naming_convention] = value }
70
37
  opt.on('--skip-associated',
71
38
  'Do not follow foreign keys to model associated tables') { |value| options[:skip_associated] = true }
39
+ opt.on('--with-factories',
40
+ 'Add factory-girl factories for all created models') { |value| options[:with_factories] = true }
72
41
  end
73
42
 
74
43
 
@@ -1,45 +1,11 @@
1
- class <%= class_name -%> < ActiveRecord::Base
2
- set_table_name <%= table_name.to_sym.inspect %>
3
- <%= "set_primary_key #{primary_key.to_sym.inspect}" if primary_key %>
1
+ class <%= definition.class_name -%> < ActiveRecord::Base
2
+ <%= "set_table_name #{definition.table_name.downcase.to_sym.inspect}" if definition.unconventional_table_name? %>
3
+ <%= "set_primary_key #{definition.primary_key.to_sym.inspect}" if definition.unconventional_primary_key? %>
4
4
 
5
5
  # Relationships
6
- <%- [:has_many, :has_one, :belongs_to, :has_and_belongs_to_many].each do |relation_type|
7
- relations[relation_type].each do |table_name, options|
8
- class_for_table = LegacyData::TableClassNameMapper.class_name_for(table_name)
9
- is_singular_association = [:has_one, :belongs_to].include?(relation_type)
10
- association_name = class_for_table.underscore
11
- association_name = association_name.pluralize unless is_singular_association
12
- needs_class_name = (ActiveRecord::Base.class_name(association_name.pluralize) != class_for_table)
13
- -%> <%= relation_type %> <%= association_name.to_sym.inspect %>, <%=options.keys.map {|key| "#{key.to_sym.inspect} => #{options[key].to_sym.inspect}"}.join(', ')%><%= ", :class_name=>'#{class_for_table}'" if needs_class_name %>
14
- <%- end unless relations[relation_type].nil?
15
- end
16
- -%>
6
+ <%= definition.relationships_to_s %>
17
7
 
18
8
  # Constraints
19
- <%= "validates_uniqueness_of #{constraints[:unique ].map {|cols| cols.downcase.to_sym.inspect}.join(', ')}" unless constraints[:unique].blank? %>
20
- <%- constraints[:multi_column_unique].each do |cols|
21
- -%> #validates_uniqueness_of_multiple_column_constraint :<%= cols.inspect %>
22
- <%- end -%>
23
- <%= "validates_presence_of #{constraints[:presence_of].map {|cols| cols.downcase.to_sym.inspect}.join(', ')}" unless constraints[:presence_of].blank? %>
24
- <%- constraints[:inclusion_of].each do |col, possible_values|
25
- -%> def self.possible_values_for_<%= col %>
26
- [ <%= possible_values %> ]
27
- end
28
- validates_inclusion_of <%= col.to_sym.inspect %>, :in => possible_values_for_<%= col %>, :message => "is not one of (#{possible_values_for_<%= col %>.join(', ')})"
29
- <%- end if constraints[:inclusion_of] -%>
30
- <%- [:allow_nil, :do_not_allow_nil].each do |nullable|
31
- unless constraints[:numericality_of][nullable].blank?
32
- -%> <%= "validates_numericality_of #{constraints[:numericality_of][nullable].map {|cols| cols.downcase.to_sym.inspect}.join(', ')}" %><%= ", {:allow_nil=>true}" if nullable == :allow_nil %>
33
- <%- end
34
- end unless constraints[:numericality_of].blank? -%>
35
- <%- constraints[:custom].each do |name, sql_rule|
36
- -%> validate <%= "validate_#{name}".to_sym.inspect %>
37
- def <%= "validate_#{name}" %>
38
- # TODO: validate this SQL constraint
39
- <<-SQL
40
- <%= sql_rule %>
41
- SQL
42
- end
43
- <%- end if constraints[:custom] -%>
9
+ <%= definition.constraints_to_s %>
44
10
  end
45
11
 
data/legacy_data.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{legacy_data}
8
- s.version = "0.1.8"
8
+ s.version = "0.1.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alex Rothenberg"]
12
- s.date = %q{2009-10-14}
12
+ s.date = %q{2009-10-21}
13
13
  s.description = %q{Create ActiveRecord models from an existing database}
14
14
  s.email = %q{alex@alexrothenberg.com}
15
15
  s.extra_rdoc_files = [
@@ -23,22 +23,110 @@ Gem::Specification.new do |s|
23
23
  "README.rdoc",
24
24
  "Rakefile",
25
25
  "VERSION",
26
- "examples/j2ee_petstore.sql",
26
+ "examples/blog_migration.rb",
27
+ "examples/create_j2ee_petstore.sql",
28
+ "examples/delete_j2ee_petstore.sql",
29
+ "examples/drupal_6_14.sql",
30
+ "examples/generated/blog_mysql/comment.rb",
31
+ "examples/generated/blog_mysql/factories.rb",
32
+ "examples/generated/blog_mysql/post.rb",
33
+ "examples/generated/blog_mysql/tag.rb",
34
+ "examples/generated/blog_sqlite3/comment.rb",
35
+ "examples/generated/blog_sqlite3/factories.rb",
36
+ "examples/generated/blog_sqlite3/post.rb",
37
+ "examples/generated/blog_sqlite3/tag.rb",
38
+ "examples/generated/drupal_mysql/access.rb",
39
+ "examples/generated/drupal_mysql/action.rb",
40
+ "examples/generated/drupal_mysql/actions_aid.rb",
41
+ "examples/generated/drupal_mysql/authmap.rb",
42
+ "examples/generated/drupal_mysql/batch.rb",
43
+ "examples/generated/drupal_mysql/block.rb",
44
+ "examples/generated/drupal_mysql/blocks_role.rb",
45
+ "examples/generated/drupal_mysql/box.rb",
46
+ "examples/generated/drupal_mysql/cache.rb",
47
+ "examples/generated/drupal_mysql/cache_block.rb",
48
+ "examples/generated/drupal_mysql/cache_filter.rb",
49
+ "examples/generated/drupal_mysql/cache_form.rb",
50
+ "examples/generated/drupal_mysql/cache_menu.rb",
51
+ "examples/generated/drupal_mysql/cache_page.rb",
52
+ "examples/generated/drupal_mysql/cache_update.rb",
53
+ "examples/generated/drupal_mysql/comment.rb",
54
+ "examples/generated/drupal_mysql/factories.rb",
55
+ "examples/generated/drupal_mysql/filter.rb",
56
+ "examples/generated/drupal_mysql/filter_format.rb",
57
+ "examples/generated/drupal_mysql/flood.rb",
58
+ "examples/generated/drupal_mysql/history.rb",
59
+ "examples/generated/drupal_mysql/menu_custom.rb",
60
+ "examples/generated/drupal_mysql/menu_link.rb",
61
+ "examples/generated/drupal_mysql/menu_router.rb",
62
+ "examples/generated/drupal_mysql/node.rb",
63
+ "examples/generated/drupal_mysql/node_access.rb",
64
+ "examples/generated/drupal_mysql/node_comment_statistic.rb",
65
+ "examples/generated/drupal_mysql/node_counter.rb",
66
+ "examples/generated/drupal_mysql/node_revision.rb",
67
+ "examples/generated/drupal_mysql/node_type.rb",
68
+ "examples/generated/drupal_mysql/permission.rb",
69
+ "examples/generated/drupal_mysql/role.rb",
70
+ "examples/generated/drupal_mysql/session.rb",
71
+ "examples/generated/drupal_mysql/system.rb",
72
+ "examples/generated/drupal_mysql/term_data.rb",
73
+ "examples/generated/drupal_mysql/term_hierarchy.rb",
74
+ "examples/generated/drupal_mysql/term_node.rb",
75
+ "examples/generated/drupal_mysql/term_relation.rb",
76
+ "examples/generated/drupal_mysql/term_synonym.rb",
77
+ "examples/generated/drupal_mysql/uploaded_files.rb",
78
+ "examples/generated/drupal_mysql/url_alias.rb",
79
+ "examples/generated/drupal_mysql/user.rb",
80
+ "examples/generated/drupal_mysql/users_role.rb",
81
+ "examples/generated/drupal_mysql/variable.rb",
82
+ "examples/generated/drupal_mysql/vocabulary.rb",
83
+ "examples/generated/drupal_mysql/vocabulary_node_type.rb",
84
+ "examples/generated/drupal_mysql/watchdog.rb",
85
+ "examples/generated/j2ee_petstore_mysql/address.rb",
86
+ "examples/generated/j2ee_petstore_mysql/category.rb",
87
+ "examples/generated/j2ee_petstore_mysql/factories.rb",
88
+ "examples/generated/j2ee_petstore_mysql/id_gen.rb",
89
+ "examples/generated/j2ee_petstore_mysql/item.rb",
90
+ "examples/generated/j2ee_petstore_mysql/product.rb",
91
+ "examples/generated/j2ee_petstore_mysql/seller_contact_info.rb",
92
+ "examples/generated/j2ee_petstore_mysql/tag.rb",
93
+ "examples/generated/j2ee_petstore_mysql/tag_item.rb",
94
+ "examples/generated/j2ee_petstore_mysql/ziplocation.rb",
95
+ "examples/generated/j2ee_petstore_oracle/address.rb",
96
+ "examples/generated/j2ee_petstore_oracle/category.rb",
97
+ "examples/generated/j2ee_petstore_oracle/factories.rb",
98
+ "examples/generated/j2ee_petstore_oracle/id_gen.rb",
99
+ "examples/generated/j2ee_petstore_oracle/item.rb",
100
+ "examples/generated/j2ee_petstore_oracle/product.rb",
101
+ "examples/generated/j2ee_petstore_oracle/sellercontactinfo.rb",
102
+ "examples/generated/j2ee_petstore_oracle/tag.rb",
103
+ "examples/generated/j2ee_petstore_oracle/ziplocation.rb",
104
+ "examples/generated/j2ee_petstore_sqlite3/address.rb",
105
+ "examples/generated/j2ee_petstore_sqlite3/category.rb",
106
+ "examples/generated/j2ee_petstore_sqlite3/factories.rb",
107
+ "examples/generated/j2ee_petstore_sqlite3/id_gen.rb",
108
+ "examples/generated/j2ee_petstore_sqlite3/item.rb",
109
+ "examples/generated/j2ee_petstore_sqlite3/product.rb",
110
+ "examples/generated/j2ee_petstore_sqlite3/seller_contact_info.rb",
111
+ "examples/generated/j2ee_petstore_sqlite3/tag.rb",
112
+ "examples/generated/j2ee_petstore_sqlite3/tag_item.rb",
113
+ "examples/generated/j2ee_petstore_sqlite3/ziplocation.rb",
27
114
  "generators/models_from_tables/USAGE",
28
115
  "generators/models_from_tables/models_from_tables_generator.rb",
29
116
  "generators/models_from_tables/templates/model.rb",
30
117
  "legacy_data.gemspec",
31
- "lib/active_record/connection_adapters/oracle_enhanced_adapter.rb",
118
+ "lib/active_record/connection_adapters/oracleenhanced_adapter.rb",
32
119
  "lib/legacy_data.rb",
33
120
  "lib/legacy_data/schema.rb",
34
121
  "lib/legacy_data/table_class_name_mapper.rb",
35
122
  "lib/legacy_data/table_definition.rb",
36
123
  "spec/expected/factories.rb",
37
124
  "spec/expected/post.rb",
38
- "spec/functional/expected/comment.rb",
39
- "spec/functional/expected/post.rb",
125
+ "spec/functional/blog_adapterspec.rb",
126
+ "spec/functional/database.yml",
127
+ "spec/functional/drupal_adapterspec.rb",
40
128
  "spec/functional/functional_spec_helper.rb",
41
- "spec/functional/models_from_tables_spec.rb",
129
+ "spec/functional/j2ee_petstore_adapterspec.rb",
42
130
  "spec/legacy_data/schema_spec.rb",
43
131
  "spec/legacy_data/table_class_name_mapper_spec.rb",
44
132
  "spec/legacy_data/table_definition_spec.rb",
@@ -54,15 +142,100 @@ Gem::Specification.new do |s|
54
142
  s.test_files = [
55
143
  "spec/expected/factories.rb",
56
144
  "spec/expected/post.rb",
57
- "spec/functional/expected/comment.rb",
58
- "spec/functional/expected/post.rb",
145
+ "spec/functional/blog_adapterspec.rb",
146
+ "spec/functional/drupal_adapterspec.rb",
59
147
  "spec/functional/functional_spec_helper.rb",
60
- "spec/functional/models_from_tables_spec.rb",
148
+ "spec/functional/j2ee_petstore_adapterspec.rb",
61
149
  "spec/legacy_data/schema_spec.rb",
62
150
  "spec/legacy_data/table_class_name_mapper_spec.rb",
63
151
  "spec/legacy_data/table_definition_spec.rb",
64
152
  "spec/models_from_tables_generator_spec.rb",
65
- "spec/spec_helper.rb"
153
+ "spec/spec_helper.rb",
154
+ "examples/blog_migration.rb",
155
+ "examples/generated/blog_mysql/comment.rb",
156
+ "examples/generated/blog_mysql/factories.rb",
157
+ "examples/generated/blog_mysql/post.rb",
158
+ "examples/generated/blog_mysql/tag.rb",
159
+ "examples/generated/blog_sqlite3/comment.rb",
160
+ "examples/generated/blog_sqlite3/factories.rb",
161
+ "examples/generated/blog_sqlite3/post.rb",
162
+ "examples/generated/blog_sqlite3/tag.rb",
163
+ "examples/generated/drupal_mysql/access.rb",
164
+ "examples/generated/drupal_mysql/action.rb",
165
+ "examples/generated/drupal_mysql/actions_aid.rb",
166
+ "examples/generated/drupal_mysql/authmap.rb",
167
+ "examples/generated/drupal_mysql/batch.rb",
168
+ "examples/generated/drupal_mysql/block.rb",
169
+ "examples/generated/drupal_mysql/blocks_role.rb",
170
+ "examples/generated/drupal_mysql/box.rb",
171
+ "examples/generated/drupal_mysql/cache.rb",
172
+ "examples/generated/drupal_mysql/cache_block.rb",
173
+ "examples/generated/drupal_mysql/cache_filter.rb",
174
+ "examples/generated/drupal_mysql/cache_form.rb",
175
+ "examples/generated/drupal_mysql/cache_menu.rb",
176
+ "examples/generated/drupal_mysql/cache_page.rb",
177
+ "examples/generated/drupal_mysql/cache_update.rb",
178
+ "examples/generated/drupal_mysql/comment.rb",
179
+ "examples/generated/drupal_mysql/factories.rb",
180
+ "examples/generated/drupal_mysql/filter.rb",
181
+ "examples/generated/drupal_mysql/filter_format.rb",
182
+ "examples/generated/drupal_mysql/flood.rb",
183
+ "examples/generated/drupal_mysql/history.rb",
184
+ "examples/generated/drupal_mysql/menu_custom.rb",
185
+ "examples/generated/drupal_mysql/menu_link.rb",
186
+ "examples/generated/drupal_mysql/menu_router.rb",
187
+ "examples/generated/drupal_mysql/node.rb",
188
+ "examples/generated/drupal_mysql/node_access.rb",
189
+ "examples/generated/drupal_mysql/node_comment_statistic.rb",
190
+ "examples/generated/drupal_mysql/node_counter.rb",
191
+ "examples/generated/drupal_mysql/node_revision.rb",
192
+ "examples/generated/drupal_mysql/node_type.rb",
193
+ "examples/generated/drupal_mysql/permission.rb",
194
+ "examples/generated/drupal_mysql/role.rb",
195
+ "examples/generated/drupal_mysql/session.rb",
196
+ "examples/generated/drupal_mysql/system.rb",
197
+ "examples/generated/drupal_mysql/term_data.rb",
198
+ "examples/generated/drupal_mysql/term_hierarchy.rb",
199
+ "examples/generated/drupal_mysql/term_node.rb",
200
+ "examples/generated/drupal_mysql/term_relation.rb",
201
+ "examples/generated/drupal_mysql/term_synonym.rb",
202
+ "examples/generated/drupal_mysql/uploaded_files.rb",
203
+ "examples/generated/drupal_mysql/url_alias.rb",
204
+ "examples/generated/drupal_mysql/user.rb",
205
+ "examples/generated/drupal_mysql/users_role.rb",
206
+ "examples/generated/drupal_mysql/variable.rb",
207
+ "examples/generated/drupal_mysql/vocabulary.rb",
208
+ "examples/generated/drupal_mysql/vocabulary_node_type.rb",
209
+ "examples/generated/drupal_mysql/watchdog.rb",
210
+ "examples/generated/j2ee_petstore_mysql/address.rb",
211
+ "examples/generated/j2ee_petstore_mysql/category.rb",
212
+ "examples/generated/j2ee_petstore_mysql/factories.rb",
213
+ "examples/generated/j2ee_petstore_mysql/id_gen.rb",
214
+ "examples/generated/j2ee_petstore_mysql/item.rb",
215
+ "examples/generated/j2ee_petstore_mysql/product.rb",
216
+ "examples/generated/j2ee_petstore_mysql/seller_contact_info.rb",
217
+ "examples/generated/j2ee_petstore_mysql/tag.rb",
218
+ "examples/generated/j2ee_petstore_mysql/tag_item.rb",
219
+ "examples/generated/j2ee_petstore_mysql/ziplocation.rb",
220
+ "examples/generated/j2ee_petstore_oracle/address.rb",
221
+ "examples/generated/j2ee_petstore_oracle/category.rb",
222
+ "examples/generated/j2ee_petstore_oracle/factories.rb",
223
+ "examples/generated/j2ee_petstore_oracle/id_gen.rb",
224
+ "examples/generated/j2ee_petstore_oracle/item.rb",
225
+ "examples/generated/j2ee_petstore_oracle/product.rb",
226
+ "examples/generated/j2ee_petstore_oracle/sellercontactinfo.rb",
227
+ "examples/generated/j2ee_petstore_oracle/tag.rb",
228
+ "examples/generated/j2ee_petstore_oracle/ziplocation.rb",
229
+ "examples/generated/j2ee_petstore_sqlite3/address.rb",
230
+ "examples/generated/j2ee_petstore_sqlite3/category.rb",
231
+ "examples/generated/j2ee_petstore_sqlite3/factories.rb",
232
+ "examples/generated/j2ee_petstore_sqlite3/id_gen.rb",
233
+ "examples/generated/j2ee_petstore_sqlite3/item.rb",
234
+ "examples/generated/j2ee_petstore_sqlite3/product.rb",
235
+ "examples/generated/j2ee_petstore_sqlite3/seller_contact_info.rb",
236
+ "examples/generated/j2ee_petstore_sqlite3/tag.rb",
237
+ "examples/generated/j2ee_petstore_sqlite3/tag_item.rb",
238
+ "examples/generated/j2ee_petstore_sqlite3/ziplocation.rb"
66
239
  ]
67
240
 
68
241
  if s.respond_to? :specification_version then
@@ -72,12 +245,15 @@ Gem::Specification.new do |s|
72
245
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
73
246
  s.add_development_dependency(%q<rspec>, [">= 0"])
74
247
  s.add_runtime_dependency(%q<activerecord>, [">= 0"])
248
+ s.add_runtime_dependency(%q<matthuhiggins-foreigner>, [">= 0.2.1"])
75
249
  else
76
250
  s.add_dependency(%q<rspec>, [">= 0"])
77
251
  s.add_dependency(%q<activerecord>, [">= 0"])
252
+ s.add_dependency(%q<matthuhiggins-foreigner>, [">= 0.2.1"])
78
253
  end
79
254
  else
80
255
  s.add_dependency(%q<rspec>, [">= 0"])
81
256
  s.add_dependency(%q<activerecord>, [">= 0"])
257
+ s.add_dependency(%q<matthuhiggins-foreigner>, [">= 0.2.1"])
82
258
  end
83
259
  end
@@ -0,0 +1,85 @@
1
+ require 'foreigner/connection_adapters/sql_2003'
2
+
3
+ module Foreigner
4
+ module ConnectionAdapters
5
+ module OracleEnhancedAdapter
6
+ include Foreigner::ConnectionAdapters::Sql2003
7
+
8
+ def foreign_keys(table_name)
9
+ (owner, table_name) = @connection.describe(table_name)
10
+
11
+ # RSI: changed select from all_constraints to user_constraints - much faster in large data dictionaries
12
+ fks = select_rows(<<-SQL, 'Foreign Keys')
13
+ select parent_c.table_name to_table, cc.column_name column_name, c.r_constraint_name name, c.delete_rule
14
+ from user_constraints c, user_constraints parent_c, user_cons_columns cc
15
+ where c.owner = '#{owner}'
16
+ and c.table_name = '#{table_name}'
17
+ and c.r_constraint_name = parent_c.constraint_name
18
+ and c.constraint_type = 'R'
19
+ and cc.owner = c.owner
20
+ and cc.constraint_name = c.constraint_name
21
+ SQL
22
+
23
+ fks.map do |row|
24
+ options = {:column => row[1], :name => row[2]}
25
+ if row[3] == 'CASCADE'
26
+ options[:dependent] = :delete
27
+ elsif $1 == 'SET NULL'
28
+ options[:dependent] = :nullify
29
+ end
30
+ ForeignKeyDefinition.new(table_name, row[0], options)
31
+ end
32
+ end
33
+
34
+ def foreign_keys_of(table_name)
35
+ (owner, table_name) = @connection.describe(table_name)
36
+
37
+ # RSI: changed select from all_constraints to user_constraints - much faster in large data dictionaries
38
+ fks = select_rows(<<-SQL, 'Remote Foriegn Keys')
39
+ select c.table_name, cc.column_name, c.delete_rule
40
+ from user_constraints c, user_constraints parent_c, user_cons_columns cc
41
+ where c.owner = '#{owner}'
42
+ and parent_c.table_name = '#{table_name}'
43
+ and c.r_constraint_name = parent_c.constraint_name
44
+ and c.constraint_type = 'R'
45
+ and cc.owner = c.owner
46
+ and cc.constraint_name = c.constraint_name
47
+ SQL
48
+ fks.map do |row|
49
+ dependent = case row[2]
50
+ when 'CASCADE'
51
+ :destroy
52
+ when 'SET NULL'
53
+ :nullify
54
+ end
55
+ options = {:to_table => row[0].downcase, :foreign_key =>row[1].downcase.to_sym }
56
+ options[:dependent] = dependent unless dependent.nil?
57
+ options
58
+ end
59
+ end
60
+
61
+ def constraints(table_name)
62
+ (owner, table_name) = @connection.describe(table_name)
63
+
64
+ # RSI: changed select from all_constraints to user_constraints - much faster in large data dictionaries
65
+ fks = select_rows(<<-SQL, 'User Contraints')
66
+ select c.constraint_name, c.search_condition
67
+ from user_constraints c
68
+ where c.owner = '#{owner}'
69
+ and c.table_name = '#{table_name}'
70
+ and c.constraint_type = 'C'
71
+ and c.generated = 'USER NAME'
72
+ and c.status = 'ENABLED'
73
+ SQL
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ module ActiveRecord
80
+ module ConnectionAdapters
81
+ OracleEnhancedAdapter.class_eval do
82
+ include Foreigner::ConnectionAdapters::OracleEnhancedAdapter
83
+ end
84
+ end
85
+ end