WIP de reordenar posts
This commit is contained in:
parent
7d4f17f51c
commit
a09f049c20
8 changed files with 136 additions and 9 deletions
|
@ -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?
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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í
|
||||||
|
|
|
@ -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
30
test/models/post_test.rb
Normal 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
27
test/models/site_test.rb
Normal 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
|
18
test/models/usuaria_test.rb
Normal file
18
test/models/usuaria_test.rb
Normal 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
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue