skunk 0.3.2 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubycritic/commands/version"
4
+
5
+ # nodoc #
6
+ module Skunk
7
+ module Command
8
+ # Shows skunk version
9
+ class Version < RubyCritic::Command::Version
10
+ def execute
11
+ print Skunk::VERSION
12
+ status_reporter
13
+ end
14
+ end
15
+ end
16
+ end
@@ -9,23 +9,23 @@ module Skunk
9
9
  # Extends RubyCritic::Cli::Options::Argv to parse a subset of the
10
10
  # parameters accepted by RubyCritic
11
11
  class Argv < RubyCritic::Cli::Options::Argv
12
+ # :reek:Attribute
13
+ attr_accessor :output_filename
14
+
12
15
  def parse # rubocop:disable Metrics/MethodLength
13
16
  parser.new do |opts|
14
17
  opts.banner = "Usage: skunk [options] [paths]\n"
15
18
 
16
- opts.on(
17
- "-p", "--path [PATH]",
18
- "Set path where report will be saved (tmp/skunk by default)"
19
- ) do |path|
20
- @root = path
21
- end
22
-
23
19
  opts.on("-b", "--branch BRANCH", "Set branch to compare") do |branch|
24
20
  self.base_branch = String(branch)
25
21
  set_current_branch
26
22
  self.mode = :compare_branches
27
23
  end
28
24
 
25
+ opts.on("-o", "--out FILE", "Output report to file") do |filename|
26
+ self.output_filename = filename
27
+ end
28
+
29
29
  opts.on_tail("-v", "--version", "Show gem's version") do
30
30
  self.mode = :version
31
31
  end
@@ -35,6 +35,10 @@ module Skunk
35
35
  end
36
36
  end.parse!(@argv)
37
37
  end
38
+
39
+ def to_h
40
+ super.merge(output_filename: output_filename)
41
+ end
38
42
  end
39
43
  end
40
44
  end
@@ -3,34 +3,34 @@
3
3
  require "rubycritic/core/analysed_module"
4
4
 
5
5
  module RubyCritic
6
- # Monkey-patches RubyCritic::AnalysedModule to add a stink_score method
6
+ # Monkey-patches RubyCritic::AnalysedModule to add a skunk_score method
7
7
  class AnalysedModule
8
8
  PERFECT_COVERAGE = 100
9
9
 
10
- # Returns a numeric value that represents the stink_score of a module:
10
+ # Returns a numeric value that represents the skunk_score of a module:
11
11
  #
12
- # If module is perfectly covered, stink score is the same as the
12
+ # If module is perfectly covered, skunk score is the same as the
13
13
  # `churn_times_cost`
14
14
  #
15
- # If module has no coverage, stink score is a penalized value of
15
+ # If module has no coverage, skunk score is a penalized value of
16
16
  # `churn_times_cost`
17
17
  #
18
- # For now the stink_score is calculated by multiplying `churn_times_cost`
18
+ # For now the skunk_score is calculated by multiplying `churn_times_cost`
19
19
  # times the lack of coverage.
20
20
  #
21
21
  # For example:
22
22
  #
23
23
  # When `churn_times_cost` is 100 and module is perfectly covered:
24
- # stink_score => 100
24
+ # skunk_score => 100
25
25
  #
26
26
  # When `churn_times_cost` is 100 and module is not covered at all:
27
- # stink_score => 100 * 100 = 10_000
27
+ # skunk_score => 100 * 100 = 10_000
28
28
  #
29
29
  # When `churn_times_cost` is 100 and module is covered at 75%:
30
- # stink_score => 100 * 25 (percentage uncovered) = 2_500
30
+ # skunk_score => 100 * 25 (percentage uncovered) = 2_500
31
31
  #
32
32
  # @return [Float]
33
- def stink_score
33
+ def skunk_score
34
34
  return cost.round(2) if coverage == PERFECT_COVERAGE
35
35
 
36
36
  (cost * (PERFECT_COVERAGE - coverage.to_i)).round(2)
@@ -41,7 +41,27 @@ module RubyCritic
41
41
  # @return [Integer]
42
42
  def churn_times_cost
43
43
  safe_churn = churn.positive? ? churn : 1
44
- @churn_times_cost ||= safe_churn * cost
44
+ @churn_times_cost ||= (safe_churn * cost).round(2)
45
+ end
46
+
47
+ # Returns a hash with these attributes:
48
+ # - file
49
+ # - skunk_score
50
+ # - churn_times_cost
51
+ # - churn
52
+ # - cost
53
+ # - coverage
54
+ #
55
+ # @return [Hash]
56
+ def to_hash
57
+ {
58
+ file: pathname.to_s,
59
+ skunk_score: skunk_score,
60
+ churn_times_cost: churn_times_cost,
61
+ churn: churn,
62
+ cost: cost.round(2),
63
+ coverage: coverage.round(2)
64
+ }
45
65
  end
