SlideShare a Scribd company logo
deploying portions
of a Rails app with Engines
Enrico Teotti -- @agenteo
admin user interface
public user interface
domain logic
requirement
run the private and public portions of the app
on separate servers
service oriented architecture
first proposal
http://teotti.com/rails-service-oriented-architecture-alternative-with-components/
two apps sharing components via engines
second proposal
http://teotti.com/git-precommit-hooks-helping-local-ruby-gems-development/
one app feature flagging engines
components
third proposal
public_uiadmin_ui
config/routes.rb
Rails.application.routes.draw do
case AppRunningMode.value
when :admin
mount AdminUi::Engine => "/"
when :public
mount PublicUi::Engine => "/"
else
mount AdminUi::Engine => "/"
mount PublicUi::Engine => "/"
end
end
RUNNING_MODE=public rails s
RUNNING_MODE=admin rails s
http://worldwideshipping-super-secret-domain.com/admin
http://worldwideshipping.com
rails s
http://localhost:3000
● are ruby gems
● are special ruby gems that provide extra
behaviour (models, views, routes, rake
tasks) to a Rails application
● they can be hosted on a gemserver or
they can live inside your repository
● can be tested in isolation
rails engines
admin user interface
public user interface
domain logic
mkdir components
rails plugin new admin_ui --mountable --dummy=spec/dummy -O -T
mv admin_ui components
admin user interface
public user interface
domain logic
admin_ui
proceeding without automated tests
could drive you crazy
shared user interface (preview)
shared domain
admin_ui
Rails.application.routes.draw do
# ... public routes here
mount AdminUi::Engine => "/"
end
config/routes.rb
gem 'admin_ui', path: 'components/admin_ui'
Gemfile
public user interface
admin_ui
public user interface
admin_ui
public_ui
rails plugin new public_ui --mountable --dummy=spec/dummy -O -T
gem 'admin_ui', path: 'components/admin_ui'
gem 'public_ui', path: 'components/public_ui'
Gemfile
public_uiadmin_ui
Gem::Specification.new do |s|
# ... other fields up here
s.name = "public_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_runtime_dependency "admin_ui"
s.add_development_dependency 'byebug'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'rspec-rails', '2.99.0'
s.add_development_dependency 'capybara'
s.add_development_dependency 'poltergeist'
end
public_ui.gemspec
Gem::Specification.new do |s|
# ... other fields up here
s.name = "public_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_runtime_dependency "admin_ui"
s.add_development_dependency 'byebug'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'rspec-rails', '2.99.0'
s.add_development_dependency 'capybara'
s.add_development_dependency 'poltergeist'
end
public_ui.gemspec
Rails.application.routes.draw do
case AppRunningMode.value
when :admin
mount AdminUi::Engine => "/"
when :public
mount PublicUi::Engine => "/"
else
mount AdminUi::Engine => "/"
mount PublicUi::Engine => "/"
end
end
config/routes.rb
the two engines are now glued together!
admin_ui public_ui
domain_logic
rails plugin new domain_logic --dummy-path=spec/dummy
--mountable -O -T
admin_ui public_ui
shared_ui domain_logic
rails plugin new shared_ui --dummy-path=spec/dummy
--mountable -O -T
admin_ui/app/views/cargo_preview/show.html.erb
<%# admin console stuff here %>
<%= render partial: 'shared_ui/cargos/show' %>
<%# admin spaceship here %>
public_ui/app/views/cargos/show.html.erb
<%= render partial: 'shared_ui/cargos/show' %>
group :admin_app do
path 'components' do
gem 'admin_ui'
gem 'legacy_migration'
end
end
group :public_app do
path 'components' do
gem 'public_ui'
end
end
Gemfile
http://teotti.com/reduce-memory-footprint-requiring-portions-of-your-component-based-rails-applications/
http://teotti.com/gemfiles-hierarchy-in-ruby-on-rails-component-based-architecture/
common pitfalls in Rails engines land
Gemfile
#gem 'domain_logic', path: 'components/domain_logic'
#gem 'shared_ui', path: 'components/shared_ui'
gem 'admin_ui', path: 'components/admin_ui'
gem 'public_ui', path: 'components/public_ui'
$ bundle
Resolving dependencies...
Could not find gem 'shared_ui (>= 0) ruby', which is required by gem
'admin_ui (>= 0) ruby', in any of the sources.
Gem::Specification.new do |s|
# ... other fields up here
s.name = "admin_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_dependency 'faraday'
s.add_dependency "domain_logic"
s.add_dependency "shared_ui"
s.add_development_dependency 'byebug'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'rspec-rails', '2.99.0'
s.add_development_dependency 'vcr'
s.add_development_dependency 'webmock'
s.add_development_dependency 'capybara'
s.add_development_dependency 'poltergeist'
end
admin_ui.gemspec
Gem::Specification.new do |s|
# ... other fields up here
s.name = "admin_ui"
s.add_dependency "rails", "~> 4.1.1"
s.add_dependency 'jquery-rails'
s.add_dependency 'mongoid'
s.add_dependency 'faraday'
s.add_dependency "domain_logic"
s.add_dependency "shared_ui"
s.add_development_dependency 'byebug'
s.add_development_dependency 'database_cleaner'
s.add_development_dependency 'rspec-rails', '2.99.0'
s.add_development_dependency 'vcr'
s.add_development_dependency 'webmock'
s.add_development_dependency 'capybara'
s.add_development_dependency 'poltergeist'
end
admin_ui/admin_ui.gemspec
source "https://rubygems.org"
gem 'domain_logic', path: '../domain_logic'
gem 'shared_ui', path: '../shared_ui'
# Declare your gem's dependencies in admin_ui.gemspec.
# Bundler will treat runtime dependencies like base
dependencies, and
# development dependencies will be added by default to the :
development group.
gemspec
admin_ui/Gemfile
require
require 'nokogiri'
require 'faraday'
manually require
domain_logic/lib/domain_logic.rb
the test dummy app
require File.expand_path("../dummy/config/environment", __FILE__)
admin_ui/spec/rails_helper.rb
admin_ui/spec/dummy/config/boot.rb
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
$LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
Rails.application.routes.draw do
mount AdminUi::Engine => "/admin_ui"
end
admin_ui/spec /dummy/config/routes.rb
Rails.application.routes.draw do
mount AdminUi::Engine => "/admin_ui"
end
admin_ui/spec /dummy/config/routes.rb
https://github.com/shageman/the_next_big_thing/blob/master/build.sh
#!/bin/bash
unset BUNDLE_GEMFILE
result=0
if [ "$CI" == "true" ]; then
BUNDLE_PATH="$HOME/vendor/bundle"
fi
for test_script in $(find . -name test.sh); do
pushd `dirname $test_script` > /dev/null
source "$HOME/.rvm/scripts/rvm"
rvm use $(cat .ruby-version)@$(cat .ruby-gemset)
./test.sh
result+=$?
popd > /dev/null
done
if [ $result -eq 0 ]; then
echo "☺ SUCCESS"
else
echo "☹ FAILURE"
fi
exit $result
testing multiple engines
require_dependency "admin_ui/application_controller"
module AdminUi
class CargosController < ApplicationController
namespace application controller
module AdminUi
class CargosController < AdminUi::ApplicationController
namespace application controller
module AdminUi
class VoyagesController < ApplicationController
namespace application controller
module AdminUi
class VoyagesController < ApplicationController
namespace application controller
scaffolding and other generators
rails generate scaffold_controller admin_ui/cargo source destination
weight --model-name=DomainLogic::Cargo --orm=mongoid -t=''
scaffolding and other generators
require_dependency "admin_ui/domain_logic/application_controller"
scaffolding and other generators
Failures:
1) Staff booking a cargo booking a cargo fitting a pending voyage
Failure/Error: visit '/admin/cargos'
LoadError:
No such file to load -- admin_ui/domain_logic/application_controller
# ./engines/admin_ui/app/controllers/admin_ui/cargos_controller.rb:1:in `<top (required)>'
# ./spec/features/book_cargo_spec.rb:12:in `block (2 levels) in <top (required)>'
Finished in 0.03067 seconds (files took 1.85 seconds to load)
2 examples, 1 failure
scaffolding and other generators
Failures:
1) Staff booking a cargo booking a cargo fitting a pending voyage
Failure/Error: visit '/admin/cargos'
RuntimeError:
Circular dependency detected while autoloading constant AdminUi::AdminUi::CargosHelper
# ./engines/admin_ui/app/controllers/admin_ui/application_controller.rb:2:in `<module:AdminUi>'
# ./engines/admin_ui/app/controllers/admin_ui/application_controller.rb:1:in `<top (required)>'
# ./engines/admin_ui/app/controllers/admin_ui/cargos_controller.rb:1:in `<top (required)>'
# ./spec/features/book_cargo_spec.rb:12:in `block (2 levels) in <top (required)>'
scaffolding and other generators
Failures:
1) Staff booking a cargo booking a cargo fitting a pending voyage
Failure/Error: visit '/admin/cargos'
ActionView::Template::Error:
undefined local variable or method `new_domain_logic_cargo_path' for #<#<Class:0x007fb38887bb38>:0x007fb388873690>
# ./engines/admin_ui/app/views/admin_ui/cargos/index.html.erb:29:in
`_engines_admin_ui_app_views_admin_ui_cargos_index_html_erb__4343322268368929370_70204533119300'
# ./spec/features/book_cargo_spec.rb:12:in `block (2 levels) in <top (required)>'
scaffolding and other generators
fang:domain_logic agenteo$ rails generate mongoid:config
/Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/mongoid-4.0.0/lib/rails/generators/mongoid/config/config_generator.rb:16:in `app_name': undefined
method `parent' for nil:NilClass (NoMethodError)
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/command.rb:27:in `run'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `block in invoke_all'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `each'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `map'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `invoke_all'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/group.rb:232:in `dispatch'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/base.rb:440:in `start'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/generators.rb:157:in `invoke'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/commands/generate.rb:11:in `<top (required)>'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/engine/commands.rb:19:in `require'
from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/engine/commands.rb:19:in `<top (required)>'
from bin/rails:12:in `require'
from bin/rails:12:in `<main>'
mongoid generators
FOLLOWUP READS
http://guides.rubyonrails.org/engines.html
https://leanpub.com/cbra
teotti.com/topics/component-based-rails-architecture
http://cbra.info/

