agregar distintas formas de deploy a un sitio

This commit is contained in:
f 2019-07-25 15:51:32 -03:00
parent 7570abaf1a
commit b561cacda4
No known key found for this signature in database
GPG key ID: 2AE5A13E321F953D
11 changed files with 145 additions and 7 deletions

View file

@ -44,6 +44,7 @@ Metrics/ClassLength:
Exclude: Exclude:
- 'app/models/site.rb' - 'app/models/site.rb'
- 'app/controllers/posts_controller.rb' - 'app/controllers/posts_controller.rb'
- 'app/controllers/sites_controller.rb'
Lint/HandleExceptions: Lint/HandleExceptions:
Exclude: Exclude:

View file

@ -23,6 +23,9 @@ class SitesController < ApplicationController
def new def new
@site = Site.new @site = Site.new
authorize @site authorize @site
@site.deploys.build type: 'DeployLocal'
@site.deploys.build type: 'DeployZip'
end end
def create def create
@ -137,6 +140,10 @@ class SitesController < ApplicationController
private private
def site_params def site_params
params.require(:site).permit(:name, :design_id, :licencia_id) params.require(:site)
.permit(:name, :design_id, :licencia_id,
deploys_attributes: %i[
type id _destroy
])
end end
end end

View file

@ -57,7 +57,7 @@ class DeployLocal < Deploy
end end
def fqdn! def fqdn!
self.fqdn ||= "#{site.name}.#{ENV.fetch('SUTTY', 'sutty.nl')}" self.fqdn ||= "#{site.name}.#{Site.domain}"
end end
def destination! def destination!

View file

@ -30,7 +30,7 @@ class DeployZip < Deploy
# Copiamos de DeployLocal para no cargar todos los métodos de # Copiamos de DeployLocal para no cargar todos los métodos de
# compilación... # compilación...
def fqdn! def fqdn!
self.fqdn ||= "#{site.name}.#{ENV.fetch('SUTTY', 'sutty.nl')}" self.fqdn ||= "#{site.name}.#{Site.domain}"
end end
def destination! def destination!

View file

@ -8,6 +8,8 @@ class Site < ApplicationRecord
validates :name, uniqueness: true, hostname: true validates :name, uniqueness: true, hostname: true
validates :design_id, presence: true validates :design_id, presence: true
validate :deploy_local_presence
friendly_id :name, use: %i[finders] friendly_id :name, use: %i[finders]
belongs_to :design belongs_to :design
@ -33,6 +35,8 @@ class Site < ApplicationRecord
attr_accessor :jekyll, :collections attr_accessor :jekyll, :collections
accepts_nested_attributes_for :deploys, allow_destroy: true
# El repositorio git para este sitio # El repositorio git para este sitio
def repository def repository
@repository ||= Site::Repository.new path @repository ||= Site::Repository.new path
@ -370,6 +374,10 @@ class Site < ApplicationRecord
Jekyll::Site.new(config) Jekyll::Site.new(config)
end end
def self.domain
ENV.fetch('SUTTY', 'sutty.nl')
end
private private
# Clona el esqueleto de Sutty para crear el sitio nuevo, no pasa nada # Clona el esqueleto de Sutty para crear el sitio nuevo, no pasa nada
@ -399,4 +407,17 @@ class Site < ApplicationRecord
FileUtils.mv old_path, path FileUtils.mv old_path, path
end end
# Valida si el sitio tiene al menos una forma de alojamiento asociada
# y es la local
#
# TODO: Volver opcional el alojamiento local, pero ahora mismo está
# atado a la generación del sitio así que no puede faltar
def deploy_local_presence
# Usamos size porque queremos saber la cantidad de deploys sin
# guardar también
return if deploys.size.positive? && deploys.map(&:type).include?('DeployLocal')
errors.add(:deploys, I18n.t('activerecord.errors.models.site.attributes.deploys.deploy_local_presence'))
end
end end

View file

@ -0,0 +1,14 @@
-#
Formulario para alojamiento local. Como el alojamiento local no es
opcional aun, solo enviamos el tipo con el formulario, no necesitamos
nada más.
.row
.col
%h3= t('.title')
- name = site.name || t('.ejemplo')
= sanitize_markdown t('.help',
fqdn: deploy.object.fqdn || "#{name}.#{Site.domain}"),
tags: %w[p strong em a]
= deploy.hidden_field :type

View file

@ -0,0 +1,21 @@
-# Formulario para "alojar" en un zip
.row
.col
= deploy.hidden_field :id
= deploy.hidden_field :type
%h3
-#
El checkbox invierte la lógica de destrucción porque queremos
crear el deploy si está activado y destruirlo si está
desactivado.
= deploy.check_box :_destroy,
{ checked: deploy.object.persisted? },
'0', '1'
= deploy.label :_destroy, t('.title')
-# TODO: secar la generación de URLs
- name = site.name || t('.ejemplo')
= sanitize_markdown t('.help',
fqdn: deploy.object.fqdn || "#{name}.#{Site.domain}",
file: deploy.object.file || "#{name}.zip"),
tags: %w[p strong em a]

