pack_stats 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 751c967ba6a3da1afb345c8b028ba980cd17b4cc9368282b42eb087c1401b298
4
- data.tar.gz: c2f7d1793f72fff866ecbf384862be4cc03bdc25a6d4320be1455594f45c3dd9
3
+ metadata.gz: 257c72796b9a65f1d67e0f6f96998fcd2929717ff09526a95e4bea8f144bb903
4
+ data.tar.gz: 79cf5e5557eb13cd286a2724e1c7b9fdb9308845830c3327ec9d99e6a0c4b27a
5
5
  SHA512:
6
- metadata.gz: a04690c416b60e9b0bf25c9f5317045cab51f49d4f998ace9c98e6ed66010bc39a3923fb13abbd8bb515dc56210310055f9e6b09ae62d442f885aee32109da98
7
- data.tar.gz: 773ddba7ab3bd34a6637088d66fbf7157050ea071df8d678878ddf7f606277ec20dda1d53a8ffd39422384d42fe7c83faf29345e71f97b39a9ba5847b0c38699
6
+ metadata.gz: 8456c2d22795b7ac537a4d64dc4e52607b44642f2a7e1af6d059863de5805ce1ad8f735ff5122f2ac876632ea6bef1bbbaab58c458b310a74dbb2b2083aa4698
7
+ data.tar.gz: 42d5b073d4771726a0f15b8622894e07c58b348d571a5b1ca3b0e478e5b8580fb37a4b88922ed18951fbcb9c3f6d6f482e0435b93350c2b820d87e10aabd1726
data/README.md CHANGED
@@ -103,4 +103,5 @@ Right now this tool sends metrics to DataDog only. However, if you want to use t
103
103
 
104
104
  We recommend the use of the dashboard that is shipped with this gem. You can create a new dashboard and then click "import dashboard JSON" to get a jump start on tracking your metrics. Note you may want to make some tweaks to these dashboards to better fit your organization's circumstances and goals.
105
105
 
106
- [Dashboard JSON](docs/dashboard.json)
106
+ - [Dashboard JSON](docs/dashboard.json)
107
+ - [Screenshots](docs/screenshots.md)
@@ -6,7 +6,6 @@ require 'pack_stats/private/metrics'
6
6
  require 'pack_stats/private/metrics/files'
7
7
  require 'pack_stats/private/metrics/public_usage'
8
8
  require 'pack_stats/private/metrics/packwerk_checker_usage'
9
- require 'pack_stats/private/metrics/rubocop_usage'
10
9
  require 'pack_stats/private/metrics/dependencies'
11
10
  require 'pack_stats/private/metrics/packages'
12
11
  require 'pack_stats/private/metrics/packages_by_team'
@@ -31,7 +31,6 @@ module PackStats
31
31
  all_metrics << GaugeMetric.for('all_packages.has_readme.count', packages.count { |package| Metrics.has_readme?(package) }, package_tags)
32
32
 
33
33
  all_metrics += Metrics::PackwerkCheckerUsage.get_checker_metrics('all_packages', packages, package_tags)
34
- all_metrics += Metrics::RubocopUsage.get_metrics('all_packages', packages, package_tags)
35
34
  all_metrics << GaugeMetric.for('all_packages.package_based_file_ownership.count', packages.count { |package| !package.metadata['owner'].nil? }, package_tags)
36
35
 
37
36
  inbound_violations_by_package = packages.flat_map(&:violations).group_by(&:to_package_name)
@@ -9,7 +9,7 @@ module PackStats
9
9
  class PackwerkCheckerUsage
10
10
  extend T::Sig
11
11
 
12
- # Some violations (e.g. dependency, visibility, architecture) matter for the referencing (outbound) package.
12
+ # Some violations (e.g. dependency, visibility, layer) matter for the referencing (outbound) package.
13
13
  # Other violations (e.g. privacy) matter for the referenced (inbound) package.
14
14
  class Direction < T::Enum
15
15
  enums do
@@ -38,7 +38,7 @@ module PackStats
38
38
  CHECKERS = T.let([
39
39
  PackwerkChecker.new(key: 'enforce_dependencies', violation_type: 'dependency', direction: Direction::Outbound),
40
40
  PackwerkChecker.new(key: 'enforce_privacy', violation_type: 'privacy', direction: Direction::Inbound),
41
- PackwerkChecker.new(key: 'enforce_architecture', violation_type: 'architecture', direction: Direction::Outbound),
41
+ PackwerkChecker.new(key: 'enforce_layers', violation_type: 'layer', direction: Direction::Outbound),
42
42
  PackwerkChecker.new(key: 'enforce_visibility', violation_type: 'visibility', direction: Direction::Outbound),
43
43
  ], T::Array[PackwerkChecker])
44
44
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pack_stats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusto Engineers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-31 00:00:00.000000000 Z
11
+ date: 2024-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: code_teams
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rake
112
+ name: base64
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rake
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: rspec
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -198,7 +212,6 @@ files:
198
212
  - lib/pack_stats/private/metrics/packages_by_team.rb
199
213
  - lib/pack_stats/private/metrics/packwerk_checker_usage.rb
200
214
  - lib/pack_stats/private/metrics/public_usage.rb
201
- - lib/pack_stats/private/metrics/rubocop_usage.rb
202
215
  - lib/pack_stats/private/source_code_file.rb
