unparser 0.8.0 → 0.8.2

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: e0e776dd7b47efb62b8ad18d7262d247362944f28ea67edb7e518d8a94c74649
4
- data.tar.gz: 759ec6fb240c4c62835bd8c789877fc26fc974563d2566687a63b2c0dec1072f
3
+ metadata.gz: c9a2bc4c065381b615f71cb36770c6edc2633ce160540426d28ebb6ccda689d8
4
+ data.tar.gz: c0952ffb8269388f5de64ea68719d785a59dd7f9869907c69df623aeb10d9006
5
5
  SHA512:
6
- metadata.gz: 11fe99943d2575e00ca2fc150a78cad1f2f830b3249f3692f473da7e520775fc9423b254fb2f7613e4b6811f03dd3d2af0d4bba1d0f2f143e048ab65281771ff
7
- data.tar.gz: f08db4117aa2ebba9c5ac7a9e057ca7ddc9fc0613170752ac10cc7515058f491fe756b880db73629e2e7a8328cc979872b4c682197c061de39da52a44796587f
6
+ metadata.gz: f0151e34f94305994a4e6fac9ea360fb5918b114e3e1f2ab9e1a6a6b5359134baa972d27a5c09410406185a1c91b5424590eb33ce1d343e928a4eb09bdbfa4e3
7
+ data.tar.gz: 0fe83efcc1cc934e3d045530c06f1addac19bf30bc101740bf56d8c4129ef2c5c7989498797d5098858b946094ec8962aecf55fa42bba866774ef34fc323fcf7
@@ -107,8 +107,8 @@ module Unparser
107
107
  end
108
108
 
109
109
  # Enumerate each node with its local variable scope
110
- def self.each(node:, stack:, &block)
111
- new(stack: stack).each(node: node, &block)
110
+ def self.each(node:, stack:, &)
111
+ new(stack: stack).each(node: node, &)
112
112
  end
113
113
 
114
114
  # Enumerate local variable scope scope
@@ -121,8 +121,8 @@ module Unparser
121
121
  #
122
122
  # @api private
123
123
  #
124
- def each(node:, &block)
125
- visit(node, &block)
124
+ def each(node:, &)
125
+ visit(node, &)
126
126
  end
127
127
 
128
128
  private
data/lib/unparser/cli.rb CHANGED
@@ -63,8 +63,8 @@ module Unparser
63
63
  # @api private
64
64
  #
65
65
  # mutant:disable
66
- def self.run(*arguments)
67
- new(*arguments).exit_status
66
+ def self.run(*)
67
+ new(*).exit_status
68
68
  end
69
69
 
70
70
  # Initialize object
@@ -15,8 +15,8 @@ module Unparser
15
15
  #
16
16
  # @api private
17
17
  #
18
- def source_range(*arguments)
19
- self.class.source_range(*arguments)
18
+ def source_range(*)
19
+ self.class.source_range(*)
20
20
  end
21
21
 
22
22
  # Initialize object
@@ -51,7 +51,7 @@ module Unparser
51
51
  emit_send_target
52
52
  when :lambda
53
53
  visit(target)
54
- emit_lambda_arguments unless node.type.equal?(:numblock)
54
+ emit_lambda_arguments
55
55
  else
56
56
  visit(target)
57
57
  end
@@ -63,7 +63,11 @@ module Unparser
63
63
  target_writer.emit_arguments_without_heredoc_body
64
64
  end
65
65
 
66
+ # NOTE: mutant fails on Ruby < 3.4
67
+ # mutant:disable
66
68
  def emit_lambda_arguments
69
+ return if node.type.equal?(:numblock) || itblock?
70
+
67
71
  parentheses { writer_with(Args, node: arguments).emit_lambda_arguments }
68
72
  end
69
73
 
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Unparser
4
- UnknownNodeError = Class.new(ArgumentError)
4
+ class UnknownNodeError < ArgumentError
5
+ end
5
6
 
6
7
  # Emitter base class
7
8
  class Emitter
data/lib/unparser/util.rb CHANGED
@@ -4,7 +4,8 @@ module Unparser
4
4
  # Original code before vendoring and reduction from: https://github.com/mbj/mutant/blob/main/lib/mutant/util.rb
5
5
  module Util
6
6
  # Error raised by `Util.one` if size is not exactly one
7
- SizeError = Class.new(IndexError)
7
+ class SizeError < IndexError
8
+ end
8
9
 
9
10
  # Return only element in array if it contains exactly one member
