5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-20 05:16:22 +00:00

fix: leer los archivos de datos correctamente #13428

los archivos de datos se leen con rutas relativas, lo que puede mezclar
el cwd en usos concurrentes.

depreca la dependencia en jekyll-data además!
This commit is contained in:
f 2023-05-13 17:31:40 -03:00
parent d5c6934b83
commit 491b5f0b3a
5 changed files with 58 additions and 20 deletions

View file

@ -58,7 +58,6 @@ gem 'inline_svg'
gem 'httparty'
gem 'safe_yaml'
gem 'jekyll', '~> 4.2.0'
gem 'jekyll-data'
gem 'jekyll-commonmark'
gem 'jekyll-images'
gem 'jekyll-include-cache'

View file

@ -276,8 +276,6 @@ GEM
terminal-table (~> 2.0)
jekyll-commonmark (1.4.0)
commonmarker (~> 0.22)
jekyll-data (1.1.2)
jekyll (>= 3.3, < 5.0.0)
jekyll-images (0.4.0)
jekyll (~> 4)
ruby-filemagic (~> 0.7)
@ -591,7 +589,6 @@ DEPENDENCIES
jbuilder (~> 2.5)
jekyll (~> 4.2.0)
jekyll-commonmark
jekyll-data
jekyll-images
jekyll-include-cache
kaminari

View file

@ -0,0 +1,36 @@
# frozen_string_literal: true
module Jekyll
module Readers
# Permite leer datos utilizando rutas absolutas.
#
# {Jekyll::DataReader} usa {Dir.chdir} con rutas relativas, lo que
# en nuestro uso provoca confusiones en el lector de datos.
#
# Con este módulo, podemos leer todos los archivos usando rutas
# absolutas, lo que nos permite reemplazar jekyll-data, que agregaba
# código duplicado.
module DataReaderDecorator
extend ActiveSupport::Concern
included do
def read_data_to(dir, data)
return unless File.directory?(dir) && !@entry_filter.symlink?(dir)
Dir.glob(File.join(dir, '*')).each do |path|
next if @entry_filter.symlink?(path)
entry = Pathname.new(path).relative_path_from(dir).to_s
if File.directory?(path)
read_data_to(path, data[sanitize_filename(entry)] = {})
else
key = sanitize_filename(File.basename(entry, ".*"))
data[key] = read_data_file(path)
end
end
end
end
end
end
end

View file

@ -375,9 +375,7 @@ class Site < ApplicationRecord
begin
install_gems
Jekyll::Site.new(configuration).tap do |site|
site.reader = JekyllData::Reader.new(site) if site.theme
end
Jekyll::Site.new(configuration)
end
end

View file

@ -2,6 +2,7 @@
String.include CoreExtensions::String::StripTags
Jekyll::Document.include CoreExtensions::Jekyll::Document::Path
Jekyll::DataReader.include Jekyll::Readers::DataReaderDecorator
# Definir tags de Liquid que provienen de complementos para que siempre
# devuelvan contenido vacío.
@ -70,9 +71,27 @@ module Jekyll
# No necesitamos los archivos estáticos
def retrieve_static_files(_, _); end
# Solo lee los datos
# Solo lee los datos, desde la plantilla y luego desde el sitio,
# usando rutas absolutas, para evitar el uso confuso de Dir.chdir.
#
# Reemplaza jekyll-data también!
#
# @return [Hash]
def read_data
@site.data = DataReader.new(site).read(site.config['data_dir'])
@site.data =
begin
reader = DataReader.new(site)
theme_dir = site.in_theme_dir('_data')
data_dir = site.in_source_dir(site.config['data_dir'])
if theme_dir
reader.read_data_to(theme_dir, reader.content)
reader.read_data_to(data_dir, reader.content)
reader.content
else
reader.read data_dir
end
end
end
# Lee los layouts
@ -174,14 +193,3 @@ module PgSearch
end
end
end
# JekyllData::Reader del plugin jekyll-data modifica Jekyll::Site#reader
# para también leer los datos que vienen en el theme.
module JekyllData
Reader.class_eval do
def read_data
super
read_theme_data
end
end
end