standard 1.27.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +18 -0
- data/Gemfile +6 -4
- data/Gemfile.lock +10 -7
- data/LICENSE.txt +3 -4
- data/README.md +353 -465
- data/bin/console +0 -4
- data/bin/run +9 -0
- data/config/base.yml +0 -161
- data/config/default.yml +9 -0
- data/config/ruby-2.2.yml +0 -3
- data/docs/ARCHITECTURE.md +31 -0
- data/lib/standard/base/plugin.rb +65 -0
- data/lib/standard/base.rb +8 -0
- data/lib/standard/creates_config_store/assigns_rubocop_yaml.rb +1 -35
- data/lib/standard/creates_config_store/merges_user_config_extensions.rb +21 -51
- data/lib/standard/creates_config_store.rb +2 -0
- data/lib/standard/formatter.rb +1 -1
- data/lib/standard/loads_yaml_config.rb +1 -0
- data/lib/standard/plugin/combines_plugin_configs.rb +15 -0
- data/lib/standard/plugin/creates_runner_context.rb +15 -0
- data/lib/standard/plugin/determines_class_constant.rb +56 -0
- data/lib/standard/plugin/initializes_plugins.rb +23 -0
- data/lib/standard/plugin/merges_plugins_into_rubocop_config.rb +158 -0
- data/lib/standard/plugin/standardizes_configured_plugins.rb +37 -0
- data/lib/standard/plugin.rb +11 -0
- data/lib/standard/railtie.rb +1 -1
- data/lib/standard/runners/help.rb +2 -2
- data/lib/standard/runners/rubocop.rb +1 -1
- data/lib/standard/version.rb +1 -1
- data/lib/standard.rb +5 -2
- data/standard.gemspec +5 -2
- metadata +54 -15
- data/lib/standard/cop/block_single_line_braces.rb +0 -96
data/bin/console
CHANGED
@@ -6,9 +6,5 @@ require "standard"
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
9
|
require "irb"
|
14
10
|
IRB.start(__FILE__)
|
data/bin/run
ADDED
data/config/base.yml
CHANGED
@@ -1,11 +1,3 @@
|
|
1
|
-
require:
|
2
|
-
- rubocop-performance
|
3
|
-
|
4
|
-
AllCops:
|
5
|
-
# Prevent RuboCop from exploding when it finds an older-than-2.6 .ruby-version
|
6
|
-
TargetRubyVersion: 2.6
|
7
|
-
Exclude: []
|
8
|
-
|
9
1
|
Bundler/DuplicatedGem:
|
10
2
|
Enabled: true
|
11
3
|
Include:
|
@@ -936,156 +928,6 @@ Naming/VariableName:
|
|
936
928
|
Naming/VariableNumber:
|
937
929
|
Enabled: false
|
938
930
|
|
939
|
-
Performance/AncestorsInclude:
|
940
|
-
Enabled: false
|
941
|
-
|
942
|
-
Performance/ArraySemiInfiniteRangeSlice:
|
943
|
-
Enabled: false
|
944
|
-
|
945
|
-
Performance/BigDecimalWithNumericArgument:
|
946
|
-
Enabled: true
|
947
|
-
|
948
|
-
Performance/BindCall:
|
949
|
-
Enabled: true
|
950
|
-
|
951
|
-
Performance/BlockGivenWithExplicitBlock:
|
952
|
-
Enabled: true
|
953
|
-
|
954
|
-
Performance/Caller:
|
955
|
-
Enabled: true
|
956
|
-
|
957
|
-
Performance/CaseWhenSplat:
|
958
|
-
Enabled: false
|
959
|
-
|
960
|
-
Performance/Casecmp:
|
961
|
-
Enabled: false
|
962
|
-
|
963
|
-
Performance/ChainArrayAllocation:
|
964
|
-
Enabled: false
|
965
|
-
|
966
|
-
Performance/CollectionLiteralInLoop:
|
967
|
-
Enabled: false
|
968
|
-
|
969
|
-
Performance/CompareWithBlock:
|
970
|
-
Enabled: true
|
971
|
-
|
972
|
-
Performance/ConcurrentMonotonicTime:
|
973
|
-
Enabled: true
|
974
|
-
|
975
|
-
Performance/ConstantRegexp:
|
976
|
-
Enabled: true
|
977
|
-
|
978
|
-
Performance/Count:
|
979
|
-
Enabled: true
|
980
|
-
|
981
|
-
Performance/DeletePrefix:
|
982
|
-
Enabled: false
|
983
|
-
|
984
|
-
Performance/DeleteSuffix:
|
985
|
-
Enabled: false
|
986
|
-
|
987
|
-
Performance/Detect:
|
988
|
-
Enabled: true
|
989
|
-
|
990
|
-
Performance/DoubleStartEndWith:
|
991
|
-
Enabled: true
|
992
|
-
IncludeActiveSupportAliases: false
|
993
|
-
|
994
|
-
Performance/EndWith:
|
995
|
-
Enabled: true
|
996
|
-
|
997
|
-
Performance/FixedSize:
|
998
|
-
Enabled: true
|
999
|
-
|
1000
|
-
Performance/FlatMap:
|
1001
|
-
Enabled: true
|
1002
|
-
EnabledForFlattenWithoutParams: false
|
1003
|
-
|
1004
|
-
Performance/InefficientHashSearch:
|
1005
|
-
Enabled: true
|
1006
|
-
|
1007
|
-
Performance/IoReadlines:
|
1008
|
-
Enabled: false
|
1009
|
-
|
1010
|
-
Performance/MapCompact:
|
1011
|
-
Enabled: false
|
1012
|
-
|
1013
|
-
Performance/MethodObjectAsBlock:
|
1014
|
-
Enabled: false
|
1015
|
-
|
1016
|
-
Performance/OpenStruct:
|
1017
|
-
Enabled: false
|
1018
|
-
|
1019
|
-
Performance/RangeInclude:
|
1020
|
-
Enabled: true
|
1021
|
-
|
1022
|
-
Performance/RedundantBlockCall:
|
1023
|
-
Enabled: false
|
1024
|
-
|
1025
|
-
Performance/RedundantEqualityComparisonBlock:
|
1026
|
-
Enabled: false
|
1027
|
-
|
1028
|
-
Performance/RedundantMatch:
|
1029
|
-
Enabled: true
|
1030
|
-
|
1031
|
-
Performance/RedundantMerge:
|
1032
|
-
Enabled: true
|
1033
|
-
MaxKeyValuePairs: 2
|
1034
|
-
|
1035
|
-
Performance/RedundantSortBlock:
|
1036
|
-
Enabled: true
|
1037
|
-
|
1038
|
-
Performance/RedundantSplitRegexpArgument:
|
1039
|
-
Enabled: true
|
1040
|
-
|
1041
|
-
Performance/RedundantStringChars:
|
1042
|
-
Enabled: true
|
1043
|
-
|
1044
|
-
Performance/RegexpMatch:
|
1045
|
-
Enabled: true
|
1046
|
-
|
1047
|
-
Performance/ReverseEach:
|
1048
|
-
Enabled: true
|
1049
|
-
|
1050
|
-
Performance/ReverseFirst:
|
1051
|
-
Enabled: true
|
1052
|
-
|
1053
|
-
Performance/SelectMap:
|
1054
|
-
Enabled: false
|
1055
|
-
|
1056
|
-
Performance/Size:
|
1057
|
-
Enabled: true
|
1058
|
-
|
1059
|
-
Performance/SortReverse:
|
1060
|
-
Enabled: true
|
1061
|
-
|
1062
|
-
Performance/Squeeze:
|
1063
|
-
Enabled: true
|
1064
|
-
|
1065
|
-
Performance/StartWith:
|
1066
|
-
Enabled: true
|
1067
|
-
|
1068
|
-
Performance/StringIdentifierArgument:
|
1069
|
-
Enabled: true
|
1070
|
-
|
1071
|
-
Performance/StringInclude:
|
1072
|
-
Enabled: false
|
1073
|
-
|
1074
|
-
Performance/StringReplacement:
|
1075
|
-
Enabled: true
|
1076
|
-
|
1077
|
-
Performance/Sum:
|
1078
|
-
Enabled: false
|
1079
|
-
|
1080
|
-
Performance/TimesMap:
|
1081
|
-
Enabled: false
|
1082
|
-
|
1083
|
-
Performance/UnfreezeString:
|
1084
|
-
Enabled: true
|
1085
|
-
|
1086
|
-
Performance/UriDefaultParser:
|
1087
|
-
Enabled: true
|
1088
|
-
|
1089
931
|
Security/CompoundHash:
|
1090
932
|
Enabled: true
|
1091
933
|
|
@@ -1107,9 +949,6 @@ Security/Open:
|
|
1107
949
|
Security/YAMLLoad:
|
1108
950
|
Enabled: true
|
1109
951
|
|
1110
|
-
Standard/BlockSingleLineBraces:
|
1111
|
-
Enabled: true
|
1112
|
-
|
1113
952
|
Style/AccessModifierDeclarations:
|
1114
953
|
Enabled: false
|
1115
954
|
|
data/config/default.yml
ADDED
data/config/ruby-2.2.yml
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Standard Ruby's Architecture
|
2
|
+
|
3
|
+
Architecture is not a 4-letter word (but the silly abbreviation 'a10e' is!), so
|
4
|
+
as Standard's internal structure has introduced more moving parts, it's
|
5
|
+
important to plant a stake in the ground and explain where all the cops are
|
6
|
+
buried.
|
7
|
+
|
8
|
+
Starting with version 1.28.0, Standard Ruby introduced plugin support and
|
9
|
+
refactored how it loads its own rules from one large YAML file into several
|
10
|
+
plugins. As a result, what was a single `standard` gem is now spread across 3
|
11
|
+
gems. Here's how it's all organized:
|
12
|
+
|
13
|
+
* [standard](https://github.com/standardrb/standard) - The main gem. The one
|
14
|
+
people install and think of. Because `standard` has a hard dependency on `rubocop`,
|
15
|
+
the base configuration of RuboCop's built-in rules is bundled into the gem, even
|
16
|
+
though it's now [defined as a plugin](lib/standard/base/plugin.rb)
|
17
|
+
* [standard-performance](https://github.com/standardrb/standard-performance) - A
|
18
|
+
plugin that depends on and configures
|
19
|
+
[rubocop-performance](https://github.com/rubocop/rubocop-performance)
|
20
|
+
* [standard-custom](https://github.com/standardrb/standard-custom) - A plugin
|
21
|
+
that implements and configures any custom rules that the Standard team writes
|
22
|
+
and maintains itself with the intention that they be part of the default
|
23
|
+
Standard Ruby experience (there's only one of these rules so far)
|
24
|
+
|
25
|
+
To glue these things together, yet another gem was created (gems are free,
|
26
|
+
right?) to define a very simple plugin API. That gem is called
|
27
|
+
[lint_roller](https://github.com/standardrb/lint_roller) and it can be used by
|
28
|
+
any gem that provides or consumes linting and formatting rules. Because Standard
|
29
|
+
Ruby is built on RuboCop's configuration and runner, RuboCop could adopt
|
30
|
+
`lint_roller` as its plugin system and plugins could support both `rubocop`
|
31
|
+
and `standard` out of the box.
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Standard::Base
|
2
|
+
class Plugin < LintRoller::Plugin
|
3
|
+
def initialize(config)
|
4
|
+
@config = config
|
5
|
+
end
|
6
|
+
|
7
|
+
def about
|
8
|
+
LintRoller::About.new(
|
9
|
+
name: "standard-base",
|
10
|
+
version: VERSION,
|
11
|
+
homepage: "https://github.com/standardrb/standard",
|
12
|
+
description: "Configuration for RuboCop's built-in rules"
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def supported?(context)
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
def rules(context)
|
21
|
+
LintRoller::Rules.new(
|
22
|
+
type: :path,
|
23
|
+
config_format: :rubocop,
|
24
|
+
value: determine_yaml_path(context.target_ruby_version)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def determine_yaml_path(desired_version)
|
31
|
+
desired_version = Gem::Version.new(desired_version) unless desired_version.is_a?(Gem::Version)
|
32
|
+
default = "base.yml"
|
33
|
+
|
34
|
+
file_name = if !Gem::Version.correct?(desired_version)
|
35
|
+
default
|
36
|
+
elsif desired_version < Gem::Version.new("1.9")
|
37
|
+
"ruby-1.8.yml"
|
38
|
+
elsif desired_version < Gem::Version.new("2.0")
|
39
|
+
"ruby-1.9.yml"
|
40
|
+
elsif desired_version < Gem::Version.new("2.1")
|
41
|
+
"ruby-2.0.yml"
|
42
|
+
elsif desired_version < Gem::Version.new("2.2")
|
43
|
+
"ruby-2.1.yml"
|
44
|
+
elsif desired_version < Gem::Version.new("2.3")
|
45
|
+
"ruby-2.2.yml"
|
46
|
+
elsif desired_version < Gem::Version.new("2.4")
|
47
|
+
"ruby-2.3.yml"
|
48
|
+
elsif desired_version < Gem::Version.new("2.5")
|
49
|
+
"ruby-2.4.yml"
|
50
|
+
elsif desired_version < Gem::Version.new("2.6")
|
51
|
+
"ruby-2.5.yml"
|
52
|
+
elsif desired_version < Gem::Version.new("3.0")
|
53
|
+
"ruby-2.7.yml"
|
54
|
+
elsif desired_version < Gem::Version.new("3.1")
|
55
|
+
"ruby-3.0.yml"
|
56
|
+
elsif desired_version < Gem::Version.new("3.2")
|
57
|
+
"ruby-3.1.yml"
|
58
|
+
else
|
59
|
+
default
|
60
|
+
end
|
61
|
+
|
62
|
+
Pathname.new(__dir__).join("../../../config/#{file_name}")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -3,42 +3,8 @@ require "pathname"
|
|
3
3
|
class Standard::CreatesConfigStore
|
4
4
|
class AssignsRubocopYaml
|
5
5
|
def call(config_store, standard_config)
|
6
|
-
config_store.options_config =
|
6
|
+
config_store.options_config = Pathname.new(__dir__).join("../../../config/default.yml")
|
7
7
|
config_store.instance_variable_get(:@options_config)
|
8
8
|
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def rubocop_yaml_path(desired_version)
|
13
|
-
default = "base.yml"
|
14
|
-
|
15
|
-
file_name = if !Gem::Version.correct?(desired_version)
|
16
|
-
default
|
17
|
-
elsif desired_version < Gem::Version.new("1.9")
|
18
|
-
"ruby-1.8.yml"
|
19
|
-
elsif desired_version < Gem::Version.new("2.0")
|
20
|
-
"ruby-1.9.yml"
|
21
|
-
elsif desired_version < Gem::Version.new("2.1")
|
22
|
-
"ruby-2.0.yml"
|
23
|
-
elsif desired_version < Gem::Version.new("2.2")
|
24
|
-
"ruby-2.1.yml"
|
25
|
-
elsif desired_version < Gem::Version.new("2.3")
|
26
|
-
"ruby-2.2.yml"
|
27
|
-
elsif desired_version < Gem::Version.new("2.4")
|
28
|
-
"ruby-2.3.yml"
|
29
|
-
elsif desired_version < Gem::Version.new("2.5")
|
30
|
-
"ruby-2.4.yml"
|
31
|
-
elsif desired_version < Gem::Version.new("2.6")
|
32
|
-
"ruby-2.5.yml"
|
33
|
-
elsif desired_version < Gem::Version.new("3.0")
|
34
|
-
"ruby-2.7.yml"
|
35
|
-
elsif desired_version < Gem::Version.new("3.1")
|
36
|
-
"ruby-3.0.yml"
|
37
|
-
else
|
38
|
-
default
|
39
|
-
end
|
40
|
-
|
41
|
-
Pathname.new(__dir__).join("../../../config/#{file_name}")
|
42
|
-
end
|
43
9
|
end
|
44
10
|
end
|
@@ -1,67 +1,37 @@
|
|
1
1
|
require_relative "../file_finder"
|
2
|
+
require_relative "../plugin"
|
2
3
|
|
3
4
|
class Standard::CreatesConfigStore
|
4
5
|
class MergesUserConfigExtensions
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
"StyleGuideCopsOnly",
|
9
|
-
"TargetRubyVersion",
|
10
|
-
|
11
|
-
# The AllCops[Enabled] key is an unused artifact of #merge_with_default.
|
12
|
-
# See: https://github.com/rubocop/rubocop/blob/master/lib/rubocop/config_loader_resolver.rb#L81-L85
|
13
|
-
"Enabled"
|
14
|
-
].freeze
|
15
|
-
|
16
|
-
def call(options_config, standard_config)
|
17
|
-
return unless standard_config[:extend_config]&.any?
|
18
|
-
|
19
|
-
extended_config = load_and_merge_extended_rubocop_configs(options_config, standard_config).to_h
|
20
|
-
merge_standard_and_user_all_cops!(options_config, extended_config)
|
21
|
-
merge_extended_rules_into_standard!(options_config, extended_config)
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def load_and_merge_extended_rubocop_configs(options_config, standard_config)
|
27
|
-
fake_out_rubocop_default_configuration(options_config) do |fake_config|
|
28
|
-
standard_config[:extend_config].reduce(fake_config) do |config, path|
|
29
|
-
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, config)
|
30
|
-
|
31
|
-
user_rubocop_yaml_path = Standard::FileFinder.new.call(path, Dir.pwd)
|
32
|
-
extension = RuboCop::ConfigLoader.load_file(user_rubocop_yaml_path)
|
33
|
-
RuboCop::ConfigLoader.merge_with_default(extension, path)
|
34
|
-
end
|
6
|
+
class ExtendConfigPlugin < LintRoller::Plugin
|
7
|
+
def initialize(path)
|
8
|
+
@yaml_path = Standard::FileFinder.new.call(path, Dir.pwd)
|
35
9
|
end
|
36
|
-
end
|
37
10
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
)
|
42
|
-
end
|
11
|
+
def about
|
12
|
+
About.new("Pseudo-plugin wrapping the `extend_config' path: #{@yaml_path}")
|
13
|
+
end
|
43
14
|
|
44
|
-
|
45
|
-
|
46
|
-
|
15
|
+
def rules(context)
|
16
|
+
LintRoller::Rules.new(
|
17
|
+
type: :path,
|
18
|
+
config_format: :rubocop,
|
19
|
+
value: @yaml_path
|
20
|
+
)
|
47
21
|
end
|
48
22
|
end
|
49
23
|
|
50
|
-
def
|
51
|
-
|
52
|
-
result = yield blank_rubocop_config(options_config)
|
53
|
-
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, og_default_config)
|
54
|
-
result
|
24
|
+
def initialize
|
25
|
+
@merges_plugins_into_rubocop_config = Standard::Plugin::MergesPluginsIntoRubocopConfig.new
|
55
26
|
end
|
56
27
|
|
57
|
-
|
58
|
-
|
59
|
-
def blank_rubocop_config(example_config)
|
60
|
-
RuboCop::Config.new(example_config.to_h.slice("AllCops"), "")
|
61
|
-
end
|
28
|
+
def call(options_config, standard_config)
|
29
|
+
return unless standard_config[:extend_config]&.any?
|
62
30
|
|
63
|
-
|
64
|
-
|
31
|
+
plugins = standard_config[:extend_config].map { |path|
|
32
|
+
ExtendConfigPlugin.new(path)
|
33
|
+
}
|
34
|
+
@merges_plugins_into_rubocop_config.call(options_config, standard_config, plugins, permit_merging: false)
|
65
35
|
end
|
66
36
|
end
|
67
37
|
end
|
@@ -11,6 +11,7 @@ module Standard
|
|
11
11
|
@assigns_rubocop_yaml = AssignsRubocopYaml.new
|
12
12
|
@sets_target_ruby_version = SetsTargetRubyVersion.new
|
13
13
|
@configures_ignored_paths = ConfiguresIgnoredPaths.new
|
14
|
+
@combines_plugin_configs = Plugin::CombinesPluginConfigs.new
|
14
15
|
@merges_user_config_extensions = MergesUserConfigExtensions.new
|
15
16
|
end
|
16
17
|
|
@@ -19,6 +20,7 @@ module Standard
|
|
19
20
|
options_config = @assigns_rubocop_yaml.call(config_store, standard_config)
|
20
21
|
@sets_target_ruby_version.call(options_config, standard_config)
|
21
22
|
@configures_ignored_paths.call(options_config, standard_config)
|
23
|
+
@combines_plugin_configs.call(options_config, standard_config)
|
22
24
|
@merges_user_config_extensions.call(options_config, standard_config)
|
23
25
|
end
|
24
26
|
end
|
data/lib/standard/formatter.rb
CHANGED
@@ -4,7 +4,7 @@ require "rubocop"
|
|
4
4
|
module Standard
|
5
5
|
class Formatter < RuboCop::Formatter::BaseFormatter
|
6
6
|
STANDARD_GREETING = <<~MSG
|
7
|
-
standard: Use Ruby Standard Style (https://github.com/
|
7
|
+
standard: Use Ruby Standard Style (https://github.com/standardrb/standard)
|
8
8
|
MSG
|
9
9
|
|
10
10
|
def started(_target_files)
|
@@ -33,6 +33,7 @@ module Standard
|
|
33
33
|
config_root: yaml_path ? Pathname.new(yaml_path).dirname.to_s : nil,
|
34
34
|
todo_file: todo_path,
|
35
35
|
todo_ignore_files: Array(todo_yaml["ignore"]).map { |f| (Hash === f) ? f.keys.first : f },
|
36
|
+
plugins: Array(standard_yaml["plugins"]),
|
36
37
|
extend_config: Array(standard_yaml["extend_config"])
|
37
38
|
}
|
38
39
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Standard
|
2
|
+
module Plugin
|
3
|
+
class CombinesPluginConfigs
|
4
|
+
def initialize
|
5
|
+
@initializes_plugins = InitializesPlugins.new
|
6
|
+
@merges_plugins_into_rubocop_config = MergesPluginsIntoRubocopConfig.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(options_config, standard_config)
|
10
|
+
plugins = @initializes_plugins.call(standard_config[:plugins])
|
11
|
+
@merges_plugins_into_rubocop_config.call(options_config, standard_config, plugins, permit_merging: true)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Standard
|
2
|
+
module Plugin
|
3
|
+
class CreatesRunnerContext
|
4
|
+
def call(standard_config)
|
5
|
+
LintRoller::Context.new(
|
6
|
+
runner: :standard,
|
7
|
+
runner_version: Standard::VERSION,
|
8
|
+
engine: :rubocop,
|
9
|
+
engine_version: RuboCop::Version.version,
|
10
|
+
target_ruby_version: standard_config[:ruby_version]
|
11
|
+
)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Standard
|
2
|
+
module Plugin
|
3
|
+
class DeterminesClassConstant
|
4
|
+
def call(plugin_name, user_config)
|
5
|
+
require_plugin(user_config["require_path"])
|
6
|
+
|
7
|
+
if (constant_name = user_config["plugin_class_name"])
|
8
|
+
begin
|
9
|
+
Kernel.const_get(constant_name)
|
10
|
+
rescue
|
11
|
+
raise "Failed while configuring plugin `#{plugin_name}': no constant with name `#{constant_name}' was found"
|
12
|
+
end
|
13
|
+
else
|
14
|
+
begin
|
15
|
+
Kernel.const_get(Gem.loaded_specs[plugin_name].metadata["default_lint_roller_plugin"])
|
16
|
+
rescue LoadError, StandardError
|
17
|
+
raise <<~MSG
|
18
|
+
Failed loading plugin `#{plugin_name}' because we couldn't determine
|
19
|
+
the corresponding plugin class to instantiate.
|
20
|
+
|
21
|
+
Standard plugin class names must either be:
|
22
|
+
|
23
|
+
- If the plugin is a gem, defined in the gemspec as `default_lint_roller_plugin'
|
24
|
+
|
25
|
+
spec.metadata["default_lint_roller_plugin"] = "MyModule::Plugin"
|
26
|
+
|
27
|
+
- Set in YAML as `plugin_class_name'; example:
|
28
|
+
|
29
|
+
plugins:
|
30
|
+
- incomplete:
|
31
|
+
require_path: my_module/plugin
|
32
|
+
plugin_class_name: "MyModule::Plugin"
|
33
|
+
MSG
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def require_plugin(require_path)
|
42
|
+
return if require_path.nil?
|
43
|
+
|
44
|
+
begin
|
45
|
+
require require_path
|
46
|
+
rescue LoadError
|
47
|
+
# If require_path isn't on the load_path (and it may be hard to get it
|
48
|
+
# on there since standardrb is a cli), let's give folks a break and
|
49
|
+
# also try to load it via the current working directory. This is
|
50
|
+
# tested in test/standardrb_test.rb #test_plugins_options
|
51
|
+
require Pathname.new(Dir.pwd).join(require_path)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Standard
|
2
|
+
module Plugin
|
3
|
+
class InitializesPlugins
|
4
|
+
def initialize
|
5
|
+
@standardizes_configured_plugins = StandardizesConfiguredPlugins.new
|
6
|
+
@determines_class_constants = DeterminesClassConstant.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(plugins)
|
10
|
+
plugin_configs = @standardizes_configured_plugins.call(plugins)
|
11
|
+
plugin_configs.map { |name_or_class, user_config|
|
12
|
+
if user_config["enabled"]
|
13
|
+
if name_or_class.is_a?(String) || name_or_class.is_a?(Symbol)
|
14
|
+
@determines_class_constants.call(name_or_class, user_config).new(user_config)
|
15
|
+
else
|
16
|
+
name_or_class.new(user_config)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|