203
216
  - lib/pack_stats/tag.rb
204
217
  - lib/pack_stats/tags.rb
@@ -210,7 +223,7 @@ metadata:
210
223
  source_code_uri: https://github.com/rubyatscale/pack_stats
211
224
  changelog_uri: https://github.com/rubyatscale/pack_stats/releases
212
225
  allowed_push_host: https://rubygems.org
213
- post_install_message:
226
+ post_install_message:
214
227
  rdoc_options: []
215
228
  require_paths:
216
229
  - lib
@@ -225,8 +238,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
238
  - !ruby/object:Gem::Version
226
239
  version: '0'
227
240
  requirements: []
228
- rubygems_version: 3.1.6
229
- signing_key:
241
+ rubygems_version: 3.5.11
242
+ signing_key:
230
243
  specification_version: 4
231
244
  summary: A gem to collect statistics about modularization progress in a Rails application
232
245
  using packwerk.
@@ -1,98 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- module PackStats
5
- module Private
6
- module Metrics
7
- class RubocopUsage
8
- extend T::Sig
9
-
10
- sig { params(prefix: String, packages: T::Array[ParsePackwerk::Package], package_tags: T::Array[Tag]).returns(T::Array[GaugeMetric]) }
11
- def self.get_metrics(prefix, packages, package_tags)
12
- [
13
- *get_rubocop_exclusions(prefix, packages, package_tags),
14
- *get_rubocop_usage_metrics(prefix, packages, package_tags)
15
- ]
16
- end
17
-
18
- sig { params(prefix: String, packages: T::Array[ParsePackwerk::Package], package_tags: T::Array[Tag]).returns(T::Array[GaugeMetric]) }
19
- def self.get_rubocop_usage_metrics(prefix, packages, package_tags)
20
- metrics = T.let([], T::Array[GaugeMetric])
21
-
22
- rubocops.each do |cop_name|
23
- ['false', 'true', 'strict'].each do |enabled_mode|
24
- count_of_packages = ParsePackwerk.all.count do |package|
25
- # We will likely want a rubocop-packs API for this, to be able to ask if a cop is enabled for a pack.
26
- # It's possible we will want to allow these to be enabled at the top-level `.rubocop.yml`,
27
- # in which case we wouldn't get the right metrics with this approach. However, we can also accept
28
- # that as a current limitation.
29
- rubocop_yml_file = package.directory.join(RuboCop::Packs::PACK_LEVEL_RUBOCOP_YML)
30
- next false if !rubocop_yml_file.exist?
31
- rubocop_yml = YAML.load_file(rubocop_yml_file)
32
- cop_config = rubocop_yml[cop_name]
33
-
34
- strict_mode = cop_config && cop_config['FailureMode'] == 'strict'
35
- enabled = cop_config && cop_config['Enabled']
36
- case enabled_mode
37
- when 'false'
38
- !enabled
39
- when 'true'
40
- enabled && !strict_mode
41
- when 'strict'
42
- !!strict_mode
43
- end
44
- end
45
-
46
- metric_name = "#{prefix}.rubocops.#{to_tag_name(cop_name)}.#{enabled_mode}.count"
47
- metrics << GaugeMetric.for(metric_name, count_of_packages, package_tags)
48
- end
49
- end
50
-
51
- metrics
52
- end
53
-
54
- sig { params(prefix: String, packages: T::Array[ParsePackwerk::Package], package_tags: T::Array[Tag]).returns(T::Array[GaugeMetric]) }
55
- def self.get_rubocop_exclusions(prefix, packages, package_tags)
56
- rubocops.flat_map do |cop_name|
57
- metric_name = "#{prefix}.rubocops.#{to_tag_name(cop_name)}.exclusions.count"
58
- all_exclusions_count = ParsePackwerk.all.sum { |package| exclude_count_for_package_and_protection(package, cop_name)}
59
- GaugeMetric.for(metric_name, all_exclusions_count, package_tags)
60
- end
61
- end
62
-
63
- # TODO: `rubocop-packs` may want to expose API for this
64
- sig { params(package: ParsePackwerk::Package, cop_name: String).returns(Integer) }
65
- def self.exclude_count_for_package_and_protection(package, cop_name)
66
- if package.name == ParsePackwerk::ROOT_PACKAGE_NAME
67
- rubocop_todo = package.directory.join('.rubocop_todo.yml')
68
- else
69
- rubocop_todo = package.directory.join(RuboCop::Packs::PACK_LEVEL_RUBOCOP_TODO_YML)
70
- end
71
-
72
- if rubocop_todo.exist?
73
- loaded_rubocop_todo = YAML.load_file(rubocop_todo)
74
- cop_config = loaded_rubocop_todo.fetch(cop_name, {})
75
- cop_config.fetch('Exclude', []).count
76
- else
77
- 0
78
- end
79
- end
80
-
81
- sig { returns(T::Array[String])}
82
- def self.rubocops
83
- [
84
- 'Packs/ClassMethodsAsPublicApis',
85
- 'Packs/RootNamespaceIsPackName',
86
- 'Packs/TypedPublicApis',
87
- 'Packs/DocumentedPublicApis',
88
- ]
89
- end
90
-
91
- sig { params(cop_name: String).returns(String) }
92
- def self.to_tag_name(cop_name)
93
- cop_name.gsub('/', '_').downcase
94
- end
95
- end
96
- end
97
- end
98
- end