46
66
  end
47
67
  end
@@ -5,10 +5,10 @@ require "rubycritic/core/analysed_modules_collection"
5
5
  module RubyCritic
6
6
  # nodoc #
7
7
  class AnalysedModulesCollection
8
- def stink_score_average
8
+ def skunk_score_average
9
9
  num_modules = @modules.size
10
10
  if num_modules.positive?
11
- map(&:stink_score).reduce(:+) / num_modules.to_f
11
+ sum(&:skunk_score) / num_modules.to_f
12
12
  else
13
13
  0.0
14
14
  end
data/lib/skunk/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Skunk
4
- VERSION = "0.3.2"
4
+ VERSION = "0.5.1"
5
5
  end
data/logo.png ADDED
Binary file
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ def hello
4
+ puts "hello world"
5
+ end
@@ -3,34 +3,34 @@
3
3
  require "rubycritic/core/analysed_module"
4
4
 
5
5
  module RubyCritic
6
- # Monkey-patches RubyCritic::AnalysedModule to add a stink_score method
6
+ # Monkey-patches RubyCritic::AnalysedModule to add a skunk_score method
7
7
  class AnalysedModule
8
8
  PERFECT_COVERAGE = 100
9
9
 
10
- # Returns a numeric value that represents the stink_score of a module:
10
+ # Returns a numeric value that represents the skunk_score of a module:
11
11
  #
12
- # If module is perfectly covered, stink score is the same as the
12
+ # If module is perfectly covered, skunk score is the same as the
13
13
  # `churn_times_cost`
14
14
  #
15
- # If module has no coverage, stink score is a penalized value of
15
+ # If module has no coverage, skunk score is a penalized value of
16
16
  # `churn_times_cost`
17
17
  #
18
- # For now the stink_score is calculated by multiplying `churn_times_cost`
18
+ # For now the skunk_score is calculated by multiplying `churn_times_cost`
19
19
  # times the lack of coverage.
20
20
  #
21
21
  # For example:
22
22
  #
23
23
  # When `churn_times_cost` is 100 and module is perfectly covered:
24
- # stink_score => 100
24
+ # skunk_score => 100
25
25
  #
26
26
  # When `churn_times_cost` is 100 and module is not covered at all:
27
- # stink_score => 100 * 100 = 10_000
27
+ # skunk_score => 100 * 100 = 10_000
28
28
  #
29
29
  # When `churn_times_cost` is 100 and module is covered at 75%:
30
- # stink_score => 100 * 25 (percentage uncovered) = 2_500
30
+ # skunk_score => 100 * 25 (percentage uncovered) = 2_500
31
31
  #
32
32
  # @return [Float]
33
- def stink_score
33
+ def skunk_score
34
34
  return cost.round(2) if coverage == PERFECT_COVERAGE
35
35
 
36
36
  (cost * (PERFECT_COVERAGE - coverage.to_i)).round(2)
data/skunk.gemspec CHANGED
@@ -11,9 +11,11 @@ Gem::Specification.new do |spec|
11
11
  spec.email = ["ernesto+github@ombulabs.com"]
12
12
  spec.licenses = ["MIT"]
13
13
  spec.summary = "A library to assess code quality vs. code coverage"
14
- spec.description = "Knows how to calculate the StinkScore for a Ruby file"
14
+ spec.description = "Knows how to calculate the SkunkScore for a set of Ruby modules"
15
15
  spec.homepage = "https://github.com/fastruby/skunk"
16
16
 
17
+ spec.required_ruby_version = [">= 2.4.0", "< 3.1.0"]
18
+
17
19
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
20
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
21
  if spec.respond_to?(:metadata)
@@ -30,22 +32,26 @@ Gem::Specification.new do |spec|
30
32
  # Specify which files should be added to the gem when it is released.
31
33
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
32
34
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
33
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
35
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(bin|test|spec|features)/}) }
34
36
  end
35
37
  spec.bindir = "exe"
36
38
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
39
  spec.require_paths = ["lib"]
38
40
 
39
- spec.add_dependency "rubycritic", "~> 4.2.1"
41
+ spec.add_dependency "rubycritic", ">= 4.5.2", "< 5.0"
40
42
  spec.add_dependency "terminal-table", "~> 1.8.0"
41
43
 
42
- spec.add_development_dependency "bundler", "~> 2.0"
43
44
  spec.add_development_dependency "byebug", "~> 11"
