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