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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee084135635a9bebb7054d2682ce58103b9c8feed46ba7da13dda05035ac1f6e
4
- data.tar.gz: 4a21594b8973d2c12676355710d3cfb805ffd317faf4e40218d275f5f0a0dfc8
3
+ metadata.gz: c6370b4639d8046076ebb15799265eafcad8c1af66795b22d2dd9812d431f8b8
4
+ data.tar.gz: 73823f09cc2022609f82287464d5d71d62fc8bef90b7542e4ab5d879be9346bf
5
5
  SHA512:
6
- metadata.gz: 5a23503f3b986ebf6b70608578461ab987b73f0a22ec7343137cb0953934049889f45639a5419215749900bdce30ab9679f835b3265194df3e76eef2a4af278d
7
- data.tar.gz: df52df866745a2de2acc946a136828c8d83e45d55f45538eb04b170fc599e2e28468da69b62ed85a83fae7d7b08cceeee13909b8b4a5d17b60d757615c23af23
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 !File.exist?(packwerk_yml_filename)
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
- DEFAULT_EXCLUDE_GLOBS.dup
36
- else
37
- Array(specified_exclude)
38
- end
35
+ DEFAULT_EXCLUDE_GLOBS.dup
36
+ else
37
+ Array(specified_exclude)
38
+ end
39
39
 
40
- excludes.push Bundler.bundle_path.join("**").to_s
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
- DEFAULT_PACKAGE_PATHS.dup
48
- else
49
- Array(specified_package_paths)
50
- end
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(["{bin,node_modules,script,tmp,vendor}/**/*"], T::Array[String])
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.new(message)
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(self.name)
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
@@ -1,7 +1,7 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require "pathname"
4
+ require 'pathname'
5
5
  require 'bundler'
6
6
 
7
7
  module ParsePackwerk
@@ -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(self.yml(package.directory))
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 !pathname.exist?
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
@@ -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, value| T.unsafe(sorted_keys).index(key) || 1000 }.to_h
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.map{|p| [p.name, p]}.to_h
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.20.1
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-21 00:00:00.000000000 Z
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: pry
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: rake
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: rspec
84
+ name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: '3.0'
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: '3.0'
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: sorbet
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: tapioca
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: hashdiff
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: awesome_print
140
+ name: tapioca
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - ">="