quiet_quality 1.2.0 → 1.2.2
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/.github/workflows/rspec.yml +1 -1
- data/CHANGELOG.md +22 -0
- data/lib/quiet_quality/annotators/github_stdout.rb +3 -1
- data/lib/quiet_quality/cli/arg_parser.rb +11 -7
- data/lib/quiet_quality/cli/entrypoint.rb +0 -8
- data/lib/quiet_quality/cli/presenter.rb +1 -1
- data/lib/quiet_quality/config/finder.rb +0 -4
- data/lib/quiet_quality/config/logging.rb +3 -2
- data/lib/quiet_quality/config/parsed_options.rb +36 -0
- data/lib/quiet_quality/config/parser.rb +4 -8
- data/lib/quiet_quality/executors/base_executor.rb +1 -11
- data/lib/quiet_quality/message.rb +44 -9
- data/lib/quiet_quality/tools/brakeman/parser.rb +8 -1
- data/lib/quiet_quality/tools/brakeman/runner.rb +1 -1
- data/lib/quiet_quality/tools/brakeman.rb +1 -0
- data/lib/quiet_quality/tools/haml_lint/parser.rb +2 -1
- data/lib/quiet_quality/tools/haml_lint/runner.rb +1 -1
- data/lib/quiet_quality/tools/haml_lint.rb +1 -0
- data/lib/quiet_quality/tools/markdown_lint/parser.rb +2 -1
- data/lib/quiet_quality/tools/markdown_lint/runner.rb +1 -1
- data/lib/quiet_quality/tools/markdown_lint.rb +1 -0
- data/lib/quiet_quality/tools/rspec/parser.rb +26 -2
- data/lib/quiet_quality/tools/rspec/runner.rb +1 -1
- data/lib/quiet_quality/tools/rspec.rb +1 -0
- data/lib/quiet_quality/tools/rubocop/parser.rb +6 -1
- data/lib/quiet_quality/tools/rubocop/runner.rb +1 -1
- data/lib/quiet_quality/tools/rubocop.rb +1 -0
- data/lib/quiet_quality/tools/standardrb/parser.rb +3 -0
- data/lib/quiet_quality/tools/standardrb/runner.rb +1 -1
- data/lib/quiet_quality/tools/standardrb.rb +1 -0
- data/lib/quiet_quality/version.rb +1 -1
- data/lib/quiet_quality/version_control_systems/git.rb +2 -11
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6876b975446f39615f129b4fd35f3543bb998024ea292edcac1e6e1a90f7b59b
|
4
|
+
data.tar.gz: 277492ea2e6b93854e3b7d16f0184a50b5c756683929fb2a1081415e8e9836df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d0acaa14243573095f8741b9ca45cf56608b4ffde72f3ecd36a6ebd03cb0aeb45541ef3e4dad1c681976d5cdc3226d738a489b754d80590be032c31bbc8520b
|
7
|
+
data.tar.gz: 8e8daf77522762cca13480745f30df25cb2e445f2f7c69f98c20af9bc3b03bc8568299b8403ddbbc2e09fef750d3b3944c1a6f9b8dc2e4e22a4389a5419d05ab
|
data/.github/workflows/rspec.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,27 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Release 1.2.2
|
4
|
+
|
5
|
+
* Add some code to the Rspec::Parser that _cleans_ the json of certain text that
|
6
|
+
simplecov may write into the rspec json output. (#91, resolves #86)
|
7
|
+
* Include the name of the originating tool in the printed message, and the
|
8
|
+
annotation, when a warning is presented. (#90 resolves #72)
|
9
|
+
* Support `normal` as a logging level, and the `--normal` and `-n` cli
|
10
|
+
arguments. This is the default value, so this really only matters if your
|
11
|
+
config file sets another value and you want to override it from the cli.
|
12
|
+
(#91, resolves #86)
|
13
|
+
|
14
|
+
## Release 1.2.1
|
15
|
+
|
16
|
+
* Fix the handling of the various ways to specify whether tools should limit
|
17
|
+
their targets to changed files or run against the entire repository. The
|
18
|
+
configuration systems had disagreements on what to call the options in
|
19
|
+
question, which resulted in some configuration entries being ignored. We
|
20
|
+
enforce a set of validations on reads and writes now to avoid such a problem
|
21
|
+
in the future (#89, resolves #88)
|
22
|
+
* Add coverage-checking, and then improve test coverage and remove unreferenced
|
23
|
+
code as a result. (#87)
|
24
|
+
|
3
25
|
## Release 1.2.0
|
4
26
|
|
5
27
|
* Support `--light`, `--quiet`, and `--logging LEVEL` arguments for less output
|
@@ -18,10 +18,12 @@ module QuietQuality
|
|
18
18
|
# ::warning file={name},line={line},title={title}::{message}
|
19
19
|
# See https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-a-warning-message
|
20
20
|
def self.format(message)
|
21
|
+
title = message.tool_name.to_s
|
22
|
+
title += " #{message.rule}" if message.rule
|
21
23
|
attributes = {
|
22
24
|
file: message.path,
|
23
25
|
line: message.annotated_line || message.start_line,
|
24
|
-
title:
|
26
|
+
title: title
|
25
27
|
}.compact
|
26
28
|
|
27
29
|
attributes_string = attributes.map { |k, v| "#{k}=#{v}" }.join(",")
|
@@ -45,12 +45,12 @@ module QuietQuality
|
|
45
45
|
# options; if they don't, they are global options. (optparse allows an optional argument
|
46
46
|
# to a flag if the string representing it is not a 'string in all caps'. So `[FOO]` or `foo`
|
47
47
|
# would be optional, but `FOO` would be required. This helper simplifies handling those.
|
48
|
-
def read_tool_or_global_option(name
|
48
|
+
def read_tool_or_global_option(name:, into:, tool:, value:)
|
49
49
|
if tool
|
50
50
|
validate_value_from("tool", tool, Tools::AVAILABLE)
|
51
|
-
set_tool_option(tool,
|
51
|
+
set_tool_option(tool, into, value)
|
52
52
|
else
|
53
|
-
set_global_option(
|
53
|
+
set_global_option(into, value)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -114,11 +114,11 @@ module QuietQuality
|
|
114
114
|
|
115
115
|
def setup_file_target_options(parser)
|
116
116
|
parser.on("-a", "--all-files [tool]", "Use the tool(s) on all files") do |tool|
|
117
|
-
read_tool_or_global_option(:all_files, tool,
|
117
|
+
read_tool_or_global_option(name: :all_files, into: :limit_targets, tool: tool, value: false)
|
118
118
|
end
|
119
119
|
|
120
120
|
parser.on("-c", "--changed-files [tool]", "Use the tool(s) only on changed files") do |tool|
|
121
|
-
read_tool_or_global_option(:all_files, tool,
|
121
|
+
read_tool_or_global_option(name: :all_files, into: :limit_targets, tool: tool, value: true)
|
122
122
|
end
|
123
123
|
|
124
124
|
parser.on("-B", "--comparison-branch BRANCH", "Specify the branch to compare against") do |branch|
|
@@ -128,15 +128,19 @@ module QuietQuality
|
|
128
128
|
|
129
129
|
def setup_filter_messages_options(parser)
|
130
130
|
parser.on("-f", "--filter-messages [tool]", "Filter messages from tool(s) based on changed lines") do |tool|
|
131
|
-
read_tool_or_global_option(:filter_messages, tool, true)
|
131
|
+
read_tool_or_global_option(name: :filter_messages, into: :filter_messages, tool: tool, value: true)
|
132
132
|
end
|
133
133
|
|
134
134
|
parser.on("-u", "--unfiltered [tool]", "Don't filter messages from tool(s)") do |tool|
|
135
|
-
read_tool_or_global_option(:filter_messages, tool, false)
|
135
|
+
read_tool_or_global_option(name: :filter_messages, into: :filter_messages, tool: tool, value: false)
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
139
|
def setup_logging_options(parser)
|
140
|
+
parser.on("-n", "--normal", "Print outcomes and messages") do
|
141
|
+
set_global_option(:logging, Config::Logging::NORMAL)
|
142
|
+
end
|
143
|
+
|
140
144
|
parser.on("-l", "--light", "Print aggregated results only") do
|
141
145
|
set_global_option(:logging, Config::Logging::LIGHT)
|
142
146
|
end
|
@@ -70,7 +70,7 @@ module QuietQuality
|
|
70
70
|
line_range = line_range_for(msg)
|
71
71
|
rule_string = msg.rule ? " [#{msg.rule}]" : ""
|
72
72
|
truncated_body = reduce_text(msg.body, 120)
|
73
|
-
logger.puts " #{msg.path}:#{line_range}#{rule_string} #{truncated_body}"
|
73
|
+
logger.puts "#{msg.tool_name} #{msg.path}:#{line_range}#{rule_string} #{truncated_body}"
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
@@ -3,11 +3,12 @@ module QuietQuality
|
|
3
3
|
class Logging
|
4
4
|
LIGHT = :light
|
5
5
|
QUIET = :quiet
|
6
|
-
|
6
|
+
NORMAL = :normal
|
7
|
+
LEVELS = [LIGHT, QUIET, NORMAL].freeze
|
7
8
|
|
8
9
|
attr_accessor :level
|
9
10
|
|
10
|
-
def initialize(level:
|
11
|
+
def initialize(level: NORMAL)
|
11
12
|
@level = level
|
12
13
|
end
|
13
14
|
|
@@ -1,6 +1,26 @@
|
|
1
1
|
module QuietQuality
|
2
2
|
module Config
|
3
3
|
class ParsedOptions
|
4
|
+
InvalidOptionName = Class.new(Error)
|
5
|
+
|
6
|
+
GLOBAL_OPTIONS = [
|
7
|
+
:no_config,
|
8
|
+
:config_path,
|
9
|
+
:annotator,
|
10
|
+
:executor,
|
11
|
+
:comparison_branch,
|
12
|
+
:logging,
|
13
|
+
:limit_targets,
|
14
|
+
:filter_messages,
|
15
|
+
:file_filter
|
16
|
+
].to_set
|
17
|
+
|
18
|
+
TOOL_OPTIONS = [
|
19
|
+
:limit_targets,
|
20
|
+
:filter_messages,
|
21
|
+
:file_filter
|
22
|
+
].to_set
|
23
|
+
|
4
24
|
def initialize
|
5
25
|
@tools = []
|
6
26
|
@tool_options = {}
|
@@ -20,21 +40,37 @@ module QuietQuality
|
|
20
40
|
end
|
21
41
|
|
22
42
|
def set_global_option(name, value)
|
43
|
+
validate_global_option(name)
|
23
44
|
@global_options[name.to_sym] = value
|
24
45
|
end
|
25
46
|
|
26
47
|
def global_option(name)
|
48
|
+
validate_global_option(name)
|
27
49
|
@global_options.fetch(name.to_sym, nil)
|
28
50
|
end
|
29
51
|
|
30
52
|
def set_tool_option(tool, name, value)
|
53
|
+
validate_tool_option(name)
|
31
54
|
@tool_options[tool.to_sym] ||= {}
|
32
55
|
@tool_options[tool.to_sym][name.to_sym] = value
|
33
56
|
end
|
34
57
|
|
35
58
|
def tool_option(tool, name)
|
59
|
+
validate_tool_option(name)
|
36
60
|
@tool_options.dig(tool.to_sym, name.to_sym)
|
37
61
|
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def validate_global_option(name)
|
66
|
+
return if GLOBAL_OPTIONS.include?(name.to_sym)
|
67
|
+
fail(InvalidOptionName, "Option name #{name} is not a recognized global ParsedOption")
|
68
|
+
end
|
69
|
+
|
70
|
+
def validate_tool_option(name)
|
71
|
+
return if TOOL_OPTIONS.include?(name.to_sym)
|
72
|
+
fail(InvalidOptionName, "Option name #{name} is not a recognized tool ParsedOption")
|
73
|
+
end
|
38
74
|
end
|
39
75
|
end
|
40
76
|
end
|
@@ -42,8 +42,8 @@ module QuietQuality
|
|
42
42
|
read_global_option(opts, :annotator, :annotator, as: :symbol, validate_from: Annotators::ANNOTATOR_TYPES)
|
43
43
|
read_global_option(opts, :annotate, :annotator, as: :symbol, validate_from: Annotators::ANNOTATOR_TYPES)
|
44
44
|
read_global_option(opts, :comparison_branch, :comparison_branch, as: :string)
|
45
|
-
read_global_option(opts, :changed_files, :
|
46
|
-
read_global_option(opts, :all_files, :
|
45
|
+
read_global_option(opts, :changed_files, :limit_targets, as: :boolean)
|
46
|
+
read_global_option(opts, :all_files, :limit_targets, as: :reversed_boolean)
|
47
47
|
read_global_option(opts, :filter_messages, :filter_messages, as: :boolean)
|
48
48
|
read_global_option(opts, :unfiltered, :filter_messages, as: :reversed_boolean)
|
49
49
|
read_global_option(opts, :logging, :logging, as: :symbol, validate_from: Logging::LEVELS)
|
@@ -61,8 +61,8 @@ module QuietQuality
|
|
61
61
|
|
62
62
|
read_tool_option(opts, tool_name, :filter_messages, :filter_messages, as: :boolean)
|
63
63
|
read_tool_option(opts, tool_name, :unfiltered, :filter_messages, as: :reversed_boolean)
|
64
|
-
read_tool_option(opts, tool_name, :changed_files, :
|
65
|
-
read_tool_option(opts, tool_name, :all_files, :
|
64
|
+
read_tool_option(opts, tool_name, :changed_files, :limit_targets, as: :boolean)
|
65
|
+
read_tool_option(opts, tool_name, :all_files, :limit_targets, as: :reversed_boolean)
|
66
66
|
read_tool_option(opts, tool_name, :file_filter, :file_filter, as: :string)
|
67
67
|
end
|
68
68
|
|
@@ -102,8 +102,6 @@ module QuietQuality
|
|
102
102
|
when :reversed_boolean then validate_boolean(name, value)
|
103
103
|
when :symbol then validate_symbol(name, value, from: from)
|
104
104
|
when :string then validate_string(name, value)
|
105
|
-
else
|
106
|
-
fail ArgumentError, "validate_value does not handle type #{as}"
|
107
105
|
end
|
108
106
|
end
|
109
107
|
|
@@ -135,8 +133,6 @@ module QuietQuality
|
|
135
133
|
when :reversed_boolean then !value
|
136
134
|
when :string then value.to_s
|
137
135
|
when :symbol then value.to_sym
|
138
|
-
else
|
139
|
-
fail ArgumentError, "coerce_value does not handle type #{as}"
|
140
136
|
end
|
141
137
|
end
|
142
138
|
end
|
@@ -7,7 +7,7 @@ module QuietQuality
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def execute!
|
10
|
-
|
10
|
+
pipelines.none?(&:failure?)
|
11
11
|
end
|
12
12
|
|
13
13
|
def outcomes
|
@@ -39,16 +39,6 @@ module QuietQuality
|
|
39
39
|
Pipeline.new(tool_options: topts, changed_files: changed_files)
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
43
|
-
def pipeline_by_tool
|
44
|
-
@_pipeline_by_tool ||= pipelines
|
45
|
-
.map { |p| [p.tool_name, p] }
|
46
|
-
.to_h
|
47
|
-
end
|
48
|
-
|
49
|
-
def pipeline_for(tool)
|
50
|
-
pipeline_by_tool.fetch(tool.to_sym)
|
51
|
-
end
|
52
42
|
end
|
53
43
|
end
|
54
44
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module QuietQuality
|
2
2
|
class Message
|
3
|
-
|
4
|
-
|
3
|
+
REQUIRED_ATTRS = %w[path body start_line tool_name].freeze
|
4
|
+
|
5
|
+
attr_writer :annotated_line
|
5
6
|
|
6
7
|
def self.load(hash)
|
7
8
|
new(**hash)
|
@@ -9,17 +10,51 @@ module QuietQuality
|
|
9
10
|
|
10
11
|
def initialize(**attrs)
|
11
12
|
@attrs = attrs.map { |k, v| [k.to_s, v] }.to_h
|
12
|
-
|
13
|
-
@body = @attrs.fetch("body")
|
14
|
-
@start_line = @attrs.fetch("start_line")
|
15
|
-
@stop_line = @attrs.fetch("stop_line", @start_line)
|
16
|
-
@annotated_line = @attrs.fetch("annotated_line", nil)
|
17
|
-
@level = @attrs.fetch("level", nil)
|
18
|
-
@rule = @attrs.fetch("rule", nil)
|
13
|
+
validate_attrs!
|
19
14
|
end
|
20
15
|
|
21
16
|
def to_h
|
22
17
|
@attrs.map { |k, v| [k.to_s, v] }.to_h
|
23
18
|
end
|
19
|
+
|
20
|
+
def path
|
21
|
+
@_path ||= @attrs.fetch("path")
|
22
|
+
end
|
23
|
+
|
24
|
+
def body
|
25
|
+
@_body ||= @attrs.fetch("body")
|
26
|
+
end
|
27
|
+
|
28
|
+
def tool_name
|
29
|
+
@_tool_name ||= @attrs.fetch("tool_name")
|
30
|
+
end
|
31
|
+
|
32
|
+
def start_line
|
33
|
+
@_start_line ||= @attrs.fetch("start_line")
|
34
|
+
end
|
35
|
+
|
36
|
+
def stop_line
|
37
|
+
@_stop_line ||= @attrs.fetch("stop_line", start_line)
|
38
|
+
end
|
39
|
+
|
40
|
+
def annotated_line
|
41
|
+
@annotated_line ||= @attrs.fetch("annotated_line", nil)
|
42
|
+
end
|
43
|
+
|
44
|
+
def level
|
45
|
+
@_level ||= @attrs.fetch("level", nil)
|
46
|
+
end
|
47
|
+
|
48
|
+
def rule
|
49
|
+
@_rule ||= @attrs.fetch("rule", nil)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def validate_attrs!
|
55
|
+
REQUIRED_ATTRS.each do |attr|
|
56
|
+
raise ArgumentError, "Missing required attribute #{attr}" unless @attrs[attr]
|
57
|
+
end
|
58
|
+
end
|
24
59
|
end
|
25
60
|
end
|
@@ -37,7 +37,14 @@ module QuietQuality
|
|
37
37
|
line = warning.fetch(:line)
|
38
38
|
level = warning.fetch(:confidence, nil)
|
39
39
|
rule = warning.fetch(:warning_type)
|
40
|
-
Message.new(
|
40
|
+
Message.new(
|
41
|
+
path: path,
|
42
|
+
body: body,
|
43
|
+
start_line: line,
|
44
|
+
level: level,
|
45
|
+
rule: rule,
|
46
|
+
tool_name: TOOL_NAME
|
47
|
+
)
|
41
48
|
end
|
42
49
|
end
|
43
50
|
end
|
@@ -36,7 +36,8 @@ module QuietQuality
|
|
36
36
|
body: offense.fetch(:message),
|
37
37
|
start_line: offense.dig(:location, :line),
|
38
38
|
level: offense.fetch(:severity, nil),
|
39
|
-
rule: offense.fetch(:linter_name, nil)
|
39
|
+
rule: offense.fetch(:linter_name, nil),
|
40
|
+
tool_name: TOOL_NAME
|
40
41
|
)
|
41
42
|
end
|
42
43
|
end
|
@@ -16,8 +16,26 @@ module QuietQuality
|
|
16
16
|
|
17
17
|
attr_reader :text
|
18
18
|
|
19
|
+
# Many people use simplecov with rspec, and its default formatter
|
20
|
+
# writes text output into the stdout stream of rspec even when rspec is
|
21
|
+
# asked for json output. I have an issue open here, and I'll get a pair
|
22
|
+
# of PRs together if they indicate any willingness to accept such a
|
23
|
+
# change: https://github.com/simplecov-ruby/simplecov/issues/1060
|
24
|
+
#
|
25
|
+
# The only stdout writes are visible on these lines:
|
26
|
+
# https://github.com/simplecov-ruby/simplecov-html/blob/main/lib/simplecov-html.rb#L31
|
27
|
+
# https://github.com/simplecov-ruby/simplecov-html/blob/main/lib/simplecov-html.rb#L80
|
28
|
+
#
|
29
|
+
# There are _hundreds_ of rspec plugins, and any of them could write to
|
30
|
+
# stdout - we probably won't worry about any but the most common.
|
31
|
+
def cleaned_text
|
32
|
+
@_cleaned_text ||= text
|
33
|
+
.gsub(/Coverage report generated.*covered.$/, "")
|
34
|
+
.gsub(/Encoding problems with file.*$/, "")
|
35
|
+
end
|
36
|
+
|
19
37
|
def content
|
20
|
-
@_content ||= JSON.parse(
|
38
|
+
@_content ||= JSON.parse(cleaned_text, symbolize_names: true)
|
21
39
|
end
|
22
40
|
|
23
41
|
def examples
|
@@ -37,7 +55,13 @@ module QuietQuality
|
|
37
55
|
body = example.dig(:exception, :message) || example.fetch(:description)
|
38
56
|
line = example.fetch(:line_number)
|
39
57
|
rule = example.dig(:exception, :class) || "Failed Example"
|
40
|
-
Message.new(
|
58
|
+
Message.new(
|
59
|
+
path: path,
|
60
|
+
body: body,
|
61
|
+
start_line: line,
|
62
|
+
rule: rule,
|
63
|
+
tool_name: TOOL_NAME
|
64
|
+
)
|
41
65
|
end
|
42
66
|
end
|
43
67
|
end
|
@@ -37,9 +37,14 @@ module QuietQuality
|
|
37
37
|
start_line: offense.dig(:location, :start_line),
|
38
38
|
stop_line: offense.dig(:location, :last_line),
|
39
39
|
level: offense.fetch(:severity, nil),
|
40
|
-
rule: offense.fetch(:cop_name, nil)
|
40
|
+
rule: offense.fetch(:cop_name, nil),
|
41
|
+
tool_name: tool_name
|
41
42
|
)
|
42
43
|
end
|
44
|
+
|
45
|
+
def tool_name
|
46
|
+
TOOL_NAME
|
47
|
+
end
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
@@ -66,12 +66,6 @@ module QuietQuality
|
|
66
66
|
|
67
67
|
private
|
68
68
|
|
69
|
-
def changed_lines_for(diff)
|
70
|
-
GitDiffParser.parse(diff).flat_map do |parsed_diff|
|
71
|
-
parsed_diff.changed_line_numbers.to_set
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
69
|
def committed_changed_files(base, sha)
|
76
70
|
ChangedFiles.new(committed_changes(base, sha))
|
77
71
|
end
|
@@ -105,11 +99,8 @@ module QuietQuality
|
|
105
99
|
end
|
106
100
|
|
107
101
|
def untracked_paths
|
108
|
-
out,
|
109
|
-
unless stat.success?
|
110
|
-
warn err
|
111
|
-
fail(Error, "git ls-files failed")
|
112
|
-
end
|
102
|
+
out, _err, stat = Open3.capture3("git", "-C", path, "ls-files", "--others", "--exclude-standard")
|
103
|
+
fail(Error, "git ls-files failed") unless stat.success?
|
113
104
|
out.split
|
114
105
|
end
|
115
106
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quiet_quality
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Mueller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git
|
@@ -251,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
251
251
|
- !ruby/object:Gem::Version
|
252
252
|
version: '0'
|
253
253
|
requirements: []
|
254
|
-
rubygems_version: 3.
|
254
|
+
rubygems_version: 3.3.7
|
255
255
|
signing_key:
|
256
256
|
specification_version: 4
|
257
257
|
summary: A system for comparing quality tool outputs against the forward diffs
|