diff --git a/Gemfile.lock b/Gemfile.lock
index 794ce862..f94c3e01 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -62,7 +62,7 @@ GEM
bson (1.2.4)
bson_ext (1.2.4)
builder (2.1.2)
- bushido (0.0.11)
+ bushido (0.0.12)
highline (>= 1.6.1)
json (>= 1.4.6)
rest-client (>= 1.6.1)
@@ -125,7 +125,7 @@ GEM
net-ssh (~> 2.0.23)
nokogiri (~> 1.4.3.1)
ruby-hmac
- formatador (0.1.2)
+ formatador (0.1.3)
formtastic (1.2.3)
actionpack (>= 2.3.7)
activesupport (>= 2.3.7)
@@ -156,7 +156,7 @@ GEM
configuration (>= 0.0.5)
rake (>= 0.8.1)
linecache (0.43)
- linecache19 (0.5.11)
+ linecache19 (0.5.12)
ruby_core_source (>= 0.1.4)
locomotive_carrierwave (0.5.0.1.beta3)
activesupport (~> 3.0)
@@ -231,7 +231,7 @@ GEM
ruby-debug-base (~> 0.10.4.0)
ruby-debug-base (0.10.4)
linecache (>= 0.3)
- ruby-debug-base19 (0.11.24)
+ ruby-debug-base19 (0.11.25)
columnize (>= 0.3.1)
linecache19 (>= 0.5.11)
ruby_core_source (>= 0.1.4)
@@ -240,7 +240,7 @@ GEM
linecache19 (>= 0.5.11)
ruby-debug-base19 (>= 0.11.19)
ruby-hmac (0.4.0)
- ruby_core_source (0.1.4)
+ ruby_core_source (0.1.5)
archive-tar-minitar (>= 0.5.2)
rubyzip (0.9.4)
s3 (0.3.8)
diff --git a/app/controllers/admin/current_sites_controller.rb b/app/controllers/admin/current_sites_controller.rb
index b02b5e1b..a5c4d324 100644
--- a/app/controllers/admin/current_sites_controller.rb
+++ b/app/controllers/admin/current_sites_controller.rb
@@ -22,7 +22,7 @@ module Admin
end
def new_host_if_subdomain_changed
- if @site.domains.include?(request.host)
+ if !Locomotive.config.multi_sites? || @site.domains.include?(request.host)
{}
else
{ :host => "#{@site.subdomain}.#{Locomotive.config.default_domain}:#{request.port}" }
diff --git a/app/controllers/admin/installation_controller.rb b/app/controllers/admin/installation_controller.rb
index eeef0ca9..ab614bca 100644
--- a/app/controllers/admin/installation_controller.rb
+++ b/app/controllers/admin/installation_controller.rb
@@ -23,25 +23,23 @@ module Admin
def handle_get
case params[:step].to_i
- when 2 then @account = Account.new
- when 3 then @site = Site.new
+ when 1 then @account = Account.new
+ when 2 then @site = Site.new
end
render "step_#{params[:step]}"
end
def handle_post
case params[:step].to_i
- when 2 # create account
+ when 1 # create account
@account = Account.create(params[:account])
if @account.valid?
redirect_to admin_installation_step_url(3)
else
- render 'step_2'
+ render 'step_1'
end
- when 3 # create site
- @site = Site.new(params[:site])
- @site.memberships.build :account => Account.first, :admin => true
- @site.save
+ when 2 # create site
+ @site = Site.create_first_one(params[:site])
if @site.valid?
begin
@@ -52,19 +50,19 @@ module Admin
logger.error "Import failed because of #{e.message}"
end
- redirect_to admin_session_url(:host => Site.first.domains.first, :port => request.port)
+ redirect_to last_url
else
- render 'step_3'
+ render 'step_2'
end
end
end
def is_step_already_done?
case params[:step].to_i
- when 2 # already an account in db
+ when 1 # already an account in db
if Account.count > 0
- @step_done = t('admin.installation.step_2.done', Account.first.attributes)
- render 'step_2' and return false
+ @step_done = t('admin.installation.step_1.done', Account.first.attributes)
+ render 'step_1' and return false
end
else
true
@@ -75,5 +73,13 @@ module Admin
redirect_to admin_pages_url if Site.count > 0 && Account.count > 0
end
+ def last_url
+ if Locomotive.config.manage_domains?
+ admin_session_url(:host => Site.first.domains.first, :port => request.port)
+ else
+ admin_session_url
+ end
+ end
+
end
end
diff --git a/app/helpers/admin/sites_helper.rb b/app/helpers/admin/sites_helper.rb
index f5b686ab..c2a0444a 100644
--- a/app/helpers/admin/sites_helper.rb
+++ b/app/helpers/admin/sites_helper.rb
@@ -30,6 +30,10 @@ module Admin::SitesHelper
Locomotive.config.manage_subdomain? || Locomotive.config.manage_domains?
end
+ def manage_subdomain?
+ Locomotive.config.manage_subdomain?
+ end
+
def manage_domains?
Locomotive.config.manage_domains?
end
diff --git a/app/models/extensions/site/first_installation.rb b/app/models/extensions/site/first_installation.rb
new file mode 100644
index 00000000..a1eba9ac
--- /dev/null
+++ b/app/models/extensions/site/first_installation.rb
@@ -0,0 +1,18 @@
+module Extensions
+ module Site
+ module FirstInstallation
+
+ # only called during the installation workflow, just after the admin account has been created
+ def create_first_one(attributes)
+ site = self.new(attributes)
+
+ site.memberships.build :account => Account.first, :admin => true
+
+ site.save
+
+ site
+ end
+
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/models/extensions/site/subdomain_domains.rb b/app/models/extensions/site/subdomain_domains.rb
index 4896ea66..257933c0 100644
--- a/app/models/extensions/site/subdomain_domains.rb
+++ b/app/models/extensions/site/subdomain_domains.rb
@@ -3,7 +3,9 @@ module Extensions
module SubdomainDomains
def enable_subdomain_n_domains_if_multi_sites
- if Locomotive.config.multi_sites? || Locomotive.config.manage_subdomain_n_domains?
+ # puts "multi_sites? #{Locomotive.config.multi_sites?} / manage_domains? #{Locomotive.config.manage_domains?} / heroku? #{Locomotive.heroku?} / bushido? #{Locomotive.bushido?}"
+
+ if Locomotive.config.multi_sites? || Locomotive.config.manage_domains?
## fields ##
field :subdomain
@@ -15,7 +17,7 @@ module Extensions
## validations ##
validates_presence_of :subdomain
validates_uniqueness_of :subdomain
- validates_exclusion_of :subdomain, :in => Locomotive.config.multi_sites.reserved_subdomains
+ validates_exclusion_of :subdomain, :in => Locomotive.config.reserved_subdomains
validates_format_of :subdomain, :with => Locomotive::Regexps::SUBDOMAIN, :allow_blank => true
validate :domains_must_be_valid_and_unique
@@ -29,7 +31,6 @@ module Extensions
}
send :include, InstanceMethods
-
end
end
diff --git a/app/models/site.rb b/app/models/site.rb
index 85a2c020..dcd39942 100644
--- a/app/models/site.rb
+++ b/app/models/site.rb
@@ -4,6 +4,7 @@ class Site
## Extensions ##
extend Extensions::Site::SubdomainDomains
+ extend Extensions::Site::FirstInstallation
## fields ##
field :name
@@ -19,7 +20,7 @@ class Site
embeds_many :memberships
## validations ##
- validates_presence_of :name
+ validates_presence_of :name
## callbacks ##
after_create :create_default_pages!
diff --git a/app/views/admin/installation/step_1.html.haml b/app/views/admin/installation/step_1.html.haml
index 23c0d556..3448b25a 100644
--- a/app/views/admin/installation/step_1.html.haml
+++ b/app/views/admin/installation/step_1.html.haml
@@ -6,19 +6,21 @@
- content_for :head do
= include_stylesheets :installation
-.inner
- %p.explanations
- = t('.explanations')
+- if @step_done.blank?
+ = semantic_form_for(@account, :url => admin_installation_step_url(1)) do |f|
+ .inner
+ = f.inputs do
+ = f.input :name, :label => t('.name'), :required => false
+ = f.input :email, :label => t('.email'), :required => false
+ = f.input :password, :label => t('.password'), :required => false
+ = f.input :password_confirmation, :label => t('.password_confirmation'), :required => false
- %dl
- %dt!= t('.database.label', :name => Mongoid.config.database.name)
- %dd
- %p.notes!= t('.database.notes')
+ .footer
+ = box_button_tag t('.next')
+- else
+ .inner
+ %p.done
+ != @step_done
- %dt!= t('.default_domain.label', :name => Locomotive.config.default_domain)
- %dd
- %p.notes!= t('.default_domain.notes', :domain => Locomotive.config.default_domain)
-
-
-.footer
- = next_installation_step_link(2)
\ No newline at end of file
+ .footer
+ = next_installation_step_link(2)
\ No newline at end of file
diff --git a/app/views/admin/installation/step_2.html.haml b/app/views/admin/installation/step_2.html.haml
index 9d1d453d..26192eaa 100644
--- a/app/views/admin/installation/step_2.html.haml
+++ b/app/views/admin/installation/step_2.html.haml
@@ -6,21 +6,20 @@
- content_for :head do
= include_stylesheets :installation
-- if @step_done.blank?
- = semantic_form_for(@account, :url => admin_installation_step_url(2)) do |f|
- .inner
- = f.inputs do
- = f.input :name, :label => t('.name'), :required => false
- = f.input :email, :label => t('.email'), :required => false
- = f.input :password, :label => t('.password'), :required => false
- = f.input :password_confirmation, :label => t('.password_confirmation'), :required => false
-
- .footer
- = box_button_tag t('.next')
-- else
+= semantic_form_for(@site, :url => admin_installation_step_url(2), :html => { :multipart => true }) do |f|
.inner
- %p.done
- != @step_done
+ %p.explanations
+ != t('.explanations')
+
+ = f.inputs do
+ = f.input :name, :required => true
+
+ - if manage_subdomain?
+ = f.input :subdomain, :required => true
+
+ %li{ :class => 'string optional', :id => 'zipfile_input' }
+ %label{ :for => 'zipfile' }= t('formtastic.labels.import.new.source')
+ = file_field_tag 'zipfile'
.footer
- = next_installation_step_link(3)
\ No newline at end of file
+ = box_button_tag t('.next')
\ No newline at end of file
diff --git a/app/views/admin/installation/step_3.html.haml b/app/views/admin/installation/step_3.html.haml
deleted file mode 100644
index 1245ef83..00000000
--- a/app/views/admin/installation/step_3.html.haml
+++ /dev/null
@@ -1,23 +0,0 @@
-- content_for :head_title do
- = t('admin.installation.common.title')
-
-- title t('.title')
-
-- content_for :head do
- = include_stylesheets :installation
-
-= semantic_form_for(@site, :url => admin_installation_step_url(3), :html => { :multipart => true }) do |f|
- .inner
- %p.explanations
- != t('.explanations')
-
- = f.inputs do
- = f.input :name, :required => false
- = f.input :subdomain, :required => false
-
- %li{ :class => 'string optional', :id => 'zipfile_input' }
- %label{ :for => 'zipfile' }= t('formtastic.labels.import.new.source')
- = file_field_tag 'zipfile'
-
- .footer
- = box_button_tag t('.next')
\ No newline at end of file
diff --git a/app/views/admin/my_accounts/edit.html.haml b/app/views/admin/my_accounts/edit.html.haml
index c620186f..39f87074 100644
--- a/app/views/admin/my_accounts/edit.html.haml
+++ b/app/views/admin/my_accounts/edit.html.haml
@@ -22,15 +22,16 @@
= f.input :password, :input_html => { :autocomplete => "off" }
= f.input :password_confirmation, :input_html => { :autocomplete => "off" }
- = f.foldable_inputs :name => :sites, :class => 'sites off' do
- - @account.sites.each do |site|
- %li{ :class => 'item' }
- %strong= link_to site.name, main_site_url(site, :uri => true)
- %em= site.domains.join(', ')
+ - if multi_sites?
+ = f.foldable_inputs :name => :sites, :class => 'sites off' do
+ - @account.sites.each do |site|
+ %li{ :class => 'item' }
+ %strong= link_to site.name, main_site_url(site, :uri => true)
+ %em= site.domains.join(', ')
- - if admin_on?(site) && site != current_site
- %span{ :class => 'actions' }
- = link_to image_tag('admin/form/icons/trash.png'), admin_site_url(site), :class => 'remove first', :confirm => t('admin.messages.confirm'), :method => :delete
+ - if admin_on?(site) && site != current_site
+ %span{ :class => 'actions' }
+ = link_to image_tag('admin/form/icons/trash.png'), admin_site_url(site), :class => 'remove first', :confirm => t('admin.messages.confirm'), :method => :delete
= f.foldable_inputs :name => :language, :class => 'language' do
= f.custom_input :language, { :css => 'full', :with_label => false } do
diff --git a/config/locales/admin_ui.de.yml b/config/locales/admin_ui.de.yml
index 229f5114..f73ae696 100644
--- a/config/locales/admin_ui.de.yml
+++ b/config/locales/admin_ui.de.yml
@@ -273,23 +273,14 @@ de:
title: Erst-Installation von getbenga
next: Weiter
step_1:
- title: Schritt 1/3
- explanations: Dies ist der erste Schritt zur Installation von getbenga. Bitte lies die folgenden Texte genau durch.
- database:
- label: "Datenbank-Name: %{name}"
- notes: "All Verbindungseinstellungen für mongodb findest du in der config/mongoid.yml Datei."
- default_domain:
- label: "Standard Domain-Name: %{name}"
- notes: "Basically, Locomotive is a multi websites platform. Each site instance has a default entry, also called subdomain and based on the default domain name. Obviously, you are free to map other domains to your site instance working like aliases.
The default domain name value can be found in the config/initializers/locomotive.rb file."
- step_2:
- title: "Schritt 2/3 — Account erstellen"
+ title: "Schritt 1/2 — Account erstellen"
name: Account-Name
email: Email
password: Passwort
password_confirmation: Passwort-Bestätigung
done: "Du hast bereits einen Account hinzugefügt:
%{name}, %{email}"
next: Account erstellen
- step_3:
- title: "Schritt 3/3 — Erstelle deine erste Webseite"
+ step_2:
+ title: "Schritt 2/2 — Erstelle deine erste Webseite"
explanations: "Dies ist der letzte Schritt der Installation. Du kannst nun ein fertiges Template als zip-Datei hochladen. Hier findest du ein paar kostenlose Templates, die du gerne kostenlos verwenden kannst."
next: Webseite erstellen
\ No newline at end of file
diff --git a/config/locales/admin_ui.en.yml b/config/locales/admin_ui.en.yml
index 41374986..3ac41f6f 100644
--- a/config/locales/admin_ui.en.yml
+++ b/config/locales/admin_ui.en.yml
@@ -279,23 +279,14 @@ en:
title: First Locomotive Installation
next: Next
step_1:
- title: Step 1/3
- explanations: Here is the first step of the Locomotive installation. Please read carefully what is written below.
- database:
- label: "Database name: %{name}"
- notes: "All the mongodb connection settings can be found in the config/mongoid.yml file of your application."
- default_domain:
- label: "Default domain name: %{name}"
- notes: "Basically, Locomotive is a multi websites platform. Each site instance has a default entry, also called subdomain and based on the default domain name. Obviously, you are free to map other domains to your site instance working like aliases.
The default domain name value can be found in the config/initializers/locomotive.rb file."
- step_2:
- title: "Step 2/3 — Create account"
+ title: "Step 1/2 — Create account"
name: Account name
email: Email
password: Password
password_confirmation: Password confirmation
done: "You have already added an account:
%{name}, %{email}"
next: Create account
- step_3:
- title: "Step 3/3 — Create first site"
+ step_2:
+ title: "Step 2/2 — Create your first site"
explanations: "This is the last step of the installation. You can upload a theme as a zip file. We have free available themes here."
next: Create site
diff --git a/config/locales/admin_ui.fr.yml b/config/locales/admin_ui.fr.yml
index 7fd2f6d1..a8eb4aa1 100644
--- a/config/locales/admin_ui.fr.yml
+++ b/config/locales/admin_ui.fr.yml
@@ -278,25 +278,14 @@ fr:
title: Première installation de Locomotive
next: Suivant
step_1:
- title: "Étape 1/3"
- explanations: "Voici la première étape de l'installation de Locomotive. Veuillez lire attentivement ce qui est écrit ci-dessous."
- database:
- label: "Nom base de données: %{name}"
- notes: "Les paramètres de la connection à MongoDB se trouvent dans le fichier config/mongoid.yml de votre application."
- default_domain:
- label: "Nom du domaine par défaut: %{name}"
- notes:
- "Locomotive est une plate-forme multi-sites. Chaque instance de site a une entrée par défaut appelée aussi sous-domaine et qui est aussi fonction du nom de domaine par défaut. Evidemment, vous êtes libres d'associer d'autres noms de domaines, sortes d'alias.
-
La valeur du nom de domaine par défaut se trouve dans le fichier config/initializers/locomotive.rb."
- step_2:
- title: "Étape 2/3 — Créer un compte"
+ title: "Étape 1/2 — Créer un compte"
name: Nom du compte
email: E-mail
password: Mot de passe
password_confirmation: Confirmation mot de passe
done: "Vous avez déjà ajouté un compte:
%{name}, %{email}"
next: Créer compte
- step_3:
- title: "Étape 3/3 — Créer premier site"
+ step_2:
+ title: "Étape 2/2 — Créer votre premier site"
explanations: "C'est la dernière étape de l'installation. Vous pouvez uploader un theme sous forme d'un fichier zip. Nous avons quelques themes disponibles ici."
next: Créer site
\ No newline at end of file
diff --git a/config/locales/admin_ui.pt-BR.yml b/config/locales/admin_ui.pt-BR.yml
index ffd81f8a..dc0bcfcd 100644
--- a/config/locales/admin_ui.pt-BR.yml
+++ b/config/locales/admin_ui.pt-BR.yml
@@ -273,23 +273,14 @@ pt-BR:
title: Primeira instalação do Locomotive
next: Próximo
step_1:
- title: Passo 1/3
- explanations: "Este é o primeiro passo da instalação do Locomotive. Por favor , leia com atenção o que está escrito"
- database:
- label: "Nome da Base de Dados: %{name}"
- notes: "Todas as configurações de conexão do mongodb podem ser encontradas no arquivo config/mongoid.yml da sua aplicação."
- default_domain:
- label: "Domínio padrão: %{name}"
- notes: "Basicamente, Locomotive é uma plataforma multi-site. Cada instância de site tem uma entrada padrão, , também chamada de sub-domínio e baseada no dominio principal. Obviamente, você pode mapear outros domínios para a instância do seu site , como uma referência.
O nome do domínio principal pode ser encontrado no arquivo config/initializers/locomotive.rb."
- step_2:
- title: "Passo 2/3 — Criar conta"
+ title: "Passo 1/2 — Criar conta"
name: Nome da Conta
email: Email
password: Senha
password_confirmation: Confirmação da Senha
done: "Você ja adicionou uma conta com:
%{name}, %{email}"
next: Criar Conta
- step_3:
- title: "Passo 3/3 — Criar primeiro site"
+ step_2:
+ title: "Passo 2/2 — Criar primeiro site"
explanations: "Este é o último passo da instalação. Você pode enviar um tema como um arquivo zip. Nós temos alguns temas de graça para download aqui."
next: Criar Site
diff --git a/features/support/env.rb b/features/support/env.rb
index 32154b2e..27e29a37 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -44,4 +44,4 @@ Capybara.default_host = 'test.example.com'
require File.expand_path(File.dirname(__FILE__) + '/../../spec/support/carrierwave')
require File.expand_path(File.dirname(__FILE__) + '/../../spec/support/locomotive')
-Locomotive.configure_for_test
\ No newline at end of file
+Locomotive.configure_for_test(true)
\ No newline at end of file
diff --git a/lib/generators/locomotive/install/templates/locomotive.rb b/lib/generators/locomotive/install/templates/locomotive.rb
index 4d0baaa1..e4f13fba 100644
--- a/lib/generators/locomotive/install/templates/locomotive.rb
+++ b/lib/generators/locomotive/install/templates/locomotive.rb
@@ -5,16 +5,16 @@ Locomotive.configure do |config|
# your own domain name (ex: locomotivehosting.com).
#
# Ex:
- config.multi_sites do |multi_sites|
- # each new website you add will have a default entry based on a subdomain
- # and the multi_site_domain value (ex: website_1.locomotivehosting.com).
- multi_sites.domain = 'example.com' #'myhostingplatform.com'
-
- # define the reserved subdomains
- # Ex:
- multi_sites.reserved_subdomains = %w(www admin email blog webmail mail support help site sites)
- end
- # config.multi_sites = false
+ # config.multi_sites do |multi_sites|
+ # # each new website you add will have a default entry based on a subdomain
+ # # and the multi_site_domain value (ex: website_1.locomotivehosting.com).
+ # multi_sites.domain = 'example.com' #'myhostingplatform.com'
+ #
+ # # define the reserved subdomains
+ # # Ex:
+ # multi_sites.reserved_subdomains = %w(www admin email blog webmail mail support help site sites)
+ # end
+ config.multi_sites = false
# configure the hosting target for the production environment. Locomotive can be installed in:
# - your own server
diff --git a/lib/locomotive.rb b/lib/locomotive.rb
index dc427a27..c66572fc 100644
--- a/lib/locomotive.rb
+++ b/lib/locomotive.rb
@@ -44,6 +44,8 @@ module Locomotive
end
def self.after_configure
+ self.define_subdomain_and_domains_options
+
# multi sites support
self.configure_multi_sites
@@ -59,8 +61,6 @@ module Locomotive
:key => self.config.cookie_key
}
- self.define_subdomain_and_domains_options
-
# Load all the dynamic classes (custom fields)
begin
ContentType.all.collect(&:fetch_content_klass)
diff --git a/lib/locomotive/configuration.rb b/lib/locomotive/configuration.rb
index c80aa636..f73c8dbe 100644
--- a/lib/locomotive/configuration.rb
+++ b/lib/locomotive/configuration.rb
@@ -4,16 +4,12 @@ module Locomotive
@@defaults = {
:name => 'LocomotiveApp',
:domain => 'example.com',
- # :multi_sites => false,
- # :default_domain => 'example.com',
- # :reserved_subdomains => %w{www admin email blog webmail mail support help site sites},
+ :reserved_subdomains => %w{www admin email blog webmail mail support help site sites},
# :forbidden_paths => %w{layouts snippets stylesheets javascripts assets admin system api},
:reserved_slugs => %w{stylesheets javascripts assets admin images api pages edit},
:locales => %w{en de fr pt-BR},
:cookie_key => '_locomotive_session',
:enable_logs => false,
- # :heroku => false,
- # :bushido => false,
:hosting => :auto,
:delayed_job => true,
:default_locale => :en,
@@ -48,6 +44,18 @@ module Locomotive
self.manage_subdomain? && self.manage_domains?
end
+ def reserved_domains
+ if self.multi_sites?
+ if self.multi_sites.reserved_subdomains.blank?
+ @@defaults[:reserved_subdomains]
+ else
+ self.multi_sites.reserved_subdomains
+ end
+ else
+ []
+ end
+ end
+
def method_missing(name, *args, &block)
self.settings.send(name, *args, &block)
end
@@ -77,7 +85,14 @@ module Locomotive
# retrieves the specified key and yields it
# if a block is provided
def [](key, &block)
- block_given? ? yield(super(key)) : super(key)
+ if block_given?
+ self.delete(key) unless super(key).respond_to?(:keys)
+ yield(super(key))
+ else
+ super(key)
+ end
+
+ # block_given? ? yield(super(key)) : super(key)
end
# provides member-based access to keys
diff --git a/lib/locomotive/hosting/bushido.rb b/lib/locomotive/hosting/bushido.rb
index 915978ad..ffe9e020 100644
--- a/lib/locomotive/hosting/bushido.rb
+++ b/lib/locomotive/hosting/bushido.rb
@@ -1,5 +1,6 @@
require 'bushido'
require 'locomotive/hosting/bushido/custom_domain'
+require 'locomotive/hosting/bushido/first_installation'
module Locomotive
module Hosting
@@ -22,7 +23,7 @@ module Locomotive
end
def enable_bushido
- self.config.domain = ENV['APP_TLD']
+ self.config.domain = ENV['APP_TLD'] unless self.config.multi_sites?
self.enhance_site_model_with_bushido
@@ -32,6 +33,7 @@ module Locomotive
def enhance_site_model_with_bushido
Site.send :include, Locomotive::Hosting::Bushido::CustomDomain
+ Site.send :include, Locomotive::Hosting::Bushido::FirstInstallation
end
# manage domains
@@ -45,7 +47,6 @@ module Locomotive
end
end
-
def remove_bushido_domain(name)
Locomotive.logger "[remove bushido domain] #{name}"
::Bushido::App.remove_domain(name)
@@ -55,7 +56,6 @@ module Locomotive
end
end
-
def set_bushido_subdomain(name)
Locomotive.logger "[set bushido subdomain] #{name}.bushi.do"
::Bushido::App.set_subdomain(name)
diff --git a/lib/locomotive/hosting/bushido/custom_domain.rb b/lib/locomotive/hosting/bushido/custom_domain.rb
index 173913cf..b171b95f 100644
--- a/lib/locomotive/hosting/bushido/custom_domain.rb
+++ b/lib/locomotive/hosting/bushido/custom_domain.rb
@@ -6,10 +6,12 @@ module Locomotive
extend ActiveSupport::Concern
included do
-
validate :subdomain_availability
+ before_save :check_subdomain_change
+
after_save :add_bushido_domains
+ after_update :record_new_subdomain
after_destroy :remove_bushido_domains
alias_method_chain :add_subdomain_to_domains, :bushido
@@ -54,6 +56,17 @@ module Locomotive
end
end
+ def check_subdomain_change
+ @new_bushido_subdomain = !Locomotive.config.multi_sites? && self.subdomain_changed?
+ true
+ end
+
+ def record_new_subdomain
+ if @new_bushido_subdomain == true
+ Locomotive.set_bushido_subdomain(self.subdomain)
+ end
+ end
+
end
end
diff --git a/lib/locomotive/hosting/bushido/first_installation.rb b/lib/locomotive/hosting/bushido/first_installation.rb
new file mode 100644
index 00000000..0bdcc1e6
--- /dev/null
+++ b/lib/locomotive/hosting/bushido/first_installation.rb
@@ -0,0 +1,29 @@
+module Locomotive
+ module Hosting
+ module Bushido
+ module FirstInstallation
+
+ extend ActiveSupport::Concern
+
+ included do
+ class << self
+ alias_method_chain :create_first_one, :bushido
+ end
+ end
+
+ module ClassMethods
+
+ def create_first_one_with_bushido(attributes)
+ unless Locomotive.config.multi_sites?
+ attributes[:subdomain] = ENV['BUSHIDO_APP']
+ end
+
+ self.create_first_one_without_bushido(attributes)
+ end
+
+ end
+
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/locomotive/hosting/heroku.rb b/lib/locomotive/hosting/heroku.rb
index df04cacf..5b6366e9 100644
--- a/lib/locomotive/hosting/heroku.rb
+++ b/lib/locomotive/hosting/heroku.rb
@@ -1,6 +1,7 @@
require 'heroku'
require 'heroku/client'
require 'locomotive/hosting/heroku/custom_domain'
+require 'locomotive/hosting/heroku/first_installation'
module Locomotive
module Hosting
@@ -23,7 +24,7 @@ module Locomotive
end
def enable_heroku
- self.config.domain = 'heroku.com'
+ self.config.domain = 'heroku.com' unless self.config.multi_sites?
self.config.heroku ||= {}
self.config.heroku[:name] = ENV['APP_NAME']
@@ -47,6 +48,7 @@ module Locomotive
def enhance_site_model_with_heroku
Site.send :include, Locomotive::Hosting::Heroku::CustomDomain
+ Site.send :include, Locomotive::Hosting::Heroku::FirstInstallation
end
# manage domains
diff --git a/lib/locomotive/hosting/heroku/first_installation.rb b/lib/locomotive/hosting/heroku/first_installation.rb
new file mode 100644
index 00000000..7b17e682
--- /dev/null
+++ b/lib/locomotive/hosting/heroku/first_installation.rb
@@ -0,0 +1,29 @@
+module Locomotive
+ module Hosting
+ module Heroku
+ module FirstInstallation
+
+ extend ActiveSupport::Concern
+
+ included do
+
+ class << self
+ alias_method_chain :create_first_one, :heroku
+ end
+
+ end
+
+ module ClassMethods
+
+ def create_first_one_with_heroku(attributes)
+ attributes[:subdomain] = ENV['APP_NAME']
+
+ self.create_first_one_without_heroku(attributes)
+ end
+
+ end
+
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/lib/locomotive/routing/default_constraint.rb b/lib/locomotive/routing/default_constraint.rb
index 5d911c1b..5e1e5d0c 100644
--- a/lib/locomotive/routing/default_constraint.rb
+++ b/lib/locomotive/routing/default_constraint.rb
@@ -7,7 +7,7 @@ module Locomotive
domain, subdomain = domain_and_subdomain(request)
subdomain = 'www' if subdomain.blank?
- domain == Locomotive.config.domain && Locomotive.config.multi_sites.reserved_subdomains.include?(subdomain)
+ domain == Locomotive.config.domain && Locomotive.config.reserved_subdomains.include?(subdomain)
else
false
end
diff --git a/spec/lib/locomotive/bushido_spec.rb b/spec/lib/locomotive/bushido_spec.rb
new file mode 100644
index 00000000..faf60e88
--- /dev/null
+++ b/spec/lib/locomotive/bushido_spec.rb
@@ -0,0 +1,172 @@
+require 'spec_helper'
+
+describe 'Bushido support' do
+
+ before(:each) do
+ ::Bushido::App.stubs(:subdomain_available?).returns(true)
+ end
+
+ context '#loaded' do
+
+ it 'has method to enable bushido' do
+ Locomotive.respond_to?(:enable_bushido).should be_true
+ end
+
+ it 'tells bushido is disabled' do
+ Locomotive.bushido?.should be_false
+ end
+
+ it 'does not add instance methods to Site' do
+ Site.instance_methods.include?('add_bushido_domains').should be_false
+ Site.instance_methods.include?('remove_bushido_domains').should be_false
+ Site.methods.include?('create_first_one_with_bushido').should be_false
+ end
+
+ end
+
+ context '#disabled' do
+
+ before(:each) do
+ Locomotive.configure do |config|
+ config.hosting = :none
+ end
+ end
+
+ it 'tells bushido is disabled' do
+ Locomotive.bushido?.should be_false
+ end
+
+ it 'does not add methods to Site' do
+ Site.instance_methods.include?('add_bushido_domains').should be_false
+ Site.instance_methods.include?('remove_bushido_domains').should be_false
+ end
+
+ end
+
+ context '#enabled' do
+
+ it 'tells bushido is enabled from ENV' do
+ ENV['HOSTING_PLATFORM'] = 'bushido'
+ Locomotive.config.hosting = :auto
+ Locomotive.bushido?.should be_true
+ end
+
+ it 'adds a method to automatically create a site with Bushido settings' do
+ configure_locomotive_with_bushido
+ Site.methods.include?('create_first_one_with_bushido').should be_true
+ end
+
+ it 'tells bushido is enabled when forcing it' do
+ configure_locomotive_with_bushido
+ Locomotive.bushido?.should be_true
+ end
+
+ context 'enhancing site' do
+
+ before(:each) do
+ configure_locomotive_with_bushido
+ (@site = Factory.build(:site)).stubs(:valid?).returns(true)
+ end
+
+ it 'calls add_bushido_domains after saving a site' do
+ @site.expects(:add_bushido_domains)
+ @site.save
+ end
+
+ it 'calls remove_bushido_domains after saving a site' do
+ @site.expects(:remove_bushido_domains)
+ @site.destroy
+ end
+
+ context 'adding domain' do
+
+ it 'does not add new domain if no delta' do
+ ::Bushido::App.expects(:add_domain).never
+ @site.save
+ end
+
+ it 'adds a new domain if new one' do
+ @site.domains = ['www.acme.fr']
+ ::Bushido::App.expects(:add_domain).with('www.acme.fr')
+ @site.save
+ Locomotive.bushido_domains.should include('www.acme.fr')
+ end
+ end
+
+ context 'changing subdomain' do
+
+ it 'does not change it if not modified' do
+ ::Bushido::App.expects(:set_subdomain).never
+ @site.save
+ end
+
+ it 'does not change it if Locomotive is launched with multi sites' do
+ @site.save
+ @site.subdomain = 'rope'
+ ::Bushido::App.expects(:set_subdomain).never
+ @site.save
+ end
+
+ it 'changes the bushido name' do
+ configure_locomotive_with_bushido do |config|
+ config.multi_sites = false
+ end
+ @site.save
+ @site.subdomain = 'rope'
+ ::Bushido::App.expects(:set_subdomain).with('rope')
+ @site.save
+ end
+
+ end
+
+ context 'removing domain' do
+
+ it 'does not remove domain if no delta' do
+ ::Bushido::App.expects(:remove_domain).never
+ @site.destroy
+ end
+
+ it 'removes domains if we destroy a site' do
+ @site.stubs(:domains_without_subdomain).returns(['www.acme.com'])
+ ::Bushido::App.expects(:remove_domain).with('www.acme.com')
+ @site.destroy
+ Locomotive.bushido_domains.should_not include('www.acme.com')
+ end
+
+ it 'removes domain if removed' do
+ ::Bushido::App.stubs(:add_domain)
+ @site.domains = ['www.acme.fr']; @site.save
+ @site.domains = ['www.acme.com']
+ ::Bushido::App.expects(:remove_domain).with('www.acme.fr')
+ @site.save
+ Locomotive.bushido_domains.should_not include('www.acme.fr')
+ end
+
+ end
+
+ end
+
+ end
+
+ def configure_locomotive_with_bushido(&block)
+ ::Bushido::App.stubs(:subdomain).returns('locomotive')
+ ::Bushido::App.stubs(:domains).returns(['www.acme.com', 'example.com', 'www.example.com'])
+
+ Locomotive.configure do |config|
+ config.hosting = :bushido
+
+ block.call(config) if block_given?
+
+ Locomotive.define_subdomain_and_domains_options
+
+ Object.send(:remove_const, 'Site') if Object.const_defined?('Site')
+ load 'site.rb'
+ end
+ end
+
+ after(:all) do
+ ENV['HOSTING_PLATFORM'] = ENV['APP_TLD'] = nil
+ Locomotive.configure_for_test(true)
+ end
+
+end
diff --git a/spec/lib/locomotive/heroku_spec.rb b/spec/lib/locomotive/heroku_spec.rb
index daa32e24..dce6ff66 100644
--- a/spec/lib/locomotive/heroku_spec.rb
+++ b/spec/lib/locomotive/heroku_spec.rb
@@ -8,43 +8,44 @@ describe 'Heroku support' do
end
context '#loaded' do
-
+
it 'has method to enable heroku' do
Locomotive.respond_to?(:enable_heroku).should be_true
end
-
+
it 'tells heroku is disabled' do
Locomotive.heroku?.should be_false
end
-
+
it 'does not add instance methods to Site' do
- Site.instance_methods.include?(:add_heroku_domains).should be_false
- Site.instance_methods.include?(:remove_heroku_domains).should be_false
+ Site.instance_methods.include?('add_heroku_domains').should be_false
+ Site.instance_methods.include?('remove_heroku_domains').should be_false
+ Site.methods.include?('create_first_one_with_heroku').should be_false
end
-
+
end
-
+
context '#disabled' do
-
+
before(:each) do
Locomotive.configure do |config|
config.hosting = :none
end
end
-
+
it 'has a nil connection' do
Locomotive.heroku_connection.should be_nil
end
-
+
it 'tells heroku is disabled' do
Locomotive.heroku?.should be_false
end
-
+
it 'does not add methods to Site' do
- Site.instance_methods.include?(:add_heroku_domains).should be_false
- Site.instance_methods.include?(:remove_heroku_domains).should be_false
+ Site.instance_methods.include?('add_heroku_domains').should be_false
+ Site.instance_methods.include?('remove_heroku_domains').should be_false
end
-
+
end
context '#enabled' do
@@ -54,60 +55,65 @@ describe 'Heroku support' do
Locomotive.config.hosting = :auto
Locomotive.heroku?.should be_true
end
-
+
+ it 'adds a method to automatically create a site with Heroku settings' do
+ configure_locomotive_with_heroku
+ Site.methods.include?('create_first_one_with_heroku').should be_true
+ end
+
it 'tells heroku is enabled when forcing it' do
configure_locomotive_with_heroku
Locomotive.heroku?.should be_true
end
-
+
it 'raises an exception if no app name is given' do
lambda {
configure_locomotive_with_heroku(:name => nil)
}.should raise_error
end
-
+
context 'dealing with heroku connection' do
-
+
it 'opens a heroku connection with provided credentials' do
configure_locomotive_with_heroku
Locomotive.heroku_connection.user.should == 'john@doe.net'
Locomotive.heroku_connection.password.should == 'easyone'
end
-
+
it 'opens a heroku connection with env credentials' do
::Heroku::Client.any_instance.stubs(:list_domains).returns([])
ENV['HEROKU_LOGIN'] = 'john@doe.net'; ENV['HEROKU_PASSWORD'] = 'easyone'; ENV['APP_NAME'] = 'test'
- Locomotive.configure { |config| config.hosting = :heroku; config.heroku = {} }
+ Locomotive.configure { |config| config.hosting = :heroku; config.heroku = {} }
Locomotive.heroku_connection.user.should == 'john@doe.net'
Locomotive.heroku_connection.password.should == 'easyone'
end
-
+
end
-
+
context 'enhancing site' do
-
+
before(:each) do
configure_locomotive_with_heroku
(@site = Factory.build(:site)).stubs(:valid?).returns(true)
end
-
+
it 'calls add_heroku_domains after saving a site' do
@site.expects(:add_heroku_domains)
@site.save
end
-
+
it 'calls remove_heroku_domains after saving a site' do
@site.expects(:remove_heroku_domains)
@site.destroy
end
-
+
context 'adding domain' do
-
+
it 'does not add new domain if no delta' do
Locomotive.heroku_connection.expects(:add_domain).never
@site.save
end
-
+
it 'adds a new domain if new one' do
@site.domains = ['www.acme.fr']
Locomotive.heroku_connection.expects(:add_domain).with('locomotive', 'www.acme.fr')
@@ -115,21 +121,21 @@ describe 'Heroku support' do
Locomotive.heroku_domains.should include('www.acme.fr')
end
end
-
+
context 'removing domain' do
-
+
it 'does not remove domain if no delta' do
Locomotive.heroku_connection.expects(:remove_domain).never
@site.destroy
end
-
+
it 'removes domains if we destroy a site' do
@site.stubs(:domains_without_subdomain).returns(['www.acme.com'])
Locomotive.heroku_connection.expects(:remove_domain).with('locomotive', 'www.acme.com')
@site.destroy
Locomotive.heroku_domains.should_not include('www.acme.com')
end
-
+
it 'removes domain if removed' do
@site.domains = ['www.acme.fr']; @site.save
@site.domains = ['www.acme.com']
@@ -137,11 +143,11 @@ describe 'Heroku support' do
@site.save
Locomotive.heroku_domains.should_not include('www.acme.fr')
end
-
+
end
-
+
end
-
+
end
def configure_locomotive_with_heroku(options = {}, domains = nil)
@@ -150,20 +156,25 @@ describe 'Heroku support' do
else
ENV['APP_NAME'] = 'locomotive'
end
-
+
::Heroku::Client.any_instance.stubs(:list_domains).with(ENV['APP_NAME']).returns(domains || [
{ :domain => "www.acme.com" }, { :domain => "example.com" }, { :domain => "www.example.com" }
])
-
+
Locomotive.configure do |config|
config.hosting = :heroku
config.heroku = { :login => 'john@doe.net', :password => 'easyone' }.merge(options)
- end
+
+ Locomotive.define_subdomain_and_domains_options
+
+ Object.send(:remove_const, 'Site') if Object.const_defined?('Site')
+ load 'site.rb'
+ end
end
-
+
after(:all) do
ENV['HEROKU_SLUG'] = ENV['APP_NAME'] = ENV['HEROKU_LOGIN'] = ENV['HEROKU_PASSWORD'] = nil
- Locomotive.configure_for_test
+ Locomotive.configure_for_test(true)
end
end
diff --git a/spec/models/site_spec.rb b/spec/models/site_spec.rb
index a614dce8..211f3647 100644
--- a/spec/models/site_spec.rb
+++ b/spec/models/site_spec.rb
@@ -2,10 +2,6 @@ require 'spec_helper'
describe Site do
- before(:each) do
- Locomotive.stubs(:add_heroku_domain).returns(true)
- end
-
it 'should have a valid factory' do
Factory.build(:site).should be_valid
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 46b859e8..b7d0db24 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,11 +1,11 @@
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
-require File.expand_path("../../config/environment", __FILE__)
+require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
-Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
+Dir[Rails.root.join('spec/support/**/*.rb')].each {|f| require f}
Locomotive.configure_for_test
@@ -34,7 +34,7 @@ RSpec.configure do |config|
require 'database_cleaner'
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
- DatabaseCleaner.orm = "mongoid"
+ DatabaseCleaner.orm = 'mongoid'
end
config.before(:each) do
diff --git a/spec/support/locomotive.rb b/spec/support/locomotive.rb
index c87a59c4..d3602ab8 100644
--- a/spec/support/locomotive.rb
+++ b/spec/support/locomotive.rb
@@ -1,10 +1,22 @@
-def Locomotive.configure_for_test
+def Locomotive.configure_for_test(force = false)
Locomotive.configure do |config|
config.multi_sites do |multi_sites|
multi_sites.domain = 'example.com'
multi_sites.reserved_subdomains = %w(www admin email blog webmail mail support help site sites)
end
+
config.hosting = :none
+
config.enable_logs = true
+
+ if force
+ Locomotive.define_subdomain_and_domains_options
+
+ Object.send(:remove_const, 'Site') if Object.const_defined?('Site')
+ load 'site.rb'
+
+ Factory.factories.clear
+ load File.join(Rails.root, 'spec', 'factories.rb')
+ end
end
end
\ No newline at end of file