10
11
  #
@@ -145,7 +145,7 @@ module Unparser
145
145
  # mutant:disable
146
146
  def report_exception(phase_exception)
147
147
  if phase_exception
148
- [phase_exception.inspect].concat(phase_exception.backtrace.take(20))
148
+ [phase_exception.inspect].concat(phase_exception.backtrace&.take(20) || [])
149
149
  else
150
150
  %w[undefined]
151
151
  end
@@ -26,42 +26,41 @@ module Unparser
26
26
  #
27
27
  # mutant:disable
28
28
  def dispatch
29
- if heredoc?
30
- write(HEREDOC_HEADER)
31
- buffer.push_heredoc(heredoc_body)
32
- elsif round_tripping_segmented_source
33
- write(round_tripping_segmented_source)
34
- else
35
- fail UnsupportedNodeError, "Unparser cannot round trip this node: #{node.inspect}"
36
- end
29
+ # Try predictable patterns first before exhaustive search
30
+
31
+ # Pattern 1: HEREDOC for large dstr (>= 8 children, preserve readability)
32
+ return write_heredoc if children.length >= HEREDOC_THRESHOLD && round_trips_heredoc?
33
+
34
+ # Pattern 2: Limited search (prevent exponential blowup)
35
+ source = limited_search_segmented_source
36
+ return write(source) if source
37
+
38
+ # Pattern 3: HEREDOC fallback (last resort if segmentation fails)
39
+ return write_heredoc if round_trips_heredoc?
40
+
41
+ fail UnsupportedNodeError, "Unparser cannot round trip this node: #{node.inspect}"
37
42
  end
38
43
 
39
44
  private
40
45
 
41
- def heredoc?
42
- if children.length >= HEREDOC_THRESHOLD
43
- round_trips_heredoc?
44
- else
45
- round_tripping_segmented_source.nil? # && round_trips_heredoc?
46
- end
46
+ def write_heredoc
47
+ write(HEREDOC_HEADER)
48
+ buffer.push_heredoc(heredoc_body)
47
49
  end
48
- memoize :heredoc?
49
50
 
50
51
  def round_trips_heredoc?
51
52
  round_trips?(source: heredoc_source)
52
53
  end
53
54
  memoize :round_trips_heredoc?
54
55
 
55
- def round_tripping_segmented_source
56
+ def limited_search_segmented_source
56
57
  each_segments(children) do |segments|
57
-
58
58
  source = segmented_source(segments: segments)
59
-
60
59
  return source if round_trips?(source: source)
61
60
  end
61
+
62
62
  nil
63
63
  end
64
- memoize :round_tripping_segmented_source
65
64
 
66
65
  def each_segments(array)
67
66
  yield [array]
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 'set'
7
6
 
8
7
  require 'unparser/equalizer'
9
8
  require 'unparser/adamantium'
@@ -53,7 +52,14 @@ module Unparser # rubocop:disable Metrics/ModuleLength
53
52
  end
54
53
  end
55
54
  else
56
- Class.new(Prism::Translation::Parser34) do
55
+ prism_translation_parser =
56
+ if Gem::Version.new(RUBY_VERSION) >= '4.0'
57
+ Prism::Translation::Parser40
58
+ else
59
+ Prism::Translation::Parser34
60
+ end
61
+
62
+ Class.new(prism_translation_parser) do
57
63
  def declare_local_variable(local_variable)
58
64
  (@local_variables ||= Set.new) << local_variable
59
65
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Schirp
@@ -13,16 +13,22 @@ dependencies:
13
13
  name: diff-lcs
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - "~>"
16
+ - - ">="
17
17
  - !ruby/object:Gem::Version
18
18
  version: '1.6'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '3'
19
22
  type: :runtime
20
23
  prerelease: false
21
24
  version_requirements: !ruby/object:Gem::Requirement
22
25
  requirements:
23
- - - "~>"
26
+ - - ">="
24
27
  - !ruby/object:Gem::Version
25
28
  version: '1.6'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '3'
26
32
  - !ruby/object:Gem::Dependency
27
33
  name: parser
28
34
  requirement: !ruby/object:Gem::Requirement
@@ -43,84 +49,110 @@ dependencies:
43
49
  requirements:
44
50
  - - ">="
45
51
  - !ruby/object:Gem::Version
46
- version: '1.4'
52
+ version: 1.5.1
47
53
  type: :runtime
48
54
  prerelease: false
49
55
  version_requirements: !ruby/object:Gem::Requirement
