parse_packwerk 0.26.0 → 0.27.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: ae2ad46b918aca49713753383cc986754ae3e79d2be225e42659bca350b0a477
4
- data.tar.gz: 9417fe06abcdd4bac2582c1b54950ae7653430d2a7a42fe761070b156d2c32c0
3
+ metadata.gz: 79acc78d3ab0fa35846a31222d63c225666c0114d5de463e2ba70305a557c278
4
+ data.tar.gz: 2e1449c7de0b3eed8ff8cae6c84f35cf9bdea252aa3f337c6021c1b3b5601a15
5
5
  SHA512:
6
- metadata.gz: 13670c835593d15f5666a401af9d1100ab964029f8403654b59d7943416b1750f468459184f37a512c31c8cc0fc7870c251ea79c75e63eca924b293831e5c78c
7
- data.tar.gz: 440a9a96e979537efd13fe8f3bb0f3f2d749c290c7d5e26cbfc476030891aa9f62c33a6d89fd678bce0699c300c1b0d1f9ba7051b08b7f3bc2526917867a0c7c
6
+ metadata.gz: f4dc8dbaff0b08207a38057713426707f9207175b73b1452346fb4fe4e8d504baf1baf87b19c840ef1e947314bce2bf5577e36a5b69e93621e5064497af2ac35
7
+ data.tar.gz: 826653675547ea46c3743e005f5025b41012f4e065e1ff2f68f52181705e6785585d44af0c4468ca81dffb1b6344e88291f02e745e15091df74e4fde185dd941
@@ -37,7 +37,13 @@ module ParsePackwerk
37
37
  Array(specified_exclude)
38
38
  end
39
39
 
40
- excludes.push Bundler.bundle_path.join('**').to_s
40
+ begin
41
+ excludes.push Bundler.bundle_path.join('**').to_s
42
+ rescue Bundler::GemfileNotFound
43
+ # Optionally, add bundle to the path. Skip when there isn't a Gemfile.
44
+ end
45
+
46
+ excludes
41
47
  end
42
48
 
43
49
  sig { params(config_hash: T::Hash[T.untyped, T.untyped]).returns(T::Array[String]) }
@@ -13,11 +13,15 @@ module ParsePackwerk
13
13
  const :dependencies, T::Array[String]
14
14
  const :config, T::Hash[T.untyped, T.untyped]
15
15
  const :violations, T::Array[Violation]
16
+ # Stores the original key order from the YAML file for preserving order on write
17
+ const :original_key_order, T::Array[String], default: []
16
18
 
17
19
  sig { params(pathname: Pathname).returns(Package) }
18
20
  def self.from(pathname)
19
21
  package_loaded_yml = YAML.load_file(pathname) || {}
20
22
  package_name = pathname.dirname.cleanpath.to_s
23
+ # Capture the original key order from the YAML file
24
+ original_keys = package_loaded_yml.is_a?(Hash) ? package_loaded_yml.keys : []
21
25
 
22
26
  new(
23
27
  name: package_name,
@@ -28,7 +32,8 @@ module ParsePackwerk
28
32
  metadata: package_loaded_yml[METADATA] || {},
29
33
  dependencies: package_loaded_yml[DEPENDENCIES] || [],
30
34
  config: package_loaded_yml,
31
- violations: PackageTodo.from(PackageTodo.yml(directory(package_name))).violations
35
+ violations: PackageTodo.from(PackageTodo.yml(directory(package_name))).violations,
36
+ original_key_order: original_keys
32
37
  )
33
38
  end
34
39
 
@@ -31,6 +31,19 @@ module ParsePackwerk
31
31
 
32
32
  extend T::Sig
33
33
 
34
+ # Configuration option to preserve the original key order when writing package.yml files.
35
+ # When true, keys will be written in their original order from the file rather than
36
+ # being sorted according to key_sort_order. This reduces diff churn when tools modify packages.
37
+ # Defaults to false for backwards compatibility.
38
+ @preserve_key_order = T.let(false, T::Boolean)
39
+
40
+ class << self
41
+ extend T::Sig
42
+
43
+ sig { returns(T::Boolean) }
44
+ attr_accessor :preserve_key_order
45
+ end
46
+
34
47
  sig do
35
48
  returns(T::Array[Package])
36
49
  end
@@ -90,8 +103,7 @@ module ParsePackwerk
90
103
  merged_config.merge!('metadata' => package.metadata)
91
104
  end
92
105
 
93
- sorted_keys = key_sort_order
94
- merged_config = merged_config.to_a.sort_by { |key, _value| T.unsafe(sorted_keys).index(key) || 1000 }.to_h
106
+ merged_config = sort_keys(merged_config, package.original_key_order)
95
107
 
96
108
  raw_yaml = YAML.dump(merged_config)
97
109
  stylized_yaml = raw_yaml.gsub("---\n", '')
@@ -99,6 +111,23 @@ module ParsePackwerk
99
111
  end
100
112
  end
101
113
 
114
+ sig { params(config: T::Hash[T.untyped, T.untyped], original_key_order: T::Array[String]).returns(T::Hash[T.untyped, T.untyped]) }
115
+ def self.sort_keys(config, original_key_order)
116
+ if preserve_key_order && original_key_order.any?
117
+ # Preserve original key order: existing keys stay in their original position,
118
+ # new keys are appended in the default sort order
119
+ existing_keys = original_key_order & config.keys
120
+ new_keys = config.keys - original_key_order
121
+ sorted_new_keys = new_keys.sort_by { |key| key_sort_order.index(key) || 1000 }
122
+
123
+ ordered_keys = existing_keys + sorted_new_keys
124
+ ordered_keys.each_with_object({}) { |key, hash| hash[key] = config[key] if config.key?(key) }
125
+ else
126
+ # Default behavior: sort by canonical key order
127
+ config.to_a.sort_by { |key, _value| T.unsafe(key_sort_order).index(key) || 1000 }.to_h
128
+ end
129
+ end
130
+
102
131
  sig { returns(T::Array[String]) }
103
132
  def self.key_sort_order
104
133
  %w[
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parse_packwerk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.0
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusto Engineers
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-07-01 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bigdecimal
@@ -188,7 +187,6 @@ metadata:
188
187
  source_code_uri: https://github.com/rubyatscale/parse_packwerk
189
188
  changelog_uri: https://github.com/rubyatscale/parse_packwerk/releases
190
189
  allowed_push_host: https://rubygems.org
191
- post_install_message:
192
190
  rdoc_options: []
193
191
  require_paths:
194
192
  - lib
@@ -203,8 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
201
  - !ruby/object:Gem::Version
204
202
  version: '0'
205
203
  requirements: []
206
- rubygems_version: 3.5.11
207
- signing_key:
204
+ rubygems_version: 3.6.9
208
205
  specification_version: 4
209
206
  summary: A low-dependency gem for parsing and writing packwerk YML files
210
207
  test_files: []