More Related Content

What's hot

Rails Engines as a way to Micro services
Rails Engines as a way to Micro servicesRails Engines as a way to Micro services
Rails Engines as a way to Micro services
Lucas Alencar
 
Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular application
mirrec
 
6applets And Graphics
6applets And Graphics6applets And Graphics
6applets And GraphicsAdil Jafri
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
Masakuni Kato
 
Rails Engine Patterns
Rails Engine PatternsRails Engine Patterns
Rails Engine Patterns
Andy Maleh
 
15.exemplu complet eloquent view add-edit-delete-search
15.exemplu complet eloquent view add-edit-delete-search15.exemplu complet eloquent view add-edit-delete-search
15.exemplu complet eloquent view add-edit-delete-search
Razvan Raducanu, PhD
 
Arquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga EscalaArquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga Escala
Eduardo Shiota Yasuda
 
Curing Webpack Cancer
Curing Webpack CancerCuring Webpack Cancer
Curing Webpack Cancer
Neel Shah
 
Android swedroid
Android swedroidAndroid swedroid
Android swedroid
Johan Nilsson
 
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
Antonio Peric-Mazar
 
Modular and Event-Driven JavaScript
Modular and Event-Driven JavaScriptModular and Event-Driven JavaScript
Modular and Event-Driven JavaScript
Eduardo Shiota Yasuda
 
