mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-26 08:16:26 +00:00
Crear posts, mover git a un servicio para poder tener acceso a usuarie
This commit is contained in:
parent
dcdf37a962
commit
603d0cfea7
9 changed files with 31 additions and 93 deletions
|
@ -14,7 +14,7 @@ class MetadataPath < MetadataTemplate
|
||||||
alias to_s value
|
alias to_s value
|
||||||
|
|
||||||
def relative
|
def relative
|
||||||
value.sub(site.path, '').sub(%r{^/}, '')
|
Pathname.new(value).relative_path_from(Pathname.new(site.path)).to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -41,6 +41,6 @@ class MetadataSlug < MetadataTemplate
|
||||||
def title
|
def title
|
||||||
return if post.title.try(:value).blank?
|
return if post.title.try(:value).blank?
|
||||||
|
|
||||||
post.title.try(:value).blank?
|
post.title.try(:value)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -188,57 +188,12 @@ class Post < OpenStruct
|
||||||
end
|
end
|
||||||
alias validate! validate
|
alias validate! validate
|
||||||
|
|
||||||
# Solo agregar el post al sitio una vez que lo guardamos
|
|
||||||
#
|
|
||||||
# TODO no sería la forma correcta de hacerlo en Rails
|
|
||||||
# def add_post_to_site!
|
|
||||||
# @site.jekyll.collections[@collection].docs << @post
|
|
||||||
# @site.jekyll.collections[@collection].docs.sort!
|
|
||||||
|
|
||||||
# unless @site.collections[@collection].include? self
|
|
||||||
# @site.collections[@collection] << self
|
|
||||||
# @site.collections[@collection].sort!
|
|
||||||
# end
|
|
||||||
# end
|
|
||||||
|
|
||||||
# Cambiar el nombre del archivo si cambió el título o la fecha.
|
|
||||||
# Como Jekyll no tiene métodos para modificar un Document, lo
|
|
||||||
# engañamos eliminando la instancia de @post y recargando otra.
|
|
||||||
def detect_file_rename!
|
|
||||||
return true unless basename_changed?
|
|
||||||
# No eliminamos el archivo a menos que ya exista el reemplazo!
|
|
||||||
return false unless File.exist? path
|
|
||||||
|
|
||||||
Rails.logger.info I18n.t('posts.logger.rm', path: path)
|
|
||||||
FileUtils.rm @post.path
|
|
||||||
# replace_post!
|
|
||||||
end
|
|
||||||
|
|
||||||
# Reemplaza el post en el sitio por uno nuevo
|
|
||||||
# TODO: refactorizar
|
|
||||||
# def replace_post!
|
|
||||||
# @old_post = @site.jekyll.collections[@lang].docs.delete @post
|
|
||||||
|
|
||||||
# new_post
|
|
||||||
# end
|
|
||||||
|
|
||||||
# Guarda los cambios en el archivo destino
|
# Guarda los cambios en el archivo destino
|
||||||
def write
|
def write
|
||||||
return true if persisted?
|
return true if persisted?
|
||||||
|
|
||||||
Site::Writer.new(site: site, file: path.absolute,
|
Site::Writer.new(site: site, file: path.absolute,
|
||||||
content: full_content, usuarie: usuarie,
|
content: full_content).save
|
||||||
message: title.value).save
|
|
||||||
end
|
|
||||||
|
|
||||||
# Devuelve le autore de un artículo
|
|
||||||
# XXX: Si se cambia le autore en el editor también cambia quién hace
|
|
||||||
# un cambio y se le puede asignar a cualquier otre.
|
|
||||||
# TODO: Mover la escritura a un servicio que combine escritura, commit
|
|
||||||
# y current_usuarie
|
|
||||||
def usuarie
|
|
||||||
OpenStruct.new(email: author.value.first,
|
|
||||||
name: author.value.first.split('@', 2).first)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Verifica si hace falta escribir cambios
|
# Verifica si hace falta escribir cambios
|
||||||
|
|
|
@ -35,7 +35,7 @@ class PostRelation < Array
|
||||||
def build_layout(layout = :post)
|
def build_layout(layout = :post)
|
||||||
return layout if layout.is_a? Layout
|
return layout if layout.is_a? Layout
|
||||||
|
|
||||||
site.layouts[symbol]
|
site.layouts[layout]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Devuelve una colección Jekyll que hace pasar el documento
|
# Devuelve una colección Jekyll que hace pasar el documento
|
||||||
|
|
|
@ -1,46 +1,29 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Site
|
# Se encarga de guardar los cambios en los archivos y mantenerlos
|
||||||
# Se encarga de guardar los cambios en los archivos y mantenerlos
|
# actualizados en git
|
||||||
# actualizados en git
|
Site::Writer = Struct.new(:site, :file, :content, keyword_init: true) do
|
||||||
class Writer
|
# TODO: si el archivo está bloqueado, esperar al desbloqueo
|
||||||
attr_reader :site, :file, :content, :usuarie, :message
|
def save
|
||||||
|
File.open(file, File::RDWR | File::CREAT, 0o640) do |f|
|
||||||
|
# Bloquear el archivo para que no sea accedido por otro
|
||||||
|
# proceso u otre editore
|
||||||
|
f.flock(File::LOCK_EX)
|
||||||
|
|
||||||
def initialize(site:, file:, content:, usuarie:, message:)
|
# Empezar por el principio
|
||||||
@site = site
|
f.rewind
|
||||||
@content = content
|
|
||||||
@file = file
|
|
||||||
@usuarie = usuarie
|
|
||||||
@message = message
|
|
||||||
end
|
|
||||||
|
|
||||||
# rubocop:disable Metrics/AbcSize
|
# Escribir el contenido
|
||||||
def save
|
f.write(content)
|
||||||
r = File.open(file, File::RDWR | File::CREAT, 0o640) do |f|
|
|
||||||
# Bloquear el archivo para que no sea accedido por otro
|
|
||||||
# proceso u otra editora
|
|
||||||
f.flock(File::LOCK_EX)
|
|
||||||
|
|
||||||
# Empezar por el principio
|
# Eliminar el resto
|
||||||
f.rewind
|
f.flush
|
||||||
|
f.truncate(f.pos)
|
||||||
|
end.zero?
|
||||||
|
end
|
||||||
|
|
||||||
# Escribir el contenido
|
# Devuelve la ruta relativa a la raíz del sitio
|
||||||
f.write(content)
|
def relative_file
|
||||||
|
Pathname.new(file).relative_path_from(Pathname.new(site.path)).to_s
|
||||||
# Eliminar el resto
|
|
||||||
f.flush
|
|
||||||
f.truncate(f.pos)
|
|
||||||
end
|
|
||||||
|
|
||||||
r.zero? && site.repository.commit(file: relative_file,
|
|
||||||
usuarie: usuarie,
|
|
||||||
message: message)
|
|
||||||
end
|
|
||||||
# rubocop:enable Metrics/AbcSize
|
|
||||||
|
|
||||||
# Devuelve la ruta relativa a la raíz del sitio
|
|
||||||
def relative_file
|
|
||||||
Pathname.new(file).relative_path_from(Pathname.new(site.path)).to_s
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
en:
|
en:
|
||||||
|
post_service:
|
||||||
|
created: 'Created "%{title}"'
|
||||||
metadata:
|
metadata:
|
||||||
array:
|
array:
|
||||||
cant_be_empty: 'This field cannot be empty'
|
cant_be_empty: 'This field cannot be empty'
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
es:
|
es:
|
||||||
|
post_service:
|
||||||
|
created: 'Creado "%{title}"'
|
||||||
metadata:
|
metadata:
|
||||||
array:
|
array:
|
||||||
cant_be_empty: 'El campo no puede estar vacío'
|
cant_be_empty: 'El campo no puede estar vacío'
|
||||||
|
|
|
@ -97,6 +97,4 @@ Al instanciar un `Post`, se pasan el sitio y la plantilla por defecto.
|
||||||
* Reimplementar glosario (se crea un artículo por cada categoría
|
* Reimplementar glosario (se crea un artículo por cada categoría
|
||||||
utilizada)
|
utilizada)
|
||||||
* Reimplementar orden de artículos (ver doc)
|
* Reimplementar orden de artículos (ver doc)
|
||||||
* Detectar cambio de nombre (fecha y slug)
|
|
||||||
* Crear artículos nuevos
|
|
||||||
* Convertir layout a params
|
* Convertir layout a params
|
||||||
|
|
|
@ -18,10 +18,7 @@ class PostTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
test 'se puede acceder a los valores' do
|
test 'se puede acceder a los valores' do
|
||||||
assert @site.posts.size.positive?
|
assert @site.posts.size.positive?
|
||||||
|
assert @post.title.value.size.positive?
|
||||||
assert @post.categories.values.size.positive?
|
|
||||||
assert @post.tags.values.size.positive?
|
|
||||||
assert @post.title.size.positive?
|
|
||||||
assert @post.content.size.positive?
|
assert @post.content.size.positive?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -168,5 +165,6 @@ class PostTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
assert post.new?
|
assert post.new?
|
||||||
assert post.save
|
assert post.save
|
||||||
|
assert File.exist?(post.path.absolute)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue