parse_packwerk 0.26.1 → 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: e8a164633cf3c023e6e03baf4c10b26d90e2a3368608634f3fcf6461c0481c03
4
- data.tar.gz: 0665b72ca8fb6b2fe68260237fa538e51e6438c088fcd6f27effca17f9f8893e
3
+ metadata.gz: 79acc78d3ab0fa35846a31222d63c225666c0114d5de463e2ba70305a557c278
4
+ data.tar.gz: 2e1449c7de0b3eed8ff8cae6c84f35cf9bdea252aa3f337c6021c1b3b5601a15
5
5
  SHA512:
6
- metadata.gz: c296d5665936ab7c1a1ecbdfe227c08eeb1beccb5ee404fc6e484bc4e0e52f28c5e07a9ab83f60ee652c1adab3a3aca2de42eb01551f6633b07a8a22e2778b25
7
- data.tar.gz: f2e03bb5dceb25ee141dc31985f4adcc58f93110bf3ae44e0e46e4e9c9531e06fb39b50a85e838e981ce5716d7094ede734179a1f1851d6c3baff4b89506721d
6
+ metadata.gz: f4dc8dbaff0b08207a38057713426707f9207175b73b1452346fb4fe4e8d504baf1baf87b19c840ef1e947314bce2bf5577e36a5b69e93621e5064497af2ac35
7
+ data.tar.gz: 826653675547ea46c3743e005f5025b41012f4e065e1ff2f68f52181705e6785585d44af0c4468ca81dffb1b6344e88291f02e745e15091df74e4fde185dd941
@@ -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,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parse_packwerk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.26.1
4
+ version: 0.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gusto Engineers
@@ -201,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
201
  - !ruby/object:Gem::Version
202
202
  version: '0'
203
203
  requirements: []
204
- rubygems_version: 3.6.7
204
+ rubygems_version: 3.6.9
205
205
  specification_version: 4
206
206
  summary: A low-dependency gem for parsing and writing packwerk YML files
207
207
  test_files: []