unparser 0.7.0 → 0.8.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: d687ea37d01a5a689f6c2c909072090603ec406d0a0e0bc933d315362b10d5a3
4
- data.tar.gz: a49fe55eb25755a6d4158084ca9ccd0df1e62741584af21d9313b8eb63d1d5af
3
+ metadata.gz: e0e776dd7b47efb62b8ad18d7262d247362944f28ea67edb7e518d8a94c74649
4
+ data.tar.gz: 759ec6fb240c4c62835bd8c789877fc26fc974563d2566687a63b2c0dec1072f
5
5
  SHA512:
6
- metadata.gz: 5bc28be9868ed008eb3c7e072a01a9403921f2ee9a28566f2d4a616042cb2f3da659a817a79046462fd4d5a782219d2209072ed21942c54133bac82754f1103d
7
- data.tar.gz: eaa194a4a148f61ffdefad476cadf99c600fa88f94618dbf408a8fed10027cde2f4151bb6d2ec4b35195ce54c10d07b90d2b58be83f7ef8abf24056aee3d828a
6
+ metadata.gz: 11fe99943d2575e00ca2fc150a78cad1f2f830b3249f3692f473da7e520775fc9423b254fb2f7613e4b6811f03dd3d2af0d4bba1d0f2f143e048ab65281771ff
7
+ data.tar.gz: f08db4117aa2ebba9c5ac7a9e057ca7ddc9fc0613170752ac10cc7515058f491fe756b880db73629e2e7a8328cc979872b4c682197c061de39da52a44796587f
data/README.md CHANGED
@@ -10,7 +10,7 @@ The following constraints apply:
10
10
 
11
11
  * No support for macruby extensions