View file

@ -46,5 +46,14 @@
%hr/ %hr/
.form-group
%h2= t('.deploys.title')
%p.lead= t('.help.deploys')
= f.fields_for :deploys do |deploy|
= render "deploys/#{deploy.object.type.underscore}",
deploy: deploy, site: site
%hr/
.form-group .form-group
= f.submit submit, class: 'btn btn-success' = f.submit submit, class: 'btn btn-success'

View file

@ -11,6 +11,10 @@ es:
name: 'Nombre' name: 'Nombre'
errors: errors:
models: models:
site:
attributes:
deploys:
deploy_local_presence: '¡Necesitamos poder generar el sitio!'
invitadx: invitadx:
attributes: attributes:
email: email:
@ -145,6 +149,25 @@ es:
lang: 'Idioma' lang: 'Idioma'
logout: 'Salir' logout: 'Salir'
error: 'Hubo un error al iniciar la sesión. ¿Escribiste bien tus credenciales?' error: 'Hubo un error al iniciar la sesión. ¿Escribiste bien tus credenciales?'
deploys:
deploy_local:
title: 'Alojar en Sutty'
help: |
El sitio estará disponible en <https://%{fqdn}/>.
Estamos desarrollando la posibilidad de agregar tus propios
dominios, ¡ayudanos!
ejemplo: 'ejemplo'
deploy_zip:
title: 'Generar un archivo ZIP'
help: |
Los archivos ZIP contienen y comprimen todos los archivos de tu
sitio. Con esta opción podrás descargar y compartir tu sitio
entero a través de la dirección <https://%{fqdn}/%{file}> y
guardarla como copia de seguridad o una estrategia de
alojamiento solidario, donde muchas personas comparten una copia
de tu sitio.
ejemplo: 'ejemplo'
sites: sites:
actions: 'Acciones' actions: 'Acciones'
posts: 'Ver y editar artículos' posts: 'Ver y editar artículos'
@ -171,6 +194,11 @@ es:
de autore. Esto significa que nadie puede hacer uso de nuestras de autore. Esto significa que nadie puede hacer uso de nuestras
obras sin permiso explícito. Con las licencias establecemos obras sin permiso explícito. Con las licencias establecemos
condiciones bajo las que queremos compartir.' condiciones bajo las que queremos compartir.'
deploys: |
Sutty te permite alojar tu sitio en distintos lugares al mismo
tiempo. Esta estrategia facilita que el sitio esté disponible
aun cuando algunos de los alojamientos no funcionen.
design: design:
title: 'Diseño' title: 'Diseño'
actions: 'Información sobre este diseño' actions: 'Información sobre este diseño'
@ -179,6 +207,8 @@ es:
licencia: licencia:
title: 'Licencia del sitio y todo lo que se publique' title: 'Licencia del sitio y todo lo que se publique'
url: 'Leer la licencia' url: 'Leer la licencia'
deploys:
title: '¿Dónde querés alojar tu sitio?'
fetch: fetch:
title: 'Actualizar el sitio' title: 'Actualizar el sitio'
help: help:

View file

@ -35,13 +35,40 @@ class SitesControllerTest < ActionDispatch::IntegrationTest
site: { site: {
name: name, name: name,
design_id: create(:design).id, design_id: create(:design).id,
licencia_id: create(:licencia).id licencia_id: create(:licencia).id,
deploys_attributes: {
'0' => {
type: 'DeployLocal'
}
}
} }
} }
assert_nothing_raised do site = Site.find_by_name(name)
site = Site.find_by_name(name)
site.destroy assert site
assert_equal @usuarie.email, site.roles.first.usuarie.email
assert_equal 'usuarie', site.roles.first.rol
site.destroy
end
test 'no se pueden crear con cualquier deploy' do
name = SecureRandom.hex
assert_raise ActiveRecord::SubclassNotFound do
post sites_url, headers: @authorization, params: {
site: {
name: name,
design_id: create(:design).id,
licencia_id: create(:licencia).id,
deploys_attributes: {
'0' => {
type: 'DeployNoExiste'
}
}
}
}
end end
end end
end end

View file

@ -5,5 +5,13 @@ FactoryBot.define do
name { "test-#{SecureRandom.hex}" } name { "test-#{SecureRandom.hex}" }
design design
licencia licencia
after :build do |site|
site.deploys << build(:deploy_local, site: site)
end
after :create do |site|
site.deploys << create(:deploy_local, site: site)
end
end end
end end