/
version.rb
93 lines (78 loc) · 3.25 KB
/
version.rb
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# frozen_string_literal: true
module RuboCop
# This module holds the RuboCop version information.
module Version
STRING = '1.35.1'
MSG = '%<version>s (using Parser %<parser_version>s, ' \
'rubocop-ast %<rubocop_ast_version>s, ' \
'running on %<ruby_engine>s %<ruby_version>s)%<server>s [%<ruby_platform>s]'
CANONICAL_FEATURE_NAMES = { 'Rspec' => 'RSpec', 'Graphql' => 'GraphQL', 'Md' => 'Markdown',
'Thread_safety' => 'ThreadSafety' }.freeze
EXTENSION_PATH_NAMES = { 'rubocop-md' => 'markdown' }.freeze
# @api private
def self.version(debug: false, env: nil)
if debug
verbose_version = format(MSG, version: STRING, parser_version: Parser::VERSION,
rubocop_ast_version: RuboCop::AST::Version::STRING,
ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
server: Server.running? ? ' +server' : '',
ruby_platform: RUBY_PLATFORM)
return verbose_version unless env
extension_versions = extension_versions(env)
return verbose_version if extension_versions.empty?
<<~VERSIONS
#{verbose_version}
#{extension_versions.join("\n")}
VERSIONS
else
STRING
end
end
# @api private
def self.extension_versions(env)
features = Util.silence_warnings do
# Suppress any config issues when loading the config (ie. deprecations,
# pending cops, etc.).
env.config_store.unvalidated.for_pwd.loaded_features.sort
end
features.map do |loaded_feature|
next unless (match = loaded_feature.match(/rubocop-(?<feature>.*)/))
# Get the expected name of the folder containing the extension code.
# Usually it would be the same as the extension name. but sometimes authors
# can choose slightly different name for their gems, e.g. rubocop-md instead of
# rubocop-markdown.
feature = EXTENSION_PATH_NAMES.fetch(loaded_feature, match[:feature])
begin
require "rubocop/#{feature}/version"
rescue LoadError
# Not worth mentioning libs that are not installed
end
next unless (feature_version = feature_version(feature))
" - #{loaded_feature} #{feature_version}"
end.compact
end
# Returns feature version in one of two ways:
#
# * Find by RuboCop core version style (e.g. rubocop-performance, rubocop-rspec)
# * Find by `bundle gem` version style (e.g. rubocop-rake)
#
# @api private
def self.feature_version(feature)
capitalized_feature = feature.capitalize
extension_name = CANONICAL_FEATURE_NAMES.fetch(capitalized_feature, capitalized_feature)
# Find by RuboCop core version style (e.g. rubocop-performance, rubocop-rspec)
RuboCop.const_get(extension_name)::Version::STRING
rescue NameError
begin
# Find by `bundle gem` version style (e.g. rubocop-rake, rubocop-packaging)
RuboCop.const_get(extension_name)::VERSION
rescue NameError
# noop
end
end
# @api private
def self.document_version
STRING.match('\d+\.\d+').to_s
end
end
end