aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/linters/sorted_dependencies.rb
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-28 17:45:06 +0900
committernsfisis <nsfisis@gmail.com>2026-06-28 17:45:26 +0900
commit53f1fb395f33e0fb8db9aebd09ea9082f650f9f1 (patch)
treef9e8bf0e9d4b1e98cce383574fb6a13b684fff08 /scripts/linters/sorted_dependencies.rb
parent212f5cd75b1403ee75ffa44d7ebdb181174340c0 (diff)
downloadphp-shirabe-53f1fb395f33e0fb8db9aebd09ea9082f650f9f1.tar.gz
php-shirabe-53f1fb395f33e0fb8db9aebd09ea9082f650f9f1.tar.zst
php-shirabe-53f1fb395f33e0fb8db9aebd09ea9082f650f9f1.zip
refactor: add linter
Diffstat (limited to 'scripts/linters/sorted_dependencies.rb')
-rw-r--r--scripts/linters/sorted_dependencies.rb52
1 files changed, 52 insertions, 0 deletions
diff --git a/scripts/linters/sorted_dependencies.rb b/scripts/linters/sorted_dependencies.rb
new file mode 100644
index 0000000..f7ae816
--- /dev/null
+++ b/scripts/linters/sorted_dependencies.rb
@@ -0,0 +1,52 @@
+def sorted_dependencies(root_dir, excludes = [])
+ pattern = root_dir.join('crates', '*', 'Cargo.toml').to_s
+ errors = Dir.glob(pattern).sort.flat_map do |path|
+ relative = Pathname.new(path).relative_path_from(root_dir).to_s
+ next [] if excludes.include?(relative)
+
+ sections = parse_dep_sections(File.read(path))
+
+ %w[dependencies dev-dependencies].filter_map do |section|
+ deps = sections[section]
+ next if deps.nil? || deps.empty?
+
+ expected = sort_dep_names(deps)
+ next if deps == expected
+
+ { path: relative, section: section, actual: deps, expected: expected }
+ end
+ end
+
+ return true if errors.empty?
+
+ puts 'Found unsorted `[dependencies]` / `[dev-dependencies]` in Cargo.toml.'
+ puts 'Entries must be alphabetical, with `shirabe-*` crates listed before others:'
+ errors.each do |err|
+ puts " #{err[:path]} [#{err[:section]}]"
+ puts " actual: #{err[:actual].join(', ')}"
+ puts " expected: #{err[:expected].join(', ')}"
+ end
+ false
+end
+
+def parse_dep_sections(content)
+ sections = {}
+ current = nil
+
+ content.each_line do |line|
+ stripped = line.chomp
+ if stripped =~ /\A\s*\[([^\]]+)\]\s*\z/
+ current = $1
+ sections[current] ||= []
+ elsif current && stripped =~ /\A([A-Za-z0-9_-]+)\s*[.=]/
+ sections[current] << $1
+ end
+ end
+
+ sections
+end
+
+def sort_dep_names(deps)
+ shirabe, other = deps.partition { |d| d.start_with?('shirabe-') }
+ shirabe.sort + other.sort
+end