50
56
  requirements:
51
57
  - - ">="
52
58
  - !ruby/object:Gem::Version
53
- version: '1.4'
59
+ version: 1.5.1
60
+ - !ruby/object:Gem::Dependency
61
+ name: benchmark
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: 0.5.0
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 0.5.0
54
74
  - !ruby/object:Gem::Dependency
55
75
  name: mutant
56
76
  requirement: !ruby/object:Gem::Requirement
57
77
  requirements:
58
78
  - - "~>"
59
79
  - !ruby/object:Gem::Version
60
- version: 0.13.0
80
+ version: 0.14.2
61
81
  type: :development
62
82
  prerelease: false
63
83
  version_requirements: !ruby/object:Gem::Requirement
64
84
  requirements:
65
85
  - - "~>"
66
86
  - !ruby/object:Gem::Version
67
- version: 0.13.0
87
+ version: 0.14.2
68
88
  - !ruby/object:Gem::Dependency
69
89
  name: mutant-rspec
70
90
  requirement: !ruby/object:Gem::Requirement
71
91
  requirements:
72
92
  - - "~>"
73
93
  - !ruby/object:Gem::Version
74
- version: 0.13.0
94
+ version: 0.14.2
75
95
  type: :development
76
96
  prerelease: false
77
97
  version_requirements: !ruby/object:Gem::Requirement
78
98
  requirements:
79
99
  - - "~>"
80
100
  - !ruby/object:Gem::Version
81
- version: 0.13.0
101
+ version: 0.14.2
82
102
  - !ruby/object:Gem::Dependency
83
103
  name: rspec
84
104
  requirement: !ruby/object:Gem::Requirement
85
105
  requirements:
86
- - - "~>"
106
+ - - ">="
87
107
  - !ruby/object:Gem::Version
88
108
  version: '3.13'
109
+ - - "<"
110
+ - !ruby/object:Gem::Version
111
+ version: '5'
89
112
  type: :development
90
113
  prerelease: false
91
114
  version_requirements: !ruby/object:Gem::Requirement
92
115
  requirements:
93
- - - "~>"
116
+ - - ">="
94
117
  - !ruby/object:Gem::Version
95
118
  version: '3.13'
119
+ - - "<"
120
+ - !ruby/object:Gem::Version
121
+ version: '5'
96
122
  - !ruby/object:Gem::Dependency
97
123
  name: rspec-core
98
124
  requirement: !ruby/object:Gem::Requirement
99
125
  requirements:
100
- - - "~>"
126
+ - - ">="
101
127
  - !ruby/object:Gem::Version
102
128
  version: '3.13'
129
+ - - "<"
130
+ - !ruby/object:Gem::Version
131
+ version: '5'
103
132
  type: :development
104
133
  prerelease: false
105
134
  version_requirements: !ruby/object:Gem::Requirement
106
135
  requirements:
107
- - - "~>"
136
+ - - ">="
108
137
  - !ruby/object:Gem::Version
109
138
  version: '3.13'
139
+ - - "<"
140
+ - !ruby/object:Gem::Version
141
+ version: '5'
110
142
  - !ruby/object:Gem::Dependency
111
143
  name: rspec-its
112
144
  requirement: !ruby/object:Gem::Requirement
113
145
  requirements:
114
146
  - - "~>"
115
147
  - !ruby/object:Gem::Version
116
- version: 1.3.0
148
+ version: '2.0'
117
149
  type: :development
118
150
  prerelease: false
119
151
  version_requirements: !ruby/object:Gem::Requirement
120
152
  requirements:
121
153
  - - "~>"
122
154
  - !ruby/object:Gem::Version
123
- version: 1.3.0
155
+ version: '2.0'
124
156
  - !ruby/object:Gem::Dependency
125
157
  name: rubocop
126
158
  requirement: !ruby/object:Gem::Requirement
@@ -278,14 +310,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
278
310
  requirements:
279
311
  - - ">="
280
312
  - !ruby/object:Gem::Version
281
- version: '3.1'
313
+ version: '3.2'
282
314
  required_rubygems_version: !ruby/object:Gem::Requirement
283
315
  requirements:
284
316
  - - ">="
285
317
  - !ruby/object:Gem::Version
286
318
  version: '0'
287
319
  requirements: []
288
- rubygems_version: 3.6.7
320
+ rubygems_version: 4.0.3
289
321
  specification_version: 4
290
322
  summary: Generate equivalent source for parser gem AST nodes
291
323
  test_files: []