sábado, 20 de noviembre de 2010

Modificación de yUMLmeRails de Nelson Silva

yUMLmeRails es un plugin de Nelson Silva para extraer la información de los modelos y generar el modelo UML usando RailRoad o mediante la web http://yuml.me

El caso es que tengo demasiados modelos para plasmarlo en una única imagen y quería seccionarlo en varias. La modificación permite seleccionar los modelos sobre los que realizar el diagrama.

Para lograrlo, he añadido parámetros al generador de diagramas y he añadido una tarea rake que acepta como argumentos los modelos que tomará como base.

Los cambios son los siguientes:

Fichero 'lib/railroad/yUMLmeRails.rb'
línea #13:

define generate_diagram(additional_options={})

añadido desde línea #35, tras OpenStruct.new():

only=additional_options[:only].split('//').map{|fn| fn.include?('.rb') ? fn : "app/models/#{fn}.rb" }
puts "Generating for models: " + only.join(',')
options.only=only

---------------------
Fichero 'lib/rails_road/'
Sustituir en los métodos load_classes y generate las líneas:

files = Dir.glob("app/models/**/*.rb")
files += Dir.glob("vendor/plugins/**/app/models/*.rb") if @options.plugins_models
files -= @options.exclude

por

if @options.only && @options.only.size>0
files = @options.only
else
files = Dir.glob("app/models/**/*.rb")
files += Dir.glob("vendor/plugins/**/app/models/*.rb") if @options.plugins_models
files -= @options.exclude
end


---------------------
Fichero 'lib/tasks/yUMLmeRails.rake'
añadido:

desc "Get yUML URL for only models"
task :url_only, :only, :needs => :environment do |t, args|
args.with_default(:only => [])
puts YUMLME_URL << only =""> args[:only])
end

---------------------

Además, he añadido un controlador para generar desde el navegador:
Fichero añadido: 'app/controllers/yuml_controller.rb'

class YumlController < models="Dir.glob(">b}
end
def show_model
@models=params[:models].map{|x| File.basename(x).chomp('.rb')}
@models||=[]
@address=YUMLmeRails.generate_diagram({:only => @models})
@url="http://yuml.me/diagram/scruffy/class/#{CGI.escape(@address)}"
end
private
def extract_class_name(filename)
File.basename(filename).chomp(".rb").camelize
end
end

------------------------------
Fichero 'app/views/yuml/index.html.erb'

Models


<%form_tag :action => 'show_model' do -%>

    <%@models.each do |m|%>

  • <%=check_box_tag 'models[]', m%><%=h(m)%>

    <%end%>

<%=submit_tag 'Ver'%>
<%end%>

------------------------------------------
Fichero 'app/views/yuml/show_model.html.erb'

Modelo UML


Modelos:



    <%@models.each do |m|%>
  • <%=h m%>

  • <%end%>

URL en yuml.com:


<%=@address%>


IMAGEN DEL MODELO


<image src="<%=@url%>" />

-------------------------------
Para usar con rake: rake yUMLmeRails:url_only[model1//model2//...]
Para usar con rake y ruta: rake yUMLmeRails:url_only[app/models/model1.rb//...]
-------------------------------
Ejemplo del modelo completo con rake yUMLmeRails:url

Ejemplo del modelo usando rake yUMLmeRails:url_only[alumno]
 
javascript:void(0)