Devise and Rails
Devise and RailsDevise and Rails
Devise and Rails
William Leeper
 
Creating Your First WordPress Plugin
Creating Your First WordPress PluginCreating Your First WordPress Plugin
Creating Your First WordPress Plugin
Brad Williams
 
Redmine Betabeers SVQ
Redmine Betabeers SVQRedmine Betabeers SVQ
Redmine Betabeers SVQ
Ildefonso Montero
 
Baruco 2014 - Rubymotion Workshop
Baruco 2014 - Rubymotion WorkshopBaruco 2014 - Rubymotion Workshop
Baruco 2014 - Rubymotion WorkshopBrian Sam-Bodden
 
Rails 6 frontend frameworks
Rails 6 frontend frameworksRails 6 frontend frameworks
Rails 6 frontend frameworks
Eric Guo
 
Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...
 	Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W... 	Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...
Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...Robert Nyman
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP plugins
Pierre MARTIN
 
Building and managing java projects with maven part-III
Building and managing java projects with maven part-IIIBuilding and managing java projects with maven part-III
Building and managing java projects with maven part-III
princeirfancivil
 

What's hot (20)

Rails Engines as a way to Micro services
Rails Engines as a way to Micro servicesRails Engines as a way to Micro services
Rails Engines as a way to Micro services
 
Rails Engine | Modular application
Rails Engine | Modular applicationRails Engine | Modular application
Rails Engine | Modular application
 
6applets And Graphics
6applets And Graphics6applets And Graphics
6applets And Graphics
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
 
Rails Engine Patterns
Rails Engine PatternsRails Engine Patterns
Rails Engine Patterns
 
15.exemplu complet eloquent view add-edit-delete-search
15.exemplu complet eloquent view add-edit-delete-search15.exemplu complet eloquent view add-edit-delete-search
15.exemplu complet eloquent view add-edit-delete-search
 
Arquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga EscalaArquitetura de Front-end em Aplicações de Larga Escala
Arquitetura de Front-end em Aplicações de Larga Escala
 
Curing Webpack Cancer
Curing Webpack CancerCuring Webpack Cancer
Curing Webpack Cancer
 
Android swedroid
Android swedroidAndroid swedroid
Android swedroid
 
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
Workshop: Symfony2 Intruduction: (Controller, Routing, Model)
 
Modular and Event-Driven JavaScript
Modular and Event-Driven JavaScriptModular and Event-Driven JavaScript
Modular and Event-Driven JavaScript
 
Devise and Rails
Devise and RailsDevise and Rails
Devise and Rails
 
Juzu framework
Juzu frameworkJuzu framework
Juzu framework
 
Creating Your First WordPress Plugin
Creating Your First WordPress PluginCreating Your First WordPress Plugin
Creating Your First WordPress Plugin
 
Redmine Betabeers SVQ
Redmine Betabeers SVQRedmine Betabeers SVQ
Redmine Betabeers SVQ
 
Baruco 2014 - Rubymotion Workshop
Baruco 2014 - Rubymotion WorkshopBaruco 2014 - Rubymotion Workshop
Baruco 2014 - Rubymotion Workshop
 
Rails 6 frontend frameworks
Rails 6 frontend frameworksRails 6 frontend frameworks
Rails 6 frontend frameworks
 
Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...
 	Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W... 	Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...
Bringing the open web and APIs to mobile devices with Firefox OS - Whisky W...
 
Using and reusing CakePHP plugins
Using and reusing CakePHP pluginsUsing and reusing CakePHP plugins
Using and reusing CakePHP plugins
 
