geert 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
data/geert.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{geert}
8
- s.version = "0.0.2"
8
+ s.version = "0.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Iain Hecker"]
@@ -4,7 +4,7 @@ module Geert
4
4
 
5
5
 
6
6
  def migration
7
- "add_foreign_key :#{source}, :#{target}, #{options_string}" unless exclude?
7
+ ":#{source}, :#{target}#{options_string}" unless exclude?
8
8
  end
9
9
 
10
10
  def polymorphic?
@@ -15,13 +15,18 @@ module Geert
15
15
  reflection.primary_key_name
16
16
  end
17
17
 
18
- private
18
+ def target
19
+ reflection.table_name
20
+ end
19
21
 
20
22
  def exclude?
21
23
  existing? or polymorphic? or uses_polymorphic?
22
24
  end
23
25
 
26
+ private
27
+
24
28
  def existing?
29
+ require "foreigner"
25
30
  ActiveRecord::Base.connection.foreign_keys(source).any? do |fk|
26
31
  fk.options[:column].to_s == column.to_s
27
32
  end
@@ -35,16 +40,16 @@ module Geert
35
40
  model.table_name
36
41
  end
37
42
 
38
- def target
39
- reflection.table_name
43
+ def options
44
+ { :column => column_option, :dependent => dependency_type }.reject { |key, value| value.nil? }
40
45
  end
41
46
 
42
- def options
43
- {:column => column}.merge(dependency || {})
47
+ def column_option
48
+ column if column != "#{target.singularize}_id"
44
49
  end
45
50
 
46
51
  def dependency
47
- { :dependent => dependency_type } if dependency_type
52
+ { :dependent => dependency_type }
48
53
  end
49
54
 
50
55
  def dependency_type
@@ -60,12 +65,38 @@ module Geert
60
65
  end
61
66
 
62
67
  def dependency_option
63
- reflection.options[:dependent]
68
+ opposite_relation.options[:dependent] if opposite_relation
69
+ end
70
+
71
+ def opposite_relation
72
+ opposite_associations.find do |association|
73
+ association.table_name == source && association.primary_key_name == column
74
+ end
75
+ end
76
+
77
+ def opposite_associations
78
+ [:has_many, :has_one].map { |type| target_model.reflect_on_all_associations(type) }.flatten
79
+ end
80
+
81
+ def target_model
82
+ target.singularize.camelize.constantize
64
83
  end
65
84
 
66
- # Just to make it pretty, remove the curly braces
67
85
  def options_string
68
- options.inspect.gsub(/\A\{(.*)\}\z/, '\\1')
86
+ options.empty? ? "" : ", " + space + pretty_options
87
+ end
88
+
89
+ def space
90
+ " " * (longest_target_size - target.size)
91
+ end
92
+
93
+ def longest_target_size
94
+ @longest_target_size ||= model.associations.map { |association| association.target.size }.sort.last.to_i
95
+ end
96
+
97
+ # Just to make it pretty, remove the curly braces, and add some spaces
98
+ def pretty_options
99
+ options.inspect.gsub(/\A\{(.*)\}\z/, '\\1').gsub("=>", " => ")
69
100
  end
70
101
 
71
102
  attr_reader :reflection, :model
data/lib/geert/model.rb CHANGED
@@ -13,7 +13,7 @@ module Geert
13
13
  end
14
14
 
15
15
  def migration
16
- associations.map(&:migration).compact.join("\n") if usable?
16
+ associations.map(&:migration).compact.sort.join("\n") if usable?
17
17
  end
18
18
 
19
19
  def associations
data/lib/geert/project.rb CHANGED
@@ -10,7 +10,33 @@ module Geert
10
10
  end
11
11
 
12
12
  def migration
13
- models.map(&:migration).select(&:present?).join("\n\n")
13
+ <<-MIGRATION
14
+ class AddMissingForeignKeys < ActiveRecord::Migration
15
+ def self.up
16
+ #{migration_up}
17
+ end
18
+
19
+ def self.down
20
+ #{migration_down}
21
+ end
22
+ end
23
+ MIGRATION
24
+ end
25
+
26
+ def migration_up
27
+ migration_lines.map(&modify_line("add"))
28
+ end
29
+
30
+ def migration_down
31
+ migration_lines.split("\n").reverse.join("\n").map(&modify_line("remove"))
32
+ end
33
+
34
+ def migration_lines
35
+ @migration_lines ||= models.map(&:migration).select(&:present?).join("\n\n")
36
+ end
37
+
38
+ def modify_line(command)
39
+ lambda { |line| line.present? ? " #{command}_foreign_key #{line}" : "\n" }
14
40
  end
15
41
 
16
42
  private
data/lib/geert.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/geert/project'
2
2
  require File.dirname(__FILE__) + '/geert/model'
3
3
  require File.dirname(__FILE__) + '/geert/association'
4
- require "foreigner"
5
4
 
6
5
  module Geert
7
6
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iain Hecker