SlideShare una empresa de Scribd logo
1 de 37
Descargar para leer sin conexión
desarrollo de plug-ins con rails
                                                                      jramirez@aspgems.com
                                                      conferencia rails 2007. 23 de Noviembre,Madrid

obra publicada por javier ramirez como ‘Atribución-No Comercial-Licenciar Igual 2.5’ de Creative Commons
» 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
» 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
» 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
» crear módulos que hagan
 una única cosa y que sean
 tan independientes como sea
 posible




                   javier ramírez. conferencia rails 2007
» trabajar lo menos posible

» para disimular podemos usar
 conceptos como DRY o less is
 more ;)



                     javier ramírez. conferencia rails 2007
» cuando vamos a copiarpegar
 un fragmento de código
 relevante de un proyecto a
 otro

» extraer, no anticipar. Más
 práctico, más usable, menos
 trabajo
                    javier ramírez. conferencia rails 2007
» módulos completamente
 separados de mi aplicación
 que realizan una única tarea

» mecanismo de compartición
 simple

» también para uso interno
                     javier ramírez. conferencia rails 2007
ruby script/generate plugin useless
  create vendor/plugins/useless/lib
  create vendor/plugins/useless/tasks
  create vendor/plugins/useless/test
  create 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
  create vendor/plugins/useless/uninstall.rb
  create vendor/plugins/useless/lib/useless.rb
  create vendor/plugins/useless/tasks/useless_tasks.rake
  create vendor/plugins/useless/test/useless_test.rb
                                               javier ramírez. conferencia rails 2007
» install.rb / uninstall.rb

» instalación off-line

» mejor usar tareas rake y que
 el script de instalación
 solamente muestre el README

                         javier ramírez. conferencia rails 2007
» selección de plugins y su orden

» modificación del load_path

» inicialización del plugin



                         javier ramírez. conferencia rails 2007