Building and managing java projects with maven part-III
Building and managing java projects with maven part-IIIBuilding and managing java projects with maven part-III
Building and managing java projects with maven part-III
 

Viewers also liked

Rentech Designs Introduction
Rentech Designs Introduction Rentech Designs Introduction
Rentech Designs Introduction
Retech Designs
 
APAC- Lessons from a digital immigrant
APAC- Lessons from a digital immigrantAPAC- Lessons from a digital immigrant
APAC- Lessons from a digital immigrantJeffrey Blais
 
اثر طرق المشاة في تحقيق بيئة مريحة
اثر طرق المشاة في تحقيق بيئة مريحةاثر طرق المشاة في تحقيق بيئة مريحة
اثر طرق المشاة في تحقيق بيئة مريحةSusan abed hasan
 
Noema Cooperating
Noema CooperatingNoema Cooperating
Noema Cooperating
Matej Slavič
 
Proceso de comunicación
Proceso de comunicaciónProceso de comunicación
Proceso de comunicación
Yesenia Hernández
 
How to set up and test a Rails 3 Engine
How to set up and test a Rails 3 EngineHow to set up and test a Rails 3 Engine
How to set up and test a Rails 3 Engine
nicholasf
 
Conheça os benefícios do amendoim
Conheça os benefícios do amendoimConheça os benefícios do amendoim
Conheça os benefícios do amendoim
amajulu
 
Trasparenza delle Lobby
Trasparenza delle LobbyTrasparenza delle Lobby
Trasparenza delle Lobby
Franco Spicciariello
 
Oncoimaging: prostate cancer
Oncoimaging: prostate cancerOncoimaging: prostate cancer
Oncoimaging: prostate cancer
Thorsang Chayovan
 
ITE-Journal-OpEd-April2015
ITE-Journal-OpEd-April2015ITE-Journal-OpEd-April2015
ITE-Journal-OpEd-April2015Vincent Mayeda
 
Dna-Repair
Dna-RepairDna-Repair
PCNL Simulation models
 PCNL Simulation  models PCNL Simulation  models
PCNL Simulation models
shankaruro84
 

Viewers also liked (13)

Rentech Designs Introduction
Rentech Designs Introduction Rentech Designs Introduction
Rentech Designs Introduction
 
APAC- Lessons from a digital immigrant
APAC- Lessons from a digital immigrantAPAC- Lessons from a digital immigrant
APAC- Lessons from a digital immigrant
 
اثر طرق المشاة في تحقيق بيئة مريحة
اثر طرق المشاة في تحقيق بيئة مريحةاثر طرق المشاة في تحقيق بيئة مريحة
اثر طرق المشاة في تحقيق بيئة مريحة
 
Noema Cooperating
Noema CooperatingNoema Cooperating
Noema Cooperating
 
Proceso de comunicación
Proceso de comunicaciónProceso de comunicación
Proceso de comunicación
 
How to set up and test a Rails 3 Engine
How to set up and test a Rails 3 EngineHow to set up and test a Rails 3 Engine
How to set up and test a Rails 3 Engine
 
GCU Diploma
GCU DiplomaGCU Diploma
GCU Diploma
 
Conheça os benefícios do amendoim
Conheça os benefícios do amendoimConheça os benefícios do amendoim
Conheça os benefícios do amendoim
 
Trasparenza delle Lobby
Trasparenza delle LobbyTrasparenza delle Lobby
Trasparenza delle Lobby
 
Oncoimaging: prostate cancer
Oncoimaging: prostate cancerOncoimaging: prostate cancer
Oncoimaging: prostate cancer
 
ITE-Journal-OpEd-April2015
ITE-Journal-OpEd-April2015ITE-Journal-OpEd-April2015
ITE-Journal-OpEd-April2015
 
Dna-Repair
Dna-RepairDna-Repair
Dna-Repair
 
PCNL Simulation models
 PCNL Simulation  models PCNL Simulation  models
PCNL Simulation models
 

Similar to feature flagging with rails engines v0.2

Lightening a component based Rails architecture
Lightening a component based Rails architectureLightening a component based Rails architecture
Lightening a component based Rails architecture
Enrico Teotti
 
Rest web service_with_spring_hateoas
Rest web service_with_spring_hateoasRest web service_with_spring_hateoas
Rest web service_with_spring_hateoas
Zeid Hassan
 
Desymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus BundlesDesymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus BundlesAlbert Jessurum
 
Symfony2 for Midgard Developers
Symfony2 for Midgard DevelopersSymfony2 for Midgard Developers
Symfony2 for Midgard Developers
Henri Bergius
 
Plug it on!... with railties
Plug it on!... with railtiesPlug it on!... with railties
Plug it on!... with railties
rails.mx
 
Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2
Sumy PHP User Grpoup
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request Flow
Vrann Tulika
 
Rails::Engine
Rails::EngineRails::Engine
Rails::Engine
Flavian Missi
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance JavascriptBeyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascript
aglemann
 
Love at first Vue
Love at first VueLove at first Vue
Love at first Vue
Dalibor Gogic
 
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)arcware
 
Rails engine
Rails engineRails engine
Rails engine
Jyaasa Technologies
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
Andréia Bohner
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
OdessaJS Conf
 