45
+ spec.add_development_dependency "codecov", "~> 0.1.16"
44
46
  spec.add_development_dependency "minitest", "~> 5.8.4"
45
47
  spec.add_development_dependency "minitest-around", "~> 0.5.0"
46
- spec.add_development_dependency "rake", "~> 10.0"
47
- spec.add_development_dependency "reek", "~> 5.4.0"
48
- spec.add_development_dependency "rubocop", "< 1.0"
49
- spec.add_development_dependency "simplecov", "~> 0.17.1"
48
+ spec.add_development_dependency "minitest-stub_any_instance", "~> 1.0.2"
49
+ spec.add_development_dependency "minitest-stub-const", "~> 0.6"
50
+ spec.add_development_dependency "rake", "~> 13.0"
51
+ spec.add_development_dependency "reek", "~> 6.0.0"
52
+ spec.add_development_dependency "rubocop", "~> 1.0"
53
+ spec.add_development_dependency "simplecov", "~> 0.18"
50
54
  spec.add_development_dependency "simplecov-console", "0.5.0"
55
+ spec.add_development_dependency "vcr", "~> 6.0.0"
56
+ spec.add_development_dependency "webmock", "~> 3.10.0"
51
57
  end
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skunk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ernesto Tagwerker
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-23 00:00:00.000000000 Z
11
+ date: 2021-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubycritic
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.5.2
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: 4.2.1
22
+ version: '5.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: 4.2.1
29
+ version: 4.5.2
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: terminal-table
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,33 +45,33 @@ dependencies:
39
45
  - !ruby/object:Gem::Version
40
46
  version: 1.8.0
41
47
  - !ruby/object:Gem::Dependency
42
- name: bundler
48
+ name: byebug
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '2.0'
53
+ version: '11'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '2.0'
60
+ version: '11'
55
61
  - !ruby/object:Gem::Dependency
56
- name: byebug
62
+ name: codecov
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '11'
67
+ version: 0.1.16
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '11'
74
+ version: 0.1.16
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: minitest
71
77
  requirement: !ruby/object:Gem::Requirement
@@ -94,46 +100,74 @@ dependencies:
94
100
  - - "~>"
95
101
  - !ruby/object:Gem::Version
96
102
  version: 0.5.0
103
+ - !ruby/object:Gem::Dependency
104
+ name: minitest-stub_any_instance
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 1.0.2
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 1.0.2
117
+ - !ruby/object:Gem::Dependency
118
+ name: minitest-stub-const
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0.6'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '0.6'
97
131
  - !ruby/object:Gem::Dependency
98
132
  name: rake
99
133
  requirement: !ruby/object:Gem::Requirement
100
134
  requirements:
101
135
  - - "~>"
102
136
  - !ruby/object:Gem::Version
103
- version: '10.0'
137
+ version: '13.0'
104
138
  type: :development
105
139
  prerelease: false
106
140
  version_requirements: !ruby/object:Gem::Requirement
107
141
  requirements:
108
142
  - - "~>"
109
143
  - !ruby/object:Gem::Version
110
- version: '10.0'
144
+ version: '13.0'
111
145
  - !ruby/object:Gem::Dependency
112
146
  name: reek
113
147
  requirement: !ruby/object:Gem::Requirement
114
148
  requirements:
115
149
  - - "~>"
116
150
  - !ruby/object:Gem::Version
117
- version: 5.4.0
151
+ version: 6.0.0
118
152
  type: :development
119
153
  prerelease: false
120
154
  version_requirements: !ruby/object:Gem::Requirement
121
155
  requirements:
122
156
  - - "~>"
123
157
  - !ruby/object:Gem::Version
124
- version: 5.4.0
158
+ version: 6.0.0
125
159
  - !ruby/object:Gem::Dependency
126
160
  name: rubocop
127
161
  requirement: !ruby/object:Gem::Requirement
128
162
  requirements:
129
- - - "<"
163
+ - - "~>"
130
164
  - !ruby/object:Gem::Version
131
165
  version: '1.0'
132
166
  type: :development
133
167
  prerelease: false
134
168
  version_requirements: !ruby/object:Gem::Requirement
135
169
  requirements:
136
- - - "<"
170
+ - - "~>"
137
171
  - !ruby/object:Gem::Version
138
172
  version: '1.0'
139
173
  - !ruby/object:Gem::Dependency
@@ -142,14 +176,14 @@ dependencies:
142
176
  requirements:
143
177
  - - "~>"
144
178
  - !ruby/object:Gem::Version
145
- version: 0.17.1
179
+ version: '0.18'
146
180
  type: :development
147
181
  prerelease: false
