trimodel 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/generators/trimodel/delete_generator.rb +54 -0
- data/lib/generators/trimodel/new_generator.rb +120 -0
- data/lib/trimodel/engine.rb +6 -0
- data/trimodel.rb +3 -0
- metadata +8 -5
- data/lib/trimodel.rb +0 -3
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module Trimodel
|
4
|
+
class DeleteGenerator < Rails::Generators::Base
|
5
|
+
desc "Delete an existing triple model relationship"
|
6
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
7
|
+
|
8
|
+
class_option :models, :type => :array, :desc => "The model triplet from where the association will be removed"
|
9
|
+
|
10
|
+
def check_parameters
|
11
|
+
if options[:models].class == NilClass
|
12
|
+
puts "error: You need to give the models you want to associate"
|
13
|
+
puts "e.g. rails g trimodel:new --models a b c"
|
14
|
+
elsif options[:models].size != 3
|
15
|
+
puts "error: Wrong number of models, they should be 3"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def rollback_migrations
|
20
|
+
list_and_perform_on_files options[:models][0], options[:models][1] { |f,a,b| rollback_migration(f,a,b) }
|
21
|
+
list_and_perform_on_files options[:models][1], options[:models][2] { |f,a,b| rollback_migration(f,a,b) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete_migration_files
|
25
|
+
list_and_perform_on_files options[:models][0], options[:models][1] { |f,a,b| delete_migration_file(f,a,b) }
|
26
|
+
list_and_perform_on_files options[:models][1], options[:models][2] { |f,a,b| delete_migration_file(f,a,b) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete_trimodel_file
|
30
|
+
File.delete(Rails.root + "config/initializers/trimodel.rb")
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def list_and_perform_on_files model_a, model_b
|
35
|
+
migration_files = Dir.entries(Rails.root + "db/migrate")
|
36
|
+
for file in migration_files
|
37
|
+
yield(file, model_a, model_b)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete_migration_file file, model_a, model_b
|
42
|
+
if /_create_#{model_a.pluralize.downcase}_#{model_b.pluralize.downcase}_trimodel/ =~ file
|
43
|
+
full_path = Rails.root.to_s + "/db/migrate/" + file
|
44
|
+
File.delete(full_path)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def rollback_migration file, model_a, model_b
|
49
|
+
if /_create_#{model_a.pluralize.downcase}_#{model_b.pluralize.downcase}_trimodel/ =~ file
|
50
|
+
%x[rake db:migrate:down VERSION=#{file[0,14]}]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
require 'rake'
|
4
|
+
|
5
|
+
module Trimodel
|
6
|
+
class NewGenerator < Rails::Generators::Base
|
7
|
+
desc "Creates a new triple model relationship"
|
8
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
9
|
+
|
10
|
+
class_option :models, :type => :array, :desc => "The triplet model that will be associated"
|
11
|
+
|
12
|
+
def check_parameters
|
13
|
+
if options[:models].class == NilClass
|
14
|
+
puts "error: You need to give the models you want to associate"
|
15
|
+
puts "e.g. rails g trimodel:new --models a b c"
|
16
|
+
elsif options[:models].size != 3
|
17
|
+
puts "error: Wrong number of models, they should be 3"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_migration_files
|
22
|
+
create_migration_file options[:models][0], options[:models][1]
|
23
|
+
#need to wait so the timestamp has a different value
|
24
|
+
#and forms a correct migration file name
|
25
|
+
sleep(1)
|
26
|
+
create_migration_file options[:models][1], options[:models][2]
|
27
|
+
end
|
28
|
+
|
29
|
+
def perform_migrations
|
30
|
+
%x[rake db:migrate]
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_trimodel_file
|
34
|
+
File.open(Rails.root + "config/initializers/trimodel.rb",
|
35
|
+
File::CREAT|File::RDWR) do |f|
|
36
|
+
add_one_asoc_to_model f, options[:models][0], options[:models][1], options[:models][2]
|
37
|
+
add_two_asocs_to_model f, options[:models][1], options[:models][0], options[:models][2]
|
38
|
+
add_one_asoc_to_model f, options[:models][2], options[:models][1], options[:models][0]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def add_one_asoc_to_model file, model_a, model_b, model_c
|
44
|
+
file.write(create_class_definition(model_a))
|
45
|
+
file.write(add_n_to_n_association(model_a, model_b))
|
46
|
+
file.write(add_iterator_method(model_b, model_c))
|
47
|
+
file.write(add_end)
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_two_asocs_to_model file, model_a, model_b, model_c
|
51
|
+
file.write(create_class_definition(model_a))
|
52
|
+
file.write(add_n_to_n_association(model_a, model_b))
|
53
|
+
file.write(add_n_to_n_association(model_a, model_c))
|
54
|
+
file.write(add_end)
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_class_definition model
|
58
|
+
"class #{model} < ActiveRecord::Base\n"
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_n_to_n_association model_a, model_b
|
62
|
+
" has_and_belongs_to_many :#{model_b.pluralize.downcase}\n"
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_iterator_method bridge_model, target_model
|
66
|
+
method_body=<<-eos
|
67
|
+
|
68
|
+
def #{target_model.pluralize.downcase}
|
69
|
+
records = []
|
70
|
+
self.#{bridge_model.pluralize.downcase}.each do |bm|
|
71
|
+
records << bm.#{target_model.pluralize.downcase}.map { |obj| obj }
|
72
|
+
end
|
73
|
+
records.flatten
|
74
|
+
end
|
75
|
+
eos
|
76
|
+
method_body
|
77
|
+
end
|
78
|
+
|
79
|
+
def add_end
|
80
|
+
"end\n\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_migration_file model_a, model_b
|
84
|
+
path = Rails.root.to_s
|
85
|
+
path << "/db/migrate/#{create_timestamp}_"
|
86
|
+
path << "create_#{model_a.pluralize.downcase}_"
|
87
|
+
path << "#{model_b.pluralize.downcase}_trimodel_join_table.rb"
|
88
|
+
File.open(path,File::CREAT|File::RDWR) do |fi|
|
89
|
+
fi.write(write_migration_code(model_a, model_b))
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_timestamp
|
94
|
+
Time.now.utc.to_s.gsub('-','').gsub(':','').gsub(' ','')[0..-4]
|
95
|
+
end
|
96
|
+
|
97
|
+
def write_migration_code model_a, model_b
|
98
|
+
if (model_a.pluralize.downcase[0] < model_b.pluralize.downcase)
|
99
|
+
first, second = model_a.pluralize.downcase, model_b.pluralize.downcase
|
100
|
+
else
|
101
|
+
first, second = model_b.pluralize.downcase, model_a.pluralize.downcase
|
102
|
+
end
|
103
|
+
code=<<-eos
|
104
|
+
class Create#{model_a.pluralize}#{model_b.pluralize}TrimodelJoinTable < ActiveRecord::Migration
|
105
|
+
def self.up
|
106
|
+
create_table :#{first}_#{second}, :id => false do |t|
|
107
|
+
t.integer :#{model_a.downcase}_id
|
108
|
+
t.integer :#{model_b.downcase}_id
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.down
|
113
|
+
drop_table :#{first}_#{second}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
eos
|
117
|
+
code
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/trimodel.rb
ADDED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trimodel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
|
-
- Angelos
|
8
|
+
- Angelos Kapsimanis
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-18 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! " A gem that enables transparent relationships \n between
|
15
15
|
2 models associated through a third one.\n"
|
@@ -18,7 +18,10 @@ executables: []
|
|
18
18
|
extensions: []
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
|
-
-
|
21
|
+
- trimodel.rb
|
22
|
+
- lib/trimodel/engine.rb
|
23
|
+
- lib/generators/trimodel/new_generator.rb
|
24
|
+
- lib/generators/trimodel/delete_generator.rb
|
22
25
|
homepage: https://github.com/akxs14/trimodel
|
23
26
|
licenses: []
|
24
27
|
post_install_message:
|
@@ -39,7 +42,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
39
42
|
version: '0'
|
40
43
|
requirements: []
|
41
44
|
rubyforge_project:
|
42
|
-
rubygems_version: 1.8.
|
45
|
+
rubygems_version: 1.8.25
|
43
46
|
signing_key:
|
44
47
|
specification_version: 3
|
45
48
|
summary: A negotiator between 3 models
|
data/lib/trimodel.rb
DELETED