Welcome to mirror list, hosted at ThFree Co, Russian Federation.

unused_helper_methods.rb « lint « scripts - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b7b651614ef005ea6a81cf001624311f8aef02fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env ruby
# frozen_string_literal: true

# Inspired in part by https://gist.github.com/kylefox/617b0bead5f53dc53a224a8651328c92
#

require 'parallel'

start = Process.clock_gettime(Process::CLOCK_MONOTONIC)

# Build an array of filename globs to process.
# Only search file types that might use or define a helper.
#
extensions = %w[rb haml erb].map { |ext| "{ee/,}app/**/*.#{ext}" }

# Build a hash of all the source files to search.
# Key is filename, value is an array of the lines.
#
source_files = {}

Dir.glob(extensions).each do |filename|
  source_files[filename] = File.readlines(filename)
end

# Build an array of {method, file} hashes defined in app/helper/* files.
#
helpers = source_files.keys.grep(%r{app/helpers}).flat_map do |filename|
  source_files[filename].flat_map do |line|
    line =~ /def ([^(\s]+)/ ? [{ method: Regexp.last_match(1).chomp, file: filename }] : []
  end
end

puts "Scanning #{source_files.size} files for #{helpers.size} helpers..."

# Combine all the source code into one big string, because regex are fast.
#
source_code = source_files.values.flatten.join

# Iterate over all the helpers and reject any that appear anywhere in the complete source.
#
unused = Parallel.flat_map(helpers, progress: 'Checking helpers') do |helper|
  /(?<!def )#{Regexp.quote(helper[:method].sub(/^self\./, ''))}\W/.match?(source_code) ? [] : helper
end

finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)

if unused
  puts "\nFound #{unused.size} unused helpers:\n\n"
  unused.each { |helper| puts "  - [ ] `#{helper[:file]}`: `#{helper[:method]}`" }
  puts "\n"
else
  puts 'No unused helpers were found.'
end

puts "Finished in #{finish - start} seconds."