Class: RuboCop::Server::Cache Private
- Inherits:
-
Object
- Object
- RuboCop::Server::Cache
- 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
- .cache_root_path ⇒ Object private
Class Method Summary collapse
- .acquire_lock ⇒ Object private
- .cache_path ⇒ Object private
-
.dir ⇒ Object
private
rubocop:enable Metrics/AbcSize.
- .inherit_from_data(yaml) ⇒ Object private
- .lock_path ⇒ Object private
- .pid_path ⇒ Object private
- .pid_running? ⇒ Boolean private
- .port_path ⇒ Object private
-
.project_dir ⇒ Object
private
Searches for Gemfile or gems.rb in the current dir or any parent dirs.
- .project_dir_cache_key ⇒ Object private
- .require_data(yaml) ⇒ Object private
-
.restart_key(args_config_file_path: nil) ⇒ Object
private
rubocop:disable Metrics/AbcSize.
- .status_path ⇒ Object private
- .stderr_path ⇒ Object private
- .token_path ⇒ Object private
- .version_path ⇒ Object private
- .write_pid_file ⇒ Object private
- .write_port_and_token_files(port:, token:) ⇒ Object private
- .write_status_file(status) ⇒ Object private
- .write_version_file(version) ⇒ Object private
Class Attribute Details
.cache_root_path ⇒ 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.
28 29 30 |
# File 'lib/rubocop/server/cache.rb', line 28 def cache_root_path @cache_root_path end |
Class Method Details
.acquire_lock ⇒ 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.
116 117 118 119 120 121 122 123 124 |
# File 'lib/rubocop/server/cache.rb', line 116 def acquire_lock lock_file = File.open(lock_path, File::CREAT) # flock returns 0 if successful, and false if not. flock_result = lock_file.flock(File::LOCK_EX | File::LOCK_NB) yield flock_result != false ensure lock_file.flock(File::LOCK_UN) lock_file.close end |
.cache_path ⇒ 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.
72 73 74 75 76 77 78 79 80 |
# File 'lib/rubocop/server/cache.rb', line 72 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.(File.join(cache_root_dir, 'server')) end |
.dir ⇒ 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:enable Metrics/AbcSize
66 67 68 69 70 |
# File 'lib/rubocop/server/cache.rb', line 66 def dir Pathname.new(File.join(cache_path, project_dir_cache_key)).tap do |d| d.mkpath unless d.exist? end 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.
146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/rubocop/server/cache.rb', line 146 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_path ⇒ 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 lock_path dir.join('lock') end |
.pid_path ⇒ 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.
90 91 92 |
# File 'lib/rubocop/server/cache.rb', line 90 def pid_path dir.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.
110 111 112 113 114 |
# File 'lib/rubocop/server/cache.rb', line 110 def pid_running? Process.kill(0, pid_path.read.to_i) == 1 rescue Errno::ESRCH, Errno::ENOENT, Errno::EACCES, Errno::EROFS, Errno::ENAMETOOLONG false end |
.port_path ⇒ 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.
82 83 84 |
# File 'lib/rubocop/server/cache.rb', line 82 def port_path dir.join('port') end |
.project_dir ⇒ 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.
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.('..', current_dir) end # If we can't find a Gemfile, just use the current directory Dir.pwd end |
.project_dir_cache_key ⇒ 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.
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.
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
# File 'lib/rubocop/server/cache.rb', line 158 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_path ⇒ 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.
98 99 100 |
# File 'lib/rubocop/server/cache.rb', line 98 def status_path dir.join('status') end |
.stderr_path ⇒ 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.
106 107 108 |
# File 'lib/rubocop/server/cache.rb', line 106 def stderr_path dir.join('stderr') end |
.token_path ⇒ 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.
86 87 88 |
# File 'lib/rubocop/server/cache.rb', line 86 def token_path dir.join('token') end |
.version_path ⇒ 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.
102 103 104 |
# File 'lib/rubocop/server/cache.rb', line 102 def version_path dir.join('version') end |
.write_pid_file ⇒ 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.
131 132 133 134 135 136 |
# File 'lib/rubocop/server/cache.rb', line 131 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.
126 127 128 129 |
# File 'lib/rubocop/server/cache.rb', line 126 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.
138 139 140 |
# File 'lib/rubocop/server/cache.rb', line 138 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.
142 143 144 |
# File 'lib/rubocop/server/cache.rb', line 142 def write_version_file(version) version_path.write(version) end |