parse_packwerk 0.20.1 → 0.22.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
- - ">="
|