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 +4 -4
- data/lib/parse_packwerk/package.rb +6 -1
- data/lib/parse_packwerk.rb +31 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 79acc78d3ab0fa35846a31222d63c225666c0114d5de463e2ba70305a557c278
|
|
4
|
+
data.tar.gz: 2e1449c7de0b3eed8ff8cae6c84f35cf9bdea252aa3f337c6021c1b3b5601a15
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
data/lib/parse_packwerk.rb
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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.
|
|
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: []
|