148
182
  version_requirements: !ruby/object:Gem::Requirement
149
183
  requirements:
150
184
  - - "~>"
151
185
  - !ruby/object:Gem::Version
152
- version: 0.17.1
186
+ version: '0.18'
153
187
  - !ruby/object:Gem::Dependency
154
188
  name: simplecov-console
155
189
  requirement: !ruby/object:Gem::Requirement
@@ -164,7 +198,35 @@ dependencies:
164
198
  - - '='
165
199
  - !ruby/object:Gem::Version
166
200
  version: 0.5.0
167
- description: Knows how to calculate the StinkScore for a Ruby file
201
+ - !ruby/object:Gem::Dependency
202
+ name: vcr
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: 6.0.0
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: 6.0.0
215
+ - !ruby/object:Gem::Dependency
216
+ name: webmock
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: 3.10.0
222
+ type: :development
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: 3.10.0
229
+ description: Knows how to calculate the SkunkScore for a set of Ruby modules
168
230
  email:
169
231
  - ernesto+github@ombulabs.com
170
232
  executables:
@@ -172,34 +234,44 @@ executables:
172
234
  extensions: []
173
235
  extra_rdoc_files: []
174
236
  files:
237
+ - ".github/ISSUE_TEMPLATE/bug_report.md"
238
+ - ".github/ISSUE_TEMPLATE/feature_request.md"
239
+ - ".github/workflows/main.yml"
240
+ - ".github/workflows/skunk.yml"
175
241
  - ".gitignore"
176
242
  - ".reek.yml"
177
243
  - ".rubocop.yml"
178
244
  - ".rubocop_todo.yml"
179
- - ".travis.yml"
180
245
  - CHANGELOG.md
246
+ - CODEOWNERS
181
247
  - CODE_OF_CONDUCT.md
182
248
  - Gemfile
183
- - Gemfile.lock
249
+ - Gemfile-Ruby-2-4
184
250
  - LICENSE.txt
185
251
  - README.md
186
252
  - Rakefile
187
- - bin/console
188
- - bin/setup
189
253
  - exe/skunk
254
+ - fastruby-logo.png
190
255
  - lib/skunk.rb
191
256
  - lib/skunk/cli/application.rb
192
257
  - lib/skunk/cli/command_factory.rb
193
258
  - lib/skunk/cli/commands/base.rb
194
259
  - lib/skunk/cli/commands/compare.rb
260
+ - lib/skunk/cli/commands/compare_score.rb
195
261
  - lib/skunk/cli/commands/default.rb
196
262
  - lib/skunk/cli/commands/help.rb
263
+ - lib/skunk/cli/commands/output.rb
264
+ - lib/skunk/cli/commands/shareable.rb
197
265
  - lib/skunk/cli/commands/status_reporter.rb
266
+ - lib/skunk/cli/commands/status_sharer.rb
267
+ - lib/skunk/cli/commands/version.rb
198
268
  - lib/skunk/cli/options.rb
199
269
  - lib/skunk/cli/options/argv.rb
200
270
  - lib/skunk/rubycritic/analysed_module.rb
201
271
  - lib/skunk/rubycritic/analysed_modules_collection.rb
202
272
  - lib/skunk/version.rb
273
+ - logo.png
274
+ - samples/engines/spec/nested_sample_spec.rb
203
275
  - samples/rubycritic/analysed_module.rb
204
276
  - skunk.gemspec
205
277
  homepage: https://github.com/fastruby/skunk
@@ -210,7 +282,7 @@ metadata:
210
282
  homepage_uri: https://github.com/fastruby/skunk
211
283
  source_code_uri: https://github.com/fastruby/skunk
212
284
  changelog_uri: https://github.com/fastruby/skunk/changelog
213
- post_install_message:
285
+ post_install_message:
214
286
  rdoc_options: []
215
287
  require_paths:
216
288
  - lib
@@ -218,15 +290,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
218
290
  requirements:
219
291
  - - ">="
220
292
  - !ruby/object:Gem::Version
221
- version: '0'
293
+ version: 2.4.0
294
+ - - "<"
295
+ - !ruby/object:Gem::Version
296
+ version: 3.1.0
222
297
  required_rubygems_version: !ruby/object:Gem::Requirement
223
298
  requirements:
224
299
  - - ">="
225
300
  - !ruby/object:Gem::Version
226
301
  version: '0'
227
302
  requirements: []
228
- rubygems_version: 3.0.6
229
- signing_key:
303
+ rubygems_version: 3.0.9
304
+ signing_key:
230
305
  specification_version: 4
231
306
  summary: A library to assess code quality vs. code coverage
232
307
  test_files: []