12
12
  * Only support for the [modern AST](https://github.com/whitequark/parser/#usage) format
13
- * Only support for Ruby >= 3.1
13
+ * Only support for Ruby >= 3.2
14
14
 
15
15
  Notable Users:
16
16
 
@@ -44,9 +44,9 @@ To preserve the comments from the source:
44
44
  require 'parser/current'
45
45
  require 'unparser'
46
46
 
47
- ast, comments = Unparser.parse_with_comments('your(ruby(code)) # with comments')
47
+ ast, comments = Unparser.parser.parse_with_comments(Unparser.buffer('your(ruby(code)) # with comments'))
48
48
 
49
- Unparser.unparse(ast, comments) # => 'your(ruby(code)) # with comments'
49
+ Unparser.unparse(ast, comments: comments) # => 'your(ruby(code)) # with comments'
50
50
  ```
51
51
 
52
52
  Passing in manually constructed AST:
@@ -114,7 +114,7 @@ Unparser currently successfully round trips almost all ruby code around. Using R
114
114
  If there is a non round trippable example that is NOT subjected to known [Limitations](#limitations).
115
115
  please report a bug.
116
116
 
117
- On CI unparser is currently tested against rubyspec with minor [excludes](https://github.com/mbj/unparser/blob/master/spec/integrations.yml).
117
+ On CI unparser is currently tested against rubyspec with minor [excludes](https://github.com/mbj/unparser/blob/main/spec/integrations.yml).
118
118
 
119
119
  Limitations:
120
120
  ------------
data/lib/unparser/cli.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'pathname'
4
+
3
5
  module Unparser
4
6
  # Unparser CLI implementation
5
7
  class CLI
@@ -30,10 +30,10 @@ module Unparser
30
30
 
31
31
  # Well rubocop you are static so you do not have a clue here ;)
32
32
  # rubocop:disable Style/RedundantInitialize
33
- # rubocop:disable Style/MissingSuper
33
+ # rubocop:disable Lint/MissingSuper
34
34
  def initialize; end
35
35
  # rubocop:enable Style/RedundantInitialize
36
- # rubocop:enable Style/MissingSuper
36
+ # rubocop:enable Lint/MissingSuper
37
37
 
38
38
  end.new
39
39
 
@@ -13,7 +13,11 @@ module Unparser
13
13
  end
14
14
 
15
15
  def emit_def_arguments
16
- delimited(normal_arguments)
16
+ if children.one? && n_mlhs?(Util.one(children))
17
+ emitter(Util.one(children)).dispatch_def
18
+ else
19
+ delimited(normal_arguments)
20
+ end
17
21
  end
18
22
 
19
23
  def emit_lambda_arguments
@@ -25,6 +25,16 @@ module Unparser
25
25
 
26
26
  if BINARY_OPERATOR.include?(right.type)
27
27
  writer_with(Writer::Binary, node: right).emit_operator
28
+ elsif n_array?(right)
29
+ emit_array
30
+ else
31
+ right_emitter.write_to_buffer
32
+ end
33
+ end
34
+
35
+ def emit_array
36
+ if right.children.size > 1
37
+ delimited(right.children)
28
38
  else
29
39
  right_emitter.write_to_buffer
30
40
  end
@@ -5,7 +5,7 @@ module Unparser
5
5
 
6
6
  # Block emitter
7
7
  class Block < self
8
- handle :block, :numblock
8
+ handle :block, :numblock, :itblock
9
9
 
10
10
  children :target, :arguments, :body
11
11
 
@@ -71,8 +71,16 @@ module Unparser
71
71
  node.type.equal?(:numblock)
72
72
  end
73
73
 
74
+ # NOTE: mutant fails on Ruby < 3.4
75
+ # mutant:disable
76
+ def itblock?
77
+ node.type.equal?(:itblock)
78
+ end
79
+
80
+ # NOTE: mutant fails on Ruby < 3.4
81
+ # mutant:disable
74
82
  def emit_block_arguments
75
- return if numblock? || arguments.children.empty?
83
+ return if numblock? || itblock? || arguments.children.empty?
76
84
 
77
85
  ws
78
86
 
@@ -33,7 +33,7 @@ module Unparser
33
33
 
34
34
  def emit_begin_child(component)
35
35
  write('#{')
36
- visit(unwrap_single_begin(component))
36
+ visit(Util.one(component.children)) if component.children.any?
37
37
  write('}')
38
38
  end
39
39
  end # DSym
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for ensure nodes
6
+ class Ensure < self
7
+ handle :ensure
8
+
9
+ private
10
+
11
+ def dispatch
12
+ emit_ensure(node)
13
+ end
14
+ end # Ensure
15
+ end # Emitter
16
+ end # Unparser
@@ -21,7 +21,7 @@ module Unparser
21
21
 
22
22
  if children.one? && n_if?(children.first)
23
23
  ws
24
- emitter(children.first).emit_ternary
24
+ emitter(Util.one(children)).emit_ternary
25
25
  else
26
26
  emit_arguments unless children.empty?
27
27
  end
@@ -16,7 +16,7 @@ module Unparser
16
16
 
17
17
  ws
18
18
 
19
- visit(target)
19
+ dispatch_target(target)
20
20
 
21
21
  if unless_guard
22
22
  ws
@@ -31,6 +31,14 @@ module Unparser
31
31
  nl
32
32
  end
33
33
  end
34
+
35
+ def dispatch_target(target)
36
+ if n_array?(target)
37
+ writer_with(Writer::Array, node: target).emit_compact
38
+ else
39
+ visit(target)
40
+ end
41
+ end
34
42
  end # InPattern
35
43
  end # Emitter
36
44
  end # Unparser
@@ -12,7 +12,7 @@ module Unparser
12
12
  write('begin')
13
13
 
14
14
  if children.one?
15
- emit_body_ensure_rescue(children.first)
15
+ emit_body_ensure_rescue(Util.one(children))
16
16
  else
17
17
  indented do
18
18
  emit_multiple_body
@@ -14,7 +14,12 @@ module Unparser
14
14
  def dispatch
15
15
  visit(target)
16
16
  write(' => ')
17
- visit(pattern)
17
+
18
+ if n_array?(pattern)
19
+ writer_with(Writer::Array, node: pattern).emit_compact
20
+ else
21
+ visit(pattern)
22
+ end
18
23
  end
19
24
  end # MatchPattern
20
25
  end # Emitter
@@ -13,7 +13,12 @@ module Unparser
13
13
  def dispatch
14
14
  visit(target)
15
15
  write(' in ')
16
- visit(pattern)
16
+
17
+ if n_array?(pattern)
18
+ writer_with(Writer::Array, node: pattern).emit_compact
19
+ else
20
+ visit(pattern)
21
+ end
17
22
  end
18
23
  end # MatchPatternP
19
24
  end # Emitter
@@ -6,10 +6,16 @@ module Unparser
6
6
  class MLHS < self
7
7
  handle :mlhs
8
8
 
9
- NO_COMMA = %i[arg splat mlhs restarg].freeze
9
+ NO_COMMA = %i[arg splat restarg].freeze
10
10
 
11
11
  private_constant(*constants(false))
12
12
 
13
+ def dispatch_def
14
+ parentheses do
15
+ delimited(children)
16
+ end
17
+ end
18
+
13
19
  private
14
20
 
15
21
  def dispatch
@@ -25,9 +25,30 @@ module Unparser
25
25
  private
26
26
 
27
27
  def dispatch
28
- visit(begin_node) if begin_node
28
+ visit_begin_node(begin_node)
29
29
  write(TOKENS.fetch(node.type))
30
- visit(end_node) if end_node
30
+ visit_end_node(end_node)
31
+ end
32
+
33
+ def visit_begin_node(node)
34
+ return unless node
35
+
36
+ if n_array?(begin_node)
37
+ writer_with(Writer::Array, node: begin_node).emit_compact
38
+ else
39
+ visit(begin_node)
40
+ end
41
+ end
42
+
43
+ def visit_end_node(node)
44
+ return unless node
45
+
46
+ write(' ') if n_range?(node)
47
+ if n_array?(node)
48
+ writer_with(Writer::Array, node: node).emit_compact
49
+ else
50
+ visit(node)
51
+ end
31
52
  end
32
53
 
33
54
  end # Range
@@ -41,6 +41,8 @@ module Unparser
41
41
  children.each do |child|
42
42
  if n_begin?(child)
43
43
  emit_begin(child)
44
+ elsif n_gvar?(child)
45
+ emit_gvar(child)
44
46
  else
45
47
  emit_string(child)
46
48
  end
@@ -64,9 +66,14 @@ module Unparser
64
66
 
65
67
  def emit_begin(component)
66
68
  write('#{')
67
- visit(unwrap_single_begin(component))
69
+ visit(Util.one(component.children)) if component.children.any?
68
70
  write('}')
69
71
  end
72
+
73
+ def emit_gvar(component)
74
+ write('#')
75
+ write(Util.one(component.children).to_s)
76
+ end
70
77
  end # XStr
71
78
  end # Emitter
72
79
  end # Unparser
@@ -147,6 +147,7 @@ module Unparser
147
147
  def emit_body_inner(node)
148
148
  head, *tail = node.children
149
149
  emit_body_member(head)
150
+ write(';') if requires_explicit_statement_terminator?(head, tail)
150
151
 
151
152
  tail.each do |child|
152
153
  buffer.ensure_nl
@@ -154,9 +155,14 @@ module Unparser
154
155
  nl if EXTRA_NL.include?(child.type)
155
156
 
156
157
  emit_body_member(child)
158
+ write(';') if requires_explicit_statement_terminator?(child, tail)
157
159
  end
158
160
  end
159
161
 
162
+ def requires_explicit_statement_terminator?(node, nodes_group)
163
+ n_range?(node) && node.children.fetch(1).nil? && !node.eql?(nodes_group.fetch(-1))
164
+ end
165
+
160
166
  def emit_body_member(node)
161
167
  if n_rescue?(node)
162
168
  emit_rescue_postcontrol(node)
@@ -31,7 +31,16 @@ module Unparser
31
31
  node.type.equal?(type)
32
32
  end
33
33
 
34
+ def n_flipflop?(node)
35
+ n_iflipflop?(node) || n_eflipflop?(node)
36
+ end
37
+
38
+ def n_range?(node)
39
+ n_irange?(node) || n_erange?(node)
40
+ end
41
+
34
42
  %i[
43
+ and
35
44
  arg
36
45
  args
37
46
  array
@@ -41,19 +50,26 @@ module Unparser
41
50
  cbase
42
51
  const
43
52
  dstr
53
+ eflipflop
44
54
  empty_else
55
+ erange
45
56
  ensure
57
+ gvar
46
58
  hash
47
59
  hash_pattern
48
60
  if
61
+ iflipflop
49
62
  in_pattern
50
63
  int
64
+ irange
51
65
  kwarg
52
66
  kwargs
53
67
  kwsplat
54
68
  lambda
55
69
  lvar
56
70
  match_rest
71
+ mlhs
72
+ or
57
73
  pair
58
74
  rescue
59
75
  send
@@ -61,20 +77,13 @@ module Unparser
61
77
  splat
62
78
  str
63
79
  sym
64
- ].each do |type|
80
+ xstr
81
+ ].to_set.each do |type|
65
82
  name = "n_#{type}?"
66
83
  define_method(name) do |node|
67
84
  n?(type, node)
68
85
  end
69
86
  private(name)
70
87
  end
71
-
72
- def unwrap_single_begin(node)
73
- if n_begin?(node) && node.children.one?
74
- node.children.first
75
- else
76
- node
77
- end
78
- end
79
88
  end # NodeHelpers
80
89
  end # Unparser
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ # Original code before vendoring and reduction from: https://github.com/mbj/mutant/blob/main/lib/mutant/util.rb
5
+ module Util
6
+ # Error raised by `Util.one` if size is not exactly one
7
+ SizeError = Class.new(IndexError)
8
+
9
+ # Return only element in array if it contains exactly one member
10
+ #
11
+ # @param array [Array]
12
+ #
13
+ # @return [Object] first entry
14
+ def self.one(array)
15
+ case array
16
+ in [value]
17
+ value
18
+ else
19
+ fail SizeError, "expected size to be exactly 1 but size was #{array.size}"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ module Writer
5
+ class Array
6
+ include Writer, Adamantium
7
+
8
+ MAP = {
9
+ dsym: '%I',
10
+ sym: '%i',
11
+ dstr: '%W',
12
+ str: '%w'
13
+ }.freeze
14
+ private_constant(*constants(false))
15
+
16
+ def emit_compact # rubocop:disable Metrics/AbcSize
17
+ children_generic_type = array_elements_generic_type
18
+
19
+ write(MAP.fetch(children_generic_type))
20
+
21
+ parentheses('[', ']') do
22
+ delimited(children, ' ') do |child|
23
+ if n_sym?(child) || n_str?(child)
24
+ write(Util.one(child.children).to_s)
25
+ else
26
+ write('#{')
27
+ emitter(Util.one(Util.one(child.children).children)).write_to_buffer
28
+ write('}')
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def array_elements_generic_type
37
+ children_types = children.to_set(&:type)
38
+
39
+ if children_types == Set[:sym, :dsym]
40
+ :dsym
41
+ elsif children_types == Set[:str, :dstr]
42
+ :dstr
43
+ elsif children_types == Set[]
44
+ :sym
45
+ else
46
+ Util.one(children_types.to_a)
47
+ end
48
+ end
49
+ end # Array
50
+ end # Writer
51
+ end # Unparser
@@ -39,7 +39,7 @@ module Unparser
39
39
  tANDOP: '&&'
40
40
  }.freeze
41
41
 
42
- NEED_KEYWORD = %i[return break next].freeze
42
+ NEED_KEYWORD = %i[return break next match_pattern_p].freeze
43
43
 
44
44
  private_constant(*constants(false))
45
45
 
@@ -52,9 +52,13 @@ module Unparser
52
52
  end
53
53
 
54
54
  def dispatch
55
- left_emitter.write_to_buffer
56
- write(' ', MAP.fetch(effective_symbol), ' ')
57
- visit(right)
55
+ if node.type.eql?(:and) && left.type.equal?(:or)
56
+ emit_with(KEYWORD_TOKENS)
57
+ else
58
+ left_emitter.write_to_buffer
59
+ write(' ', MAP.fetch(effective_symbol), ' ')
60
+ visit(right)
61
+ end
58
62
  end
59
63
 
60
64
  private
@@ -55,6 +55,9 @@ module Unparser
55
55
  write('#{')
56
56
  node.children.each(&method(:visit))
57
57
  write('}')
58
+ elsif n_gvar?(node)
59
+ write('#')
60
+ write_regular(node.children.first.to_s)
58
61
  else
59
62
  write_regular(node.children.first)
60
63
  end
@@ -14,8 +14,13 @@ module Unparser
14
14
  children :exception, :assignment, :body
15
15
 
16
16
  def emit_postcontrol
17
- write(' rescue ')
18
- visit(body)
17
+ if body
18
+ write(' rescue ')
19
+ visit(body)
20
+ else
21
+ nl
22
+ write('rescue')
23
+ end
19
24
  end
20
25
 
21
26
  def emit_regular
@@ -58,10 +63,10 @@ module Unparser
58
63
  end
59
64
 
60
65
  def write_index_assignment
61
- receiver, index = assignment.children
66
+ receiver, *indexes = assignment.children
62
67
  visit(receiver)
63
68
  write('[')
64
- visit(index) if index
69
+ delimited(indexes)
65
70
  write(']')
66
71
  end
67
72
  end # Resbody
@@ -21,7 +21,7 @@ module Unparser
21
21
  end
22
22
 
23
23
  def emit_postcontrol
24
- visit(body)
24
+ visit(body) if body
25
25
  writer_with(Resbody, node: rescue_body).emit_postcontrol
26
26
  end
27
27
 
@@ -12,13 +12,18 @@ module Unparser
12
12
 
13
13
  private_constant(*constants(false))
14
14
 
15
- def dispatch
15
+ def dispatch # rubocop:disable Metrics/AbcSize
16
16
  name = selector
17
+ first_child = children.fetch(0)
17
18
 
18
- write(MAP.fetch(name, name).to_s)
19
+ if n_flipflop?(first_child) || n_and?(first_child) || n_or?(first_child)
20
+ write 'not '
21
+ else
22
+ write(MAP.fetch(name, name).to_s)
19
23
 
20
- if n_int?(receiver) && selector.equal?(:+@)
21
- write('+')
24
+ if n_int?(receiver) && selector.equal?(:+@)
25
+ write('+')
26
+ end
22
27
  end
23
28
 
24
29
  visit(receiver)
@@ -29,10 +29,9 @@ module Unparser
29
29
  # mutant:disable
30
30
  def round_trips?(source:)
31
31
  parser = Unparser.parser
32
-
33
- local_variable_scope
34
- .local_variables_for_node(node)
35
- .each(&parser.static_env.public_method(:declare))
32
+ local_variable_scope.local_variables_for_node(node).each do |local_variable|
33
+ parser.declare_local_variable(local_variable)
34
+ end
36
35
 
37
36
  buffer = Buffer.new
38
37
  buffer.write_encoding(explicit_encoding) if explicit_encoding
data/lib/unparser.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  require 'diff/lcs'
4
4
  require 'diff/lcs/hunk'
5
5
  require 'optparse'
6
- require 'parser/current'
7
6
  require 'set'
8
7
 
9
8
  require 'unparser/equalizer'
@@ -18,18 +17,53 @@ require 'unparser/anima/attribute'
18
17
  require 'unparser/anima/error'
19
18
 
20
19
  # Library namespace
21
- module Unparser
20
+ module Unparser # rubocop:disable Metrics/ModuleLength
22
21
  # Unparser specific AST builder defaulting to modern AST format
23
- class Builder < Parser::Builders::Default
24
- modernize
22
+ if Gem::Version.new(RUBY_VERSION) <= '3.4'
23
+ require 'parser/current'
24
+ class Builder < Parser::Builders::Default
25
+ modernize
25
26
 
26
- def initialize
27
- super
27
+ # mutant:disable
28
+ def initialize
29
+ super
28
30
 
29
- self.emit_file_line_as_literals = false
31
+ self.emit_file_line_as_literals = false
32
+ end
33
+ end
34
+ else
35
+ require 'prism'
36
+ class Builder < Prism::Translation::Parser::Builder
37
+ modernize
38
+
39
+ # mutant:disable
40
+ def initialize
41
+ super
42
+
43
+ self.emit_file_line_as_literals = false
44
+ end
30
45
  end
31
46
  end
32
47
 
48
+ PARSER_CLASS =
49
+ if Gem::Version.new(RUBY_VERSION) <= '3.4'
50
+ Class.new(Parser::CurrentRuby) do
51
+ def declare_local_variable(local_variable)
52
+ static_env.declare(local_variable)
53
+ end
54
+ end
55
+ else
56
+ Class.new(Prism::Translation::Parser34) do
57
+ def declare_local_variable(local_variable)
58
+ (@local_variables ||= Set.new) << local_variable
59
+ end
60
+
61
+ def prism_options
62
+ super.merge(scopes: [@local_variables.to_a])
63
+ end
64
+ end
65
+ end
66
+
33
67
  EMPTY_STRING = ''.freeze
34
68
  EMPTY_ARRAY = [].freeze
35
69
 
@@ -202,8 +236,9 @@ module Unparser
202
236
  # @return [Parser::Base]
203
237
  #
204
238
  # @api private
239
+ # mutant:disable
205
240
  def self.parser
206
- Parser::CurrentRuby.new(Builder.new).tap do |parser|
241
+ PARSER_CLASS.new(Builder.new).tap do |parser|
207
242
  parser.diagnostics.tap do |diagnostics|
208
243
  diagnostics.all_errors_are_fatal = true
209
244
  end
@@ -250,6 +285,7 @@ require 'unparser/emitter/def'
250
285
  require 'unparser/emitter/defined'
251
286
  require 'unparser/emitter/dstr'
252
287
  require 'unparser/emitter/dsym'
288
+ require 'unparser/emitter/ensure'
253
289
  require 'unparser/emitter/flipflop'
254
290
  require 'unparser/emitter/float'
255
291
  require 'unparser/emitter/flow_modifier'
@@ -294,6 +330,7 @@ require 'unparser/emitter/find_pattern'
294
330
  require 'unparser/emitter/match_pattern'
295
331
  require 'unparser/emitter/match_pattern_p'
296
332
  require 'unparser/writer'
333
+ require 'unparser/writer/array'
297
334
  require 'unparser/writer/binary'
298
335
  require 'unparser/writer/dynamic_string'
299
336
  require 'unparser/writer/regexp'
@@ -307,6 +344,7 @@ require 'unparser/writer/send/unary'
307
344
  require 'unparser/node_details'
308
345
  require 'unparser/node_details/send'
309
346
  require 'unparser/cli'
347
+ require 'unparser/util'
310
348
 
311
349
  require 'unparser/validation'
312
350
  # make it easy for zombie
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Schirp
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-03-16 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: diff-lcs
@@ -38,34 +37,48 @@ dependencies:
38
37
  - - ">="
39
38
  - !ruby/object:Gem::Version
40
39
  version: 3.3.0
40
+ - !ruby/object:Gem::Dependency
41
+ name: prism
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '1.4'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '1.4'
41
54
  - !ruby/object:Gem::Dependency
42
55
  name: mutant
43
56
  requirement: !ruby/object:Gem::Requirement
44
57
  requirements:
45
58
  - - "~>"
46
59
  - !ruby/object:Gem::Version
47
- version: 0.12.4
60
+ version: 0.13.0
48
61
  type: :development
49
62
  prerelease: false
50
63
  version_requirements: !ruby/object:Gem::Requirement
51
64
  requirements:
52
65
  - - "~>"
53
66
  - !ruby/object:Gem::Version
54
- version: 0.12.4
67
+ version: 0.13.0
55
68
  - !ruby/object:Gem::Dependency
56
69
  name: mutant-rspec
57
70
  requirement: !ruby/object:Gem::Requirement
58
71
  requirements:
59
72
  - - "~>"
60
73
  - !ruby/object:Gem::Version
61
- version: 0.12.4
74
+ version: 0.13.0
62
75
  type: :development
63
76
  prerelease: false
64
77
  version_requirements: !ruby/object:Gem::Requirement
65
78
  requirements:
66
79
  - - "~>"
67
80
  - !ruby/object:Gem::Version
68
- version: 0.12.4
81
+ version: 0.13.0
69
82
  - !ruby/object:Gem::Dependency
70
83
  name: rspec
71
84
  requirement: !ruby/object:Gem::Requirement
@@ -184,6 +197,7 @@ files:
184
197
  - lib/unparser/emitter/defined.rb
185
198
  - lib/unparser/emitter/dstr.rb
186
199
  - lib/unparser/emitter/dsym.rb
200
+ - lib/unparser/emitter/ensure.rb
187
201
  - lib/unparser/emitter/find_pattern.rb
188
202
  - lib/unparser/emitter/flipflop.rb
189
203
  - lib/unparser/emitter/float.rb
@@ -233,8 +247,10 @@ files:
233
247
  - lib/unparser/node_details.rb
234
248
  - lib/unparser/node_details/send.rb
235
249
  - lib/unparser/node_helpers.rb
250
+ - lib/unparser/util.rb
236
251
  - lib/unparser/validation.rb
237
252
  - lib/unparser/writer.rb
253
+ - lib/unparser/writer/array.rb
238
254
  - lib/unparser/writer/binary.rb
239
255
  - lib/unparser/writer/dynamic_string.rb
240
256
  - lib/unparser/writer/regexp.rb
@@ -251,11 +267,10 @@ licenses:
251
267
  - MIT
252
268
  metadata:
253
269
  bug_tracker_uri: https://github.com/mbj/unparser/issues
254
- changelog_uri: https://github.com/mbj/unparser/blob/master/Changelog.md
270
+ changelog_uri: https://github.com/mbj/unparser/blob/main/Changelog.md
255
271
  funding_uri: https://github.com/sponsors/mbj
256
272
  source_code_uri: https://github.com/mbj/unparser
257
273
  rubygems_mfa_required: 'true'
258
- post_install_message:
259
274
  rdoc_options: []
260
275
  require_paths:
261
276
  - lib
@@ -270,8 +285,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
270
285
  - !ruby/object:Gem::Version
271
286
  version: '0'
272
287
  requirements: []
273
- rubygems_version: 3.5.22
274
- signing_key:
288
+ rubygems_version: 3.6.7
275
289
  specification_version: 4
276
290
  summary: Generate equivalent source for parser gem AST nodes
277
291
  test_files: []