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 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
  - - ">="