codemonitor 0.4.0 → 0.6.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: 67bdedaed6063ea891d58825204d5dd31d60498325ee9b4b217d5981947282d7
4
- data.tar.gz: 2cdf8289ed5be0af4dfbd1acbb0d7d6d77964b81427ae22edf3f4aff1b081d19
3
+ metadata.gz: f8376539752d3392f7d8488ba82d5006143456cb0d42293b5c44a8aee5973185
4
+ data.tar.gz: 703466cb760fa112f0d07ccf1e8c0c891002532ee17d616730876594b7f118a1
5
5
  SHA512:
6
- metadata.gz: 8fc80f0a516df374fa081ead8d3de1d3a9a58cd320b36ad867e106aa13c123fb9aed0bafa07f9958df4ce1a3a7c78c6451c49cd56fe9dcb225e1635eb61c5c86
7
- data.tar.gz: 6bc644578c63a242697bea5d17949c610e2ca1b3d1ccda0fcf62999cd3dd77f6d15b44f4dc1dce0cbcd07620dde3bf49e3032f390bb47b91031291017f04b19b
6
+ metadata.gz: 7560f2f13f6cd781e24f93640adadb8cba58cca68d66b83e354ac4fac8da7f93b03b7672b905769790fbf2843a36c434c3ec385fc4000a08f79d49fb03e1dbda
7
+ data.tar.gz: b316ad47b929584ee345f37210362c16b720b204ad016c9d561fd7c7b645a5c891e85c8b2e98019e60a4f3e53cc0d827ba498f1adb8ec8c641dcc0dcccb25437
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- codemonitor (0.4.0)
4
+ codemonitor (0.6.0)
5
5
  dogapi (~> 1.45)
6
6
  octokit (~> 4.0)
7
7
 
@@ -15,7 +15,7 @@ GEM
15
15
  diff-lcs (1.3)
16
16
  dogapi (1.45.0)
17
17
  multi_json
18
- faraday (1.9.3)
18
+ faraday (1.10.0)
19
19
  faraday-em_http (~> 1.0)
20
20
  faraday-em_synchrony (~> 1.0)
21
21
  faraday-excon (~> 1.1)
@@ -50,7 +50,7 @@ GEM
50
50
  pry (0.13.1)
51
51
  coderay (~> 1.1)
52
52
  method_source (~> 1.0)
53
- public_suffix (4.0.6)
53
+ public_suffix (4.0.7)
54
54
  rainbow (3.0.0)
55
55
  rake (13.0.3)
56
56
  regexp_parser (2.1.1)
@@ -98,4 +98,4 @@ DEPENDENCIES
98
98
  rubocop (~> 0.80)
99
99
 
100
100
  BUNDLED WITH
101
- 2.2.17
101
+ 2.3.12
@@ -3,6 +3,10 @@
3
3
  module Engines
4
4
  module Custom
5
5
  class Extractor
6
+ def initialize
7
+ @filenames = ENV.fetch('CODEMONITOR_CUSTOMS', nil)
8
+ end
9
+
6
10
  def call(provider)
7
11
  provider.emit(metrics)
8
12
  end
@@ -14,7 +18,27 @@ module Engines
14
18
  private
15
19
 
16
20
  def custom_files
17
- Dir.glob('./.codemonitor/*.rb')
21
+ return Dir.glob('./.codemonitor/*.rb') if @filenames.nil?
22
+
23
+ raise 'Forbidden access to parent folder' unless @filenames.match(/\.\./).nil?
24
+
25
+ includes = @filenames.split(',').reject do |filename|
26
+ filename.start_with?('-')
27
+ end.map do |filename|
28
+ "./.codemonitor/#{filename}.rb"
29
+ end
30
+
31
+ excludes = @filenames.split(',').filter do |filename|
32
+ filename.start_with?('-')
33
+ end.map do |filename|
34
+ "./.codemonitor/#{filename.gsub(/^-/, '')}.rb"
35
+ end
36
+
37
+ raise 'Mixed included and excluded custom paths is not allowed' if includes.size > 0 && excludes.size > 0
38
+
39
+ return Dir.glob(includes) if includes.size > 0
40
+
41
+ Dir.glob('./.codemonitor/*.rb') - Dir.glob(excludes)
18
42
  end
19
43
 
