parse_packwerk 0.20.1 → 0.22.0
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/lib/parse_packwerk/configuration.rb +12 -12
- data/lib/parse_packwerk/constants.rb +2 -1
- data/lib/parse_packwerk/extensions.rb +5 -0
- data/lib/parse_packwerk/package.rb +11 -4
- data/lib/parse_packwerk/package_set.rb +1 -1
- data/lib/parse_packwerk/package_todo.rb +8 -8
- data/lib/parse_packwerk.rb +11 -7
- metadata +31 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c6370b4639d8046076ebb15799265eafcad8c1af66795b22d2dd9812d431f8b8
|
|
4
|
+
data.tar.gz: 73823f09cc2022609f82287464d5d71d62fc8bef90b7542e4ab5d879be9346bf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d1b44126cee4b76567cc56bc9e5e662d1adce14d1044c679b176cac461bc8c1f1563f1fff487de6f45d6901b8fa857815ee8c55a9317d7dfe9d18623af42ff27
|
|
7
|
+
data.tar.gz: d3da9bbae535e82a114e1d703a454407a5d432d7ee2c4003756a8afdb67d74a71be148518ec724c7e55e9daa9a713c120e6beb8705a8d0a9f7639128db349eba
|
|
@@ -12,12 +12,12 @@ module ParsePackwerk
|
|
|
12
12
|
sig { returns(Configuration) }
|
|
13
13
|
def self.fetch
|
|
14
14
|
packwerk_yml_filename = Pathname.new(PACKWERK_YML_NAME)
|
|
15
|
-
if
|
|
16
|
-
raw_packwerk_config = {}
|
|
17
|
-
else
|
|
15
|
+
if File.exist?(packwerk_yml_filename)
|
|
18
16
|
# when the YML file is empty or only contains comment, it gets parsed
|
|
19
17
|
# as the boolean `false` for some reason. this handles that case
|
|
20
18
|
raw_packwerk_config = YAML.load_file(packwerk_yml_filename) || {}
|
|
19
|
+
else
|
|
20
|
+
raw_packwerk_config = {}
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
Configuration.new(
|
|
@@ -32,22 +32,22 @@ module ParsePackwerk
|
|
|
32
32
|
def self.excludes(config_hash)
|
|
33
33
|
specified_exclude = config_hash['exclude']
|
|
34
34
|
excludes = if specified_exclude.nil?
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
DEFAULT_EXCLUDE_GLOBS.dup
|
|
36
|
+
else
|
|
37
|
+
Array(specified_exclude)
|
|
38
|
+
end
|
|
39
39
|
|
|
40
|
-
excludes.push Bundler.bundle_path.join(
|
|
40
|
+
excludes.push Bundler.bundle_path.join('**').to_s
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
sig { params(config_hash: T::Hash[T.untyped, T.untyped]).returns(T::Array[String]) }
|
|
44
44
|
def self.package_paths(config_hash)
|
|
45
45
|
specified_package_paths = config_hash['package_paths']
|
|
46
46
|
package_paths = if specified_package_paths.nil?
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
DEFAULT_PACKAGE_PATHS.dup
|
|
48
|
+
else
|
|
49
|
+
Array(specified_package_paths)
|
|
50
|
+
end
|
|
51
51
|
|
|
52
52
|
# We add the root package path always
|
|
53
53
|
package_paths.push '.'
|
|
@@ -7,6 +7,7 @@ module ParsePackwerk
|
|
|
7
7
|
PACKAGE_TODO_YML_NAME = T.let('package_todo.yml'.freeze, String)
|
|
8
8
|
ENFORCE_DEPENDENCIES = T.let('enforce_dependencies'.freeze, String)
|
|
9
9
|
ENFORCE_PRIVACY = T.let('enforce_privacy'.freeze, String)
|
|
10
|
+
ENFORCE_ARCHITECTURE = T.let('enforce_architecture'.freeze, String)
|
|
10
11
|
DEPENDENCY_VIOLATION_TYPE = T.let('dependency'.freeze, String)
|
|
11
12
|
PRIVACY_VIOLATION_TYPE = T.let('privacy'.freeze, String)
|
|
12
13
|
PUBLIC_PATH = T.let('public_path'.freeze, String)
|
|
@@ -19,7 +20,7 @@ module ParsePackwerk
|
|
|
19
20
|
T::Hash[T.untyped, T.untyped]
|
|
20
21
|
end
|
|
21
22
|
|
|
22
|
-
DEFAULT_EXCLUDE_GLOBS = T.let([
|
|
23
|
+
DEFAULT_EXCLUDE_GLOBS = T.let(['{bin,node_modules,script,tmp,vendor}/**/*'], T::Array[String])
|
|
23
24
|
DEFAULT_PACKAGE_PATHS = T.let(['**/'], T::Array[String])
|
|
24
25
|
DEFAULT_PUBLIC_PATH = T.let('app/public', String)
|
|
25
26
|
end
|
|
@@ -13,6 +13,11 @@ module ParsePackwerk
|
|
|
13
13
|
def self.privacy_extension_installed?
|
|
14
14
|
all_extensions_installed? || ParsePackwerk.yml.requires.include?('packwerk/privacy/checker')
|
|
15
15
|
end
|
|
16
|
+
|
|
17
|
+
sig { returns(T::Boolean) }
|
|
18
|
+
def self.architecture_extension_installed?
|
|
19
|
+
all_extensions_installed? || ParsePackwerk.yml.requires.include?('packwerk/architecture/checker')
|
|
20
|
+
end
|
|
16
21
|
end
|
|
17
22
|
|
|
18
23
|
private_constant :Extensions
|
|
@@ -5,8 +5,9 @@ module ParsePackwerk
|
|
|
5
5
|
extend T::Sig
|
|
6
6
|
|
|
7
7
|
const :name, String
|
|
8
|
-
const :enforce_dependencies, T.any(T::Boolean, String)
|
|
8
|
+
const :enforce_dependencies, T.nilable(T.any(T::Boolean, String))
|
|
9
9
|
const :enforce_privacy, T.any(T::Boolean, String), default: false
|
|
10
|
+
const :enforce_architecture, T.any(T::Boolean, String), default: false
|
|
10
11
|
const :public_path, String, default: DEFAULT_PUBLIC_PATH
|
|
11
12
|
const :metadata, MetadataYmlType
|
|
12
13
|
const :dependencies, T::Array[String]
|
|
@@ -18,7 +19,7 @@ module ParsePackwerk
|
|
|
18
19
|
package_loaded_yml = YAML.load_file(pathname)
|
|
19
20
|
if package_loaded_yml.nil? || package_loaded_yml == false
|
|
20
21
|
message = "Failed to parse `#{pathname}`. Please fix any issues with this package.yml OR add its containing folder to packwerk.yml `exclude`"
|
|
21
|
-
raise PackageParseError
|
|
22
|
+
raise PackageParseError, message
|
|
22
23
|
end
|
|
23
24
|
package_name = pathname.dirname.cleanpath.to_s
|
|
24
25
|
|
|
@@ -26,6 +27,7 @@ module ParsePackwerk
|
|
|
26
27
|
name: package_name,
|
|
27
28
|
enforce_dependencies: package_loaded_yml[ENFORCE_DEPENDENCIES],
|
|
28
29
|
enforce_privacy: package_loaded_yml[ENFORCE_PRIVACY] || false,
|
|
30
|
+
enforce_architecture: package_loaded_yml[ENFORCE_ARCHITECTURE] || false,
|
|
29
31
|
public_path: package_loaded_yml[PUBLIC_PATH] || DEFAULT_PUBLIC_PATH,
|
|
30
32
|
metadata: package_loaded_yml[METADATA] || {},
|
|
31
33
|
dependencies: package_loaded_yml[DEPENDENCIES] || [],
|
|
@@ -46,7 +48,7 @@ module ParsePackwerk
|
|
|
46
48
|
|
|
47
49
|
sig { returns(Pathname) }
|
|
48
50
|
def directory
|
|
49
|
-
self.class.directory(
|
|
51
|
+
self.class.directory(name)
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
sig { returns(Pathname) }
|
|
@@ -54,7 +56,7 @@ module ParsePackwerk
|
|
|
54
56
|
directory.join(public_path).cleanpath
|
|
55
57
|
end
|
|
56
58
|
|
|
57
|
-
sig { returns(T.any(T::Boolean, String)) }
|
|
59
|
+
sig { returns(T.nilable(T.any(T::Boolean, String))) }
|
|
58
60
|
def enforces_dependencies?
|
|
59
61
|
enforce_dependencies
|
|
60
62
|
end
|
|
@@ -63,5 +65,10 @@ module ParsePackwerk
|
|
|
63
65
|
def enforces_privacy?
|
|
64
66
|
enforce_privacy
|
|
65
67
|
end
|
|
68
|
+
|
|
69
|
+
sig { returns(T.any(T::Boolean, String)) }
|
|
70
|
+
def enforces_architecture?
|
|
71
|
+
enforce_architecture
|
|
72
|
+
end
|
|
66
73
|
end
|
|
67
74
|
end
|
|
@@ -9,17 +9,12 @@ module ParsePackwerk
|
|
|
9
9
|
|
|
10
10
|
sig { params(package: Package).returns(PackageTodo) }
|
|
11
11
|
def self.for(package)
|
|
12
|
-
PackageTodo.from(
|
|
12
|
+
PackageTodo.from(yml(package.directory))
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
sig { params(pathname: Pathname).returns(PackageTodo) }
|
|
16
16
|
def self.from(pathname)
|
|
17
|
-
if
|
|
18
|
-
new(
|
|
19
|
-
pathname: pathname.cleanpath,
|
|
20
|
-
violations: []
|
|
21
|
-
)
|
|
22
|
-
else
|
|
17
|
+
if pathname.exist?
|
|
23
18
|
package_todo_loaded_yml = YAML.load_file(pathname)
|
|
24
19
|
|
|
25
20
|
all_violations = []
|
|
@@ -39,9 +34,14 @@ module ParsePackwerk
|
|
|
39
34
|
pathname: pathname.cleanpath,
|
|
40
35
|
violations: all_violations
|
|
41
36
|
)
|
|
37
|
+
else
|
|
38
|
+
new(
|
|
39
|
+
pathname: pathname.cleanpath,
|
|
40
|
+
violations: []
|
|
41
|
+
)
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
|
-
|
|
44
|
+
|
|
45
45
|
sig { params(dirname: Pathname).returns(Pathname) }
|
|
46
46
|
def self.yml(dirname)
|
|
47
47
|
dirname.join(PACKAGE_TODO_YML_NAME).cleanpath
|
data/lib/parse_packwerk.rb
CHANGED
|
@@ -62,16 +62,20 @@ module ParsePackwerk
|
|
|
62
62
|
sig { params(package: ParsePackwerk::Package).void }
|
|
63
63
|
def self.write_package_yml!(package)
|
|
64
64
|
FileUtils.mkdir_p(package.directory)
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
File.open(package.yml, 'w') do |file|
|
|
67
67
|
merged_config = package.config
|
|
68
68
|
|
|
69
|
-
merged_config.merge!('enforce_dependencies' => package.enforce_dependencies
|
|
69
|
+
merged_config.merge!('enforce_dependencies' => package.enforce_dependencies)
|
|
70
70
|
|
|
71
71
|
if Extensions.privacy_extension_installed?
|
|
72
72
|
merged_config.merge!('enforce_privacy' => package.enforce_privacy)
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
+
if Extensions.architecture_extension_installed?
|
|
76
|
+
merged_config.merge!('enforce_architecture' => package.enforce_architecture)
|
|
77
|
+
end
|
|
78
|
+
|
|
75
79
|
unless package.public_path == DEFAULT_PUBLIC_PATH
|
|
76
80
|
merged_config.merge!('public_path' => package.public_path)
|
|
77
81
|
end
|
|
@@ -87,11 +91,11 @@ module ParsePackwerk
|
|
|
87
91
|
end
|
|
88
92
|
|
|
89
93
|
sorted_keys = key_sort_order
|
|
90
|
-
merged_config = merged_config.to_a.sort_by{|key,
|
|
94
|
+
merged_config = merged_config.to_a.sort_by { |key, _value| T.unsafe(sorted_keys).index(key) || 1000 }.to_h
|
|
91
95
|
|
|
92
96
|
raw_yaml = YAML.dump(merged_config)
|
|
93
97
|
# Add indentation for dependencies
|
|
94
|
-
raw_yaml.gsub!(/^- /,
|
|
98
|
+
raw_yaml.gsub!(/^- /, ' - ')
|
|
95
99
|
stylized_yaml = raw_yaml.gsub("---\n", '')
|
|
96
100
|
file.write(stylized_yaml)
|
|
97
101
|
end
|
|
@@ -99,7 +103,7 @@ module ParsePackwerk
|
|
|
99
103
|
|
|
100
104
|
sig { returns(T::Array[String]) }
|
|
101
105
|
def self.key_sort_order
|
|
102
|
-
%w
|
|
106
|
+
%w[
|
|
103
107
|
enforce_dependencies
|
|
104
108
|
enforce_privacy
|
|
105
109
|
enforce_visibility
|
|
@@ -111,7 +115,7 @@ module ParsePackwerk
|
|
|
111
115
|
ignored_dependencies
|
|
112
116
|
visible_to
|
|
113
117
|
metadata
|
|
114
|
-
|
|
118
|
+
]
|
|
115
119
|
end
|
|
116
120
|
|
|
117
121
|
# We memoize packages_by_name for fast lookup.
|
|
@@ -124,7 +128,7 @@ module ParsePackwerk
|
|
|
124
128
|
# We want to match more specific paths first
|
|
125
129
|
# Packwerk does this too and is necessary for package_from_path to work correctly.
|
|
126
130
|
sorted_packages = all_packages.sort_by { |package| -package.name.length }
|
|
127
|
-
sorted_packages.
|
|
131
|
+
sorted_packages.to_h { |p| [p.name, p] }
|
|
128
132
|
end
|
|
129
133
|
end
|
|
130
134
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: parse_packwerk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.22.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Gusto Engineers
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-12-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: sorbet-runtime
|
|
@@ -24,6 +24,20 @@ dependencies:
|
|
|
24
24
|
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: awesome_print
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
27
41
|
- !ruby/object:Gem::Dependency
|
|
28
42
|
name: bundler
|
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -39,7 +53,7 @@ dependencies:
|
|
|
39
53
|
- !ruby/object:Gem::Version
|
|
40
54
|
version: '2.2'
|
|
41
55
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
56
|
+
name: hashdiff
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
|
44
58
|
requirements:
|
|
45
59
|
- - ">="
|
|
@@ -53,7 +67,7 @@ dependencies:
|
|
|
53
67
|
- !ruby/object:Gem::Version
|
|
54
68
|
version: '0'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
70
|
+
name: pry
|
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
|
58
72
|
requirements:
|
|
59
73
|
- - ">="
|
|
@@ -67,35 +81,35 @@ dependencies:
|
|
|
67
81
|
- !ruby/object:Gem::Version
|
|
68
82
|
version: '0'
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
|
-
name:
|
|
84
|
+
name: rake
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
72
86
|
requirements:
|
|
73
|
-
- - "
|
|
87
|
+
- - ">="
|
|
74
88
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
89
|
+
version: '0'
|
|
76
90
|
type: :development
|
|
77
91
|
prerelease: false
|
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
93
|
requirements:
|
|
80
|
-
- - "
|
|
94
|
+
- - ">="
|
|
81
95
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: '
|
|
96
|
+
version: '0'
|
|
83
97
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
98
|
+
name: rspec
|
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
|
86
100
|
requirements:
|
|
87
|
-
- - "
|
|
101
|
+
- - "~>"
|
|
88
102
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '0'
|
|
103
|
+
version: '3.0'
|
|
90
104
|
type: :development
|
|
91
105
|
prerelease: false
|
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
107
|
requirements:
|
|
94
|
-
- - "
|
|
108
|
+
- - "~>"
|
|
95
109
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '0'
|
|
110
|
+
version: '3.0'
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name:
|
|
112
|
+
name: rubocop
|
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
|
100
114
|
requirements:
|
|
101
115
|
- - ">="
|
|
@@ -109,7 +123,7 @@ dependencies:
|
|
|
109
123
|
- !ruby/object:Gem::Version
|
|
110
124
|
version: '0'
|
|
111
125
|
- !ruby/object:Gem::Dependency
|
|
112
|
-
name:
|
|
126
|
+
name: sorbet
|
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
|
114
128
|
requirements:
|
|
115
129
|
- - ">="
|
|
@@ -123,7 +137,7 @@ dependencies:
|
|
|
123
137
|
- !ruby/object:Gem::Version
|
|
124
138
|
version: '0'
|
|
125
139
|
- !ruby/object:Gem::Dependency
|
|
126
|
-
name:
|
|
140
|
+
name: tapioca
|
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
|
128
142
|
requirements:
|
|
129
143
|
- - ">="
|