Creating your own framework on top of Symfony2 Components
Creating your own framework on top of Symfony2 ComponentsCreating your own framework on top of Symfony2 Components
Creating your own framework on top of Symfony2 Components
Deepak Chandani
 
Capifony. Minsk PHP MeetUp #11
Capifony. Minsk PHP MeetUp #11Capifony. Minsk PHP MeetUp #11
Capifony. Minsk PHP MeetUp #11
Yury Pliashkou
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
Lindsay Holmwood
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
Antônio Roberto Silva
 

Similar to feature flagging with rails engines v0.2 (20)

Lightening a component based Rails architecture
Lightening a component based Rails architectureLightening a component based Rails architecture
Lightening a component based Rails architecture
 
Rest web service_with_spring_hateoas
Rest web service_with_spring_hateoasRest web service_with_spring_hateoas
Rest web service_with_spring_hateoas
 
Rails engines
Rails enginesRails engines
Rails engines
 
Desymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus BundlesDesymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus Bundles
 
Symfony2 for Midgard Developers
Symfony2 for Midgard DevelopersSymfony2 for Midgard Developers
Symfony2 for Midgard Developers
 
Plug it on!... with railties
Plug it on!... with railtiesPlug it on!... with railties
Plug it on!... with railties
 
Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2Service approach for development REST API in Symfony2
Service approach for development REST API in Symfony2
 
Magento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request FlowMagento Live Australia 2016: Request Flow
Magento Live Australia 2016: Request Flow
 
Rails::Engine
Rails::EngineRails::Engine
Rails::Engine
 
The Rails Way
The Rails WayThe Rails Way
The Rails Way
 
Beyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance JavascriptBeyond DOMReady: Ultra High-Performance Javascript
Beyond DOMReady: Ultra High-Performance Javascript
 
Love at first Vue
Love at first VueLove at first Vue
Love at first Vue
 
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
10 Things Every Plugin Developer Should Know (WordCamp Atlanta 2013)
 
Rails engine
Rails engineRails engine
Rails engine
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
Maciej Treder ''Angular Universal - a medicine for the Angular + SEO/CDN issu...
 
Creating your own framework on top of Symfony2 Components
Creating your own framework on top of Symfony2 ComponentsCreating your own framework on top of Symfony2 Components
Creating your own framework on top of Symfony2 Components
 
Capifony. Minsk PHP MeetUp #11
Capifony. Minsk PHP MeetUp #11Capifony. Minsk PHP MeetUp #11
Capifony. Minsk PHP MeetUp #11
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
 

More from Enrico Teotti

Facilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdfFacilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdf
Enrico Teotti
 
Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023
Enrico Teotti
 
Facilitating online agile retrospectives
Facilitating online agile retrospectivesFacilitating online agile retrospectives
Facilitating online agile retrospectives
Enrico Teotti
 
Measure success in agile retrospectives
Measure success in agile retrospectivesMeasure success in agile retrospectives
Measure success in agile retrospectives
Enrico Teotti
 
Structured retros
Structured retrosStructured retros
Structured retros
Enrico Teotti
 
Build and maintain large ruby applications - LA Ruby Oct meetup
Build and maintain large ruby applications - LA Ruby Oct meetupBuild and maintain large ruby applications - LA Ruby Oct meetup
Build and maintain large ruby applications - LA Ruby Oct meetup
Enrico Teotti
 
3 things about public speaking
3 things about public speaking3 things about public speaking
3 things about public speaking
Enrico Teotti
 
Build and maintain large ruby applications Ruby Conf Australia 2016
Build and maintain large ruby applications Ruby Conf Australia 2016Build and maintain large ruby applications Ruby Conf Australia 2016
Build and maintain large ruby applications Ruby Conf Australia 2016
Enrico Teotti
 
Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1
Enrico Teotti
 
Mindset
MindsetMindset
Mindset
Enrico Teotti
 

More from Enrico Teotti (10)

Facilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdfFacilitating an online Agile Retrospective.pdf
Facilitating an online Agile Retrospective.pdf
 
Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023Build and maintain large Ruby applications 2023
Build and maintain large Ruby applications 2023
 
Facilitating online agile retrospectives
Facilitating online agile retrospectivesFacilitating online agile retrospectives
Facilitating online agile retrospectives
 
Measure success in agile retrospectives
Measure success in agile retrospectivesMeasure success in agile retrospectives
Measure success in agile retrospectives
 
Structured retros
Structured retrosStructured retros
Structured retros
 
Build and maintain large ruby applications - LA Ruby Oct meetup
Build and maintain large ruby applications - LA Ruby Oct meetupBuild and maintain large ruby applications - LA Ruby Oct meetup
Build and maintain large ruby applications - LA Ruby Oct meetup
 
3 things about public speaking
3 things about public speaking3 things about public speaking
3 things about public speaking
 
Build and maintain large ruby applications Ruby Conf Australia 2016
Build and maintain large ruby applications Ruby Conf Australia 2016Build and maintain large ruby applications Ruby Conf Australia 2016
Build and maintain large ruby applications Ruby Conf Australia 2016
 
Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1Build and maintain large Ruby apps 0.0.1
Build and maintain large Ruby apps 0.0.1
 
