Class: RuboCop::Server::Cache Private

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/server/cache.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Caches the states of server process.

Constant Summary collapse

GEMFILE_NAMES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

%w[Gemfile gems.rb].freeze
LOCKFILE_NAMES =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

%w[Gemfile.lock gems.locked].freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.cache_root_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



28
29
30
# File 'lib/rubocop/server/cache.rb', line 28

def cache_root_path
  @cache_root_path
end

Class Method Details

.acquire_lockObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



121
122
123
124
125
126
127
# File 'lib/rubocop/server/cache.rb', line 121

def acquire_lock
  File.open(lock_path, File::CREAT) do |lock_file|
    # flock returns 0 if successful, and false if not.
    flock_result = lock_file.flock(File::LOCK_EX | File::LOCK_NB)
    yield flock_result != false
  end
end

.cache_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



76
77
78
79
80
81
82
83
84
# File 'lib/rubocop/server/cache.rb', line 76

def cache_path
  cache_root_dir = if cache_root_path
                     File.join(cache_root_path, 'rubocop_cache')
                   else
                     CacheConfig.root_dir_from_toplevel_config
                   end

  File.expand_path(File.join(cache_root_dir, 'server'))
end

.dirObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

rubocop:enable Metrics/AbcSize



66
67
68
69
70
# File 'lib/rubocop/server/cache.rb', line 66

def dir
  dir_path.tap do |d|
    d.mkpath unless d.exist?
  end
end

.dir_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



72
73
74
# File 'lib/rubocop/server/cache.rb', line 72

def dir_path
  Pathname.new(File.join(cache_path, project_dir_cache_key))
end

.inherit_from_data(yaml) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



149
150
151
152
153
154
155
156
157
158
159
# File 'lib/rubocop/server/cache.rb', line 149

def inherit_from_data(yaml)
  return '' unless (inherit_from_paths = yaml['inherit_from'])

  Array(inherit_from_paths).map do |path|
    next if PathUtil.remote_file?(path)

    path = Pathname(path)

    path.exist? ? path.read : ''
  end.join
end

.lock_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



98
99
100
# File 'lib/rubocop/server/cache.rb', line 98

def lock_path
  dir.join('lock')
end

.pid_path(create_dir: true) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



94
95
96
# File 'lib/rubocop/server/cache.rb', line 94

def pid_path(create_dir: true)
  (create_dir ? dir : dir_path).join('pid')
end

.pid_running?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


114
115
116
117
118
119
# File 'lib/rubocop/server/cache.rb', line 114

def pid_running?
  Process.kill(0, pid_path(create_dir: false).read.to_i) == 1
rescue Errno::ESRCH, Errno::ENOENT, Errno::EACCES, Errno::EROFS, Errno::ENAMETOOLONG,
       Errno::ENOTDIR
  false
end

.port_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



86
87
88
# File 'lib/rubocop/server/cache.rb', line 86

def port_path
  dir.join('port')
end

.project_dirObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Searches for Gemfile or gems.rb in the current dir or any parent dirs



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/rubocop/server/cache.rb', line 31

def project_dir
  current_dir = Dir.pwd
  while current_dir != '/'
    return current_dir if GEMFILE_NAMES.any? do |gemfile|
      File.exist?(File.join(current_dir, gemfile))
    end

    current_dir = File.expand_path('..', current_dir)
  end
  # If we can't find a Gemfile, just use the current directory
  Dir.pwd
end

.project_dir_cache_keyObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



44
45
46
# File 'lib/rubocop/server/cache.rb', line 44

def project_dir_cache_key
  @project_dir_cache_key ||= project_dir[1..].tr('/', '+')
end

.require_data(yaml) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/rubocop/server/cache.rb', line 161

def require_data(yaml)
  return '' unless (require_paths = yaml['require'])

  Array(require_paths).map do |path|
    # NOTE: This targets only relative or absolute path specifications.
    # For example, specifications like `require: rubocop-performance`,
    # which can be loaded from `$LOAD_PATH`, are ignored.
    next unless path.start_with?('.', '/')

    # NOTE: `.so` files are not typically specified, so only `.rb` files are targeted.
    path = "#{path}.rb" unless path.end_with?('.rb')
    path = Pathname(path)

    path.exist? ? path.read : ''
  end.join
end

.restart_key(args_config_file_path: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

rubocop:disable Metrics/AbcSize



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rubocop/server/cache.rb', line 49

def restart_key(args_config_file_path: nil)
  lockfile_path = LOCKFILE_NAMES.map do |lockfile_name|
    Pathname(project_dir).join(lockfile_name)
  end.find(&:exist?)
  version_data = lockfile_path&.read || RuboCop::Version::STRING
  config_data = Pathname(
    args_config_file_path || ConfigFinder.find_config_path(Dir.pwd)
  ).read
  yaml = load_erb_templated_yaml(config_data)

  inherit_from_data = inherit_from_data(yaml)
  require_data = require_data(yaml)

  Digest::SHA1.hexdigest(version_data + config_data + inherit_from_data + require_data)
end

.status_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



102
103
104
# File 'lib/rubocop/server/cache.rb', line 102

def status_path
  dir.join('status')
end

.stderr_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



110
111
112
# File 'lib/rubocop/server/cache.rb', line 110

def stderr_path
  dir.join('stderr')
end

.token_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



90
91
92
# File 'lib/rubocop/server/cache.rb', line 90

def token_path
  dir.join('token')
end

.version_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



106
107
108
# File 'lib/rubocop/server/cache.rb', line 106

def version_path
  dir.join('version')
end

.write_pid_fileObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



134
135
136
137
138
139
# File 'lib/rubocop/server/cache.rb', line 134

def write_pid_file
  pid_path.write(Process.pid)
  yield
ensure
  dir.rmtree
end

.write_port_and_token_files(port:, token:) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



129
130
131
132
# File 'lib/rubocop/server/cache.rb', line 129

def write_port_and_token_files(port:, token:)
  port_path.write(port)
  token_path.write(token)
end

.write_status_file(status) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



141
142
143
# File 'lib/rubocop/server/cache.rb', line 141

def write_status_file(status)
  status_path.write(status)
end

.write_version_file(version) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



145
146
147
# File 'lib/rubocop/server/cache.rb', line 145

def write_version_file(version)
  version_path.write(version)
end