» config.plugins_path
 ([quot;#{root_path}/vendor/pluginsquot;])


» config.plugin_locator
 (Plugin::FileSystemLocator < Plugin::Locator)



» config.plugin_loader
 (Plugin::Loader)


                                       javier ramírez. conferencia rails 2007
» 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
» add_plugin_load_paths de
 Plugin::Loader

» añade directorio lib de cada
 plugin al load_path de rails

» añade lib también a
 Dependencies para autoload de
 clases                javier ramírez. conferencia rails 2007
» 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
» 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
» pueden dejarse directamente
 en lib, pero necesitamos añadir
 la ruta a config.controller_paths

» config.controller_paths << directory




                            javier ramírez. conferencia rails 2007
» controller.template_root        (pre rails 2)



» controller.view_paths

»controller.prepend_view_path

»controller.append_view_path

                      javier ramírez. conferencia rails 2007
» 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
»podemos definir módulos e
 incluirlos en todos los
 controladores, vistas (vía
 helper) o modelos *

» ActionController::Base.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
» podemos crearnos directorios
 dentro de lib y añadirlos al
 load_path y a Dependencies
c_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_path
Dependencies.load_paths << c_path << m_path << h_path
config.controller_paths << c_path
                                             javier ramírez. conferencia rails 2007
» 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::Base para
 desde él incluir nuestro módulo
 en las clases hijas que lo usen
                      javier ramírez. conferencia rails 2007
module ActsAsUseless
def ActsAsUseless.included(base_klass)
 base_klass.extend ARClassMethods #mix-in sobre la clase AR
end

 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
    quot;useless #{self.class.to_s}quot;
  end
 end
end

                                            javier ramírez. conferencia rails 2007
» 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ón
module Useless
 mattr_accessor :useless_variable
 self.useless_variable = 'default_value'
end
                                           javier ramírez. conferencia rails 2007
module ActionController
 module Routing #:nodoc:
  class RouteSet #:nodoc:
    def draw_with_content
     draw_without_content do |map|
     map.connect '', :controller => 'ct', :action=>'xx' if Content.map_home
    map.connect
  quot;#{Content.web_prefix}/*page_pathquot;, :controller=>'ct', :action=>'xx'
      yield map
     end
    end
    alias_method_chain :draw, :content
  end #routeset
 end #routing
end #actioncontroller
                                                   javier ramírez. conferencia rails 2007
» buenas sustitutas para install.rb
 en install podría hacer Rake::Task[: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
» se escriben tareas rake estándar.
 Simplemente hay que dejar los ficheros
 en directory/tasks
namespace :useless do
   desc 'useless task. plugin example'
   task :demo => :environment do
      puts quot;i told you i am a shallow useless taskquot;
   end
   desc 'useless task without environment. plugin example'
   task :light_demo do
      puts quot;i don't even have the environmentquot;
   end
end
                                            javier ramírez. conferencia rails 2007
» buena idea usar find_or_initialize para
tolerar que el usuario ejecute varias
veces sin introducir duplicados

» podemos seguir la filosofía de las
migrations, definiendo un método up y
down y llamarlos desde rake usando
métodos como
ActiveRecord::Base.connection.create_table :roles, :force
=> false do |t|
t.column ...
end
                                        javier ramírez. conferencia rails 2007
» 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
» 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,
 table_name, plural_name,
 singular_name...
                           javier ramírez. conferencia rails 2007
» 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)

» manifest es capaz de deshacer las
 acciones si se llama a script/destroy
                              javier ramírez. conferencia rails 2007
» si definimos las tareas en el
fichero Rakefile generado en la
raíz del plugin, sólo será
accesible ejecutando rake desde
ese directorio

» útiles para ejecutar tareas
administrativas internas del
plugin, como generación de
documentación o testing
                        javier ramírez. conferencia rails 2007
» 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
» 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
Técnica aportada por Sergio Gil Pérez de la Manga, inmediatamente
después de mi charla en la Conferencia Rails, con una solución
simple para poder probar modelos sin necesidad de la complejidad
de crearse una tabla previamente. ¡Brillante!
 ActiveRecord::Base.class_eval do
     alias_method :save, :valid?
     def self.columns() @columns ||= []; end

      def self.column(name, sql_type = nil, default = nil, null = true)
      columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s,
                 default, sql_type, null)
      end
end

class Resource < ActiveRecord::Base
  column :id, :integer
  column :name, :string
  column :amount, :integer
  column :conditions, :boolean
end

Luego por ejemplo en el setup de los tests o donde te haga falta puedes hacer
Resource.new...                                        javier ramírez. conferencia rails 2007
javier ramírez. conferencia rails 2007
@
                                                                              .

                                                                                                        .
                                                                    .
                                         javier.ramirez.gomara@gmail.com
                                      http://formatinternet.wordpress.com

obra publicada por javier ramirez como ‘Atribución-No Comercial-Licenciar Igual 2.5’ de Creative Commons


                       Imágenes de las letras bajo licencia CC. Autor Leo Reynolds. Descargadas de Flickr

Más contenido relacionado

La actualidad más candente

Servlets y jsp
Servlets y jspServlets y jsp
Servlets y jspdtbadboy0
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaEudris Cabrera
 
Servlets exposicion
Servlets exposicionServlets exposicion
Servlets exposicionFlashnet S.A
 
Zen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHPZen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHPJuan Belón Pérez
 
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...JaenFrankcezco
 
Presentación de zan php
Presentación de zan phpPresentación de zan php
Presentación de zan phpCarlos Zantana
 
Servicios web
Servicios webServicios web
Servicios webitoomac02
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web javaCésar Ocampo
 
Manual programacion - java - jsp & xml
Manual   programacion - java - jsp & xmlManual   programacion - java - jsp & xml
Manual programacion - java - jsp & xmlgilhorak
 
STRUTS (MVC e Java)
STRUTS (MVC e Java)STRUTS (MVC e Java)
STRUTS (MVC e Java)ousli07
 
Jsp servlet- Tutorial BD Conexión
Jsp servlet- Tutorial BD ConexiónJsp servlet- Tutorial BD Conexión
Jsp servlet- Tutorial BD ConexiónPattzy Montero
 
Jsp(java server pages)
Jsp(java server pages)Jsp(java server pages)
Jsp(java server pages)diegob1098
 

La actualidad más candente (18)

Servicios web
Servicios webServicios web
Servicios web
 
Servlets y jsp
Servlets y jspServlets y jsp
Servlets y jsp
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en Java
 
Servlets exposicion
Servlets exposicionServlets exposicion
Servlets exposicion
 
Zen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHPZen Scaffolding - Programador PHP
Zen Scaffolding - Programador PHP
 
Curso Jsp
Curso JspCurso Jsp
Curso Jsp
 
Curso Java Avanzado 2 Servlets
Curso Java Avanzado   2 ServletsCurso Java Avanzado   2 Servlets
Curso Java Avanzado 2 Servlets
 
Curso Java Avanzado 3 Js Ps
Curso Java Avanzado   3 Js PsCurso Java Avanzado   3 Js Ps
Curso Java Avanzado 3 Js Ps
 
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
Introduccion, Instalacion, Configuracion e Implementacion Framework ZanPHP IT...
 
Presentación de zan php
Presentación de zan phpPresentación de zan php
Presentación de zan php
 
Servicios web
Servicios webServicios web
Servicios web
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web java
 
Primefaces
PrimefacesPrimefaces
Primefaces
 
Manual programacion - java - jsp & xml
Manual   programacion - java - jsp & xmlManual   programacion - java - jsp & xml
Manual programacion - java - jsp & xml
 
Apache Camel - Parte II
Apache Camel - Parte IIApache Camel - Parte II
Apache Camel - Parte II
 
STRUTS (MVC e Java)
STRUTS (MVC e Java)STRUTS (MVC e Java)
STRUTS (MVC e Java)
 
Jsp servlet- Tutorial BD Conexión
Jsp servlet- Tutorial BD ConexiónJsp servlet- Tutorial BD Conexión
Jsp servlet- Tutorial BD Conexión
 
Jsp(java server pages)
Jsp(java server pages)Jsp(java server pages)
Jsp(java server pages)
 

Similar a Desarrollo plug-ins Rails

Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsFreelancer
 
Framework kahana
Framework kahanaFramework kahana
Framework kahanaH31D1
 
Conferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y RailsConferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y RailsDavid Calavera
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Nelson Rojas Núñez
 
7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el diaFrancisco Aranda
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microserviciosPedro J. Molina
 
Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails IntroThirdWay
 
Pleased to meet you, Laravel
Pleased to meet you, LaravelPleased to meet you, Laravel
Pleased to meet you, LaravelRolando Caldas
 
Marchando sobre Rieles
Marchando sobre RielesMarchando sobre Rieles
Marchando sobre Rielescdechauri
 
Desarrollo Aplicaciones Zend Framework
Desarrollo Aplicaciones Zend FrameworkDesarrollo Aplicaciones Zend Framework
Desarrollo Aplicaciones Zend Frameworkricsoc
 
Presentación Ruby on Rails
Presentación Ruby on RailsPresentación Ruby on Rails
Presentación Ruby on RailsGiannis Morales
 
Ruby on the Rails
Ruby on the RailsRuby on the Rails
Ruby on the Rails000ari2014
 
♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente
♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente ♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente
♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente Manuel Vidaurre
 

Similar a Desarrollo plug-ins Rails (20)

Introducción a Kohana Framework
Introducción a Kohana FrameworkIntroducción a Kohana Framework
Introducción a Kohana Framework
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on Rails
 
Framework kahana
Framework kahanaFramework kahana
Framework kahana
 
Conferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y RailsConferencia Rails: Integracion Continua Y Rails
Conferencia Rails: Integracion Continua Y Rails
 
Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009Presentacion Ruby on Rails en Universidad Autónoma 2009
Presentacion Ruby on Rails en Universidad Autónoma 2009
 
7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia7 Gemas de Ruby on Rails que podrían salvarte el dia
7 Gemas de Ruby on Rails que podrían salvarte el dia
 
Framework
FrameworkFramework
Framework
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microservicios
 
Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails Intro
 
Rails intro
Rails introRails intro
Rails intro
 
Pleased to meet you, Laravel
Pleased to meet you, LaravelPleased to meet you, Laravel
Pleased to meet you, Laravel
 
Marchando sobre Rieles
Marchando sobre RielesMarchando sobre Rieles
Marchando sobre Rieles
 
Desarrollo Aplicaciones Zend Framework
Desarrollo Aplicaciones Zend FrameworkDesarrollo Aplicaciones Zend Framework
Desarrollo Aplicaciones Zend Framework
 
Framework
FrameworkFramework
Framework
 
Presentación Ruby on Rails
Presentación Ruby on RailsPresentación Ruby on Rails
Presentación Ruby on Rails
 
Ruby on the Rails
Ruby on the RailsRuby on the Rails
Ruby on the Rails
 
♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente
♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente ♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente
♬♪♬..I'm too sexy... ♫♪ catwalk... Como modelar el dominio efectivamente
 
Framework Catalyst
Framework CatalystFramework Catalyst
Framework Catalyst
 
Framework
FrameworkFramework
Framework
 

Más de javier ramirez

¿Se puede vivir del open source? T3chfest
¿Se puede vivir del open source? T3chfest¿Se puede vivir del open source? T3chfest
¿Se puede vivir del open source? T3chfestjavier ramirez
 
QuestDB: The building blocks of a fast open-source time-series database
QuestDB: The building blocks of a fast open-source time-series databaseQuestDB: The building blocks of a fast open-source time-series database
QuestDB: The building blocks of a fast open-source time-series databasejavier ramirez
 
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...javier ramirez
 
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...javier ramirez
 
Deduplicating and analysing time-series data with Apache Beam and QuestDB
Deduplicating and analysing time-series data with Apache Beam and QuestDBDeduplicating and analysing time-series data with Apache Beam and QuestDB
Deduplicating and analysing time-series data with Apache Beam and QuestDBjavier ramirez
 
Your Database Cannot Do this (well)
Your Database Cannot Do this (well)Your Database Cannot Do this (well)
Your Database Cannot Do this (well)javier ramirez
 
Your Timestamps Deserve Better than a Generic Database
Your Timestamps Deserve Better than a Generic DatabaseYour Timestamps Deserve Better than a Generic Database
Your Timestamps Deserve Better than a Generic Databasejavier ramirez
 
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...javier ramirez
 
QuestDB-Community-Call-20220728
QuestDB-Community-Call-20220728QuestDB-Community-Call-20220728
QuestDB-Community-Call-20220728javier ramirez
 
Processing and analysing streaming data with Python. Pycon Italy 2022
Processing and analysing streaming  data with Python. Pycon Italy 2022Processing and analysing streaming  data with Python. Pycon Italy 2022
Processing and analysing streaming data with Python. Pycon Italy 2022javier ramirez
 
QuestDB: ingesting a million time series per second on a single instance. Big...
QuestDB: ingesting a million time series per second on a single instance. Big...QuestDB: ingesting a million time series per second on a single instance. Big...
QuestDB: ingesting a million time series per second on a single instance. Big...javier ramirez
 
Servicios e infraestructura de AWS y la próxima región en Aragón
Servicios e infraestructura de AWS y la próxima región en AragónServicios e infraestructura de AWS y la próxima región en Aragón
Servicios e infraestructura de AWS y la próxima región en Aragónjavier ramirez
 
Primeros pasos en desarrollo serverless
Primeros pasos en desarrollo serverlessPrimeros pasos en desarrollo serverless
Primeros pasos en desarrollo serverlessjavier ramirez
 
How AWS is reinventing the cloud
How AWS is reinventing the cloudHow AWS is reinventing the cloud
How AWS is reinventing the cloudjavier ramirez
 
Analitica de datos en tiempo real con Apache Flink y Apache BEAM
Analitica de datos en tiempo real con Apache Flink y Apache BEAMAnalitica de datos en tiempo real con Apache Flink y Apache BEAM
Analitica de datos en tiempo real con Apache Flink y Apache BEAMjavier ramirez
 
Getting started with streaming analytics
Getting started with streaming analyticsGetting started with streaming analytics
Getting started with streaming analyticsjavier ramirez
 
Getting started with streaming analytics: Setting up a pipeline
Getting started with streaming analytics: Setting up a pipelineGetting started with streaming analytics: Setting up a pipeline
Getting started with streaming analytics: Setting up a pipelinejavier ramirez
 
Getting started with streaming analytics: Deep Dive
Getting started with streaming analytics: Deep DiveGetting started with streaming analytics: Deep Dive
Getting started with streaming analytics: Deep Divejavier ramirez
 
Getting started with streaming analytics: streaming basics (1 of 3)
Getting started with streaming analytics: streaming basics (1 of 3)Getting started with streaming analytics: streaming basics (1 of 3)
Getting started with streaming analytics: streaming basics (1 of 3)javier ramirez
 
Monitorización de seguridad y detección de amenazas con AWS
Monitorización de seguridad y detección de amenazas con AWSMonitorización de seguridad y detección de amenazas con AWS
Monitorización de seguridad y detección de amenazas con AWSjavier ramirez
 

Más de javier ramirez (20)

¿Se puede vivir del open source? T3chfest
¿Se puede vivir del open source? T3chfest¿Se puede vivir del open source? T3chfest
¿Se puede vivir del open source? T3chfest
 
QuestDB: The building blocks of a fast open-source time-series database
QuestDB: The building blocks of a fast open-source time-series databaseQuestDB: The building blocks of a fast open-source time-series database
QuestDB: The building blocks of a fast open-source time-series database
 
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
Como creamos QuestDB Cloud, un SaaS basado en Kubernetes alrededor de QuestDB...
 
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
Ingesting Over Four Million Rows Per Second With QuestDB Timeseries Database ...
 
Deduplicating and analysing time-series data with Apache Beam and QuestDB
Deduplicating and analysing time-series data with Apache Beam and QuestDBDeduplicating and analysing time-series data with Apache Beam and QuestDB
Deduplicating and analysing time-series data with Apache Beam and QuestDB
 
Your Database Cannot Do this (well)
Your Database Cannot Do this (well)Your Database Cannot Do this (well)
Your Database Cannot Do this (well)
 
Your Timestamps Deserve Better than a Generic Database
Your Timestamps Deserve Better than a Generic DatabaseYour Timestamps Deserve Better than a Generic Database
Your Timestamps Deserve Better than a Generic Database
 
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
Cómo se diseña una base de datos que pueda ingerir más de cuatro millones de ...
 
QuestDB-Community-Call-20220728
QuestDB-Community-Call-20220728QuestDB-Community-Call-20220728
QuestDB-Community-Call-20220728
 
Processing and analysing streaming data with Python. Pycon Italy 2022
Processing and analysing streaming  data with Python. Pycon Italy 2022Processing and analysing streaming  data with Python. Pycon Italy 2022
Processing and analysing streaming data with Python. Pycon Italy 2022
 
QuestDB: ingesting a million time series per second on a single instance. Big...
QuestDB: ingesting a million time series per second on a single instance. Big...QuestDB: ingesting a million time series per second on a single instance. Big...
QuestDB: ingesting a million time series per second on a single instance. Big...
 
Servicios e infraestructura de AWS y la próxima región en Aragón
Servicios e infraestructura de AWS y la próxima región en AragónServicios e infraestructura de AWS y la próxima región en Aragón
Servicios e infraestructura de AWS y la próxima región en Aragón
 
Primeros pasos en desarrollo serverless
Primeros pasos en desarrollo serverlessPrimeros pasos en desarrollo serverless
Primeros pasos en desarrollo serverless
 
How AWS is reinventing the cloud
How AWS is reinventing the cloudHow AWS is reinventing the cloud
How AWS is reinventing the cloud
 
Analitica de datos en tiempo real con Apache Flink y Apache BEAM
Analitica de datos en tiempo real con Apache Flink y Apache BEAMAnalitica de datos en tiempo real con Apache Flink y Apache BEAM
Analitica de datos en tiempo real con Apache Flink y Apache BEAM
 
Getting started with streaming analytics
Getting started with streaming analyticsGetting started with streaming analytics
Getting started with streaming analytics
 
Getting started with streaming analytics: Setting up a pipeline
Getting started with streaming analytics: Setting up a pipelineGetting started with streaming analytics: Setting up a pipeline
Getting started with streaming analytics: Setting up a pipeline
 
Getting started with streaming analytics: Deep Dive
Getting started with streaming analytics: Deep DiveGetting started with streaming analytics: Deep Dive
Getting started with streaming analytics: Deep Dive
 
Getting started with streaming analytics: streaming basics (1 of 3)
Getting started with streaming analytics: streaming basics (1 of 3)Getting started with streaming analytics: streaming basics (1 of 3)
Getting started with streaming analytics: streaming basics (1 of 3)
 
Monitorización de seguridad y detección de amenazas con AWS
Monitorización de seguridad y detección de amenazas con AWSMonitorización de seguridad y detección de amenazas con AWS
Monitorización de seguridad y detección de amenazas con AWS
 

Último

Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzzAlexandergo5
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 

Último (20)

Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzz
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 

Desarrollo plug-ins Rails

  • 1. desarrollo de plug-ins con rails jramirez@aspgems.com conferencia rails 2007. 23 de Noviembre,Madrid obra publicada por javier ramirez como ‘Atribución-No Comercial-Licenciar Igual 2.5’ de Creative Commons
  • 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
  • 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
  • 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
  • 5. » crear módulos que hagan una única cosa y que sean tan independientes como sea posible javier ramírez. conferencia rails 2007
  • 6. » trabajar lo menos posible » para disimular podemos usar conceptos como DRY o less is more ;) javier ramírez. conferencia rails 2007
  • 7. » cuando vamos a copiarpegar un fragmento de código relevante de un proyecto a otro » extraer, no anticipar. Más práctico, más usable, menos trabajo javier ramírez. conferencia rails 2007
  • 8. » módulos completamente separados de mi aplicación que realizan una única tarea » mecanismo de compartición simple » también para uso interno javier ramírez. conferencia rails 2007
  • 9. ruby script/generate plugin useless create vendor/plugins/useless/lib create vendor/plugins/useless/tasks create vendor/plugins/useless/test create 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 create vendor/plugins/useless/uninstall.rb create vendor/plugins/useless/lib/useless.rb create vendor/plugins/useless/tasks/useless_tasks.rake create vendor/plugins/useless/test/useless_test.rb javier ramírez. conferencia rails 2007
  • 10. » install.rb / uninstall.rb » instalación off-line » mejor usar tareas rake y que el script de instalación solamente muestre el README javier ramírez. conferencia rails 2007
  • 11. » selección de plugins y su orden » modificación del load_path » inicialización del plugin javier ramírez. conferencia rails 2007
  • 12. » config.plugins_path ([quot;#{root_path}/vendor/pluginsquot;]) » config.plugin_locator (Plugin::FileSystemLocator < Plugin::Locator) » config.plugin_loader (Plugin::Loader) javier ramírez. conferencia rails 2007
  • 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
  • 14. » add_plugin_load_paths de Plugin::Loader » añade directorio lib de cada plugin al load_path de rails » añade lib también a Dependencies para autoload de clases javier ramírez. conferencia rails 2007
  • 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
  • 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
  • 17. » pueden dejarse directamente en lib, pero necesitamos añadir la ruta a config.controller_paths » config.controller_paths << directory javier ramírez. conferencia rails 2007
  • 18. » controller.template_root (pre rails 2) » controller.view_paths »controller.prepend_view_path »controller.append_view_path javier ramírez. conferencia rails 2007
  • 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
  • 20. »podemos definir módulos e incluirlos en todos los controladores, vistas (vía helper) o modelos * » ActionController::Base.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
  • 21. » podemos crearnos directorios dentro de lib y añadirlos al load_path y a Dependencies c_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_path Dependencies.load_paths << c_path << m_path << h_path config.controller_paths << c_path javier ramírez. conferencia rails 2007
  • 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::Base para desde él incluir nuestro módulo en las clases hijas que lo usen javier ramírez. conferencia rails 2007
  • 23. module ActsAsUseless def ActsAsUseless.included(base_klass) base_klass.extend ARClassMethods #mix-in sobre la clase AR end 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 quot;useless #{self.class.to_s}quot; end end end javier ramírez. conferencia rails 2007
  • 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ón module Useless mattr_accessor :useless_variable self.useless_variable = 'default_value' end javier ramírez. conferencia rails 2007
  • 25. module ActionController module Routing #:nodoc: class RouteSet #:nodoc: def draw_with_content draw_without_content do |map| map.connect '', :controller => 'ct', :action=>'xx' if Content.map_home map.connect quot;#{Content.web_prefix}/*page_pathquot;, :controller=>'ct', :action=>'xx' yield map end end alias_method_chain :draw, :content end #routeset end #routing end #actioncontroller javier ramírez. conferencia rails 2007
  • 26. » buenas sustitutas para install.rb en install podría hacer Rake::Task[: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
  • 27. » se escriben tareas rake estándar. Simplemente hay que dejar los ficheros en directory/tasks namespace :useless do desc 'useless task. plugin example' task :demo => :environment do puts quot;i told you i am a shallow useless taskquot; end desc 'useless task without environment. plugin example' task :light_demo do puts quot;i don't even have the environmentquot; end end javier ramírez. conferencia rails 2007
  • 28. » buena idea usar find_or_initialize para tolerar que el usuario ejecute varias veces sin introducir duplicados » podemos seguir la filosofía de las migrations, definiendo un método up y down y llamarlos desde rake usando métodos como ActiveRecord::Base.connection.create_table :roles, :force => false do |t| t.column ... end javier ramírez. conferencia rails 2007
  • 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
  • 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, table_name, plural_name, singular_name... javier ramírez. conferencia rails 2007
  • 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) » manifest es capaz de deshacer las acciones si se llama a script/destroy javier ramírez. conferencia rails 2007
  • 32. » si definimos las tareas en el fichero Rakefile generado en la raíz del plugin, sólo será accesible ejecutando rake desde ese directorio » útiles para ejecutar tareas administrativas internas del plugin, como generación de documentación o testing javier ramírez. conferencia rails 2007
  • 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
  • 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
  • 35. Técnica aportada por Sergio Gil Pérez de la Manga, inmediatamente después de mi charla en la Conferencia Rails, con una solución simple para poder probar modelos sin necesidad de la complejidad de crearse una tabla previamente. ¡Brillante! ActiveRecord::Base.class_eval do alias_method :save, :valid? def self.columns() @columns ||= []; end def self.column(name, sql_type = nil, default = nil, null = true) columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type, null) end end class Resource < ActiveRecord::Base column :id, :integer column :name, :string column :amount, :integer column :conditions, :boolean end Luego por ejemplo en el setup de los tests o donde te haga falta puedes hacer Resource.new... javier ramírez. conferencia rails 2007
  • 37. @ . . . javier.ramirez.gomara@gmail.com http://formatinternet.wordpress.com obra publicada por javier ramirez como ‘Atribución-No Comercial-Licenciar Igual 2.5’ de Creative Commons Imágenes de las letras bajo licencia CC. Autor Leo Reynolds. Descargadas de Flickr