20
44
  def metrics
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Engines
6
+ module JestJsonSummary
7
+ class Extractor
8
+ METRICS = %i[].freeze
9
+
10
+ def initialize; end
11
+
12
+ def call(provider)
13
+ metrics = METRICS.map do |metric|
14
+ [metric, send(metric)]
15
+ end.to_h
16
+
17
+ metrics
18
+ .merge!(total_lines)
19
+ .merge!(total_statements)
20
+ .merge!(total_functions)
21
+ .merge!(total_branches)
22
+ .merge!(total_branches_true)
23
+
24
+ provider.emit(metrics)
25
+ end
26
+
27
+ def requirements?
28
+ File.exist?('jest_json_summary.output.json')
29
+ end
30
+
31
+ private
32
+
33
+ def json_summary
34
+ @json_summary ||= JSON.parse(File.read('jest_json_summary.output.json'))
35
+ end
36
+
37
+ def total_lines
38
+ flatten('lines')
39
+ end
40
+
41
+ def total_statements
42
+ flatten('statements')
43
+ end
44
+
45
+ def total_functions
46
+ flatten('functions')
47
+ end
48
+
49
+ def total_branches
50
+ flatten('branches')
51
+ end
52
+
53
+ def total_branches_true
54
+ flatten('branchesTrue', 'branches_true')
55
+ end
56
+
57
+ def flatten(member, rename = nil)
58
+ json_summary['total'][member].map do |key, value|
59
+ ["jest_json_summary_#{rename || member}_#{key}", value.to_f]
60
+ end.to_h
61
+ end
62
+ end
63
+ end
64
+ end
@@ -8,13 +8,21 @@ module Engines
8
8
  module Npm
9
9
  class Extractor
10
10
  METRICS = %i[
11
- npm_number_of_dependencies
11
+ npm_number_of_prod_dependencies
12
12
  npm_number_of_dev_dependencies
13
13
  npm_number_of_scripts
14
- npm_number_of_vulnerable_dependencies
14
+ npm_number_of_computed_prod_dependencies
15
+ npm_number_of_computed_dev_dependencies
16
+ npm_number_of_computed_optional_dependencies
17
+ npm_number_of_computed_peer_dependencies
18
+ npm_number_of_computed_peer_optional_dependencies
19
+ npm_number_of_computed_total_dependencies
20
+ npm_number_of_vulnerable_dependencies_info
15
21
  npm_number_of_vulnerable_dependencies_low
16
22
  npm_number_of_vulnerable_dependencies_moderate
17
23
  npm_number_of_vulnerable_dependencies_high
24
+ npm_number_of_vulnerable_dependencies_critical
25
+ npm_number_of_vulnerable_dependencies_total
18
26
  ].freeze
19
27
 
20
28
  def call(provider)
@@ -26,25 +34,25 @@ module Engines
26
34
  end
27
35
 
28
36
  def requirements?
29
- File.exist?('package.json')
37
+ File.exist?('package.json') && File.exist?('package-lock.json')
30
38
  end
31
39
 
32
40
  private
33
41
 
34
- def npm_number_of_dependencies
35
- npm_package['dependencies'].keys.length
42
+ def npm_number_of_prod_dependencies
43
+ npm_package['dependencies']&.keys&.length
36
44
  end
37
45
 
38
46
  def npm_number_of_dev_dependencies
39
- npm_package['devDependencies'].keys.length
47
+ npm_package['devDependencies']&.keys&.length
40
48
  end
41
49
 
42
50
  def npm_number_of_scripts
43
51
  npm_package['scripts'].keys.length
44
52
  end
45
53
 
46
- def npm_number_of_vulnerable_dependencies
47
- npm_audit['advisories'].length
54
+ def npm_number_of_vulnerable_dependencies_info
55
+ npm_audit_by_severity['info']
48
56
  end
49
57
 
50
58
  def npm_number_of_vulnerable_dependencies_low
@@ -59,6 +67,38 @@ module Engines
59
67
  npm_audit_by_severity['high']
60
68
  end
61
69
 
70
+ def npm_number_of_vulnerable_dependencies_critical
71
+ npm_audit_by_severity['critical']
72
+ end
73
+
74
+ def npm_number_of_vulnerable_dependencies_total
75
+ npm_audit_by_severity['total']
76
+ end
77
+
78
+ def npm_number_of_computed_prod_dependencies
79
+ npm_audit_by_dependencies['prod']
80
+ end
81
+
82
+ def npm_number_of_computed_dev_dependencies
83
+ npm_audit_by_dependencies['dev']
84
+ end
85
+
86
+ def npm_number_of_computed_optional_dependencies
87
+ npm_audit_by_dependencies['optional']
88
+ end
89
+
90
+ def npm_number_of_computed_peer_dependencies
91
+ npm_audit_by_dependencies['peer']
92
+ end
93
+
94
+ def npm_number_of_computed_peer_optional_dependencies
95
+ npm_audit_by_dependencies['peerOptional']
96
+ end
97
+
98
+ def npm_number_of_computed_total_dependencies
99
+ npm_audit_by_dependencies['total']
100
+ end
101
+
62
102
  def npm_package
63
103
  @npm_package ||= JSON.parse(File.read('package.json'))
64
104
  end
@@ -67,10 +107,12 @@ module Engines
67
107
  @npm_audit ||= JSON.parse(Shell.run('npm audit --json'))
68
108
  end
69
109
 