Mindset
MindsetMindset
Mindset
 

Recently uploaded

ASME IX(9) 2007 Full Version .pdf
ASME IX(9)  2007 Full Version       .pdfASME IX(9)  2007 Full Version       .pdf
ASME IX(9) 2007 Full Version .pdf
AhmedHussein950959
 
space technology lecture notes on satellite
space technology lecture notes on satellitespace technology lecture notes on satellite
space technology lecture notes on satellite
ongomchris
 
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
obonagu
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
Kamal Acharya
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
AmarGB2
 
H.Seo, ICLR 2024, MLILAB, KAIST AI.pdf
H.Seo,  ICLR 2024, MLILAB,  KAIST AI.pdfH.Seo,  ICLR 2024, MLILAB,  KAIST AI.pdf
H.Seo, ICLR 2024, MLILAB, KAIST AI.pdf
MLILAB
 
WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234
AafreenAbuthahir2
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
JoytuBarua2
 
ethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.pptethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.ppt
Jayaprasanna4
 
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
Amil Baba Dawood bangali
 
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptxCFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
R&R Consult
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
TeeVichai
 
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdfGoverning Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
WENKENLI1
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
MdTanvirMahtab2
 
MCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdfMCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdf
Osamah Alsalih
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
MLILAB
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Dr.Costas Sachpazis
 
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&BDesign and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Sreedhar Chowdam
 
Gen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdfGen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdf
gdsczhcet
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
Robbie Edward Sayers
 

Recently uploaded (20)

ASME IX(9) 2007 Full Version .pdf
ASME IX(9)  2007 Full Version       .pdfASME IX(9)  2007 Full Version       .pdf
ASME IX(9) 2007 Full Version .pdf
 
space technology lecture notes on satellite
space technology lecture notes on satellitespace technology lecture notes on satellite
space technology lecture notes on satellite
 
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
在线办理(ANU毕业证书)澳洲国立大学毕业证录取通知书一模一样
 
Final project report on grocery store management system..pdf
Final project report on grocery store management system..pdfFinal project report on grocery store management system..pdf
Final project report on grocery store management system..pdf
 
Investor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptxInvestor-Presentation-Q1FY2024 investor presentation document.pptx
Investor-Presentation-Q1FY2024 investor presentation document.pptx
 
H.Seo, ICLR 2024, MLILAB, KAIST AI.pdf
H.Seo,  ICLR 2024, MLILAB,  KAIST AI.pdfH.Seo,  ICLR 2024, MLILAB,  KAIST AI.pdf
H.Seo, ICLR 2024, MLILAB, KAIST AI.pdf
 
WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234WATER CRISIS and its solutions-pptx 1234
WATER CRISIS and its solutions-pptx 1234
 
Planning Of Procurement o different goods and services
Planning Of Procurement o different goods and servicesPlanning Of Procurement o different goods and services
Planning Of Procurement o different goods and services
 
ethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.pptethical hacking in wireless-hacking1.ppt
ethical hacking in wireless-hacking1.ppt
 
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
NO1 Uk best vashikaran specialist in delhi vashikaran baba near me online vas...
 
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptxCFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
CFD Simulation of By-pass Flow in a HRSG module by R&R Consult.pptx
 
Railway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdfRailway Signalling Principles Edition 3.pdf
Railway Signalling Principles Edition 3.pdf
 
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdfGoverning Equations for Fundamental Aerodynamics_Anderson2010.pdf
Governing Equations for Fundamental Aerodynamics_Anderson2010.pdf
 
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
Industrial Training at Shahjalal Fertilizer Company Limited (SFCL)
 
MCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdfMCQ Soil mechanics questions (Soil shear strength).pdf
MCQ Soil mechanics questions (Soil shear strength).pdf
 
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang,  ICLR 2024, MLILAB, KAIST AI.pdfJ.Yang,  ICLR 2024, MLILAB, KAIST AI.pdf
J.Yang, ICLR 2024, MLILAB, KAIST AI.pdf
 
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
Sachpazis:Terzaghi Bearing Capacity Estimation in simple terms with Calculati...
 
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&BDesign and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
Design and Analysis of Algorithms-DP,Backtracking,Graphs,B&B
 
Gen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdfGen AI Study Jams _ For the GDSC Leads in India.pdf
Gen AI Study Jams _ For the GDSC Leads in India.pdf
 
HYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generationHYDROPOWER - Hydroelectric power generation
HYDROPOWER - Hydroelectric power generation
 

