unparser 0.4.7 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -9
  3. data/bin/unparser +2 -2
  4. data/lib/unparser/abstract_type.rb +121 -0
  5. data/lib/unparser/adamantium/method_builder.rb +111 -0
  6. data/lib/unparser/adamantium.rb +150 -0
  7. data/lib/unparser/anima/attribute.rb +59 -0
  8. data/lib/unparser/anima/error.rb +23 -0
  9. data/lib/unparser/anima.rb +184 -0
  10. data/lib/unparser/ast/local_variable_scope.rb +6 -76
  11. data/lib/unparser/ast.rb +1 -3
  12. data/lib/unparser/buffer.rb +14 -25
  13. data/lib/unparser/cli.rb +85 -77
  14. data/lib/unparser/{cli/color.rb → color.rb} +4 -14
  15. data/lib/unparser/comments.rb +0 -26
  16. data/lib/unparser/concord.rb +114 -0
  17. data/lib/unparser/constants.rb +4 -53
  18. data/lib/unparser/diff.rb +98 -0
  19. data/lib/unparser/dsl.rb +0 -32
  20. data/lib/unparser/either.rb +153 -0
  21. data/lib/unparser/emitter/alias.rb +2 -8
  22. data/lib/unparser/emitter/args.rb +45 -0
  23. data/lib/unparser/emitter/argument.rb +13 -169
  24. data/lib/unparser/emitter/array.rb +27 -0
  25. data/lib/unparser/emitter/array_pattern.rb +29 -0
  26. data/lib/unparser/emitter/assignment.rb +36 -127
  27. data/lib/unparser/emitter/begin.rb +9 -84
  28. data/lib/unparser/emitter/binary.rb +7 -20
  29. data/lib/unparser/emitter/block.rb +57 -41
  30. data/lib/unparser/emitter/case.rb +6 -48
  31. data/lib/unparser/emitter/case_guard.rb +27 -0
  32. data/lib/unparser/emitter/case_match.rb +40 -0
  33. data/lib/unparser/emitter/cbase.rb +1 -3
  34. data/lib/unparser/emitter/class.rb +6 -26
  35. data/lib/unparser/emitter/const_pattern.rb +24 -0
  36. data/lib/unparser/emitter/def.rb +7 -51
  37. data/lib/unparser/emitter/defined.rb +2 -12
  38. data/lib/unparser/emitter/dstr.rb +22 -0
  39. data/lib/unparser/emitter/dsym.rb +41 -0
  40. data/lib/unparser/emitter/find_pattern.rb +18 -0
  41. data/lib/unparser/emitter/flipflop.rb +11 -10
  42. data/lib/unparser/emitter/float.rb +29 -0
  43. data/lib/unparser/emitter/flow_modifier.rb +15 -53
  44. data/lib/unparser/emitter/for.rb +5 -19
  45. data/lib/unparser/emitter/hash.rb +36 -0
  46. data/lib/unparser/emitter/hash_pattern.rb +67 -0
  47. data/lib/unparser/emitter/hookexe.rb +5 -11
  48. data/lib/unparser/emitter/if.rb +15 -71
  49. data/lib/unparser/emitter/in_match.rb +21 -0
  50. data/lib/unparser/emitter/in_pattern.rb +36 -0
  51. data/lib/unparser/emitter/index.rb +22 -89
  52. data/lib/unparser/emitter/kwargs.rb +13 -0
  53. data/lib/unparser/emitter/kwbegin.rb +31 -0
  54. data/lib/unparser/emitter/lambda.rb +0 -8
  55. data/lib/unparser/emitter/masgn.rb +20 -0
  56. data/lib/unparser/emitter/match.rb +3 -17
  57. data/lib/unparser/emitter/match_alt.rb +23 -0
  58. data/lib/unparser/emitter/match_as.rb +21 -0
  59. data/lib/unparser/emitter/match_pattern.rb +30 -0
  60. data/lib/unparser/emitter/match_pattern_p.rb +20 -0
  61. data/lib/unparser/emitter/match_rest.rb +33 -0
  62. data/lib/unparser/emitter/match_var.rb +19 -0
  63. data/lib/unparser/emitter/mlhs.rb +40 -0
  64. data/lib/unparser/emitter/module.rb +3 -9
  65. data/lib/unparser/emitter/op_assign.rb +14 -29
  66. data/lib/unparser/emitter/pair.rb +33 -0
  67. data/lib/unparser/emitter/pin.rb +19 -0
  68. data/lib/unparser/emitter/primitive.rb +93 -0
  69. data/lib/unparser/emitter/range.rb +35 -0
  70. data/lib/unparser/emitter/regexp.rb +35 -0
  71. data/lib/unparser/emitter/repetition.rb +17 -57
  72. data/lib/unparser/emitter/rescue.rb +1 -97
  73. data/lib/unparser/emitter/root.rb +17 -1
  74. data/lib/unparser/emitter/send.rb +10 -219
  75. data/lib/unparser/emitter/simple.rb +33 -0
  76. data/lib/unparser/emitter/splat.rb +13 -19
  77. data/lib/unparser/emitter/super.rb +1 -29
  78. data/lib/unparser/emitter/undef.rb +1 -9
  79. data/lib/unparser/emitter/variable.rb +1 -31
  80. data/lib/unparser/emitter/xstr.rb +72 -0
  81. data/lib/unparser/emitter/yield.rb +1 -9
  82. data/lib/unparser/emitter.rb +24 -425
  83. data/lib/unparser/equalizer.rb +98 -0
  84. data/lib/unparser/generation.rb +252 -0
  85. data/lib/unparser/node_details/send.rb +65 -0
  86. data/lib/unparser/node_details.rb +21 -0
  87. data/lib/unparser/node_helpers.rb +48 -6
  88. data/lib/unparser/validation.rb +172 -0
  89. data/lib/unparser/writer/binary.rb +99 -0
  90. data/lib/unparser/writer/dynamic_string.rb +211 -0
  91. data/lib/unparser/writer/resbody.rb +40 -0
  92. data/lib/unparser/writer/rescue.rb +43 -0
  93. data/lib/unparser/{emitter → writer}/send/attribute_assignment.rb +11 -26
  94. data/lib/unparser/writer/send/binary.rb +27 -0
  95. data/lib/unparser/writer/send/conditional.rb +25 -0
  96. data/lib/unparser/writer/send/regular.rb +33 -0
  97. data/lib/unparser/{emitter → writer}/send/unary.rb +10 -17
  98. data/lib/unparser/writer/send.rb +115 -0
  99. data/lib/unparser/writer.rb +15 -0
  100. data/lib/unparser.rb +161 -77
  101. metadata +100 -157
  102. data/.circleci/config.yml +0 -49
  103. data/.gitignore +0 -37
  104. data/.rspec +0 -4
  105. data/.rubocop.yml +0 -9
  106. data/Changelog.md +0 -156
  107. data/Gemfile +0 -9
  108. data/Gemfile.lock +0 -181
  109. data/LICENSE +0 -20
  110. data/Rakefile +0 -22
  111. data/config/devtools.yml +0 -2
  112. data/config/flay.yml +0 -3
  113. data/config/flog.yml +0 -2
  114. data/config/mutant.yml +0 -6
  115. data/config/reek.yml +0 -98
  116. data/config/rubocop.yml +0 -122
  117. data/config/yardstick.yml +0 -2
  118. data/lib/unparser/cli/differ.rb +0 -152
  119. data/lib/unparser/cli/source.rb +0 -267
  120. data/lib/unparser/emitter/empty.rb +0 -23
  121. data/lib/unparser/emitter/ensure.rb +0 -37
  122. data/lib/unparser/emitter/literal/array.rb +0 -29
  123. data/lib/unparser/emitter/literal/dynamic.rb +0 -53
  124. data/lib/unparser/emitter/literal/dynamic_body.rb +0 -132
  125. data/lib/unparser/emitter/literal/execute_string.rb +0 -38
  126. data/lib/unparser/emitter/literal/hash.rb +0 -156
  127. data/lib/unparser/emitter/literal/primitive.rb +0 -145
  128. data/lib/unparser/emitter/literal/range.rb +0 -36
  129. data/lib/unparser/emitter/literal/regexp.rb +0 -114
  130. data/lib/unparser/emitter/literal/singleton.rb +0 -26
  131. data/lib/unparser/emitter/literal.rb +0 -10
  132. data/lib/unparser/emitter/meta.rb +0 -16
  133. data/lib/unparser/emitter/redo.rb +0 -25
  134. data/lib/unparser/emitter/resbody.rb +0 -76
  135. data/lib/unparser/emitter/retry.rb +0 -25
  136. data/lib/unparser/emitter/send/binary.rb +0 -57
  137. data/lib/unparser/emitter/send/conditional.rb +0 -40
  138. data/lib/unparser/emitter/send/regular.rb +0 -40
  139. data/lib/unparser/preprocessor.rb +0 -159
  140. data/spec/integration/unparser/corpus_spec.rb +0 -111
  141. data/spec/integrations.yml +0 -92
  142. data/spec/spec_helper.rb +0 -20
  143. data/spec/unit/unparser/buffer/append_spec.rb +0 -24
  144. data/spec/unit/unparser/buffer/append_without_prefix_spec.rb +0 -23
  145. data/spec/unit/unparser/buffer/capture_content_spec.rb +0 -17
  146. data/spec/unit/unparser/buffer/content_spec.rb +0 -38
  147. data/spec/unit/unparser/buffer/fresh_line_spec.rb +0 -20
  148. data/spec/unit/unparser/buffer/indent_spec.rb +0 -20
  149. data/spec/unit/unparser/buffer/nl_spec.rb +0 -16
  150. data/spec/unit/unparser/buffer/unindent_spec.rb +0 -20
  151. data/spec/unit/unparser/comments/consume_spec.rb +0 -22
  152. data/spec/unit/unparser/comments/take_all_spec.rb +0 -19
  153. data/spec/unit/unparser/comments/take_before_spec.rb +0 -46
  154. data/spec/unit/unparser/comments/take_eol_comments_spec.rb +0 -32
  155. data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +0 -17
  156. data/spec/unit/unparser_spec.rb +0 -1849
  157. data/unparser.gemspec +0 -32
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Send
6
- # Emitter for "conditional" receiver&.selector(arguments...) case
7
- class Conditional < self
8
- include Terminated
9
-
10
- handle :csend
11
-
12
- private
13
-
14
- # Perform regular dispatch
15
- #
16
- # @return [undefined]
17
- #
18
- # @api private
19
- #
20
- def dispatch
21
- emit_receiver
22
- emit_selector
23
- emit_arguments
24
- end
25
-
26
- # Emit receiver
27
- #
28
- # @return [undefined]
29
- #
30
- # @api private
31
- #
32
- def emit_receiver
33
- visit(receiver)
34
- write(T_AMP, T_DOT)
35
- end
36
-
37
- end # Regular
38
- end # Send
39
- end # Emitter
40
- end # Unparser
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Send
6
- # Emitter for "regular" receiver.selector(arguments...) case
7
- class Regular < self
8
- include Terminated
9
-
10
- private
11
-
12
- # Perform regular dispatch
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- emit_receiver
20
- emit_selector
21
- emit_arguments
22
- end
23
-
24
- # Emit receiver
25
- #
26
- # @return [undefined]
27
- #
28
- # @api private
29
- #
30
- def emit_receiver
31
- return unless first_child
32
-
33
- visit(receiver)
34
- write(T_DOT)
35
- end
36
-
37
- end # Regular
38
- end # Send
39
- end # Emitter
40
- end # Unparser
@@ -1,159 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- # Preprocessor to normalize AST generated by parser
5
- class Preprocessor
6
- include Adamantium::Flat, NodeHelpers, AbstractType, Concord.new(:node, :parent_type), Procto.call(:result)
7
-
8
- # Return preprocessor result
9
- #
10
- # @return [Parser::AST::Node]
11
- #
12
- # @api private
13
- #
14
- abstract_method :result
15
-
16
- EMPTY = Parser::AST::Node.new(:empty)
17
-
18
- # Run preprocessor for node
19
- #
20
- # @param [Parser::AST::Node, nil] node
21
- #
22
- # @return [Parser::AST::Node, nil]
23
- #
24
- # @api private
25
- #
26
- def self.run(node, parent_type = nil)
27
- return EMPTY if node.nil?
28
-
29
- REGISTRY.fetch(node.type, [Noop]).reduce(node) do |current, processor|
30
- processor.call(current, parent_type)
31
- end
32
- end
33
-
34
- REGISTRY = Hash.new { |hash, key| hash[key] = [] }
35
-
36
- # Register preprocessor
37
- #
38
- # @param [Symbol] type
39
- #
40
- # @return [undefined]
41
- #
42
- # @api private
43
- #
44
- def self.register(type)
45
- REGISTRY[type] << self
46
- end
47
- private_class_method :register
48
-
49
- private
50
-
51
- # Visit node
52
- #
53
- # @param [Parser::AST::Node] child
54
- #
55
- # @return [undefined]
56
- #
57
- # @api private
58
- #
59
- def visit(child)
60
- self.class.run(child, node.type)
61
- end
62
-
63
- # Return children
64
- #
65
- # @return [Array<Parser::AST::Node>]
66
- #
67
- # @api private
68
- #
69
- def children
70
- node.children
71
- end
72
-
73
- # Return visited children
74
- #
75
- # @return [Array<Parser::Ast::Node>]
76
- #
77
- # @api private
78
- #
79
- def visited_children
80
- children.map do |node|
81
- if node.is_a?(Parser::AST::Node)
82
- visit(node)
83
- else
84
- node
85
- end
86
- end
87
- end
88
-
89
- # Noop preprocessor that just passes node through.
90
- class Noop < self
91
-
92
- register :int
93
- register :str
94
-
95
- # Return preprocessor result
96
- #
97
- # @return [Parser::AST::Node]
98
- #
99
- # @api private
100
- #
101
- def result
102
- node.updated(nil, visited_children)
103
- end
104
-
105
- end # Noop
106
-
107
- # Preprocessor transforming numeric nodes with infinity as value to round trippable equivalent.
108
- class Infinity < self
109
-
110
- register :float
111
- register :int
112
-
113
- NEG_INFINITY = -(Float::INFINITY - 1)
114
-
115
- # Return preprocessor result
116
- #
117
- # @return [Parser::AST::Node]
118
- #
119
- # @api private
120
- #
121
- def result
122
- value = node.children.first
123
- case value
124
- when Float::INFINITY
125
- s(:const, s(:const, nil, :Float), :INFINITY)
126
- when NEG_INFINITY
127
- s(:send, s(:const, s(:const, nil, :Float), :INFINITY), :-@)
128
- else
129
- node
130
- end
131
- end
132
- end
133
-
134
- # Preprocessor for begin nodes. Removes begin nodes with one child.
135
- #
136
- # This reduces the amount of complex logic needed inside unparser to emit "nice" syntax with minimal
137
- # tokens.
138
- #
139
- class Begin < self
140
-
141
- register :begin
142
-
143
- # Return preprocessor result
144
- #
145
- # @return [Parser::AST::Node]
146
- #
147
- # @api private
148
- #
149
- def result
150
- if children.one? && !parent_type.equal?(:regexp)
151
- visit(children.first)
152
- else
153
- Noop.call(node, parent_type)
154
- end
155
- end
156
-
157
- end # Begin
158
- end # Preprocessor
159
- end # Unparser
@@ -1,111 +0,0 @@
1
- require 'spec_helper'
2
- describe 'Unparser on ruby corpus', mutant: false do
3
- ROOT = Pathname.new(__FILE__).parent.parent.parent.parent
4
-
5
- TMP = ROOT.join('tmp')
6
-
7
- class Project
8
- include Anima.new(:name, :repo_uri, :repo_ref, :exclude)
9
-
10
- # Perform verification via unparser cli
11
- #
12
- # @return [self]
13
- # if successful
14
- #
15
- # @raise [Exception]
16
- # otherwise
17
- #
18
- def verify
19
- checkout
20
- command = %W(unparser #{repo_path})
21
- exclude.each do |name|
22
- command.concat(%W(--ignore #{repo_path.join(name)}))
23
- end
24
- system(command) do
25
- raise "Verifing #{name} failed!"
26
- end
27
- self
28
- end
29
-
30
- # Checkout repository
31
- #
32
- # @return [self]
33
- #
34
- # @api private
35
- #
36
- def checkout
37
- TMP.mkdir unless TMP.directory?
38
- if repo_path.exist?
39
- Dir.chdir(repo_path) do
40
- system(%w(git pull origin master))
41
- system(%w(git clean -f -d -x))
42
- end
43
- else
44
- system(%W(git clone #{repo_uri} #{repo_path}))
45
- end
46
-
47
- Dir.chdir(repo_path) do
48
- system(%W(git checkout #{repo_ref}))
49
- system(%w(git reset --hard))
50
- system(%w(git clean -f -d -x))
51
- end
52
-
53
- self
54
- end
55
-
56
- private
57
-
58
- # Return repository path
59
- #
60
- # @return [Pathname]
61
- #
62
- # @api private
63
- #
64
- def repo_path
65
- TMP.join(name)
66
- end
67
-
68
- # Helper method to execute system commands
69
- #
70
- # @param [Array<String>] arguments
71
- #
72
- # @api private
73
- #
74
- def system(arguments)
75
- return if Kernel.system(*arguments)
76
-
77
- if block_given?
78
- yield
79
- else
80
- raise "System command #{arguments.inspect} failed!"
81
- end
82
- end
83
-
84
- LOADER = Morpher.build do
85
- s(:block,
86
- s(:guard, s(:primitive, Array)),
87
- s(:map,
88
- s(:block,
89
- s(:guard, s(:primitive, Hash)),
90
- s(:hash_transform,
91
- s(:key_symbolize, :repo_uri, s(:guard, s(:primitive, String))),
92
- s(:key_symbolize, :repo_ref, s(:guard, s(:primitive, String))),
93
- s(:key_symbolize, :name, s(:guard, s(:primitive, String))),
94
- s(:key_symbolize, :exclude, s(:map, s(:guard, s(:primitive, String))))),
95
- s(:load_attribute_hash,
96
- # NOTE: The domain param has no DSL currently!
97
- Morpher::Evaluator::Transformer::Domain::Param.new(
98
- Project,
99
- [:repo_uri, :repo_ref, :name, :exclude]
100
- )))))
101
- end
102
-
103
- ALL = LOADER.call(YAML.load_file(ROOT.join('spec', 'integrations.yml')))
104
- end
105
-
106
- Project::ALL.each do |project|
107
- specify "unparsing #{project.name}" do
108
- project.verify
109
- end
110
- end
111
- end
@@ -1,92 +0,0 @@
1
- ---
2
- - name: anima
3
- repo_uri: 'https://github.com/mbj/anima.git'
4
- repo_ref: 'origin/master'
5
- exclude: []
6
- - name: mutant
7
- repo_uri: 'https://github.com/mbj/mutant.git'
8
- repo_ref: 'origin/master'
9
- exclude: []
10
- - name: yaks
11
- repo_uri: 'https://github.com/plexus/yaks.git'
12
- repo_ref: 'origin/master'
13
- exclude: []
14
- - name: chassis
15
- repo_uri: 'https://github.com/ahawkins/chassis.git'
16
- repo_ref: 'origin/master'
17
- exclude: []
18
- - name: rubyspec
19
- repo_uri: 'https://github.com/ruby/spec.git'
20
- # Revision of rubyspec on the last CI build of unparser that passed
21
- repo_ref: 'origin/master'
22
- exclude:
23
- - command_line/fixtures/bad_syntax.rb
24
- - core/array/pack/shared/float.rb
25
- - core/array/pack/shared/integer.rb
26
- - core/array/pack/shared/string.rb
27
- - core/array/pack/{b,c,h,m}_spec.rb
28
- - core/array/pack/{u,w}_spec.rb
29
- - core/encoding/compatible_spec.rb
30
- - core/encoding/converter/convert_spec.rb
31
- - core/encoding/converter/last_error_spec.rb
32
- - core/encoding/converter/primitive_convert_spec.rb
33
- - core/encoding/converter/primitive_errinfo_spec.rb
34
- - core/encoding/converter/putback_spec.rb
35
- - core/encoding/fixtures/classes.rb
36
- - core/encoding/invalid_byte_sequence_error/error_bytes_spec.rb
37
- - core/encoding/invalid_byte_sequence_error/incomplete_input_spec.rb
38
- - core/encoding/invalid_byte_sequence_error/readagain_bytes_spec.rb
39
- - core/encoding/replicate_spec.rb
40
- - core/env/element_reference_spec.rb
41
- - core/io/readpartial_spec.rb
42
- - core/io/shared/gets_ascii.rb
43
- - core/kernel/shared/sprintf_encoding.rb
44
- - core/marshal/dump_spec.rb
45
- - core/marshal/fixtures/marshal_data.rb
46
- - core/marshal/shared/load.rb
47
- - core/random/bytes_spec.rb
48
- - core/regexp/shared/new.rb
49
- - core/regexp/shared/new_ascii.rb
50
- - core/regexp/shared/new_ascii_8bit.rb
51
- - core/regexp/shared/quote.rb
52
- - core/string/byteslice_spec.rb
53
- - core/string/casecmp_spec.rb
54
- - core/string/codepoints_spec.rb
55
- - core/string/count_spec.rb
56
- - core/string/encode_spec.rb
57
- - core/string/inspect_spec.rb
58
- - core/string/shared/codepoints.rb
59
- - core/string/shared/each_codepoint_without_block.rb
60
- - core/string/shared/eql.rb
61
- - core/string/shared/succ.rb
62
- - core/string/shared/to_sym.rb
63
- - core/string/squeeze_spec.rb
64
- - core/string/unpack/shared/float.rb
65
- - core/string/unpack/shared/integer.rb
66
- - core/string/unpack/{b,c,h,m}_spec.rb
67
- - core/string/unpack/{u,w}_spec.rb
68
- - core/symbol/casecmp_spec.rb
69
- - core/time/_dump_spec.rb
70
- - core/time/_load_spec.rb
71
- - language/fixtures/binary_symbol.rb
72
- - language/fixtures/squiggly_heredoc.rb
73
- - language/for_spec.rb
74
- - language/regexp/encoding_spec.rb
75
- - language/regexp/escapes_spec.rb
76
- - language/source_encoding_spec.rb
77
- - language/string_spec.rb
78
- - library/base64/decode64_spec.rb
79
- - library/digest/md5/shared/constants.rb
80
- - library/digest/md5/shared/sample.rb
81
- - library/digest/sha1/shared/constants.rb
82
- - library/digest/sha256/shared/constants.rb
83
- - library/digest/sha384/shared/constants.rb
84
- - library/digest/sha512/shared/constants.rb
85
- - library/openssl/shared/constants.rb
86
- - library/socket/basicsocket/recv_spec.rb
87
- - library/socket/socket/gethostbyname_spec.rb
88
- - library/stringscanner/getch_spec.rb
89
- - library/stringscanner/shared/get_byte.rb
90
- - library/zlib/inflate/set_dictionary_spec.rb
91
- - optional/capi/integer_spec.rb
92
- - security/cve_2010_1330_spec.rb
data/spec/spec_helper.rb DELETED
@@ -1,20 +0,0 @@
1
- require 'yaml'
2
- require 'pathname'
3
- require 'unparser'
4
- require 'anima'
5
- require 'morpher'
6
- require 'devtools/spec_helper'
7
-
8
- require 'parser/current'
9
-
10
- module SpecHelper
11
- def s(type, *children)
12
- Parser::AST::Node.new(type, children)
13
- end
14
- end
15
-
16
- RSpec.configure do |config|
17
- config.include(SpecHelper)
18
- config.extend(SpecHelper)
19
- config.raise_errors_for_deprecations!
20
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#append' do
4
- subject { object.append(string) }
5
-
6
- let(:object) { described_class.new }
7
- let(:string) { 'foo' }
8
-
9
- specify do
10
- expect { subject }.to change { object.content }.from('').to('foo')
11
- end
12
-
13
- # Yeah duplicate, mutant will be improved ;)
14
- it 'should prefix with indentation if line is empty' do
15
- object.append('foo')
16
- object.nl
17
- object.indent
18
- object.append('bar')
19
- object.append('baz')
20
- expect(object.content).to eql("foo\n barbaz")
21
- end
22
-
23
- it_should_behave_like 'a command method'
24
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#append_without_prefix' do
4
- subject { object.append_without_prefix(string) }
5
-
6
- let(:object) { described_class.new }
7
- let(:string) { 'foo' }
8
-
9
- specify do
10
- expect { subject }.to change { object.content }.from('').to('foo')
11
- end
12
-
13
- it 'should not prefix with indentation' do
14
- object.append_without_prefix('foo')
15
- object.nl
16
- object.indent
17
- object.append_without_prefix('bar')
18
- object.append_without_prefix('baz')
19
- expect(object.content).to eql("foo\nbarbaz")
20
- end
21
-
22
- it_should_behave_like 'a command method'
23
- end
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#capture_content' do
4
-
5
- let(:object) { described_class.new }
6
-
7
- it 'should capture only the content appended within the block' do
8
- object.append('foo')
9
- object.nl
10
- object.indent
11
- captured = object.capture_content do
12
- object.append('bar')
13
- object.nl
14
- end
15
- expect(captured).to eql(" bar\n")
16
- end
17
- end
@@ -1,38 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#content' do
4
- subject { object.content }
5
-
6
- let(:object) { described_class.new }
7
-
8
- shared_examples_for 'buffer content' do
9
- it 'contains expected content' do
10
- should eql(expected_content)
11
- end
12
-
13
- it { should be_frozen }
14
-
15
- it 'returns fresh string copies' do
16
- first = object.content
17
- second = object.content
18
- expect(first).to eql(second)
19
- expect(first).not_to be(second)
20
- end
21
- end
22
-
23
- context 'with empty buffer' do
24
- let(:expected_content) { '' }
25
-
26
- it_should_behave_like 'buffer content'
27
- end
28
-
29
- context 'with filled buffer' do
30
- before do
31
- object.append('foo')
32
- end
33
-
34
- let(:expected_content) { 'foo' }
35
-
36
- it_behaves_like 'buffer content'
37
- end
38
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#fresh_line?' do
4
- let(:object) { described_class.new }
5
-
6
- it 'should return true while buffer is empty' do
7
- expect(object.fresh_line?).to eql(true)
8
- end
9
-
10
- it 'should return false after content has been appended' do
11
- object.append('foo')
12
- expect(object.fresh_line?).to eql(false)
13
- end
14
-
15
- it 'should return true after a nl has been appended' do
16
- object.append('foo')
17
- object.nl
18
- expect(object.fresh_line?).to eql(true)
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#indent' do
4
- let(:object) { described_class.new }
5
-
6
- subject { object.indent }
7
-
8
- it 'should indent with two spaces' do
9
- object.append('foo')
10
- object.nl
11
- object.indent
12
- object.append('bar')
13
- object.nl
14
- object.indent
15
- object.append('baz')
16
- expect(object.content).to eql("foo\n bar\n baz")
17
- end
18
-
19
- it_should_behave_like 'a command method'
20
- end
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#nl' do
4
- let(:object) { described_class.new }
5
-
6
- subject { object.nl }
7
-
8
- it 'writes a newline' do
9
- object.append('foo')
10
- subject
11
- object.append('bar')
12
- expect(object.content).to eql("foo\nbar")
13
- end
14
-
15
- it_should_behave_like 'a command method'
16
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Buffer, '#unindent' do
4
- let(:object) { described_class.new }
5
-
6
- subject { object.unindent }
7
-
8
- it 'unindents two chars' do
9
- object.append('foo')
10
- object.nl
11
- object.indent
12
- object.append('bar')
13
- object.nl
14
- object.unindent
15
- object.append('baz')
16
- expect(object.content).to eql("foo\n bar\nbaz")
17
- end
18
-
19
- it_should_behave_like 'a command method'
20
- end
@@ -1,22 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Comments, '#consume' do
4
-
5
- let(:ast_and_comments) do
6
- Unparser.parse_with_comments(<<~'RUBY')
7
- def hi # EOL 1
8
- end # EOL 2
9
- RUBY
10
- end
11
- let(:ast) { ast_and_comments[0] }
12
- let(:comments) { ast_and_comments[1] }
13
- let(:object) { described_class.new(comments) }
14
-
15
- it 'should cause further EOL comments to be returned' do
16
- expect(object.take_eol_comments).to eql([])
17
- object.consume(ast, :name)
18
- expect(object.take_eol_comments).to eql([comments[0]])
19
- object.consume(ast, :end)
20
- expect(object.take_eol_comments).to eql([comments[1]])
21
- end
22
- end
@@ -1,19 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Unparser::Comments, '#take_all' do
4
-
5
- let(:ast_and_comments) do
6
- Unparser.parse_with_comments(<<~'RUBY')
7
- def hi # EOL 1
8
- end # EOL 2
9
- RUBY
10
- end
11
- let(:ast) { ast_and_comments[0] }
12
- let(:comments) { ast_and_comments[1] }
13
- let(:object) { described_class.new(comments) }
14
-
15
- it 'should take all comments' do
16
- expect(object.take_all).to eql(comments)
17
- expect(object.take_all).to eql([])
18
- end
19
- end