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))
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
# lang en otras colecciones
def translated?

View file

@ -69,11 +69,7 @@ class Site
# Los posts de este sitio, si el sitio está traducido, trae los posts
# del idioma actual, porque _posts va a estar vacío
def posts
@posts ||= if i18n?
posts_for(I18n.locale.to_s)
else
posts_for('posts')
end
@posts ||= posts_for('posts')
end
# Obtiene todos los posts de una colección determinada
@ -82,6 +78,10 @@ class Site
def posts_for(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]
return _collection if _collection
@ -189,6 +189,25 @@ class Site
end
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
def self.site_path
File.join(Rails.root, '_sites')

View file

@ -2,3 +2,5 @@
* Convertir Site y Post en adaptadores de ActiveRecord, para que podamos
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
orden nuevo de posts. Las fechas se mantienen igual, pero cambia el
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 'rails/test_help'
require 'open3'
class ActiveSupport::TestCase
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
# Add more helper methods to be used by all tests here...
# Resetear el repositorio a su estado original antes de leerlo
def reset_git_repo(path)
Dir.chdir(path) do
Open3::popen3('git reset --hard') do |_, _, _, thread|
# Wait for the process to finish
thread.value
end
end
end
end