From e473de6a4ec515886b6fd172cc2ffa9d2abaafe4 Mon Sep 17 00:00:00 2001 From: f Date: Sat, 13 May 2023 17:31:40 -0300 Subject: [PATCH] fix: leer los archivos de datos correctamente #13428 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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! --- Gemfile | 2 +- Gemfile.lock | 3 -- .../jekyll/readers/data_reader_decorator.rb | 36 +++++++++++++++++++ app/models/site.rb | 4 +-- config/initializers/core_extensions.rb | 34 +++++++++++------- 5 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 app/lib/jekyll/readers/data_reader_decorator.rb diff --git a/Gemfile b/Gemfile index b2472035..5f1f6268 100644 --- a/Gemfile +++ b/Gemfile @@ -52,7 +52,7 @@ gem 'icalendar' gem 'inline_svg' gem 'httparty' gem 'safe_yaml' -gem 'jekyll', '~> 4.2' +gem 'jekyll', '~> 4.2.0' gem 'jekyll-data' gem 'jekyll-commonmark' gem 'jekyll-images' diff --git a/Gemfile.lock b/Gemfile.lock index 67ce13e2..951ae8c5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -284,8 +284,6 @@ GEM jekyll-commonmark (1.3.2) commonmarker (~> 0.14, < 0.22) jekyll (>= 3.7, < 5.0) - jekyll-data (1.1.2) - jekyll (>= 3.3, < 5.0.0) jekyll-dotenv (0.2.0) dotenv (~> 2.7) jekyll (~> 4) @@ -644,7 +642,6 @@ DEPENDENCIES jbuilder (~> 2.5) jekyll (~> 4.2) jekyll-commonmark - jekyll-data jekyll-images jekyll-include-cache kaminari diff --git a/app/lib/jekyll/readers/data_reader_decorator.rb b/app/lib/jekyll/readers/data_reader_decorator.rb new file mode 100644 index 00000000..9fed7ac7 --- /dev/null +++ b/app/lib/jekyll/readers/data_reader_decorator.rb @@ -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 diff --git a/app/models/site.rb b/app/models/site.rb index 24644b9c..a6e1c541 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -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 diff --git a/config/initializers/core_extensions.rb b/config/initializers/core_extensions.rb index abbdfda1..861491ae 100644 --- a/config/initializers/core_extensions.rb +++ b/config/initializers/core_extensions.rb @@ -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