110
+ def npm_audit_by_dependencies
111
+ npm_audit['metadata']['dependencies']
112
+ end
113
+
70
114
  def npm_audit_by_severity
71
- npm_audit['advisories']
72
- .map { |_key, value| value['severity'] }
73
- .each_with_object(Hash.new(0)) { |e, total| total[e] += 1; }
115
+ npm_audit['metadata']['vulnerabilities']
74
116
  end
75
117
  end
76
118
  end
@@ -6,7 +6,7 @@ module Engines
6
6
  module Scc
7
7
  class Extractor
8
8
  METRICS = %i[].freeze
9
- FIELDS = %w[Bytes Lines Code Comment Blank Complexity Count WeightedComplexity]
9
+ FIELDS = %w[Bytes Lines Code Comment Blank Complexity Count WeightedComplexity].freeze
10
10
 
11
11
  def initialize; end
12
12
 
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Engines
6
+ module SimpleCovJsonCoverage
7
+ class Extractor
8
+ METRICS = %i[
9
+ simplecov_json_coverage_metrics_covered_percent
10
+ simplecov_json_coverage_metrics_covered_strength
11
+ simplecov_json_coverage_metrics_covered_lines
12
+ simplecov_json_coverage_metrics_total_lines
13
+ ].freeze
14
+
15
+ def initialize; end
16
+
17
+ def call(provider)
18
+ metrics = METRICS.map do |metric|
19
+ [metric, send(metric)]
20
+ end.to_h
21
+
22
+ provider.emit(metrics)
23
+ end
24
+
25
+ def requirements?
26
+ File.exist?('simplecov_json_coverage.output.json')
27
+ end
28
+
29
+ private
30
+
31
+ def json_summary
32
+ @json_summary ||= JSON.parse(File.read('simplecov_json_coverage.output.json'))
33
+ end
34
+
35
+ def metrics
36
+ @metrics ||= json_summary['metrics']
37
+ end
38
+
39
+ def simplecov_json_coverage_metrics_covered_percent
40
+ metrics['covered_percent']
41
+ end
42
+
43
+ def simplecov_json_coverage_metrics_covered_strength
44
+ metrics['covered_strength']
45
+ end
46
+
47
+ def simplecov_json_coverage_metrics_covered_lines
48
+ metrics['covered_lines']
49
+ end
50
+
51
+ def simplecov_json_coverage_metrics_total_lines
52
+ metrics['total_lines']
53
+ end
54
+ end
55
+ end
56
+ end
data/exe/codemonitor CHANGED
@@ -15,6 +15,8 @@ require_relative '../engines/semgrep/extractor'
15
15
  require_relative '../engines/sorbet/extractor'
16
16
  require_relative '../engines/scc/extractor'
17
17
  require_relative '../engines/custom/extractor'
18
+ require_relative '../engines/jest-json-summary/extractor'
19
+ require_relative '../engines/simplecov-json-coverage/extractor'
18
20
 
19
21
  PROVIDERS = {
20
22
  console: Providers::Console,
@@ -32,7 +34,9 @@ EXTRACTORS = {
32
34
  semgrep: Engines::Semgrep::Extractor,
33
35
  sorbet: Engines::Sorbet::Extractor,
34
36
  scc: Engines::Scc::Extractor,
35
- custom: Engines::Custom::Extractor
37
+ custom: Engines::Custom::Extractor,
38
+ jest_json_summary: Engines::JestJsonSummary::Extractor,
39
+ simplecov_json_coverage: Engines::SimpleCovJsonCoverage::Extractor
36
40
  }.freeze
37
41
 
38
42
  config_provider = ENV['CODEMONITOR_PROVIDER'] || 'console'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CodeMonitor
4
- VERSION = '0.4.0'
4
+ VERSION = '0.6.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codemonitor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ferran Basora
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-01 00:00:00.000000000 Z
11
+ date: 2022-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dogapi
@@ -134,11 +134,13 @@ files:
134
134
  - engines/eslint/extractor.rb
135
135
  - engines/git/extractor.rb
136
136
  - engines/github/extractor.rb
137
+ - engines/jest-json-summary/extractor.rb
137
138
  - engines/npm/extractor.rb
138
139
  - engines/packwerk/extractor.rb
139
140
  - engines/rubocop/extractor.rb
140
141
  - engines/scc/extractor.rb
141
142
  - engines/semgrep/extractor.rb
143
+ - engines/simplecov-json-coverage/extractor.rb
142
144
  - engines/sorbet/extractor.rb
143
145
  - exe/codemonitor
144
146
  - lib/codemonitor/version.rb
@@ -167,7 +169,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
169
  - !ruby/object:Gem::Version
168
170
  version: '0'
169
171
  requirements: []
170
- rubygems_version: 3.0.1
172
+ rubygems_version: 3.3.5
171
173
  signing_key:
172
174
  specification_version: 4
173
175
  summary: Collect many metrics your code is generating