Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Integração de gems com o Rails @ RS on Rails

Integração de gems com o Rails @ RS on Rails

Carlos Antonio

September 15, 2012
Tweet

More Decks by Carlos Antonio

Other Decks in Programming

Transcript

  1. Railties
    INTEGRANDO GEMS
    COM O RAILS

    View Slide

  2. @cantoniodasilva
    Carlos Antonio

    View Slide

  3. View Slide

  4. Devise
    maintainer

    View Slide

  5. SimpleForm
    maintainer

    View Slide

  6. Responders
    maintainer

    View Slide

  7. Rails
    commiter

    View Slide

  8. guru
    SC

    View Slide

  9. Railties
    INTEGRANDO GEMS
    COM O RAILS

    View Slide

  10. The Road So Far...

    View Slide

  11. Rails
    2.3

    View Slide

  12. Plugins!
    vendor/plugins

    View Slide

  13. script/plugin install
    git://github.com/SomeGuy/
    my_awesome_plugin.git

    View Slide

  14. Engines!
    app/*

    View Slide

  15. App
    Engine

    View Slide

  16. module Rails
    class Plugin
    # Engines are plugins with an app/ directory.
    def engine?
    has_app_directory?
    end
    private
    def has_app_directory?
    File.directory?(File.join(directory, 'app'))
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb

    View Slide

  17. module Rails
    class Plugin
    # Engines are plugins with an app/ directory.
    def engine?
    has_app_directory?
    end
    private
    def has_app_directory?
    File.directory?(File.join(directory, 'app'))
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb
    # Engines are plugins with an app/ directory.
    def engine?
    has_app_directory?
    end
    private
    def has_app_directory?
    File.directory?(File.join(directory, 'app'))
    end

    View Slide

  18. View Slide

  19. app/ models
    controllers
    helpers
    config/ routes.rb

    View Slide

  20. module Rails
    class Plugin
    def view_path
    File.join(directory, 'app', 'views')
    end
    def controller_path
    File.join(directory, 'app', 'controllers')
    end
    def routing_file
    File.join(directory, 'config', 'routes.rb')
    end
    private
    def app_paths
    [ File.join(directory, 'app', 'models'),
    File.join(directory, 'app', 'helpers'),
    controller_path, metal_path ]
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb

    View Slide

  21. module Rails
    class Plugin
    def view_path
    File.join(directory, 'app', 'views')
    end
    def controller_path
    File.join(directory, 'app', 'controllers')
    end
    def routing_file
    File.join(directory, 'config', 'routes.rb')
    end
    private
    def app_paths
    [ File.join(directory, 'app', 'models'),
    File.join(directory, 'app', 'helpers'),
    controller_path, metal_path ]
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/rails/plugin.rb
    def view_path
    File.join(directory, 'app', 'views')
    end
    def controller_path
    File.join(directory, 'app', 'controllers')
    end
    def routing_file
    File.join(directory, 'config', 'routes.rb')
    end
    private
    def app_paths
    [ File.join(directory, 'app', 'models'),
    File.join(directory, 'app', 'helpers'),
    controller_path, metal_path ]
    end

    View Slide

  22. Rails
    Active Record

    View Slide

  23. module Rails
    class Initializer
    def load_observers
    if gems_dependencies_loaded &&
    configuration.frameworks.include?(:active_record)
    ActiveRecord::Base.instantiate_observers
    end
    end
    def initialize_database
    if configuration.frameworks.include?(:active_record)
    ActiveRecord::Base.configurations =
    configuration.database_configuration
    ActiveRecord::Base.establish_connection
    end
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb

    View Slide

  24. module Rails
    class Initializer
    def load_observers
    if gems_dependencies_loaded &&
    configuration.frameworks.include?(:active_record)
    ActiveRecord::Base.instantiate_observers
    end
    end
    def initialize_database
    if configuration.frameworks.include?(:active_record)
    ActiveRecord::Base.configurations =
    configuration.database_configuration
    ActiveRecord::Base.establish_connection
    end
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb
    if gems_dependencies_loaded &&
    configuration.frameworks.include?(:active_record)
    ActiveRecord::Base.instantiate_observers
    end
    if configuration.frameworks.include?(:active_record)
    ActiveRecord::Base.configurations =
    configuration.database_configuration
    ActiveRecord::Base.establish_connection
    end

    View Slide

  25. module Rails
    class Initializer
    private
    def default_frameworks
    [ :active_record, :action_controller,
    :action_view, :action_mailer, :active_resource ]
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb

    View Slide

  26. module Rails
    class Initializer
    private
    def default_frameworks
    [ :active_record, :action_controller,
    :action_view, :action_mailer, :active_resource ]
    end
    end
    end
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb
    def default_frameworks
    [ :active_record, :action_controller,
    :action_view, :action_mailer, :active_resource ]
    end

    View Slide

  27. ORMs

    View Slide

  28. ORMs
    Sequel MongoMapper
    DataMapper Mongoid

    View Slide

  29. Frágil

    View Slide

  30. monkey
    Patch

    View Slide

  31. module Rails
    class Initializer
    def process
    Rails.configuration = configuration
    check_ruby_version
    install_gem_spec_stubs
    set_load_path
    add_gem_load_paths
    require_frameworks
    set_autoload_paths
    add_plugin_load_paths
    load_environment
    preload_frameworks
    initialize_encoding
    initialize_database
    initialize_cache
    initialize_framework_caches
    initialize_logger
    initialize_framework_logging
    initialize_dependency_mechanism
    initialize_whiny_nils
    initialize_time_zone
    initialize_i18n
    initialize_framework_settings
    initialize_framework_views
    initialize_metal
    add_support_load_paths
    check_for_unbuilt_gems
    load_gems
    load_plugins
    https://github.com/rails/rails/blob/2-3-stable/railties/lib/initializer.rb
    # pick up any gems that plugins depend on
    add_gem_load_paths
    load_gems
    check_gem_dependencies
    # bail out if gems are missing - note that check_gem_dependencies
    # will have already called abort() unless $gems_rake_task is set
    return unless gems_dependencies_loaded
    load_application_initializers
    # the framework is now fully initialized
    after_initialize
    # Setup database middleware after initializers have run
    initialize_database_middleware
    # Prepare dispatcher callbacks and run 'prepare' callbacks
    prepare_dispatcher
    # Routing must be initialized after plugins to allow the former to
    # extend the routes
    initialize_routing
    # Observers are loaded after plugins in case Observers or observed
    # models are modified by plugins.
    load_observers
    # Load view path cache
    load_view_paths
    # Load application classes
    load_application_classes
    # Disable dependency loading during request cycle
    disable_dependency_loading
    # Flag initialized
    Rails.initialized = true
    end
    end
    end

    View Slide

  32. Single
    Responsibility
    Principle

    View Slide

  33. Single
    Responsibility
    Principle

    View Slide

  34. Rails
    3

    View Slide

  35. Modularidade

    View Slide

  36. Rails
    Active Record

    View Slide

  37. Rails
    Active Record

    View Slide

  38. Rails

    View Slide

  39. Rails
    Action Controller
    Action Mailer
    Action View
    Active Record
    Active Resource

    View Slide

  40. Rails

    View Slide

  41. Rails
    DataMapper
    Devise
    RSpec
    Mongoid
    etc...

    View Slide

  42. Hooks!

    View Slide

  43. Rails::
    Railtie

    View Slide

  44. Configuração
    &
    Inicialização

    View Slide

  45. Config

    View Slide

  46. module Responders
    class Railtie < ::Rails::Railtie
    config.responders = ActiveSupport::OrderedOptions.new
    config.responders.flash_keys = [ :notice, :alert ]
    # ...
    end
    end
    https://github.com/plataformatec/responders/blob/v0.9.2/lib/responders.rb
    Responders

    View Slide

  47. module MyApp
    class Application < ::Rails::Application
    config.responders.flash_keys = [ :success, :failure ]
    end
    end

    View Slide

  48. Initializers

    View Slide

  49. module Responders
    class Railtie < ::Rails::Railtie
    config.responders.flash_keys = [ :notice, :alert ]
    initializer "responders.flash_responder" do |app|
    Responders::FlashResponder.flash_keys =
    app.config.responders.flash_keys
    # ...
    end
    end
    end
    https://github.com/plataformatec/responders/blob/v0.9.2/lib/responders.rb
    Responders

    View Slide

  50. module CarrierWave
    class Railtie < Rails::Railtie
    initializer "carrierwave.setup_paths" do
    CarrierWave.root =
    Rails.root.join(Rails.public_path).to_s
    # ...
    end
    end
    end
    https://github.com/jnicklas/carrierwave/blob/v0.6.2/lib/carrierwave.rb
    CarrierWave

    View Slide

  51. Initializers
    + Hooks

    View Slide

  52. module MyGem
    class Railtie < Rails::Railtie
    config.before_configuration {
    # Executa antes das configurações do usuário
    }
    end
    end

    View Slide

  53. module MyGem
    class Railtie < Rails::Railtie
    config.before_initialize {
    # Depois da config do usuário, mas antes dos
    # initializers.
    }
    end
    end

    View Slide

  54. module MyGem
    class Railtie < Rails::Railtie
    config.to_prepare {
    # cache_classes = false (development)
    # Roda toda vez antes de recarregar o ambiente.
    # cache_classes = true (production)
    # Roda antes da primeira requisição.
    }
    end
    end

    View Slide

  55. module MyGem
    class Railtie < Rails::Railtie
    config.before_eager_load {
    # Antes de carregar todo o código da aplicação,
    # somente com cache_classes true.
    }
    end
    end

    View Slide

  56. module MyGem
    class Railtie < Rails::Railtie
    config.after_initialize {
    # Após todos os demais (configs, initializers, etc),
    # uma única vez antes da primeira requisição.
    }
    end
    end

    View Slide

  57. Development
    before_configuration
    => Booting WEBrick
    before_initialize
    to_prepare
    after_initialize
    [...] INFO WEBrick 1.3.1
    to_prepare
    Request...
    to_prepare
    Request...
    to_prepare
    Production (cache_classes)
    before_configuration
    => Booting WEBrick
    before_initialize
    to_prepare
    before_eager_load
    after_initialize
    [...] INFO WEBrick 1.3.1
    Request...
    Request...

    View Slide

  58. Development
    before_configuration
    => Booting WEBrick
    before_initialize
    to_prepare
    after_initialize
    [...] INFO WEBrick 1.3.1
    to_prepare
    Request...
    to_prepare
    Request...
    to_prepare
    Production (cache_classes)
    before_configuration
    => Booting WEBrick
    before_initialize
    to_prepare
    before_eager_load
    after_initialize
    [...] INFO WEBrick 1.3.1
    Request...
    Request...

    View Slide

  59. module ActiveRecord
    class Railtie < Rails::Railtie
    config.after_initialize do
    ActiveSupport.on_load(:active_record) do
    instantiate_observers
    ActionDispatch::Reloader.to_prepare do
    ActiveRecord::Base.instantiate_observers
    end
    end
    end
    end
    end
    https://github.com/rails/rails/tree/3-2-stable/activerecord/lib/active_record/railtie.rb
    Active Record

    View Slide

  60. module Rails
    module Mongoid
    class Railtie < Rails::Railtie
    initializer "instantiate observers" do
    config.after_initialize do
    ::Mongoid::instantiate_observers
    ActionDispatch::Reloader.to_prepare do
    ::Mongoid.instantiate_observers
    end
    end
    end
    end
    end
    end
    https://github.com/mongoid/mongoid/blob/3.0.0-stable/lib/mongoid/railtie.rb
    Mongoid

    View Slide

  61. module Haml
    module Rails
    class Railtie < ::Rails::Railtie
    config.before_initialize do
    Haml.init_rails(binding)
    Haml::Template.options[:format] = :html5
    end
    end
    end
    end
    https://github.com/indirect/haml-rails/blob/v0.3.5/lib/haml-rails.rb
    Haml

    View Slide

  62. Generators

    View Slide

  63. simple_form
    lib
    generators
    simple_form
    install_generator.rb
    https://github.com/plataformatec/simple_form
    SimpleForm

    View Slide

  64. simple_form
    lib
    generators
    simple_form
    install_generator.rb
    Namespace
    https://github.com/plataformatec/simple_form
    SimpleForm

    View Slide

  65. simple_form
    lib
    generators
    simple_form
    install_generator.rb
    Namespace
    Generator
    https://github.com/plataformatec/simple_form
    SimpleForm

    View Slide

  66. module SimpleForm
    module Generators
    class InstallGenerator < Rails::Generators::Base
    desc "Copy SimpleForm default files"
    source_root File.expand_path('../templates', __FILE__)
    def copy_config
    directory 'config'
    end
    def copy_scaffold_template
    # ...
    end
    end
    end
    end
    https://github.com/plataformatec/simple_form/blob/v2.0.2/lib/generators/simple_form/install_generator.rb
    SimpleForm

    View Slide

  67. rails generate
    simple_form:install

    View Slide

  68. Convenções

    View Slide

  69. module MyGem
    class Railtie < ::Rails::Railtie
    generators do
    require "my_gem/generators"
    end
    end
    end

    View Slide

  70. Generators
    + Hooks

    View Slide

  71. module ActiveRecord
    class Railtie < Rails::Railtie
    config.app_generators.orm :active_record,
    :migration => true, :timestamps => true
    end
    end
    https://github.com/rails/rails/tree/3-2-stable/activerecord/lib/active_record/railtie.rb
    Active Record

    View Slide

  72. module Rails
    module Mongoid
    class Railtie < Rails::Railtie
    def self.generator
    config.respond_to?(:app_generators) ?
    :app_generators : :generators
    end
    config.send(generator).orm :mongoid,
    migration: false
    end
    end
    end
    https://github.com/mongoid/mongoid/blob/3.0.0-stable/lib/mongoid/railtie.rb
    Mongoid

    View Slide

  73. module RSpec
    module Rails
    class Railtie < ::Rails::Railtie
    generators = config.respond_to?(:app_generators) ?
    config.app_generators : config.generators
    generators.integration_tool :rspec
    generators.test_framework :rspec
    end
    end
    end
    https://github.com/rspec/rspec-rails/blob/v2.11.0/lib/rspec-rails.rb
    RSpec

    View Slide

  74. module Responders
    class Railtie < ::Rails::Railtie
    if config.respond_to?(:app_generators)
    config.app_generators.scaffold_controller =
    :responders_controller
    else
    config.generators.scaffold_controller =
    :responders_controller
    end
    end
    end
    https://github.com/plataformatec/responders/blob/v0.9.2/lib/responders.rb
    Responders

    View Slide

  75. module Haml
    module Rails
    class Railtie < ::Rails::Railtie
    if ::Rails.version.to_f >= 3.1
    config.app_generators.template_engine :haml
    else
    config.generators.template_engine :haml
    end
    end
    end
    end
    https://github.com/indirect/haml-rails/blob/v0.3.5/lib/haml-rails.rb
    Haml

    View Slide

  76. :assets => true
    :force_plural => false
    :helper => true
    :integration_tool => nil
    :javascripts => true
    :javascript_engine => :js
    :orm => false
    :performance_tool => nil
    :resource_controller => :controller
    :resource_route => true
    :scaffold_controller => :scaffold_controller
    :stylesheets => true
    :stylesheet_engine => :css
    :test_framework => false
    :template_engine => :erb
    https://github.com/rails/rails/blob/3-2-stable/railties/lib/rails/generators.rb

    View Slide

  77. Console

    View Slide

  78. module MyGem
    class Railtie < Rails::Railtie
    console do
    puts "Hello console!"
    end
    end
    end

    View Slide

  79. module ActiveRecord
    class Railtie < Rails::Railtie
    console do |app|
    if app.sandbox?
    require "active_record/railties/console_sandbox"
    end
    ActiveRecord::Base.logger = Logger.new(STDERR)
    end
    end
    end
    https://github.com/rails/rails/tree/3-2-stable/activerecord/lib/active_record/railtie.rb
    Active Record

    View Slide

  80. module PryRails
    class Railtie < Rails::Railtie
    console do
    # ... código para carregar o Pry
    end
    end
    end
    https://github.com/rweng/pry-rails/blob/master/lib/pry-rails/railtie.rb
    Pry Rails

    View Slide

  81. Rails
    4
    SPOILER

    View Slide

  82. RAILS 4
    https://github.com/rails/rails/commit/951b582

    View Slide

  83. module PryRails
    class Railtie < Rails::Railtie
    console do
    if Rails::VERSION::MAJOR == 4
    Rails.application.config.console = Pry
    end
    end
    end
    end
    https://github.com/rweng/pry-rails/blob/master/lib/pry-rails/railtie.rb
    Pry Rails

    View Slide

  84. Rake Tasks

    View Slide

  85. module RSpec
    module Rails
    class Railtie < ::Rails::Railtie
    rake_tasks do
    load "rspec/rails/tasks/rspec.rake"
    end
    end
    end
    end
    https://github.com/rspec/rspec-rails/blob/v2.11.0/lib/rspec-rails.rb
    RSpec

    View Slide

  86. module ActiveRecord
    class Railtie < Rails::Railtie
    rake_tasks do
    load "active_record/railties/databases.rake"
    end
    end
    end
    https://github.com/rails/rails/tree/3-2-stable/activerecord/lib/active_record/railtie.rb
    Active Record

    View Slide

  87. module Rails
    module Mongoid
    class Railtie < Rails::Railtie
    rake_tasks do
    load "mongoid/railties/database.rake"
    end
    end
    end
    end
    https://github.com/mongoid/mongoid/blob/3.0.0-stable/lib/mongoid/railtie.rb
    Mongoid

    View Slide

  88. Framework
    Loading

    View Slide

  89. module MyGem
    module SimpleFormExtensions
    def special_input(*)
    # ...
    end
    end
    end
    SimpleForm::FormBuilder.send(
    :include, MyGem::SimpleFormExtensions)

    View Slide

  90. module MyGem
    module SimpleFormExtensions
    def special_input(*)
    # ...
    end
    end
    end
    SimpleForm::FormBuilder.send(
    :include, MyGem::SimpleFormExtensions)

    View Slide

  91. module SimpleForm
    class FormBuilder
    end
    end
    ActiveSupport.run_load_hooks(
    :simple_form, SimpleForm::FormBuilder)

    View Slide

  92. module MyGem
    module SimpleFormExtensions
    def special_input(*)
    # ...
    end
    end
    end
    ActiveSupport.on_load(:simple_form) do
    include MyGem::SimpleFormExtensions
    end

    View Slide

  93. module ActiveRecord
    class Base
    end
    end
    ActiveSupport.run_load_hooks(
    :active_record, ActiveRecord::Base)
    https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/base.rb
    Active Record

    View Slide

  94. module ActiveRecord
    class Railtie < Rails::Railtie
    initializer "active_record.initialize_timezone" do
    ActiveSupport.on_load(:active_record) do
    self.time_zone_aware_attributes = true
    self.default_timezone = :utc
    end
    end
    end
    end
    https://github.com/rails/rails/tree/3-2-stable/activerecord/lib/active_record/railtie.rb
    Active Record

    View Slide

  95. module MyGem
    module ActiveRecordExtensions
    end
    end
    ActiveSupport.on_load(:active_record) do
    include MyGem::ActiveRecordExtensions
    end

    View Slide

  96. ActiveSupport.on_load(:active_record) do
    include MyGem::ActiveRecordExtensions
    end
    ActiveSupport.on_load(:action_controller) do
    include MyGem::ActionControllerExtensions
    end

    View Slide

  97. Criar uma
    Railtie?

    View Slide

  98. module MyGem
    class Railtie < Rails::Railtie
    end
    end

    View Slide

  99. Você nem sempre
    precisa de uma
    Railtie!

    View Slide

  100. Initializers
    Railtie: quando?

    View Slide

  101. rake tasks
    Railtie: quando?

    View Slide

  102. Expor configs
    de sua gem
    Railtie: quando?

    View Slide

  103. Extensões para o
    console
    Railtie: quando?

    View Slide

  104. Generators em outro
    diretório
    Railtie: quando?

    View Slide

  105. Alterar um
    generator default
    Railtie: quando?

    View Slide

  106. Rails::
    Engine

    View Slide

  107. Engine < Railtie

    View Slide

  108. Paths + Autoload

    View Slide

  109. app/ *
    assets
    controllers
    helpers
    mailers
    models
    views

    View Slide

  110. https://github.com/plataformatec/devise/tree/v2.1.2/app

    View Slide

  111. config/ environments/
    #{Rails.env}.rb
    initializers/*.rb
    locales/*.{rb,yml}
    routes.rb

    View Slide

  112. https://github.com/plataformatec/devise/tree/v2.1.2/config

    View Slide

  113. lib/ assets/*
    tasks/*.rake
    vendor/ assets/*

    View Slide

  114. https://github.com/rails/jquery-rails/tree/v2.1.2/vendor/assets/javascripts

    View Slide

  115. module MyGem
    class Railtie < ::Rails::Engine
    # Você pode alterar os paths padrão.
    paths.app.controllers << "lib/controllers"
    end
    end

    View Slide

  116. Criar uma
    Engine?

    View Slide

  117. module MyGem
    class Railtie < ::Rails::Engine
    end
    end

    View Slide

  118. module Jquery
    module Rails
    class Engine < ::Rails::Engine
    end
    end
    end
    https://github.com/rails/jquery-rails/blob/v2.1.2/lib/jquery/rails/engine.rb
    Jquery Rails

    View Slide

  119. module Devise
    class Engine < ::Rails::Engine
    config.devise = Devise
    # Force routes to be loaded if we are doing any
    # eager load.
    config.before_eager_load { |app| app.reload_routes! }
    initializer "devise.url_helpers" do
    Devise.include_helpers(Devise::Controllers)
    end
    initializer "devise.omniauth" do |app|
    # ...
    end
    # ...
    end
    end https://github.com/plataformatec/devise/blob/v2.1.2/lib/devise/rails.rb
    Devise

    View Slide

  120. Quando eu preciso
    de uma Engine?

    View Slide

  121. Rotas
    Railtie: quando?

    View Slide

  122. Models
    Railtie: quando?

    View Slide

  123. Controllers
    Railtie: quando?

    View Slide

  124. Views
    Railtie: quando?

    View Slide

  125. app/*
    Railtie: quando?

    View Slide

  126. config/*
    Railtie: quando?

    View Slide

  127. Rails::
    Plugin

    View Slide

  128. Plugin < Engine

    View Slide

  129. rails plugin install

    View Slide

  130. vendor/plugins

    View Slide

  131. init.rb

    View Slide

  132. Criar uma
    Plugin?

    View Slide

  133. Você não cria :)

    View Slide

  134. module Rails
    class Plugin < Engine
    def self.inherited(base)
    raise "You cannot inherit from Rails::Plugin"
    end
    end
    end
    https://github.com/rails/rails/blob/3-2-stable/railties/lib/rails/plugin.rb

    View Slide

  135. module Rails
    class Plugin < Engine
    def self.inherited(base)
    raise "You cannot inherit from Rails::Plugin"
    end
    end
    end
    https://github.com/rails/rails/blob/3-2-stable/railties/lib/rails/plugin.rb
    def self.inherited(base)
    raise "You cannot inherit from Rails::Plugin"
    end

    View Slide

  136. Lembre-se:
    interno ao Rails :)

    View Slide

  137. Quando eu preciso
    de um Plugin?

    View Slide

  138. Você não precisa
    (não mais :)

    View Slide

  139. Rails
    4
    SPOILER

    View Slide

  140. RAILS 4
    https://github.com/rails/rails/commit/dad7fdc

    View Slide

  141. gems <3

    View Slide

  142. Rails::
    Application

    View Slide

  143. Application < Engine

    View Slide

  144. Start!

    View Slide

  145. require
    config/boot.rb
    Rails boot

    View Slide

  146. require
    railties + engines
    Rails boot

    View Slide

  147. Define
    Rails.application
    Rails boot

    View Slide

  148. Run
    before_configuration
    Rails boot

    View Slide

  149. Load
    config/environment/ENV.rb
    Rails boot

    View Slide

  150. Run
    before_initialize
    Rails boot

    View Slide

  151. Initialize
    railties
    Rails boot

    View Slide

  152. Configure
    railties
    Rails boot

    View Slide

  153. Run
    railties#initializers
    Rails boot

    View Slide

  154. Build
    middleware
    Rails boot

    View Slide

  155. Run
    to_prepare
    Rails boot

    View Slide

  156. Run
    before_eager_load
    Rails boot

    View Slide

  157. Run
    after_initialize
    Rails boot

    View Slide

  158. Booted!

    View Slide

  159. Criar uma
    Application?

    View Slide

  160. rails new my_app

    View Slide

  161. module MyApp
    class Application < Rails::Application
    end
    end

    View Slide

  162. >> require 'rails/all'
    => true
    >> class MyApp < Rails::Application; end
    => nil
    >> Rails.application
    => #
    >> class OtherApp < Rails::Application; end
    RuntimeError:
    You cannot have more than one Rails::Application

    View Slide

  163. Single
    Responsibility
    Principle

    View Slide

  164. Win!

    View Slide

  165. Criando uma gem

    View Slide

  166. Bundler

    View Slide

  167. $ bundle gem rsonrails
    create rsonrails/Gemfile
    create rsonrails/Rakefile
    create rsonrails/LICENSE.txt
    create rsonrails/README.md
    create rsonrails/.gitignore
    create rsonrails/rsonrails.gemspec
    create rsonrails/lib/rsonrails.rb
    create rsonrails/lib/rsonrails/version.rb
    Initializating git repo in /Users/carlos/rsonrails
    bundle gem

    View Slide

  168. Copyright (c) 2012 Carlos Antonio da Silva
    MIT License
    Permission is hereby granted, free of
    charge, to any person obtaining...
    License

    View Slide

  169. # Rsonrails
    TODO: Write a gem description
    ## Installation
    Add this line to your application's Gemfile:
    gem 'rsonrails'
    ...
    ## Usage
    ...
    ## Contributing
    ...
    Readme

    View Slide

  170. source 'https://rubygems.org'
    # Specify your gem's dependencies in
    rsonrails.gemspec
    gemspec
    Gemfile

    View Slide

  171. # -*- encoding: utf-8 -*-
    lib = File.expand_path('../lib', __FILE__)
    $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
    require 'rsonrails/version'
    Gem::Specification.new do |gem|
    gem.name = "rsonrails"
    gem.version = Rsonrails::VERSION
    gem.authors = ["Carlos Antonio da Silva"]
    gem.email = ["[email protected]"]
    gem.description = %q{TODO: Write a gem description}
    gem.summary = %q{TODO: Write a gem summary}
    gem.homepage = ""
    gem.files = `git ls-files`.split($/)
    gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
    gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
    gem.require_paths = ["lib"]
    end
    rsonrails.gemspec

    View Slide

  172. require "rsonrails/version"
    module Rsonrails
    # Your code goes here...
    end
    lib/rsonrails.rb

    View Slide

  173. module Rsonrails
    VERSION = "0.0.1"
    end
    lib/rsonrails/version.rb

    View Slide

  174. Railtie?

    View Slide

  175. module Rsonrails
    class Railtie < Rails::Railtie
    # config.rsonrails =
    ActiveSupport::OrderedOptions.new
    # rake_tasks {}
    # config.to_prepare {}
    # initializer {}
    end
    end
    lib/rsonrails.rb

    View Slide

  176. module Rsonrails
    class Railtie < Rails::Railtie
    # config.rsonrails =
    ActiveSupport::OrderedOptions.new
    # rake_tasks {}
    # config.to_prepare {}
    # initializer {}
    end
    end
    require "rsonrails/version"
    require "rsonrails/railtie"
    module Rsonrails
    # Your code goes here...
    end
    lib/rsonrails/railtie.rb
    lib/rsonrails.rb

    View Slide

  177. ! Rails?

    View Slide

  178. require "rsonrails/version"
    if defined?(Rails)
    require "rsonrails/railtie"
    end
    module Rsonrails
    # Your code goes here...
    end
    lib/rsonrails.rb

    View Slide

  179. require "bundler/gem_tasks"
    Rakefile

    View Slide

  180. $ rake -T
    rake build # Build rsonrails-0.0.1.gem
    into the pkg directory
    rake install # Build and install rsonrails-0.0.1.gem
    into system gems
    rake release # Create tag v0.0.1 and build and push
    rsonrails-0.0.1.gem to Rubygems
    rake tasks

    View Slide

  181. Bundler

    View Slide

  182. Bundler
    <3 <3 <3

    View Slide

  183. View Slide

  184. Railtie
    Engine
    Application

    View Slide

  185. View Slide

  186. plataformatec/
    simple_form

    View Slide

  187. plataformatec/
    responders

    View Slide

  188. plataformatec/
    devise

    View Slide

  189. rails/rails/
    **/*railtie.rb

    View Slide

  190. http://pragprog.com/book/jvrails/crafting-rails-applications

    View Slide

  191. WITH GREAT
    MOUSTACHE
    COMES GREAT
    RESPONSIBILITY

    View Slide

  192. Estamos contratando!
    plataformatec.com.br

    View Slide

  193. View Slide

  194. INTEGRANDO GEMS
    COM O RAILS
    @cantoniodasilva
    Obrigado!

    View Slide