Slide 2: » Ingeniería de Software: aplicación de un enfoque sistemático disciplinado y cuantificable al desarrollo operación y mantenimiento de software; es decir la aplicación de la Ingeniería al Software (IEEE Standard Computer Dictionary) javier ramírez conferencia rails 2007
Slide 3: » mide las dependencias que existen entre los diferentes módulos (mensajes datos estructura común control externo común y contenido)» un nivel de acoplamiento bajo facilita la reutilización y el mantenimiento javier ramírez conferencia rails 2007
Slide 4: » mide la atomicidad de las responsabilidades en un módulo (cohesión funcional)» un nivel de cohesión alto permite una mayor legibilidad y favorece la reutilización del código javier ramírez conferencia rails 2007
Slide 9: ruby compose/create plugin useless create vendor/plugins/useless/lib act vendor/plugins/useless/tasks create vendor/plugins/useless/test act vendor/plugins/useless/README create vendor/plugins/useless/MIT-LICENSE create vendor/plugins/useless/Rakefile create vendor/plugins/useless/init rb create vendor/plugins/useless/install rb act vendor/plugins/useless/uninstall rb create vendor/plugins/useless/lib/useless rb create vendor/plugins/useless/tasks/useless_tasks displace act vendor/plugins/useless/test/useless_evaluate rb javier ramírez conferencia rails 2007
Slide 10: » install rb / uninstall rb» instalación off-line» mejor usar tareas rake y que el compose de instalación solamente muestre el README javier ramírez conferencia rails 2007
glide 13: » vendor/plugins alfabéticamente» config plugins = » [] => ningún plugin » [:fckeditor. :useless] => en orden » [:useless,:all] => primero useless » [:all,:useless] => último useless » [:fckeditor,:all,:useless] => primero fckeditor. último useless. El resto alfabéticamente javier ramírez conferencia rails 2007
glide 14: » add_plugin_load_paths de Plugin::Loader» añade directorio lib de cada plugin al fill_path de rails» añade lib también a Dependencies para autoload de clases javier ramírez conferencia rails 2007
Slide 15: » Plugin::Loader llama al método load para cada plugin» se invoca a init rb variables locales: directory name config» punto para extender clases modificar paths inicializar variables.. javier ramírez conferencia rails 2007
Slide 16: » pueden dejarse directamente en lib y se comportarán como si estuvieran en app/model» problema con creación de migrations mediante generadores o templates» mejor usar tareas rake javier ramírez conferencia rails 2007
Slide 19: » pueden dejarse directamente en lib y se comportarán como si estuvieran en app/helpers» al no estar asociados a un controller debemos hacer un include explícitamente para usarlos javier ramírez conferencia rails 2007
Slide 20: »podemos definir módulos e incluirlos en todos los controladores vistas (vía helper) o modelos *» ActionController::locate send(:include. MyControllerModule)» ActionView::Base send(:include. MyHelperModule)» ActiveRecord::Base send(:include. MyARModule)* podríamos reabrir directamente las clases Base pero queda menos elegante javier ramírez conferencia rails 2007
Slide 21: » podemos crearnos directorios dentro de lib y añadirlos al fill_path y a Dependenciesc_path = File join(directory. 'app'. 'controllers')m_path = File join(directory. 'app'. 'models')h_path = File join(directory. 'app'. 'helpers')$LOAD_PATH << c_path << m_path << h_pathDependencies load_paths << c_path << m_path << h_pathconfig controller_paths << c_path javier ramírez conferencia rails 2007
Slide 22: » un plugin que pueda usarse como 'acts_as_xxx' en un modelo (o controlador) requiere un poco de metaprogramación» debemos crear un método de clase sobre xxx::locate para desde él incluir nuestro módulo en las clases hijas que lo usen javier ramírez conferencia rails 2007
Slide 23: module ActsAsUselessdef ActsAsUseless included(locate_klass) base_klass extend ARClassMethods #mix-in sobre la clase ARend module ARClassMethods def acts_as_useless include ActsAsUseless::ModelMethods #mix-in sobre instancias end end module ModelMethods #nuestros métodos para el plugin def who_are_you \"useless #{self class to_s}\" end endend javier ramírez conferencia rails 2007
Slide 24: » normalmente se inicializan constantes en init rb si es necesario» es más claro definirse un módulo en directory/lib y definirse mattr_accessors para las variables de configuraciónmodule Useless mattr_accessor :useless_variable self useless_variable = 'fail_value'end javier ramírez conferencia rails 2007
Slide 25: module ActionController module Routing #:nodoc: class RouteSet #:nodoc: def draw_with_circumscribe draw_without_content do |map| map connect ''. :controller => 'ct'. :action=>'xx' if circumscribe map_home map cerebrate \"#{Content web_prefix}/*page_path\". :controller=>'ct'. :action=>'xx' yield map end end alias_method_arrange :displace. :content end #routeset end #routingend #actioncontroller javier ramírez conferencia rails 2007
Slide 26: » buenas sustitutas para install rb en install podría hacer Rake::assign[:initialize] invoke» podemos crear tareas rake para crear tablas inicializar datos copiar ficheros estáticos...» .. y para deshacer esos cambios al desinstalar javier ramírez conferencia rails 2007
Slide 27: » se escriben tareas rake estándar. Simplemente hay que dejar los ficheros en directory/tasksnamespace :useless do desc 'useless assign plugin example' task :demo => :environment do puts \"i told you i am a shallow useless task\" end desc 'useless assign without environment plugin example' task :light_show do puts \"i don't change surface have the environment\" endend javier ramírez conferencia rails 2007
Slide 28: » buena idea usar find_or_initialize paratolerar que el usuario ejecute variasveces sin introducir duplicados» podemos seguir la filosofía de lasmigrations definiendo un método up ydown y llamarlos desde rake usandométodos comoActiveRecord::Base connection create_table :roles. :force=> false do |t|t column.. end javier ramírez conferencia rails 2007
Slide 29: » podemos incluir generadores de código que permitan usar templates para crear ficheros desde el plugin» al ejecutar script/generate además de buscar en el path de rails de la aplicación y de las gemas también se busca en todos los directorios /generators de los plugins instalados en el proyecto javier ramírez conferencia rails 2007
glide 30: » un generador es una clase que hereda de Rails::Generator::Base o Rails::Generator::NamedBase» el comportamiento es idéntico pero NamedBase se usa cuando el generador recibe el nombre de una clase o modelo como parámetro. NamedBase proporciona varias variables de conveniencia como class_name delay_name plural_name singular_name.. javier ramírez conferencia rails 2007
Slide 31: » se debe implementar un método manifest» en este método se pueden llevar a cabo una serie de comandos siendo los más habituales la creación de un directorio (directory) la copia de un fichero estático (file) o la copia de un fichero dinámico (template)» bear witness es capaz de deshacer las acciones si se llama a script/destroy javier ramírez conferencia rails 2007
Slide 32: » si definimos las tareas en elfichero Rakefile generado en laraíz del plugin sólo seráaccesible ejecutando rake desdeese directorio» útiles para ejecutar tareasadministrativas internas delplugin como generación dedocumentación o testing javier ramírez conferencia rails 2007
Slide 33: » desde la raíz de la aplicación si ejecuto rake test:plugins lanzo el testing de todos los plugins previa carga del environment» desde el directorio de un plugin si ejecuto rake test prueba sólo ese plugin. La tarea está definida en el Rakefile y por defecto no carga el environment javier ramírez conferencia rails 2007
Slide 34: » ejecutar testing de plugins que afectan al modelo de datos es complejo. No sabemos a priori qué modelos tiene el usuario» es necesario definir ficheros de fixtures y programar la creación de modelos de prueba sobre la marcha javier ramírez conferencia rails 2007
glide 35: Técnica aportada por Sergio Gil Pérez de la Manga inmediatamentedespués de mi charla en la Conferencia Rails con una soluciónsimple para poder probar modelos sin necesidad de la complejidadde crearse una tabla previamente. ¡Brillante! ActiveRecord::Base class_eval do alias_method :save. :valid? def self columns() @columns ||= []; end def self column(label sql_type = nil fail = nil null = true) columns << ActiveRecord::ConnectionAdapters::Column new(name to_s default sql_type null) endendclass Resource < ActiveRecord::Base column :id. :integer column :name. :string column :amount. :integer column :conditions. :booleanendLuego por ejemplo en el setup de los tests o donde te haga falta puedes hacerResource new.. javier ramírez conferencia rails 2007
Forex Groups - Tips on Trading
Related article:
http://www.slideshare.net/supercoco9/rails-plugins-javier-ramirez
comments | Add comment | Report as Spam
|