WIP de reordenar posts

This commit is contained in:
f 2018-04-27 15:48:26 -03:00
parent 7d4f17f51c
commit a09f049c20
No known key found for this signature in database
GPG key ID: F3FDAB97B5F9F7E7
8 changed files with 136 additions and 9 deletions

View file

@ -70,6 +70,16 @@ class Post
@post.nil? || !File.exist?(@post.try(:path)) @post.nil? || !File.exist?(@post.try(:path))
end end
# El número de orden del artículo, si no tiene uno, se le asigna la
# posición en la colección de artículos
def order
get_front_matter 'order'
end
def is_ordered?
!order.nil?
end
# Determina si fue traducido, buscando los slugs de su front_matter # Determina si fue traducido, buscando los slugs de su front_matter
# lang en otras colecciones # lang en otras colecciones
def translated? def translated?

View file

@ -69,11 +69,7 @@ class Site
# Los posts de este sitio, si el sitio está traducido, trae los posts # Los posts de este sitio, si el sitio está traducido, trae los posts
# del idioma actual, porque _posts va a estar vacío # del idioma actual, porque _posts va a estar vacío
def posts def posts
@posts ||= if i18n? @posts ||= posts_for('posts')
posts_for(I18n.locale.to_s)
else
posts_for('posts')
end
end end
# Obtiene todos los posts de una colección determinada # Obtiene todos los posts de una colección determinada
@ -82,6 +78,10 @@ class Site
def posts_for(collection) def posts_for(collection)
return unless @jekyll.config['collections'].key? collection return unless @jekyll.config['collections'].key? collection
# Si pedimos 'posts' pero estamos en un sitio traducido, traemos el
# idioma actual
collection = I18n.locale.to_s if collection == 'posts' && i18n?
_collection = @collections[collection] _collection = @collections[collection]
return _collection if _collection return _collection if _collection
@ -189,6 +189,25 @@ class Site
end end
alias :dequeue! :dequeue alias :dequeue! :dequeue
# Verifica si los posts están ordenados
def ordered?(collection = 'posts')
posts_for(collection).map do |p|
p.order
end.all?
end
# Reordena la colección usando la posición actual de los artículos y
# guarda los cambios
def reorder_collection!(collection = 'posts')
posts_for(collection).each_with_index do |p, i|
p.update_attributes order: i
p.save
end
true
end
alias :reorder_posts! :reorder_collection!
# El directorio donde se almacenan los sitios # El directorio donde se almacenan los sitios
def self.site_path def self.site_path
File.join(Rails.root, '_sites') File.join(Rails.root, '_sites')

View file

@ -2,3 +2,5 @@
* Convertir Site y Post en adaptadores de ActiveRecord, para que podamos * Convertir Site y Post en adaptadores de ActiveRecord, para que podamos
trabajar de la forma Rails (con asociaciones, etc.) trabajar de la forma Rails (con asociaciones, etc.)
O tal vez solo extender Array con SiteCollection o algo así

View file

@ -117,3 +117,18 @@ cambios mínimos.
También podemos tomar todo el set original de fechas y asociarselo al También podemos tomar todo el set original de fechas y asociarselo al
orden nuevo de posts. Las fechas se mantienen igual, pero cambia el orden nuevo de posts. Las fechas se mantienen igual, pero cambia el
orden de los posts. orden de los posts.
Qué pasa cuando dos o más artículos comparten la misma fecha?
Normalmente se ordenan por nombre, pero en este algoritmo no entra ese
orden, se asume que siempre están una fecha adelante o atrás
---
Todos los posts tienen un campo order.
El orden se actualiza en base al orden cronologico.
En la plantilla se puede ordenar cronólogicamente o por orden numérico.
Es más simple de implementar y no tiene comportamientos inesperados,
como "por qué cambió de fecha?"

30
test/models/post_test.rb Normal file
View file

@ -0,0 +1,30 @@
require 'test_helper'
class PostTest < ActiveSupport::TestCase
setup do
@user = Usuaria.find('f@kefir.red')
@path = File.join(Site.site_path_for(@user), 'cyber-women.com')
@site = @user.sites.select { |s| s.name == 'cyber-women.com' }.first
@post = @site.posts.sample
end
test 'El post no es nuevo si ya existe' do
assert_not @post.new?
end
test 'El post está traducido' do
assert @post.translated?
end
test 'El post tiene un título' do
assert String, @post.title.class
end
test 'El post tiene una fecha' do
assert DateTime, @post.date.class
end
test 'Es obvio que un post recién cargado es válido' do
assert @post.valid?
end
end

27
test/models/site_test.rb Normal file
View file

@ -0,0 +1,27 @@
require 'test_helper'
class SiteTest < ActiveSupport::TestCase
setup do
@user = Usuaria.find('f@kefir.red')
@path = File.join(Site.site_path_for(@user), 'cyber-women.com')
reset_git_repo(@path)
@site = @user.sites.select { |s| s.name == 'cyber-women.com' }.first
@site.read
end
test "El directorio es un sitio jekyll" do
assert Site.jekyll?(@path)
end
test 'Un directorio se puede cargar como un sitio Jekyll' do
jekyll = Site.load_jekyll @path
assert_equal Jekyll::Site, jekyll.class
end
test 'Los artículos no están ordenados si a alguno le falta orden' do
assert_not @site.ordered?
assert @site.reorder_collection!
assert @site.ordered?
end
end

View file

@ -0,0 +1,18 @@
require 'test_helper'
class UsuariaTest < ActiveSupport::TestCase
setup do
@mail = 'f@kefir.red'
@usuaria = Usuaria.find(@mail)
end
test "La usuaria puede encontrarse por su mail" do
assert_equal @mail, @usuaria.username
end
test "La usuaria tiene sitios" do
@usuaria.sites.each do |s|
assert_equal Site, s.class
end
end
end

View file

@ -1,9 +1,15 @@
require File.expand_path('../../config/environment', __FILE__) require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help' require 'rails/test_help'
require 'open3'
class ActiveSupport::TestCase class ActiveSupport::TestCase
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. # Resetear el repositorio a su estado original antes de leerlo
fixtures :all def reset_git_repo(path)
Dir.chdir(path) do
# Add more helper methods to be used by all tests here... Open3::popen3('git reset --hard') do |_, _, _, thread|
# Wait for the process to finish
thread.value
end
end
end
end end