Skip to content

Commit

Permalink
Fix index method for association_builder.
Browse files Browse the repository at this point in the history
  • Loading branch information
raghubetina committed Jul 19, 2012
1 parent fac8f89 commit dff876d
Show file tree
Hide file tree
Showing 115 changed files with 184 additions and 2,319 deletions.
6 changes: 4 additions & 2 deletions app
Expand Up @@ -10,6 +10,7 @@ app_name = ARGV[0] ? ARGV[0].downcase.gsub('_', '') : "myapp"
layout_name = ARGV[1] || "fixed"

puts "Creating #{app_name} app."
`rm -rf #{app_name}`
`rails new #{app_name}`

g = GemfileModifier.new(app_name)
Expand Down Expand Up @@ -40,5 +41,6 @@ l.fix_misc

a = AssociationBuilder.new(app_name)
a.build_associations

Dir.chdir(app_name) { `rails s` }
a.fix_index
a.fix_show
# Dir.chdir(app_name) { `rails s` }
169 changes: 104 additions & 65 deletions association_builder.rb
@@ -1,79 +1,118 @@
require 'active_support/inflector'
require './modeler/domain_modeler'
require 'csv'

class AssociationBuilder
def initialize(app_name = "MyApp")
@app_name = app_name
end

def association_line(model, relationship)
symbols = model.send(relationship)
" #{relationship} #{symbols.map { |x| ":#{x}" }.join(', ')}" if symbols.any?
end

def writelines(filename, lines)
IO.write(filename, lines.join("\n"))
end

def build_associations
puts "Building associations."
CSV.foreach("models.csv") do |row|
model = row.shift
models = DomainModeler.new('models.csv')
models.each do |model|
model_file = IO.readlines(model.class_path(@app_name))
[:belongs_to, :has_many].each do |assoc|
model_file.insert(1, association_line(model, assoc))
end
puts model_file.compact
writelines(model.class_path(@app_name), model_file.compact)
end
end

def fix_index
puts "Fixing associated index templates."

row.compact.each do |column|
parsed = column.split(':').first.split('_')
ending = parsed.last
if ending == "id"
foreign_key = parsed.first
puts "Foreign key #{foreign_key} detected in #{model}."

puts "Adding belongs_to to #{model}."
model_file = IO.readlines("#{@app_name}/app/models/#{model.downcase}.rb")
model_file.insert(1, " belongs_to :#{foreign_key}")

f = File.new("#{@app_name}/app/models/#{model.downcase}.rb", 'w')
model_file.each { |line| f.puts line }
f.close

#TODO: Clean this up a lot. All CSV parsing needs to be done with headers.
descriptor = ""
CSV.foreach("models.csv") do |test_model_row|
test_model = test_model_row.shift.downcase
if test_model == foreign_key
descriptor = test_model_row.first.split(':').first
end
end

puts "Using #{descriptor} as descriptor for #{foreign_key.capitalize}."

puts "Fixing #{model} show template."

#TODO: Reading and/or writing need to be refactored into method.
model_show = IO.readlines("#{@app_name}/app/views/#{model.pluralize.downcase}/show.html.erb")
foreign_key_label_pos = model_show.map(&:strip).index("<dd><%= @#{model.downcase}.#{foreign_key}_id %></dd>")
model_show[foreign_key_label_pos] = " <dd><%= @#{model.downcase}.#{foreign_key} ? @#{model.downcase}.#{foreign_key}.#{descriptor} : nil %></dd>"
f = File.new("#{@app_name}/app/views/#{model.pluralize.downcase}/show.html.erb", 'w')
model_show.each { |line| f.puts line }
f.close

puts "Fixing #{model} index template."

model_index = IO.readlines("#{@app_name}/app/views/#{model.pluralize.downcase}/index.html.erb")
foreign_key_td_pos = model_index.map(&:strip).index("<td><%= #{model.downcase}.#{foreign_key}_id %></td>")
model_index[foreign_key_td_pos] = " <td><%= #{model.downcase}.#{foreign_key} ? #{model.downcase}.#{foreign_key}.#{descriptor} : nil %></td>"
f = File.new("#{@app_name}/app/views/#{model.pluralize.downcase}/index.html.erb", 'w')
model_index.each { |line| f.puts line }
f.close

puts "Fixing #{model} form."

model_form = IO.readlines("#{@app_name}/app/views/#{model.pluralize.downcase}/_form.html.erb")
foreign_key_field_pos = model_form.map(&:strip).index("<%= f.number_field :#{foreign_key}_id, :class => 'number_field' %>")
model_form[foreign_key_field_pos] = " <%= f.collection_select :#{foreign_key}_id, #{foreign_key.capitalize}.all, :id, :#{descriptor} %>"
f = File.new("#{@app_name}/app/views/#{model.pluralize.downcase}/_form.html.erb", 'w')
model_form.each { |line| f.puts line }
f.close

