quiet_quality 1.5.0 → 1.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ff5a82876936d746842d76e055475ba19e78d0bfff7967b2f179a2262cb5d7e
4
- data.tar.gz: 529ed1d29fdf3c3c6ba381e7ab71cbf006bc44c8d608858e8ec84d67c2efb267
3
+ metadata.gz: 3084fe3f419db403944af870a9ccc39cccfe046f9f01841f52872808cd38b186
4
+ data.tar.gz: bc3b18bd54ec79e6adf72c9947142050cd0a14a329d665f58290fe40b3382b27
5
5
  SHA512:
6
- metadata.gz: 1b840cfe8d90929c0fcc32fdc1370310924a46464006b39afa5dceff69b8c24254d701002e77f33a845baaa7fe5373243486b5d1422a3beea4fd45a50e65ec8b
7
- data.tar.gz: e3176f406a5de5a027cae5a2edcbd897395a0191dad1a6cb402bf48fb005f9dce3783d8e6778f91e7d05c03b3f12f473ee23438b9235ed5eedd5e4d588a58526
6
+ metadata.gz: 761966c658f578970e2d420d194d8d81a71e2d8808f95c8862366656a88e2ee3bf10e1ec8907ac21f4b4e62d799cd923ea481c7bbbd856da8a9b5c8656c3cf1e
7
+ data.tar.gz: 2a91a00a403943d7a6051dc788dae5d2a963740cfd6d543228d8dbc810a5efd2ac5bdc0d8fc9c5f6c799e97c0c81742fd17543a43b184b86e4be117365146a0c
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## Release 1.5.1
4
+
5
+ * Refactor ConfigParser to just parse the config into ParsedOptions, separating
6
+ the file-filter/excludes handling properly (#114)
7
+ * Update the standard/rubocop constraints (dev-only)
8
+ * Fail the pipeline when rspec encounters non-spec failures (#120 resolves #119)
9
+ * Expose error messages when brakeman encounters errors (#122 resolves #115)
10
+
3
11
  ## Release 1.5.0
4
12
 
5
13
  * Update to comply with current standardrb rules, and use checkout@v4
@@ -84,7 +84,7 @@ module QuietQuality
84
84
 
85
85
  def set_unless_nil(object, method, value)
86
86
  return if value.nil?
87
- object.send("#{method}=", value)
87
+ object.send(:"#{method}=", value)
88
88
  end
89
89
 
90
90
  # ---- update the global options -------------
@@ -129,7 +129,7 @@ module QuietQuality
129
129
  options.tools.each do |tool_options|
130
130
  update_tool_option(tool_options, :limit_targets)
131
131
  update_tool_option(tool_options, :filter_messages)
132
- update_tool_option(tool_options, :file_filter)
132
+ set_unless_nil(tool_options, :file_filter, build_file_filter(tool_options.tool_name))
133
133
  end
134
134
  end
135
135
 
@@ -138,6 +138,13 @@ module QuietQuality
138
138
  set_unless_nil(tool_options, option_name, apply.global_option(option_name))
139
139
  set_unless_nil(tool_options, option_name, apply.tool_option(tool_name, option_name))
140
140
  end
141
+
142
+ def build_file_filter(tool_name)
143
+ filter_string = apply.tool_option(tool_name, :file_filter)
144
+ excludes_strings = apply.tool_option(tool_name, :excludes)
145
+ return nil if filter_string.nil? && (excludes_strings.nil? || excludes_strings.empty?)
146
+ Config::FileFilter.new(regex: filter_string, excludes: excludes_strings)
147
+ end
141
148
  end
142
149
  end
143
150
  end
@@ -8,6 +8,8 @@ module QuietQuality
8
8
  @excludes_strings = excludes
9
9
  end
10
10
 
11
+ attr_reader :regex_string, :excludes_strings
12
+
11
13
  def regex
12
14
  return nil if @regex_string.nil?
13
15
  @_regex ||= Regexp.new(@regex_string)
@@ -33,6 +35,10 @@ module QuietQuality
33
35
  regex_match?(s) && !excludes_match?(s)
34
36
  end
35
37
 
38
+ def ==(other)
39
+ regex_string == other.regex_string && excludes_strings.sort == other.excludes_strings.sort
40
+ end
41
+
36
42
  private
37
43
 
38
44
  # The regex is an allow-match - if it's not supplied, treat everything as matching.
@@ -21,7 +21,8 @@ module QuietQuality
21
21
  TOOL_OPTIONS = [
22
22
  :limit_targets,
23
23
  :filter_messages,
24
- :file_filter
24
+ :file_filter,
25
+ :excludes
25
26
  ].to_set
26
27
 
27
28
  def initialize
@@ -65,7 +65,8 @@ module QuietQuality
65
65
  read_tool_option(opts, tool_name, :unfiltered, :filter_messages, as: :reversed_boolean)
66
66
  read_tool_option(opts, tool_name, :changed_files, :limit_targets, as: :boolean)
67
67
  read_tool_option(opts, tool_name, :all_files, :limit_targets, as: :reversed_boolean)
68
- read_file_filter(opts, tool_name)
68
+ read_tool_option(opts, tool_name, :file_filter, :file_filter, as: :string)
69
+ read_tool_option(opts, tool_name, :excludes, :excludes, as: :strings)
69
70
  end
70
71
 
71
72
  def invalid!(message)
@@ -98,21 +99,13 @@ module QuietQuality
98
99
  opts.set_tool_option(tool, into, coerced_value)
99
100
  end
100
101
 
101
- def read_file_filter(opts, tool)
102
- parsed_regex = data.dig(tool.to_sym, :file_filter)
103
- parsed_excludes = data.dig(tool.to_sym, :excludes)
104
- if parsed_regex || parsed_excludes
105
- filter = Config::FileFilter.new(regex: parsed_regex, excludes: parsed_excludes)
106
- opts.set_tool_option(tool, :file_filter, filter)
107
- end
108
- end
109
-
110
102
  def validate_value(name, value, as:, from: nil)
111
103
  case as
112
104
  when :boolean then validate_boolean(name, value)
113
105
  when :reversed_boolean then validate_boolean(name, value)
114
106
  when :symbol then validate_symbol(name, value, from: from)
115
107
  when :string then validate_string(name, value)
108
+ when :strings then validate_strings(name, value)
116
109
  end
117
110
  end
118
111
 
@@ -138,11 +131,17 @@ module QuietQuality
138
131
  invalid!("option #{name} must not be empty") if value.empty?
139
132
  end
140
133
 
134
+ def validate_strings(name, value)
135
+ invalid!("option #{name} must be an array") unless value.is_a?(Array)
136
+ value.each_with_index { |item, n| validate_string("#{name}[#{n}]", item) }
137
+ end
138
+
141
139
  def coerce_value(value, as:)
142
140
  case as
143
141
  when :boolean then !!value
144
142
  when :reversed_boolean then !value
145
143
  when :string then value.to_s
144
+ when :strings then value.map(&:to_s)
146
145
  when :symbol then value.to_sym
147
146
  end
148
147
  end
@@ -53,8 +53,10 @@ module QuietQuality
53
53
  data_text = JSON.pretty_generate(data)
54
54
  message = message + "\n" + data_text
55
55
  end
56
- prefixed_message = message.split("\n").map { |line| "[#{prefix}] #{line}" }.join("\n")
57
- colorize(prefixed_message, message_level)
56
+ message.split("\n")
57
+ .map { |line| "[#{prefix}] #{line}" }
58
+ .map { |prefixed_line| colorize(prefixed_line, message_level) }
59
+ .join("\n")
58
60
  end
59
61
 
60
62
  def colorize(s, message_level)
@@ -2,6 +2,8 @@ module QuietQuality
2
2
  module Tools
3
3
  module Brakeman
4
4
  class Parser
5
+ include Logging
6
+
5
7
  def initialize(text)
6
8
  @text = text
7
9
  end
@@ -24,6 +26,8 @@ module QuietQuality
24
26
  def check_errors!
25
27
  errors = data[:errors]
26
28
  return if errors.nil? || errors.empty?
29
+ warn "Brakeman errors:"
30
+ errors.each { |error| warn " #{error}" }
27
31
  fail(ParsingError, "Found #{errors.length} errors in brakeman output")
28
32
  end
29
33
 
@@ -2,6 +2,8 @@ module QuietQuality
2
2
  module Tools
3
3
  module Rspec
4
4
  class Parser
5
+ include Logging
6
+
5
7
  def initialize(text)
6
8
  @text = text
7
9
  end
@@ -39,7 +41,9 @@ module QuietQuality
39
41
  end
40
42
 
41
43
  def examples
42
- @_examples ||= content.fetch(:examples)
44
+ return @_examples if defined?(@_examples)
45
+ raise_if_errors_outside_of_examples!
46
+ @_examples = content.fetch(:examples)
43
47
  end
44
48
 
45
49
  def failed_examples
@@ -63,6 +67,25 @@ module QuietQuality
63
67
  tool_name: TOOL_NAME
64
68
  )
65
69
  end
70
+
71
+ def errors_count
72
+ @_errors_count ||= content.dig(:summary, :errors_outside_of_examples_count) || 0
73
+ end
74
+
75
+ def error_messages
76
+ @_error_messages ||= content.fetch(:messages, [])
77
+ end
78
+
79
+ def raise_if_errors_outside_of_examples!
80
+ return if errors_count < 1
81
+ warn "RSpec errors:"
82
+ warn "-" * 80
83
+ error_messages.each do |msg|
84
+ warn msg
85
+ warn "-" * 80
86
+ end
87
+ fail Rspec::Error, "Rspec encountered #{errors_count} errors outside of examples"
88
+ end
66
89
  end
67
90
  end
68
91
  end
@@ -2,6 +2,8 @@ module QuietQuality
2
2
  module Tools
3
3
  module Rspec
4
4
  TOOL_NAME = :rspec
5
+
6
+ Error = Class.new(Tools::Error)
5
7
  end
6
8
  end
7
9
  end
@@ -1,3 +1,3 @@
1
1
  module QuietQuality
2
- VERSION = "1.5.0"
2
+ VERSION = "1.5.1"
3
3
  end
@@ -34,12 +34,12 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency "git", "~> 1.18"
35
35
  spec.add_dependency "git_diff_parser", "~> 4"
36
36
 
37
- spec.add_development_dependency "rspec", "~> 3.10"
37
+ spec.add_development_dependency "rspec", "~> 3.13"
38
38
  spec.add_development_dependency "rspec-its", "~> 1.3"
39
39
  spec.add_development_dependency "simplecov", "~> 0.22.0"
40
40
  spec.add_development_dependency "pry", "~> 0.14"
41
- spec.add_development_dependency "standard", "~> 1.28"
42
- spec.add_development_dependency "rubocop", "~> 1.50"
41
+ spec.add_development_dependency "standard", ">= 1.35.1"
42
+ spec.add_development_dependency "rubocop", ">= 1.62"
43
43
  spec.add_development_dependency "debug", "~> 1.7"
44
44
  spec.add_development_dependency "mdl", "~> 0.12"
45
45
  spec.add_development_dependency "rspec-cover_it", "~> 0.1.0"
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.5.0
4
+ version: 1.5.1
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-15 00:00:00.000000000 Z
11
+ date: 2024-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.10'
47
+ version: '3.13'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.10'
54
+ version: '3.13'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec-its
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -98,30 +98,30 @@ dependencies:
98
98
  name: standard
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: '1.28'
103
+ version: 1.35.1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: '1.28'
110
+ version: 1.35.1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rubocop
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '1.50'
117
+ version: '1.62'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: '1.50'
124
+ version: '1.62'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: debug
127
127
  requirement: !ruby/object:Gem::Requirement