feature flagging with rails engines v0.2

  • 1. deploying portions of a Rails app with Engines Enrico Teotti -- @agenteo
  • 2. admin user interface public user interface domain logic
  • 3. requirement run the private and public portions of the app on separate servers
  • 4. service oriented architecture first proposal http://teotti.com/rails-service-oriented-architecture-alternative-with-components/
  • 5. two apps sharing components via engines second proposal http://teotti.com/git-precommit-hooks-helping-local-ruby-gems-development/
  • 6. one app feature flagging engines components third proposal
  • 8. config/routes.rb Rails.application.routes.draw do case AppRunningMode.value when :admin mount AdminUi::Engine => "/" when :public mount PublicUi::Engine => "/" else mount AdminUi::Engine => "/" mount PublicUi::Engine => "/" end end
  • 9. RUNNING_MODE=public rails s RUNNING_MODE=admin rails s http://worldwideshipping-super-secret-domain.com/admin http://worldwideshipping.com rails s http://localhost:3000
  • 10. ● are ruby gems ● are special ruby gems that provide extra behaviour (models, views, routes, rake tasks) to a Rails application ● they can be hosted on a gemserver or they can live inside your repository ● can be tested in isolation rails engines
  • 11. admin user interface public user interface domain logic
  • 13. rails plugin new admin_ui --mountable --dummy=spec/dummy -O -T mv admin_ui components
  • 14. admin user interface public user interface domain logic admin_ui
  • 15. proceeding without automated tests could drive you crazy
  • 16. shared user interface (preview) shared domain admin_ui
  • 17. Rails.application.routes.draw do # ... public routes here mount AdminUi::Engine => "/" end config/routes.rb
  • 18. gem 'admin_ui', path: 'components/admin_ui' Gemfile
  • 21. rails plugin new public_ui --mountable --dummy=spec/dummy -O -T
  • 22. gem 'admin_ui', path: 'components/admin_ui' gem 'public_ui', path: 'components/public_ui' Gemfile
  • 24. Gem::Specification.new do |s| # ... other fields up here s.name = "public_ui" s.add_dependency "rails", "~> 4.1.1" s.add_dependency 'jquery-rails' s.add_dependency 'mongoid' s.add_runtime_dependency "admin_ui" s.add_development_dependency 'byebug' s.add_development_dependency 'database_cleaner' s.add_development_dependency 'rspec-rails', '2.99.0' s.add_development_dependency 'capybara' s.add_development_dependency 'poltergeist' end public_ui.gemspec
  • 25. Gem::Specification.new do |s| # ... other fields up here s.name = "public_ui" s.add_dependency "rails", "~> 4.1.1" s.add_dependency 'jquery-rails' s.add_dependency 'mongoid' s.add_runtime_dependency "admin_ui" s.add_development_dependency 'byebug' s.add_development_dependency 'database_cleaner' s.add_development_dependency 'rspec-rails', '2.99.0' s.add_development_dependency 'capybara' s.add_development_dependency 'poltergeist' end public_ui.gemspec
  • 26. Rails.application.routes.draw do case AppRunningMode.value when :admin mount AdminUi::Engine => "/" when :public mount PublicUi::Engine => "/" else mount AdminUi::Engine => "/" mount PublicUi::Engine => "/" end end config/routes.rb
  • 27. the two engines are now glued together!
  • 29. rails plugin new domain_logic --dummy-path=spec/dummy --mountable -O -T
  • 31. rails plugin new shared_ui --dummy-path=spec/dummy --mountable -O -T
  • 32. admin_ui/app/views/cargo_preview/show.html.erb <%# admin console stuff here %> <%= render partial: 'shared_ui/cargos/show' %> <%# admin spaceship here %> public_ui/app/views/cargos/show.html.erb <%= render partial: 'shared_ui/cargos/show' %>
  • 33. group :admin_app do path 'components' do gem 'admin_ui' gem 'legacy_migration' end end group :public_app do path 'components' do gem 'public_ui' end end Gemfile http://teotti.com/reduce-memory-footprint-requiring-portions-of-your-component-based-rails-applications/ http://teotti.com/gemfiles-hierarchy-in-ruby-on-rails-component-based-architecture/
  • 34. common pitfalls in Rails engines land
  • 35. Gemfile #gem 'domain_logic', path: 'components/domain_logic' #gem 'shared_ui', path: 'components/shared_ui' gem 'admin_ui', path: 'components/admin_ui' gem 'public_ui', path: 'components/public_ui'
  • 36. $ bundle Resolving dependencies... Could not find gem 'shared_ui (>= 0) ruby', which is required by gem 'admin_ui (>= 0) ruby', in any of the sources.
  • 37. Gem::Specification.new do |s| # ... other fields up here s.name = "admin_ui" s.add_dependency "rails", "~> 4.1.1" s.add_dependency 'jquery-rails' s.add_dependency 'mongoid' s.add_dependency 'faraday' s.add_dependency "domain_logic" s.add_dependency "shared_ui" s.add_development_dependency 'byebug' s.add_development_dependency 'database_cleaner' s.add_development_dependency 'rspec-rails', '2.99.0' s.add_development_dependency 'vcr' s.add_development_dependency 'webmock' s.add_development_dependency 'capybara' s.add_development_dependency 'poltergeist' end admin_ui.gemspec
  • 38. Gem::Specification.new do |s| # ... other fields up here s.name = "admin_ui" s.add_dependency "rails", "~> 4.1.1" s.add_dependency 'jquery-rails' s.add_dependency 'mongoid' s.add_dependency 'faraday' s.add_dependency "domain_logic" s.add_dependency "shared_ui" s.add_development_dependency 'byebug' s.add_development_dependency 'database_cleaner' s.add_development_dependency 'rspec-rails', '2.99.0' s.add_development_dependency 'vcr' s.add_development_dependency 'webmock' s.add_development_dependency 'capybara' s.add_development_dependency 'poltergeist' end admin_ui/admin_ui.gemspec
  • 39. source "https://rubygems.org" gem 'domain_logic', path: '../domain_logic' gem 'shared_ui', path: '../shared_ui' # Declare your gem's dependencies in admin_ui.gemspec. # Bundler will treat runtime dependencies like base dependencies, and # development dependencies will be added by default to the : development group. gemspec admin_ui/Gemfile
  • 41. require 'nokogiri' require 'faraday' manually require domain_logic/lib/domain_logic.rb
  • 43. require File.expand_path("../dummy/config/environment", __FILE__) admin_ui/spec/rails_helper.rb admin_ui/spec/dummy/config/boot.rb # Set up gems listed in the Gemfile. ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__) require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__) Rails.application.routes.draw do mount AdminUi::Engine => "/admin_ui" end admin_ui/spec /dummy/config/routes.rb
  • 44. Rails.application.routes.draw do mount AdminUi::Engine => "/admin_ui" end admin_ui/spec /dummy/config/routes.rb
  • 45. https://github.com/shageman/the_next_big_thing/blob/master/build.sh #!/bin/bash unset BUNDLE_GEMFILE result=0 if [ "$CI" == "true" ]; then BUNDLE_PATH="$HOME/vendor/bundle" fi for test_script in $(find . -name test.sh); do pushd `dirname $test_script` > /dev/null source "$HOME/.rvm/scripts/rvm" rvm use $(cat .ruby-version)@$(cat .ruby-gemset) ./test.sh result+=$? popd > /dev/null done if [ $result -eq 0 ]; then echo "☺ SUCCESS" else echo "☹ FAILURE" fi exit $result testing multiple engines
  • 46. require_dependency "admin_ui/application_controller" module AdminUi class CargosController < ApplicationController namespace application controller
  • 47. module AdminUi class CargosController < AdminUi::ApplicationController namespace application controller
  • 48. module AdminUi class VoyagesController < ApplicationController namespace application controller
  • 49. module AdminUi class VoyagesController < ApplicationController namespace application controller
  • 50. scaffolding and other generators
  • 51. rails generate scaffold_controller admin_ui/cargo source destination weight --model-name=DomainLogic::Cargo --orm=mongoid -t='' scaffolding and other generators
  • 53. Failures: 1) Staff booking a cargo booking a cargo fitting a pending voyage Failure/Error: visit '/admin/cargos' LoadError: No such file to load -- admin_ui/domain_logic/application_controller # ./engines/admin_ui/app/controllers/admin_ui/cargos_controller.rb:1:in `<top (required)>' # ./spec/features/book_cargo_spec.rb:12:in `block (2 levels) in <top (required)>' Finished in 0.03067 seconds (files took 1.85 seconds to load) 2 examples, 1 failure scaffolding and other generators
  • 54. Failures: 1) Staff booking a cargo booking a cargo fitting a pending voyage Failure/Error: visit '/admin/cargos' RuntimeError: Circular dependency detected while autoloading constant AdminUi::AdminUi::CargosHelper # ./engines/admin_ui/app/controllers/admin_ui/application_controller.rb:2:in `<module:AdminUi>' # ./engines/admin_ui/app/controllers/admin_ui/application_controller.rb:1:in `<top (required)>' # ./engines/admin_ui/app/controllers/admin_ui/cargos_controller.rb:1:in `<top (required)>' # ./spec/features/book_cargo_spec.rb:12:in `block (2 levels) in <top (required)>' scaffolding and other generators
  • 55. Failures: 1) Staff booking a cargo booking a cargo fitting a pending voyage Failure/Error: visit '/admin/cargos' ActionView::Template::Error: undefined local variable or method `new_domain_logic_cargo_path' for #<#<Class:0x007fb38887bb38>:0x007fb388873690> # ./engines/admin_ui/app/views/admin_ui/cargos/index.html.erb:29:in `_engines_admin_ui_app_views_admin_ui_cargos_index_html_erb__4343322268368929370_70204533119300' # ./spec/features/book_cargo_spec.rb:12:in `block (2 levels) in <top (required)>' scaffolding and other generators
  • 56. fang:domain_logic agenteo$ rails generate mongoid:config /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/mongoid-4.0.0/lib/rails/generators/mongoid/config/config_generator.rb:16:in `app_name': undefined method `parent' for nil:NilClass (NoMethodError) from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/command.rb:27:in `run' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `block in invoke_all' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `each' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `map' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/invocation.rb:133:in `invoke_all' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/group.rb:232:in `dispatch' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/thor-0.19.1/lib/thor/base.rb:440:in `start' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/generators.rb:157:in `invoke' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/commands/generate.rb:11:in `<top (required)>' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/engine/commands.rb:19:in `require' from /Users/agenteo/.rvm/gems/ruby-2.1.2@worldwide_shipping/gems/railties-4.1.4/lib/rails/engine/commands.rb:19:in `<top (required)>' from bin/rails:12:in `require' from bin/rails:12:in `<main>' mongoid generators
  • 57.
  • 58.