puts "Adding has_many to #{foreign_key.capitalize}."
model_file = IO.readlines("#{@app_name}/app/models/#{foreign_key}.rb")
model_file.insert(1, " has_many :#{model.pluralize.downcase}")

f = File.new("#{@app_name}/app/models/#{foreign_key}.rb", 'w')
model_file.each { |line| f.puts line }
f.close
end
models = DomainModeler.new('models.csv')
models.each do |model|
model_index = IO.readlines(model.index_path(@app_name))
model.belongs_to.each do |bt|
descriptor = models[bt].columns.first.name

bt_pos = model_index.map(&:strip).index("<td><%= #{model.name.downcase}.#{bt}_id %></td>")
model_index[bt_pos] = " <td><%= #{model.name.downcase}.#{bt}.#{descriptor} if #{model.name.downcase}.#{bt} %></td>"
end
writelines(model.index_path(@app_name), model_index.compact)
end
end
end
#
# CSV.foreach("models.csv") do |row|
# model = row.shift
#
# row.compact.each do |column|
# parsed = column.split(':').first.split('_')
# ending = parsed.last
# if ending == "id"
# foreign_key = parsed.first
# puts "Foreign key #{foreign_key} detected in #{model}."
#
# puts "Adding belongs_to to #{model}."
# model_file = IO.readlines("#{@app_name}/app/models/#{model.downcase}.rb")
# model_file.insert(1, " belongs_to :#{foreign_key}")
#
# f = File.new("#{@app_name}/app/models/#{model.downcase}.rb", 'w')
# model_file.each { |line| f.puts line }
# f.close
#
# #TODO: Clean this up a lot. All CSV parsing needs to be done with headers.
# descriptor = ""
# CSV.foreach("models.csv") do |test_model_row|
# test_model = test_model_row.shift.downcase
# if test_model == foreign_key
# descriptor = test_model_row.first.split(':').first
# end
# end
#
# puts "Using #{descriptor} as descriptor for #{foreign_key.capitalize}."
#
# puts "Fixing #{model} show template."
#
# #TODO: Reading and/or writing need to be refactored into method.
# model_show = IO.readlines("#{@app_name}/app/views/#{model.pluralize.downcase}/show.html.erb")
# foreign_key_label_pos = model_show.map(&:strip).index("<dd><%= @#{model.downcase}.#{foreign_key}_id %></dd>")
# model_show[foreign_key_label_pos] = " <dd><%= @#{model.downcase}.#{foreign_key} ? @#{model.downcase}.#{foreign_key}.#{descriptor} : nil %></dd>"
# f = File.new("#{@app_name}/app/views/#{model.pluralize.downcase}/show.html.erb", 'w')
# model_show.each { |line| f.puts line }
# f.close
#
# puts "Fixing #{model} index template."
#
# model_index = IO.readlines("#{@app_name}/app/views/#{model.pluralize.downcase}/index.html.erb")
# foreign_key_td_pos = model_index.map(&:strip).index("<td><%= #{model.downcase}.#{foreign_key}_id %></td>")
# model_index[foreign_key_td_pos] = " <td><%= #{model.downcase}.#{foreign_key} ? #{model.downcase}.#{foreign_key}.#{descriptor} : nil %></td>"
# f = File.new("#{@app_name}/app/views/#{model.pluralize.downcase}/index.html.erb", 'w')
# model_index.each { |line| f.puts line }
# f.close
#
# puts "Fixing #{model} form."
#
# model_form = IO.readlines("#{@app_name}/app/views/#{model.pluralize.downcase}/_form.html.erb")
# foreign_key_field_pos = model_form.map(&:strip).index("<%= f.number_field :#{foreign_key}_id, :class => 'number_field' %>")
# model_form[foreign_key_field_pos] = " <%= f.collection_select :#{foreign_key}_id, #{foreign_key.capitalize}.all, :id, :#{descriptor} %>"
# f = File.new("#{@app_name}/app/views/#{model.pluralize.downcase}/_form.html.erb", 'w')
# model_form.each { |line| f.puts line }
# f.close
#
# puts "Adding has_many to #{foreign_key.capitalize}."
# model_file = IO.readlines("#{@app_name}/app/models/#{foreign_key}.rb")
# model_file.insert(1, " has_many :#{model.pluralize.downcase}")
#
# f = File.new("#{@app_name}/app/models/#{foreign_key}.rb", 'w')
# model_file.each { |line| f.puts line }
# f.close
# end
# end
# end
# end
end

AssociationBuilder.new("hockey").fix_index
15 changes: 0 additions & 15 deletions hockey/.gitignore

This file was deleted.

49 changes: 0 additions & 49 deletions hockey/Gemfile

This file was deleted.

0 comments on commit dff876d

Please sign in to comment.