From dd5ce8bfa2ce5762dc3dfab8fb2cbb615c49c01e Mon Sep 17 00:00:00 2001 From: James Smith Date: Thu, 12 Mar 2026 15:06:21 +0000 Subject: [PATCH] Move file glob methods into their own module --- app/jobs/application_job.rb | 42 ------------------ .../library/detect_filesystem_changes_job.rb | 4 +- app/jobs/scan/model/add_new_files_job.rb | 8 ++-- app/lib/file_matcher.rb | 43 +++++++++++++++++++ .../file_matcher_spec.rb} | 2 +- 5 files changed, 50 insertions(+), 49 deletions(-) create mode 100644 app/lib/file_matcher.rb rename spec/{jobs/application_job_spec.rb => lib/file_matcher_spec.rb} (94%) diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb index 70b30f59d..d462f44a0 100644 --- a/app/jobs/application_job.rb +++ b/app/jobs/application_job.rb @@ -26,46 +26,4 @@ class ApplicationJob < ActiveJob::Base step: nil ) end - - def self.extension_glob(extensions) - [ - "*.{", - extensions.map { |ext| case_insensitive_glob_string(ext) }.join(","), - "}" - ].join - end - - def self.case_insensitive_glob_string(str) - str.chars.map { |char| - "[#{char.upcase}#{char.downcase}]" - }.join - end - - def self.image_pattern - extension_glob(SupportedMimeTypes.image_extensions) - end - - def self.file_pattern - extension_glob(SupportedMimeTypes.indexable_extensions) - end - - def self.common_subfolders - { - "3mf" => file_pattern, - "fdm" => file_pattern, - "files" => file_pattern, - "images" => image_pattern, - "lychee" => file_pattern, - "lys" => file_pattern, - "model" => file_pattern, - "obj" => file_pattern, - "parts" => file_pattern, - "presupported" => file_pattern, - "resin" => file_pattern, - "stl" => file_pattern, - "sup" => file_pattern, - "supported" => file_pattern, - "unsupported" => file_pattern - } - end end diff --git a/app/jobs/scan/library/detect_filesystem_changes_job.rb b/app/jobs/scan/library/detect_filesystem_changes_job.rb index 87f03e3c6..d9c20459f 100644 --- a/app/jobs/scan/library/detect_filesystem_changes_job.rb +++ b/app/jobs/scan/library/detect_filesystem_changes_job.rb @@ -4,7 +4,7 @@ class Scan::Library::DetectFilesystemChangesJob < ApplicationJob # Find all files in the library that we might need to look at def filenames_on_disk(library) - library.list_files(File.join("**", ApplicationJob.file_pattern)) + library.list_files(File.join("**", FileMatcher.file_pattern)) end # Get a list of all the existing filenames @@ -13,7 +13,7 @@ class Scan::Library::DetectFilesystemChangesJob < ApplicationJob end def filter_out_common_subfolders(folders) - matcher = /\/(#{ApplicationJob.common_subfolders.keys.join("|")})$/i + matcher = /\/(#{FileMatcher.common_subfolders.keys.join("|")})$/i folders.map { |f| f.gsub(matcher, "") }.uniq end diff --git a/app/jobs/scan/model/add_new_files_job.rb b/app/jobs/scan/model/add_new_files_job.rb index 71371f158..d29865c9e 100644 --- a/app/jobs/scan/model/add_new_files_job.rb +++ b/app/jobs/scan/model/add_new_files_job.rb @@ -6,12 +6,12 @@ class Scan::Model::AddNewFilesJob < ApplicationJob def file_list(model_path, library, include_all_subfolders: false) glob = include_all_subfolders ? - [File.join(Shellwords.escape(model_path), "**", ApplicationJob.file_pattern)] : - [File.join(Shellwords.escape(model_path), ApplicationJob.file_pattern)] + - ApplicationJob.common_subfolders.map do |name, pattern| + [File.join(Shellwords.escape(model_path), "**", FileMatcher.file_pattern)] : + [File.join(Shellwords.escape(model_path), FileMatcher.file_pattern)] + + FileMatcher.common_subfolders.map do |name, pattern| File.join( Shellwords.escape(model_path), - ApplicationJob.case_insensitive_glob_string(name), + FileMatcher.case_insensitive_glob_string(name), pattern ) end diff --git a/app/lib/file_matcher.rb b/app/lib/file_matcher.rb new file mode 100644 index 000000000..5607d2ca3 --- /dev/null +++ b/app/lib/file_matcher.rb @@ -0,0 +1,43 @@ +module FileMatcher + def self.extension_glob(extensions) + [ + "*.{", + extensions.map { |ext| case_insensitive_glob_string(ext) }.join(","), + "}" + ].join + end + + def self.case_insensitive_glob_string(str) + str.chars.map { |char| + "[#{char.upcase}#{char.downcase}]" + }.join + end + + def self.image_pattern + extension_glob(SupportedMimeTypes.image_extensions) + end + + def self.file_pattern + extension_glob(SupportedMimeTypes.indexable_extensions) + end + + def self.common_subfolders + { + "3mf" => file_pattern, + "fdm" => file_pattern, + "files" => file_pattern, + "images" => image_pattern, + "lychee" => file_pattern, + "lys" => file_pattern, + "model" => file_pattern, + "obj" => file_pattern, + "parts" => file_pattern, + "presupported" => file_pattern, + "resin" => file_pattern, + "stl" => file_pattern, + "sup" => file_pattern, + "supported" => file_pattern, + "unsupported" => file_pattern + } + end +end diff --git a/spec/jobs/application_job_spec.rb b/spec/lib/file_matcher_spec.rb similarity index 94% rename from spec/jobs/application_job_spec.rb rename to spec/lib/file_matcher_spec.rb index 39757c8c3..0036e423a 100644 --- a/spec/jobs/application_job_spec.rb +++ b/spec/lib/file_matcher_spec.rb @@ -1,6 +1,6 @@ require "rails_helper" -RSpec.describe ApplicationJob do +RSpec.describe FileMatcher do it "generates a case-insensitive pattern for all supported files" do # rubocop:todo RSpec/MultipleExpectations pattern = described_class.file_pattern expect(pattern).to include "[Ss][Tt][Ll],"