yaml-sort 2.1.1 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.simplecov +7 -0
- data/CHANGELOG.md +24 -0
- data/Gemfile +1 -0
- data/README.md +4 -0
- data/Rakefile +1 -1
- data/lib/yaml/sort/alias.rb +39 -0
- data/lib/yaml/sort/dictionary.rb +3 -4
- data/lib/yaml/sort/parser.rb +95 -42
- data/lib/yaml/sort/version.rb +1 -1
- data/lib/yaml/sort.rb +1 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71ee5e9950197312df22f8cb27e87dd7fe223f8c320969edcb7130c2c9548ed5
|
4
|
+
data.tar.gz: ca1948fa942e772f7ed9caade6b91683c92f7c20b685f24e508d4f669826ebef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37f4ae4497b011da8e928f5d7c9ba315105e80a5de50f4052320fb7409de469a45a51c92d143bac5061706e7e5e3bcfb422a461ffcfa0ab4b2f1d2df7309c39c
|
7
|
+
data.tar.gz: 4ba38b243d77ea33aa89c933eea5a3b98e2d7bed158d664d8f1020636c609e99d48c10cf462ec5e7db822ff73f3abf4f20693fc4ac0ea7585ae3ee343a316644
|
data/.simplecov
ADDED
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file.
|
|
3
3
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
4
4
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
5
5
|
|
6
|
+
## [v2.2.1](https://github.com/smortex/yaml-sort/tree/v2.2.1) (2023-01-04)
|
7
|
+
|
8
|
+
[Full Changelog](https://github.com/smortex/yaml-sort/compare/v2.2.0...v2.2.1)
|
9
|
+
|
10
|
+
**Fixed bugs:**
|
11
|
+
|
12
|
+
- Fix parsing of dictionaries with quotes in KEY/VALUE [\#21](https://github.com/smortex/yaml-sort/pull/21) ([smortex](https://github.com/smortex))
|
13
|
+
|
14
|
+
## [v2.2.0](https://github.com/smortex/yaml-sort/tree/v2.2.0) (2022-09-27)
|
15
|
+
|
16
|
+
[Full Changelog](https://github.com/smortex/yaml-sort/compare/v2.1.1...v2.2.0)
|
17
|
+
|
18
|
+
**Implemented enhancements:**
|
19
|
+
|
20
|
+
- Add support for &anchor / \*alias [\#17](https://github.com/smortex/yaml-sort/pull/17) ([smortex](https://github.com/smortex))
|
21
|
+
|
22
|
+
**Fixed bugs:**
|
23
|
+
|
24
|
+
- Fix relocation of comments following UNINDENT [\#18](https://github.com/smortex/yaml-sort/pull/18) ([smortex](https://github.com/smortex))
|
25
|
+
|
26
|
+
**Merged pull requests:**
|
27
|
+
|
28
|
+
- Add CodeClimate integration [\#15](https://github.com/smortex/yaml-sort/pull/15) ([smortex](https://github.com/smortex))
|
29
|
+
|
6
30
|
## [v2.1.1](https://github.com/smortex/yaml-sort/tree/v2.1.1) (2022-07-03)
|
7
31
|
|
8
32
|
[Full Changelog](https://github.com/smortex/yaml-sort/compare/v2.1.0...v2.1.1)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# yaml-sort
|
2
2
|
|
3
|
+
[![CI](https://github.com/smortex/yaml-sort/actions/workflows/ci.yaml/badge.svg)](https://github.com/smortex/yaml-sort/actions/workflows/ci.yaml)
|
4
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/4df28a3babe44d1a83c0/maintainability)](https://codeclimate.com/github/smortex/yaml-sort/maintainability)
|
5
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/4df28a3babe44d1a83c0/test_coverage)](https://codeclimate.com/github/smortex/yaml-sort/test_coverage)
|
6
|
+
|
3
7
|
An utility to manage YAML files and ensure their lines is in a predictable order.
|
4
8
|
|
5
9
|
This is mainly indended to manage [Hiera files](https://puppet.com/docs/puppet/7/hiera_intro.html) for [Puppet](https://puppet.com/) and translation files in [Ruby on Rails](https://rubyonrails.org/) applications.
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ require "cucumber/rake/task"
|
|
13
13
|
|
14
14
|
Cucumber::Rake::Task.new
|
15
15
|
|
16
|
-
task default: %i[
|
16
|
+
task default: %i[spec cucumber]
|
17
17
|
|
18
18
|
file "lib/yaml/sort/parser.rb": ["lib/yaml/sort/parser.ra"] do
|
19
19
|
sh "racc --output-status --output-file=lib/yaml/sort/parser.rb lib/yaml/sort/parser.ra"
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yaml
|
4
|
+
module Sort
|
5
|
+
class Alias < Value
|
6
|
+
attr_reader :name
|
7
|
+
|
8
|
+
def initialize(anchors, name)
|
9
|
+
super()
|
10
|
+
@anchors = anchors
|
11
|
+
@name = name[:value]
|
12
|
+
end
|
13
|
+
|
14
|
+
def value?
|
15
|
+
@anchors[@name]
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete_value
|
19
|
+
@anchors.delete(@name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s(*)
|
23
|
+
if (s = @anchors.delete(@name))
|
24
|
+
separator = case s
|
25
|
+
when List, Dictionary then "\n"
|
26
|
+
else " "
|
27
|
+
end
|
28
|
+
"&#{name}#{separator}#{s}"
|
29
|
+
else
|
30
|
+
"*#{name}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def <=>(_other)
|
35
|
+
0
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/yaml/sort/dictionary.rb
CHANGED
@@ -25,10 +25,9 @@ module Yaml
|
|
25
25
|
super + items.map do |k, v|
|
26
26
|
n += 1
|
27
27
|
case v
|
28
|
-
when List, Dictionary
|
29
|
-
|
30
|
-
|
31
|
-
"#{k.to_s(skip_first_indent: skip_first_indent && n.zero?)} #{v}"
|
28
|
+
when List, Dictionary then "#{k.to_s(skip_first_indent: skip_first_indent && n.zero?)}\n#{v}"
|
29
|
+
when Scalar, Alias then "#{k.to_s(skip_first_indent: skip_first_indent && n.zero?)} #{v}"
|
30
|
+
else raise "Unexpected type"
|
32
31
|
end
|
33
32
|
end.join("\n")
|
34
33
|
end
|
data/lib/yaml/sort/parser.rb
CHANGED
@@ -13,7 +13,7 @@ module Yaml
|
|
13
13
|
module Sort
|
14
14
|
class Parser < Racc::Parser
|
15
15
|
|
16
|
-
module_eval(<<'...end parser.ra/module_eval...', 'parser.ra',
|
16
|
+
module_eval(<<'...end parser.ra/module_eval...', 'parser.ra', 36)
|
17
17
|
|
18
18
|
def scan(text)
|
19
19
|
text = "---\n#{text}" unless text.start_with?("---\n")
|
@@ -27,11 +27,16 @@ def scan(text)
|
|
27
27
|
@fakelineno = 0
|
28
28
|
@position = 0
|
29
29
|
@indent_stack = []
|
30
|
+
@anchors = {}
|
30
31
|
|
31
32
|
until s.eos?
|
32
33
|
if scan_value
|
33
34
|
@position += s.matched_size if s.scan(/[[:blank:]]*/)
|
34
35
|
case
|
36
|
+
when s.scan(/&[[:alnum:]]+/)
|
37
|
+
emit(:ANCHOR, s.matched[1..-1])
|
38
|
+
when s.scan(/\*[[:alnum:]]+/)
|
39
|
+
emit(:ALIAS, s.matched[1..-1])
|
35
40
|
when s.scan(/[|>][-+]?(?=\n)/)
|
36
41
|
match = s.matched
|
37
42
|
|
@@ -77,10 +82,11 @@ def scan(text)
|
|
77
82
|
when s.scan(/\n[[:blank:]]*#.*/) then emit(:COMMENT, s.matched)
|
78
83
|
when s.scan(/\n([[:blank:]]*-) */) then emit(:ITEM, s.matched, indent: s.captures[0])
|
79
84
|
when s.scan(/\n[[:blank:]]*\.\.\./) then emit(:END_OF_DOCUMENT, s.matched)
|
80
|
-
when s.scan(/\n?([[:blank:]]*)(
|
85
|
+
when s.scan(/\n?([[:blank:]]*)(.+?:)(?=[ \n])/)
|
81
86
|
indent = s.captures[0]
|
82
87
|
indent = last_indent_value + indent + " " unless s.matched.start_with?("\n")
|
83
88
|
emit(:KEY, s.matched, indent: indent, value: s.captures[1])
|
89
|
+
scan_value = true if s.rest
|
84
90
|
|
85
91
|
when s.scan(/\n\z/)
|
86
92
|
# Done
|
@@ -111,7 +117,7 @@ def scan(text)
|
|
111
117
|
@tokens.each do |token|
|
112
118
|
if token[0] == :COMMENT
|
113
119
|
comment << token[1][:value] + "\n"
|
114
|
-
elsif comment.any?
|
120
|
+
elsif comment.any? && token[0] != :UNINDENT
|
115
121
|
token[1][:comment] = comment
|
116
122
|
comment = []
|
117
123
|
end
|
@@ -141,8 +147,19 @@ def emit(token, match, length: nil, indent: nil, value: nil)
|
|
141
147
|
@indent_stack.push(indent) unless @indent_stack.last == indent
|
142
148
|
end
|
143
149
|
|
150
|
+
value ||= match
|
151
|
+
|
152
|
+
if token == :KEY && value == '<<:'
|
153
|
+
message = <<~MESSAGE
|
154
|
+
#{@filename}:#{@lineno}: '<<:' references are not sortable:
|
155
|
+
#{@lines[@lineno - 1].chomp}
|
156
|
+
#{indent}#{" " * @position}^#{"~" * (length - indent.length - 1)}
|
157
|
+
MESSAGE
|
158
|
+
raise(Racc::ParseError, message)
|
159
|
+
end
|
160
|
+
|
144
161
|
exvalue = {
|
145
|
-
value: value
|
162
|
+
value: value,
|
146
163
|
lineno: @lineno,
|
147
164
|
position: @position,
|
148
165
|
length: length,
|
@@ -193,50 +210,61 @@ end
|
|
193
210
|
##### State transition tables begin ###
|
194
211
|
|
195
212
|
racc_action_table = [
|
196
|
-
5,
|
197
|
-
|
213
|
+
5, 10, 2, 12, 3, 8, 5, 10, 13, 12,
|
214
|
+
19, 8, 5, 10, 14, 12, 21, 8, 5, 10,
|
215
|
+
nil, 12, nil, 8, 5, 10, nil, 12, nil, 8,
|
216
|
+
10, 15, 17, 12 ]
|
198
217
|
|
199
218
|
racc_action_check = [
|
200
|
-
2, 2, 0, 2,
|
201
|
-
|
219
|
+
2, 2, 0, 2, 1, 2, 10, 10, 3, 10,
|
220
|
+
10, 10, 12, 12, 4, 12, 12, 12, 19, 19,
|
221
|
+
nil, 19, nil, 19, 21, 21, nil, 21, nil, 21,
|
222
|
+
6, 6, 7, 7 ]
|
202
223
|
|
203
224
|
racc_action_pointer = [
|
204
|
-
0,
|
205
|
-
nil,
|
225
|
+
0, 4, -4, 8, 11, nil, 25, 26, nil, nil,
|
226
|
+
2, nil, 8, nil, nil, nil, nil, nil, nil, 14,
|
227
|
+
nil, 20, nil, nil, nil ]
|
206
228
|
|
207
229
|
racc_action_default = [
|
208
|
-
-
|
209
|
-
-
|
230
|
+
-15, -15, -15, -15, -2, -3, -15, -15, -6, -8,
|
231
|
+
-15, -12, -15, 25, -1, -4, -7, -5, -11, -15,
|
232
|
+
-10, -15, -14, -9, -13 ]
|
210
233
|
|
211
234
|
racc_goto_table = [
|
212
|
-
4, 1,
|
235
|
+
4, 1, 16, 18, nil, nil, nil, nil, 20, nil,
|
236
|
+
22, nil, nil, nil, nil, nil, nil, 23, nil, 24 ]
|
213
237
|
|
214
238
|
racc_goto_check = [
|
215
|
-
2, 1, 5, 6, nil, nil, nil, 2, nil,
|
239
|
+
2, 1, 5, 6, nil, nil, nil, nil, 2, nil,
|
240
|
+
2, nil, nil, nil, nil, nil, nil, 2, nil, 2 ]
|
216
241
|
|
217
242
|
racc_goto_pointer = [
|
218
243
|
nil, 1, -2, nil, nil, -4, -4 ]
|
219
244
|
|
220
245
|
racc_goto_default = [
|
221
|
-
nil, nil, nil, 6, 7,
|
246
|
+
nil, nil, nil, 6, 7, 9, 11 ]
|
222
247
|
|
223
248
|
racc_reduce_table = [
|
224
249
|
0, 0, :racc_error,
|
225
|
-
3,
|
226
|
-
2,
|
227
|
-
1,
|
228
|
-
2,
|
229
|
-
2,
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
2, 14, :_reduce_11
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
250
|
+
3, 11, :_reduce_1,
|
251
|
+
2, 11, :_reduce_2,
|
252
|
+
1, 12, :_reduce_3,
|
253
|
+
2, 12, :_reduce_4,
|
254
|
+
2, 12, :_reduce_5,
|
255
|
+
1, 12, :_reduce_6,
|
256
|
+
2, 13, :_reduce_7,
|
257
|
+
1, 13, :_reduce_8,
|
258
|
+
3, 15, :_reduce_9,
|
259
|
+
2, 15, :_reduce_10,
|
260
|
+
2, 14, :_reduce_11,
|
261
|
+
1, 14, :_reduce_12,
|
262
|
+
3, 16, :_reduce_13,
|
263
|
+
2, 16, :_reduce_14 ]
|
264
|
+
|
265
|
+
racc_reduce_n = 15
|
266
|
+
|
267
|
+
racc_shift_n = 25
|
240
268
|
|
241
269
|
racc_token_table = {
|
242
270
|
false => 0,
|
@@ -246,9 +274,11 @@ racc_token_table = {
|
|
246
274
|
:VALUE => 4,
|
247
275
|
:KEY => 5,
|
248
276
|
:UNINDENT => 6,
|
249
|
-
:ITEM => 7
|
277
|
+
:ITEM => 7,
|
278
|
+
:ANCHOR => 8,
|
279
|
+
:ALIAS => 9 }
|
250
280
|
|
251
|
-
racc_nt_base =
|
281
|
+
racc_nt_base = 10
|
252
282
|
|
253
283
|
racc_use_result_var = true
|
254
284
|
|
@@ -277,6 +307,8 @@ Racc_token_to_s_table = [
|
|
277
307
|
"KEY",
|
278
308
|
"UNINDENT",
|
279
309
|
"ITEM",
|
310
|
+
"ANCHOR",
|
311
|
+
"ALIAS",
|
280
312
|
"$start",
|
281
313
|
"document",
|
282
314
|
"value",
|
@@ -326,43 +358,64 @@ module_eval(<<'.,.,', 'parser.ra', 14)
|
|
326
358
|
end
|
327
359
|
.,.,
|
328
360
|
|
329
|
-
module_eval(<<'.,.,', 'parser.ra',
|
361
|
+
module_eval(<<'.,.,', 'parser.ra', 15)
|
330
362
|
def _reduce_6(val, _values, result)
|
331
|
-
|
363
|
+
result = Alias.new(@anchors, val[0])
|
332
364
|
result
|
333
365
|
end
|
334
366
|
.,.,
|
335
367
|
|
336
368
|
module_eval(<<'.,.,', 'parser.ra', 17)
|
337
369
|
def _reduce_7(val, _values, result)
|
338
|
-
result =
|
370
|
+
val[0].add_item(*val[1]); result = val[0]
|
339
371
|
result
|
340
372
|
end
|
341
373
|
.,.,
|
342
374
|
|
343
|
-
module_eval(<<'.,.,', 'parser.ra',
|
375
|
+
module_eval(<<'.,.,', 'parser.ra', 18)
|
344
376
|
def _reduce_8(val, _values, result)
|
345
|
-
result =
|
377
|
+
result = Dictionary.create(*val[0])
|
346
378
|
result
|
347
379
|
end
|
348
380
|
.,.,
|
349
381
|
|
350
|
-
module_eval(<<'.,.,', 'parser.ra',
|
382
|
+
module_eval(<<'.,.,', 'parser.ra', 20)
|
351
383
|
def _reduce_9(val, _values, result)
|
352
|
-
val[
|
384
|
+
@anchors[val[1][:value]] = val[2]; result = [Scalar.new(val[0]), Alias.new(@anchors, val[1])]
|
353
385
|
result
|
354
386
|
end
|
355
387
|
.,.,
|
356
388
|
|
357
|
-
module_eval(<<'.,.,', 'parser.ra',
|
389
|
+
module_eval(<<'.,.,', 'parser.ra', 21)
|
358
390
|
def _reduce_10(val, _values, result)
|
359
|
-
result =
|
391
|
+
result = [Scalar.new(val[0]), val[1]]
|
360
392
|
result
|
361
393
|
end
|
362
394
|
.,.,
|
363
395
|
|
364
|
-
module_eval(<<'.,.,', 'parser.ra',
|
396
|
+
module_eval(<<'.,.,', 'parser.ra', 23)
|
365
397
|
def _reduce_11(val, _values, result)
|
398
|
+
val[0].add_item(*val[1]); result = val[0]
|
399
|
+
result
|
400
|
+
end
|
401
|
+
.,.,
|
402
|
+
|
403
|
+
module_eval(<<'.,.,', 'parser.ra', 24)
|
404
|
+
def _reduce_12(val, _values, result)
|
405
|
+
result = List.create(*val[0])
|
406
|
+
result
|
407
|
+
end
|
408
|
+
.,.,
|
409
|
+
|
410
|
+
module_eval(<<'.,.,', 'parser.ra', 26)
|
411
|
+
def _reduce_13(val, _values, result)
|
412
|
+
@anchors[val[1][:value]] = val[2]; result = [Item.new(val[0]), Alias.new(@anchors, val[1])]
|
413
|
+
result
|
414
|
+
end
|
415
|
+
.,.,
|
416
|
+
|
417
|
+
module_eval(<<'.,.,', 'parser.ra', 27)
|
418
|
+
def _reduce_14(val, _values, result)
|
366
419
|
result = [Item.new(val[0]), val[1]]
|
367
420
|
result
|
368
421
|
end
|
data/lib/yaml/sort/version.rb
CHANGED
data/lib/yaml/sort.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yaml-sort
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Romain Tartière
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cri
|
@@ -76,6 +76,7 @@ extra_rdoc_files: []
|
|
76
76
|
files:
|
77
77
|
- ".rspec"
|
78
78
|
- ".rubocop.yml"
|
79
|
+
- ".simplecov"
|
79
80
|
- CHANGELOG.md
|
80
81
|
- CODE_OF_CONDUCT.md
|
81
82
|
- Gemfile
|
@@ -84,6 +85,7 @@ files:
|
|
84
85
|
- Rakefile
|
85
86
|
- exe/yaml-sort
|
86
87
|
- lib/yaml/sort.rb
|
88
|
+
- lib/yaml/sort/alias.rb
|
87
89
|
- lib/yaml/sort/cli.rb
|
88
90
|
- lib/yaml/sort/dictionary.rb
|
89
91
|
- lib/yaml/sort/item.rb
|
@@ -119,7 +121,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
121
|
- !ruby/object:Gem::Version
|
120
122
|
version: '0'
|
121
123
|
requirements: []
|
122
|
-
rubygems_version: 3.3.
|
124
|
+
rubygems_version: 3.3.26
|
123
125
|
signing_key:
|
124
126
|
specification_version: 4
|
125
127
|
summary: Sort lines in YAML files in a predictable order
|