synvert-core 0.2.0 → 0.3.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/CHANGELOG.md +6 -3
 - data/lib/synvert/core/node_ext.rb +58 -19
 - data/lib/synvert/core/rewriter/condition.rb +3 -3
 - data/lib/synvert/core/rewriter/instance.rb +17 -4
 - data/lib/synvert/core/rewriter/scope.rb +2 -2
 - data/lib/synvert/core/version.rb +1 -1
 - data/spec/synvert/core/node_ext_spec.rb +62 -18
 - data/spec/synvert/core/rewriter/condition_spec.rb +56 -71
 - data/spec/synvert/core/rewriter/instance_spec.rb +24 -0
 - data/spec/synvert/core/rewriter/scope_spec.rb +3 -2
 - data/spec/synvert/core/rewriter_spec.rb +4 -4
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 8ee7de00fd1f401d3d4ea506c941871da5714229
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 406b2f2ecdfdb8b837ad0e8839c5e37b1c9d821f
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: d1db8ef41e1b179c38df52c22091418183e40b879921b462bc47d9f9821a47cb4d4823983bb54024624717cbcf39bfa5b4a86575c4cd69a6ae9b179c7eb1bab6
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: f394394861d482865963fccd5024a340ddabf9e43077a0467a79ef9de77285348905e09d70f5e334d1e1ae759737dfd709bb5c49a955ff7b331eaacb13082482
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,12 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # CHANGELOG
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            ## 0.3.0
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            * Rename node.source(instance) to node.to_source
         
     | 
| 
      
 6 
     | 
    
         
            +
            * Add has_key? and hash_value helper methods for hash node
         
     | 
| 
      
 7 
     | 
    
         
            +
            * Fix Instance#check_conflict_actions
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       3 
9 
     | 
    
         
             
            ## 0.2.0
         
     | 
| 
       4 
10 
     | 
    
         | 
| 
       5 
11 
     | 
    
         
             
            * Add remove_file dsl
         
     | 
| 
       6 
12 
     | 
    
         
             
            * Add warn dsl
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            ## 0.1.1
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
13 
     | 
    
         
             
            * Return empty array if no available rewriters
         
     | 
| 
       11 
14 
     | 
    
         | 
| 
       12 
15 
     | 
    
         
             
            ## 0.1.0
         
     | 
| 
         @@ -119,6 +119,33 @@ class Parser::AST::Node 
     | 
|
| 
       119 
119 
     | 
    
         
             
                end
         
     | 
| 
       120 
120 
     | 
    
         
             
              end
         
     | 
| 
       121 
121 
     | 
    
         | 
| 
      
 122 
     | 
    
         
            +
              # Test if hash node contains specified key.
         
     | 
| 
      
 123 
     | 
    
         
            +
              #
         
     | 
| 
      
 124 
     | 
    
         
            +
              # @param [Object] key value.
         
     | 
| 
      
 125 
     | 
    
         
            +
              # @return [Boolean] true if specified key exists.
         
     | 
| 
      
 126 
     | 
    
         
            +
              # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
         
     | 
| 
      
 127 
     | 
    
         
            +
              def has_key?(key)
         
     | 
| 
      
 128 
     | 
    
         
            +
                if :hash == self.type
         
     | 
| 
      
 129 
     | 
    
         
            +
                  self.children.any? { |pair_node| pair_node.key.to_value == key }
         
     | 
| 
      
 130 
     | 
    
         
            +
                else
         
     | 
| 
      
 131 
     | 
    
         
            +
                  raise Synvert::Core::MethodNotSupported.new "has_key? is not handled for #{self.inspect}"
         
     | 
| 
      
 132 
     | 
    
         
            +
                end
         
     | 
| 
      
 133 
     | 
    
         
            +
              end
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
              # Get hash value node according to specified key.
         
     | 
| 
      
 136 
     | 
    
         
            +
              #
         
     | 
| 
      
 137 
     | 
    
         
            +
              # @param [Object] key value.
         
     | 
| 
      
 138 
     | 
    
         
            +
              # @return [Parser::AST::Node] value node.
         
     | 
| 
      
 139 
     | 
    
         
            +
              # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
         
     | 
| 
      
 140 
     | 
    
         
            +
              def hash_value(key)
         
     | 
| 
      
 141 
     | 
    
         
            +
                if :hash == self.type
         
     | 
| 
      
 142 
     | 
    
         
            +
                  value_node = self.children.find { |pair_node| pair_node.key.to_value == key }
         
     | 
| 
      
 143 
     | 
    
         
            +
                  value_node ? value_node.value : nil
         
     | 
| 
      
 144 
     | 
    
         
            +
                else
         
     | 
| 
      
 145 
     | 
    
         
            +
                  raise Synvert::Core::MethodNotSupported.new "has_key? is not handled for #{self.inspect}"
         
     | 
| 
      
 146 
     | 
    
         
            +
                end
         
     | 
| 
      
 147 
     | 
    
         
            +
              end
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
       122 
149 
     | 
    
         
             
              # Get key node of hash :pair node.
         
     | 
| 
       123 
150 
     | 
    
         
             
              #
         
     | 
| 
       124 
151 
     | 
    
         
             
              # @return [Parser::AST::Node] key node.
         
     | 
| 
         @@ -143,11 +170,26 @@ class Parser::AST::Node 
     | 
|
| 
       143 
170 
     | 
    
         
             
                end
         
     | 
| 
       144 
171 
     | 
    
         
             
              end
         
     | 
| 
       145 
172 
     | 
    
         | 
| 
      
 173 
     | 
    
         
            +
              # Return the exact value.
         
     | 
| 
      
 174 
     | 
    
         
            +
              #
         
     | 
| 
      
 175 
     | 
    
         
            +
              # @return [Object] exact value.
         
     | 
| 
      
 176 
     | 
    
         
            +
              # @raise [Synvert::Core::MethodNotSupported] if calls on other node.
         
     | 
| 
      
 177 
     | 
    
         
            +
              def to_value
         
     | 
| 
      
 178 
     | 
    
         
            +
                case self.type
         
     | 
| 
      
 179 
     | 
    
         
            +
                when :str, :sym
         
     | 
| 
      
 180 
     | 
    
         
            +
                  self.children.last
         
     | 
| 
      
 181 
     | 
    
         
            +
                when :array
         
     | 
| 
      
 182 
     | 
    
         
            +
                  self.children.map(&:to_value)
         
     | 
| 
      
 183 
     | 
    
         
            +
                else
         
     | 
| 
      
 184 
     | 
    
         
            +
                  raise Synvert::Core::MethodNotSupported.new "to_value is not handled for #{self.inspect}"
         
     | 
| 
      
 185 
     | 
    
         
            +
                end
         
     | 
| 
      
 186 
     | 
    
         
            +
              end
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
       146 
188 
     | 
    
         
             
              # Get the source code of current node.
         
     | 
| 
       147 
189 
     | 
    
         
             
              #
         
     | 
| 
       148 
     | 
    
         
            -
              # @param instance [Synvert::Core::Rewriter::Instance]
         
     | 
| 
       149 
190 
     | 
    
         
             
              # @return [String] source code.
         
     | 
| 
       150 
     | 
    
         
            -
              def  
     | 
| 
      
 191 
     | 
    
         
            +
              def to_source
         
     | 
| 
      
 192 
     | 
    
         
            +
                instance = Synvert::Rewriter::Instance.current
         
     | 
| 
       151 
193 
     | 
    
         
             
                if self.loc.expression
         
     | 
| 
       152 
194 
     | 
    
         
             
                  instance.current_source[self.loc.expression.begin_pos...self.loc.expression.end_pos]
         
     | 
| 
       153 
195 
     | 
    
         
             
                end
         
     | 
| 
         @@ -175,23 +217,22 @@ class Parser::AST::Node 
     | 
|
| 
       175 
217 
     | 
    
         | 
| 
       176 
218 
     | 
    
         
             
              # Match current node with rules.
         
     | 
| 
       177 
219 
     | 
    
         
             
              #
         
     | 
| 
       178 
     | 
    
         
            -
              # @param instance [Synvert::Core::Rewriter::Instance] used to get crrent source code.
         
     | 
| 
       179 
220 
     | 
    
         
             
              # @param rules [Hash] rules to match.
         
     | 
| 
       180 
221 
     | 
    
         
             
              # @return true if matches.
         
     | 
| 
       181 
     | 
    
         
            -
              def match?( 
     | 
| 
      
 222 
     | 
    
         
            +
              def match?(rules)
         
     | 
| 
       182 
223 
     | 
    
         
             
                flat_hash(rules).keys.all? do |multi_keys|
         
     | 
| 
       183 
224 
     | 
    
         
             
                  if multi_keys.last == :any
         
     | 
| 
       184 
     | 
    
         
            -
                    actual_values = actual_value(self,  
     | 
| 
      
 225 
     | 
    
         
            +
                    actual_values = actual_value(self, multi_keys[0...-1])
         
     | 
| 
       185 
226 
     | 
    
         
             
                    expected = expected_value(rules, multi_keys)
         
     | 
| 
       186 
     | 
    
         
            -
                    actual_values.any? { |actual| match_value?( 
     | 
| 
      
 227 
     | 
    
         
            +
                    actual_values.any? { |actual| match_value?(actual, expected) }
         
     | 
| 
       187 
228 
     | 
    
         
             
                  elsif multi_keys.last == :not
         
     | 
| 
       188 
     | 
    
         
            -
                    actual = actual_value(self,  
     | 
| 
      
 229 
     | 
    
         
            +
                    actual = actual_value(self, multi_keys[0...-1])
         
     | 
| 
       189 
230 
     | 
    
         
             
                    expected = expected_value(rules, multi_keys)
         
     | 
| 
       190 
     | 
    
         
            -
                    !match_value?( 
     | 
| 
      
 231 
     | 
    
         
            +
                    !match_value?(actual, expected)
         
     | 
| 
       191 
232 
     | 
    
         
             
                  else
         
     | 
| 
       192 
     | 
    
         
            -
                    actual = actual_value(self,  
     | 
| 
      
 233 
     | 
    
         
            +
                    actual = actual_value(self, multi_keys)
         
     | 
| 
       193 
234 
     | 
    
         
             
                    expected = expected_value(rules, multi_keys)
         
     | 
| 
       194 
     | 
    
         
            -
                    match_value?( 
     | 
| 
      
 235 
     | 
    
         
            +
                    match_value?(actual, expected)
         
     | 
| 
       195 
236 
     | 
    
         
             
                  end
         
     | 
| 
       196 
237 
     | 
    
         
             
                end
         
     | 
| 
       197 
238 
     | 
    
         
             
              end
         
     | 
| 
         @@ -229,33 +270,32 @@ private 
     | 
|
| 
       229 
270 
     | 
    
         | 
| 
       230 
271 
     | 
    
         
             
              # Compare actual value with expected value.
         
     | 
| 
       231 
272 
     | 
    
         
             
              #
         
     | 
| 
       232 
     | 
    
         
            -
              # @param instance [Synvert::Core::Rewriter::Instance] used to get source code.
         
     | 
| 
       233 
273 
     | 
    
         
             
              # @param actual [Object] actual value.
         
     | 
| 
       234 
274 
     | 
    
         
             
              # @param expected [Object] expected value.
         
     | 
| 
       235 
275 
     | 
    
         
             
              # @return [Integer] -1, 0 or 1.
         
     | 
| 
       236 
276 
     | 
    
         
             
              # @raise [Synvert::Core::MethodNotSupported] if expected class is not supported.
         
     | 
| 
       237 
     | 
    
         
            -
              def match_value?( 
     | 
| 
      
 277 
     | 
    
         
            +
              def match_value?(actual, expected)
         
     | 
| 
       238 
278 
     | 
    
         
             
                case expected
         
     | 
| 
       239 
279 
     | 
    
         
             
                when Symbol
         
     | 
| 
       240 
280 
     | 
    
         
             
                  if Parser::AST::Node === actual
         
     | 
| 
       241 
     | 
    
         
            -
                    actual. 
     | 
| 
      
 281 
     | 
    
         
            +
                    actual.to_source == ":#{expected}"
         
     | 
| 
       242 
282 
     | 
    
         
             
                  else
         
     | 
| 
       243 
283 
     | 
    
         
             
                    actual.to_sym == expected
         
     | 
| 
       244 
284 
     | 
    
         
             
                  end
         
     | 
| 
       245 
285 
     | 
    
         
             
                when String
         
     | 
| 
       246 
286 
     | 
    
         
             
                  if Parser::AST::Node === actual
         
     | 
| 
       247 
     | 
    
         
            -
                    actual. 
     | 
| 
      
 287 
     | 
    
         
            +
                    actual.to_source == expected || actual.to_source[1...-1] == expected
         
     | 
| 
       248 
288 
     | 
    
         
             
                  else
         
     | 
| 
       249 
289 
     | 
    
         
             
                    actual.to_s == expected
         
     | 
| 
       250 
290 
     | 
    
         
             
                  end
         
     | 
| 
       251 
291 
     | 
    
         
             
                when Regexp
         
     | 
| 
       252 
292 
     | 
    
         
             
                  if Parser::AST::Node === actual
         
     | 
| 
       253 
     | 
    
         
            -
                    actual. 
     | 
| 
      
 293 
     | 
    
         
            +
                    actual.to_source =~ Regexp.new(expected.to_s, Regexp::MULTILINE)
         
     | 
| 
       254 
294 
     | 
    
         
             
                  else
         
     | 
| 
       255 
295 
     | 
    
         
             
                    actual.to_s =~ Regexp.new(expected.to_s, Regexp::MULTILINE)
         
     | 
| 
       256 
296 
     | 
    
         
             
                  end
         
     | 
| 
       257 
297 
     | 
    
         
             
                when Array
         
     | 
| 
       258 
     | 
    
         
            -
                  actual.zip(expected).all? { |a, e| match_value?( 
     | 
| 
      
 298 
     | 
    
         
            +
                  actual.zip(expected).all? { |a, e| match_value?(a, e) }
         
     | 
| 
       259 
299 
     | 
    
         
             
                when NilClass
         
     | 
| 
       260 
300 
     | 
    
         
             
                  actual.nil?
         
     | 
| 
       261 
301 
     | 
    
         
             
                when Numeric
         
     | 
| 
         @@ -297,13 +337,12 @@ private 
     | 
|
| 
       297 
337 
     | 
    
         
             
              # Get actual value from the node.
         
     | 
| 
       298 
338 
     | 
    
         
             
              #
         
     | 
| 
       299 
339 
     | 
    
         
             
              # @param node [Parser::AST::Node]
         
     | 
| 
       300 
     | 
    
         
            -
              # @param instance [Synvert::Core::Rewriter::Instance]
         
     | 
| 
       301 
340 
     | 
    
         
             
              # @param multi_keys [Array<Symbol>]
         
     | 
| 
       302 
341 
     | 
    
         
             
              # @return [Object] actual value.
         
     | 
| 
       303 
     | 
    
         
            -
              def actual_value(node,  
     | 
| 
      
 342 
     | 
    
         
            +
              def actual_value(node, multi_keys)
         
     | 
| 
       304 
343 
     | 
    
         
             
                multi_keys.inject(node) { |n, key|
         
     | 
| 
       305 
344 
     | 
    
         
             
                  if n
         
     | 
| 
       306 
     | 
    
         
            -
                    key == :source ? n.send(key 
     | 
| 
      
 345 
     | 
    
         
            +
                    key == :source ? n.send(key) : n.send(key)
         
     | 
| 
       307 
346 
     | 
    
         
             
                  end
         
     | 
| 
       308 
347 
     | 
    
         
             
                }
         
     | 
| 
       309 
348 
     | 
    
         
             
              end
         
     | 
| 
         @@ -27,7 +27,7 @@ module Synvert::Core 
     | 
|
| 
       27 
27 
     | 
    
         
             
                def match?
         
     | 
| 
       28 
28 
     | 
    
         
             
                  match = false
         
     | 
| 
       29 
29 
     | 
    
         
             
                  @instance.current_node.recursive_children do |child_node|
         
     | 
| 
       30 
     | 
    
         
            -
                    match = match || (child_node && child_node.match?(@ 
     | 
| 
      
 30 
     | 
    
         
            +
                    match = match || (child_node && child_node.match?(@rules))
         
     | 
| 
       31 
31 
     | 
    
         
             
                  end
         
     | 
| 
       32 
32 
     | 
    
         
             
                  match
         
     | 
| 
       33 
33 
     | 
    
         
             
                end
         
     | 
| 
         @@ -39,7 +39,7 @@ module Synvert::Core 
     | 
|
| 
       39 
39 
     | 
    
         
             
                def match?
         
     | 
| 
       40 
40 
     | 
    
         
             
                  match = false
         
     | 
| 
       41 
41 
     | 
    
         
             
                  @instance.current_node.recursive_children do |child_node|
         
     | 
| 
       42 
     | 
    
         
            -
                    match = match || (child_node && child_node.match?(@ 
     | 
| 
      
 42 
     | 
    
         
            +
                    match = match || (child_node && child_node.match?(@rules))
         
     | 
| 
       43 
43 
     | 
    
         
             
                  end
         
     | 
| 
       44 
44 
     | 
    
         
             
                  !match
         
     | 
| 
       45 
45 
     | 
    
         
             
                end
         
     | 
| 
         @@ -50,7 +50,7 @@ module Synvert::Core 
     | 
|
| 
       50 
50 
     | 
    
         
             
                # check if only have one child node and the child node matches rules.
         
     | 
| 
       51 
51 
     | 
    
         
             
                def match?
         
     | 
| 
       52 
52 
     | 
    
         
             
                  @instance.current_node.body.size == 1 &&
         
     | 
| 
       53 
     | 
    
         
            -
                    @instance.current_node.body.first.match?(@ 
     | 
| 
      
 53 
     | 
    
         
            +
                    @instance.current_node.body.first.match?(@rules)
         
     | 
| 
       54 
54 
     | 
    
         
             
                end
         
     | 
| 
       55 
55 
     | 
    
         
             
              end
         
     | 
| 
       56 
56 
     | 
    
         
             
            end
         
     | 
| 
         @@ -6,6 +6,10 @@ module Synvert::Core 
     | 
|
| 
       6 
6 
     | 
    
         
             
              #
         
     | 
| 
       7 
7 
     | 
    
         
             
              # One instance can contains one or many [Synvert::Core::Rewriter::Scope] and [Synvert::Rewriter::Condition].
         
     | 
| 
       8 
8 
     | 
    
         
             
              class Rewriter::Instance
         
     | 
| 
      
 9 
     | 
    
         
            +
                class <<self
         
     | 
| 
      
 10 
     | 
    
         
            +
                  attr_accessor :current
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       9 
13 
     | 
    
         
             
                # @!attribute [rw] current_node
         
     | 
| 
       10 
14 
     | 
    
         
             
                #   @return current parsing node
         
     | 
| 
       11 
15 
     | 
    
         
             
                # @!attribute [rw] current_source
         
     | 
| 
         @@ -32,6 +36,8 @@ module Synvert::Core 
     | 
|
| 
       32 
36 
     | 
    
         
             
                # It finds all files, for each file, it executes the block code, gets all rewrite actions,
         
     | 
| 
       33 
37 
     | 
    
         
             
                # and rewrite source code back to original file.
         
     | 
| 
       34 
38 
     | 
    
         
             
                def process
         
     | 
| 
      
 39 
     | 
    
         
            +
                  self.class.current = self
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
       35 
41 
     | 
    
         
             
                  parser = Parser::CurrentRuby.new
         
     | 
| 
       36 
42 
     | 
    
         
             
                  file_pattern = File.join(Configuration.instance.get(:path), @file_pattern)
         
     | 
| 
       37 
43 
     | 
    
         
             
                  Dir.glob(file_pattern).each do |file_path|
         
     | 
| 
         @@ -164,12 +170,19 @@ module Synvert::Core 
     | 
|
| 
       164 
170 
     | 
    
         
             
                # So if there is an overlap between two actions, it removes the conflict actions and operate them in the next loop.
         
     | 
| 
       165 
171 
     | 
    
         
             
                def check_conflict_actions
         
     | 
| 
       166 
172 
     | 
    
         
             
                  i = @actions.length - 1
         
     | 
| 
      
 173 
     | 
    
         
            +
                  j = i - 1
         
     | 
| 
       167 
174 
     | 
    
         
             
                  @conflict_actions = []
         
     | 
| 
       168 
     | 
    
         
            -
                   
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
      
 175 
     | 
    
         
            +
                  return if i < 0
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
                  begin_pos = @actions[i].begin_pos
         
     | 
| 
      
 178 
     | 
    
         
            +
                  while j > -1
         
     | 
| 
      
 179 
     | 
    
         
            +
                    if begin_pos <= @actions[j].end_pos
         
     | 
| 
      
 180 
     | 
    
         
            +
                      @conflict_actions << @actions.delete_at(j)
         
     | 
| 
      
 181 
     | 
    
         
            +
                    else
         
     | 
| 
      
 182 
     | 
    
         
            +
                      i = j
         
     | 
| 
      
 183 
     | 
    
         
            +
                      begin_pos = @actions[i].begin_pos
         
     | 
| 
       171 
184 
     | 
    
         
             
                    end
         
     | 
| 
       172 
     | 
    
         
            -
                     
     | 
| 
      
 185 
     | 
    
         
            +
                    j -= 1
         
     | 
| 
       173 
186 
     | 
    
         
             
                  end
         
     | 
| 
       174 
187 
     | 
    
         
             
                  @conflict_actions
         
     | 
| 
       175 
188 
     | 
    
         
             
                end
         
     | 
| 
         @@ -21,9 +21,9 @@ module Synvert::Core 
     | 
|
| 
       21 
21 
     | 
    
         
             
                  return unless current_node
         
     | 
| 
       22 
22 
     | 
    
         
             
                  process_with_node current_node do
         
     | 
| 
       23 
23 
     | 
    
         
             
                    matching_nodes = []
         
     | 
| 
       24 
     | 
    
         
            -
                    matching_nodes << current_node if current_node.match? @ 
     | 
| 
      
 24 
     | 
    
         
            +
                    matching_nodes << current_node if current_node.match? @rules
         
     | 
| 
       25 
25 
     | 
    
         
             
                    current_node.recursive_children do |child_node|
         
     | 
| 
       26 
     | 
    
         
            -
                      matching_nodes << child_node if child_node.match? @ 
     | 
| 
      
 26 
     | 
    
         
            +
                      matching_nodes << child_node if child_node.match? @rules
         
     | 
| 
       27 
27 
     | 
    
         
             
                    end
         
     | 
| 
       28 
28 
     | 
    
         
             
                    matching_nodes.each do |matching_node|
         
     | 
| 
       29 
29 
     | 
    
         
             
                      process_with_node matching_node do
         
     | 
    
        data/lib/synvert/core/version.rb
    CHANGED
    
    
| 
         @@ -6,8 +6,8 @@ describe Parser::AST::Node do 
     | 
|
| 
       6 
6 
     | 
    
         
             
                  node = parse('class Synvert; end')
         
     | 
| 
       7 
7 
     | 
    
         
             
                  expect(node.name).to eq parse('Synvert')
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                  node = parse('class Synvert:: 
     | 
| 
       10 
     | 
    
         
            -
                  expect(node.name).to eq parse('Synvert:: 
     | 
| 
      
 9 
     | 
    
         
            +
                  node = parse('class Synvert::Rewriter::Instance; end')
         
     | 
| 
      
 10 
     | 
    
         
            +
                  expect(node.name).to eq parse('Synvert::Rewriter::Instance')
         
     | 
| 
       11 
11 
     | 
    
         
             
                end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
                it 'gets for module node' do
         
     | 
| 
         @@ -50,7 +50,8 @@ describe Parser::AST::Node do 
     | 
|
| 
       50 
50 
     | 
    
         
             
                  source = 'RSpec.configure do |config|; end'
         
     | 
| 
       51 
51 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       52 
52 
     | 
    
         
             
                  instance = double(current_source: source)
         
     | 
| 
       53 
     | 
    
         
            -
                   
     | 
| 
      
 53 
     | 
    
         
            +
                  Synvert::Rewriter::Instance.current = instance
         
     | 
| 
      
 54 
     | 
    
         
            +
                  expect(node.arguments.map { |argument| argument.to_source }).to eq ['config']
         
     | 
| 
       54 
55 
     | 
    
         
             
                end
         
     | 
| 
       55 
56 
     | 
    
         | 
| 
       56 
57 
     | 
    
         
             
                it 'gets for defined? node' do
         
     | 
| 
         @@ -91,28 +92,52 @@ describe Parser::AST::Node do 
     | 
|
| 
       91 
92 
     | 
    
         
             
              describe "#keys" do
         
     | 
| 
       92 
93 
     | 
    
         
             
                it 'gets for hash node' do
         
     | 
| 
       93 
94 
     | 
    
         
             
                  node = parse("{:foo => :bar, 'foo' => 'bar'}")
         
     | 
| 
       94 
     | 
    
         
            -
                  expect(node.keys).to eq [ 
     | 
| 
      
 95 
     | 
    
         
            +
                  expect(node.keys).to eq [parse(':foo'), parse("'foo'")]
         
     | 
| 
       95 
96 
     | 
    
         
             
                end
         
     | 
| 
       96 
97 
     | 
    
         
             
              end
         
     | 
| 
       97 
98 
     | 
    
         | 
| 
       98 
99 
     | 
    
         
             
              describe "#values" do
         
     | 
| 
       99 
100 
     | 
    
         
             
                it 'gets for hash node' do
         
     | 
| 
       100 
101 
     | 
    
         
             
                  node = parse("{:foo => :bar, 'foo' => 'bar'}")
         
     | 
| 
       101 
     | 
    
         
            -
                  expect(node.values).to eq [ 
     | 
| 
      
 102 
     | 
    
         
            +
                  expect(node.values).to eq [parse(':bar'), parse("'bar'")]
         
     | 
| 
      
 103 
     | 
    
         
            +
                end
         
     | 
| 
      
 104 
     | 
    
         
            +
              end
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
              describe "#has_key?" do
         
     | 
| 
      
 107 
     | 
    
         
            +
                it "gets true if key exists" do
         
     | 
| 
      
 108 
     | 
    
         
            +
                  node = parse("{:foo => :bar}")
         
     | 
| 
      
 109 
     | 
    
         
            +
                  expect(node.has_key?(:foo)).to be_truthy
         
     | 
| 
      
 110 
     | 
    
         
            +
                end
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                it "gets false if key does not exist" do
         
     | 
| 
      
 113 
     | 
    
         
            +
                  node = parse("{:foo => :bar}")
         
     | 
| 
      
 114 
     | 
    
         
            +
                  expect(node.has_key?('foo')).to be_falsey
         
     | 
| 
      
 115 
     | 
    
         
            +
                end
         
     | 
| 
      
 116 
     | 
    
         
            +
              end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              describe "#hash_value" do
         
     | 
| 
      
 119 
     | 
    
         
            +
                it "gets value of specified key" do
         
     | 
| 
      
 120 
     | 
    
         
            +
                  node = parse("{:foo => :bar}")
         
     | 
| 
      
 121 
     | 
    
         
            +
                  expect(node.hash_value(:foo)).to eq parse(':bar')
         
     | 
| 
      
 122 
     | 
    
         
            +
                end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                it "gets nil if key does not exist" do
         
     | 
| 
      
 125 
     | 
    
         
            +
                  node = parse("{:foo => :bar}")
         
     | 
| 
      
 126 
     | 
    
         
            +
                  expect(node.hash_value(:bar)).to be_nil
         
     | 
| 
       102 
127 
     | 
    
         
             
                end
         
     | 
| 
       103 
128 
     | 
    
         
             
              end
         
     | 
| 
       104 
129 
     | 
    
         | 
| 
       105 
130 
     | 
    
         
             
              describe "#key" do
         
     | 
| 
       106 
131 
     | 
    
         
             
                it 'gets for pair node' do
         
     | 
| 
       107 
132 
     | 
    
         
             
                  node = parse("{:foo => 'bar'}").children[0]
         
     | 
| 
       108 
     | 
    
         
            -
                  expect(node.key).to eq  
     | 
| 
      
 133 
     | 
    
         
            +
                  expect(node.key).to eq parse(':foo')
         
     | 
| 
       109 
134 
     | 
    
         
             
                end
         
     | 
| 
       110 
135 
     | 
    
         
             
              end
         
     | 
| 
       111 
136 
     | 
    
         | 
| 
       112 
137 
     | 
    
         
             
              describe "#value" do
         
     | 
| 
       113 
138 
     | 
    
         
             
                it 'gets for hash node' do
         
     | 
| 
       114 
139 
     | 
    
         
             
                  node = parse("{:foo => 'bar'}").children[0]
         
     | 
| 
       115 
     | 
    
         
            -
                  expect(node.value).to eq  
     | 
| 
      
 140 
     | 
    
         
            +
                  expect(node.value).to eq parse("'bar'")
         
     | 
| 
       116 
141 
     | 
    
         
             
                end
         
     | 
| 
       117 
142 
     | 
    
         
             
              end
         
     | 
| 
       118 
143 
     | 
    
         | 
| 
         @@ -123,12 +148,30 @@ describe Parser::AST::Node do 
     | 
|
| 
       123 
148 
     | 
    
         
             
                end
         
     | 
| 
       124 
149 
     | 
    
         
             
              end
         
     | 
| 
       125 
150 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
              describe  
     | 
| 
      
 151 
     | 
    
         
            +
              describe "#to_value" do
         
     | 
| 
      
 152 
     | 
    
         
            +
                it 'gets for string' do
         
     | 
| 
      
 153 
     | 
    
         
            +
                  node = parse("'str'")
         
     | 
| 
      
 154 
     | 
    
         
            +
                  expect(node.to_value).to eq "str"
         
     | 
| 
      
 155 
     | 
    
         
            +
                end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
                it 'gets for symbol' do
         
     | 
| 
      
 158 
     | 
    
         
            +
                  node = parse(":str")
         
     | 
| 
      
 159 
     | 
    
         
            +
                  expect(node.to_value).to eq :str
         
     | 
| 
      
 160 
     | 
    
         
            +
                end
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
                it 'gets for array' do
         
     | 
| 
      
 163 
     | 
    
         
            +
                  node = parse("['str', :str]")
         
     | 
| 
      
 164 
     | 
    
         
            +
                  expect(node.to_value).to eq ['str', :str]
         
     | 
| 
      
 165 
     | 
    
         
            +
                end
         
     | 
| 
      
 166 
     | 
    
         
            +
              end
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
              describe '#to_source' do
         
     | 
| 
       127 
169 
     | 
    
         
             
                it 'gets for node' do
         
     | 
| 
       128 
170 
     | 
    
         
             
                  source = 'params[:user][:email]'
         
     | 
| 
       129 
171 
     | 
    
         
             
                  instance = double(current_source: source)
         
     | 
| 
      
 172 
     | 
    
         
            +
                  Synvert::Rewriter::Instance.current = instance
         
     | 
| 
       130 
173 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       131 
     | 
    
         
            -
                  expect(node. 
     | 
| 
      
 174 
     | 
    
         
            +
                  expect(node.to_source).to eq 'params[:user][:email]'
         
     | 
| 
       132 
175 
     | 
    
         
             
                end
         
     | 
| 
       133 
176 
     | 
    
         
             
              end
         
     | 
| 
       134 
177 
     | 
    
         | 
| 
         @@ -153,57 +196,58 @@ describe Parser::AST::Node do 
     | 
|
| 
       153 
196 
     | 
    
         | 
| 
       154 
197 
     | 
    
         
             
              describe '#match?' do
         
     | 
| 
       155 
198 
     | 
    
         
             
                let(:instance) {
         
     | 
| 
       156 
     | 
    
         
            -
                  rewriter = Synvert:: 
     | 
| 
       157 
     | 
    
         
            -
                  Synvert:: 
     | 
| 
      
 199 
     | 
    
         
            +
                  rewriter = Synvert::Rewriter.new('foobar')
         
     | 
| 
      
 200 
     | 
    
         
            +
                  Synvert::Rewriter::Instance.new(rewriter, 'file pattern')
         
     | 
| 
       158 
201 
     | 
    
         
             
                }
         
     | 
| 
      
 202 
     | 
    
         
            +
                before { Synvert::Rewriter::Instance.current = instance }
         
     | 
| 
       159 
203 
     | 
    
         | 
| 
       160 
204 
     | 
    
         
             
                it 'matches class name' do
         
     | 
| 
       161 
205 
     | 
    
         
             
                  source = 'class Synvert; end'
         
     | 
| 
       162 
206 
     | 
    
         
             
                  instance.current_source = source
         
     | 
| 
       163 
207 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       164 
     | 
    
         
            -
                  expect(node).to be_match( 
     | 
| 
      
 208 
     | 
    
         
            +
                  expect(node).to be_match(type: 'class', name: 'Synvert')
         
     | 
| 
       165 
209 
     | 
    
         
             
                end
         
     | 
| 
       166 
210 
     | 
    
         | 
| 
       167 
211 
     | 
    
         
             
                it 'matches message with regexp' do
         
     | 
| 
       168 
212 
     | 
    
         
             
                  source = 'User.find_by_login(login)'
         
     | 
| 
       169 
213 
     | 
    
         
             
                  instance.current_source = source
         
     | 
| 
       170 
214 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       171 
     | 
    
         
            -
                  expect(node).to be_match( 
     | 
| 
      
 215 
     | 
    
         
            +
                  expect(node).to be_match(type: 'send', message: /^find_by_/)
         
     | 
| 
       172 
216 
     | 
    
         
             
                end
         
     | 
| 
       173 
217 
     | 
    
         | 
| 
       174 
218 
     | 
    
         
             
                it 'matches arguments with symbol' do
         
     | 
| 
       175 
219 
     | 
    
         
             
                  source = 'params[:user]'
         
     | 
| 
       176 
220 
     | 
    
         
             
                  instance.current_source = source
         
     | 
| 
       177 
221 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       178 
     | 
    
         
            -
                  expect(node).to be_match( 
     | 
| 
      
 222 
     | 
    
         
            +
                  expect(node).to be_match(type: 'send', receiver: 'params', message: '[]', arguments: [:user])
         
     | 
| 
       179 
223 
     | 
    
         
             
                end
         
     | 
| 
       180 
224 
     | 
    
         | 
| 
       181 
225 
     | 
    
         
             
                it 'matches assign number' do
         
     | 
| 
       182 
226 
     | 
    
         
             
                  source = 'at_least(0)'
         
     | 
| 
       183 
227 
     | 
    
         
             
                  instance.current_source = source
         
     | 
| 
       184 
228 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       185 
     | 
    
         
            -
                  expect(node).to be_match( 
     | 
| 
      
 229 
     | 
    
         
            +
                  expect(node).to be_match(type: 'send', arguments: [0])
         
     | 
| 
       186 
230 
     | 
    
         
             
                end
         
     | 
| 
       187 
231 
     | 
    
         | 
| 
       188 
232 
     | 
    
         
             
                it 'matches arguments with string' do
         
     | 
| 
       189 
233 
     | 
    
         
             
                  source = 'params["user"]'
         
     | 
| 
       190 
234 
     | 
    
         
             
                  instance.current_source = source
         
     | 
| 
       191 
235 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       192 
     | 
    
         
            -
                  expect(node).to be_match( 
     | 
| 
      
 236 
     | 
    
         
            +
                  expect(node).to be_match(type: 'send', receiver: 'params', message: '[]', arguments: ['user'])
         
     | 
| 
       193 
237 
     | 
    
         
             
                end
         
     | 
| 
       194 
238 
     | 
    
         | 
| 
       195 
239 
     | 
    
         
             
                it 'matches arguments any' do
         
     | 
| 
       196 
240 
     | 
    
         
             
                  source = 'config.middleware.insert_after ActiveRecord::QueryCache, Lifo::Cache, page_cache: false'
         
     | 
| 
       197 
241 
     | 
    
         
             
                  instance.current_source = source
         
     | 
| 
       198 
242 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       199 
     | 
    
         
            -
                  expect(node).to be_match( 
     | 
| 
      
 243 
     | 
    
         
            +
                  expect(node).to be_match(type: 'send', arguments: {any: 'Lifo::Cache'})
         
     | 
| 
       200 
244 
     | 
    
         
             
                end
         
     | 
| 
       201 
245 
     | 
    
         | 
| 
       202 
246 
     | 
    
         
             
                it 'matches not' do
         
     | 
| 
       203 
247 
     | 
    
         
             
                  source = 'class Synvert; end'
         
     | 
| 
       204 
248 
     | 
    
         
             
                  instance.current_source = source
         
     | 
| 
       205 
249 
     | 
    
         
             
                  node = parse(source)
         
     | 
| 
       206 
     | 
    
         
            -
                  expect(node).not_to be_match( 
     | 
| 
      
 250 
     | 
    
         
            +
                  expect(node).not_to be_match(type: 'class', name: {not: 'Synvert'})
         
     | 
| 
       207 
251 
     | 
    
         
             
                end
         
     | 
| 
       208 
252 
     | 
    
         
             
              end
         
     | 
| 
       209 
253 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'spec_helper'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module Synvert::Core
         
     | 
| 
       4 
     | 
    
         
            -
              describe Rewriter:: 
     | 
| 
      
 4 
     | 
    
         
            +
              describe Rewriter::Condition do
         
     | 
| 
       5 
5 
     | 
    
         
             
                let(:source) {
         
     | 
| 
       6 
6 
     | 
    
         
             
                  """
         
     | 
| 
       7 
7 
     | 
    
         
             
                  RSpec.configure do |config|
         
     | 
| 
         @@ -12,94 +12,79 @@ module Synvert::Core 
     | 
|
| 
       12 
12 
     | 
    
         
             
                }
         
     | 
| 
       13 
13 
     | 
    
         
             
                let(:node) { Parser::CurrentRuby.parse(source) }
         
     | 
| 
       14 
14 
     | 
    
         
             
                let(:instance) { double(:current_node => node, :current_source => source) }
         
     | 
| 
      
 15 
     | 
    
         
            +
                before { Rewriter::Instance.current = instance }
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                describe  
     | 
| 
       17 
     | 
    
         
            -
                   
     | 
| 
       18 
     | 
    
         
            -
                     
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                       
     | 
| 
      
 17 
     | 
    
         
            +
                describe Rewriter::IfExistCondition do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  describe '#process' do
         
     | 
| 
      
 19 
     | 
    
         
            +
                    it 'call block if match anything' do
         
     | 
| 
      
 20 
     | 
    
         
            +
                      run = false
         
     | 
| 
      
 21 
     | 
    
         
            +
                      condition = Rewriter::IfExistCondition.new instance, type: 'send', message: 'include', arguments: ['EmailSpec::Helpers'] do
         
     | 
| 
      
 22 
     | 
    
         
            +
                        run = true
         
     | 
| 
      
 23 
     | 
    
         
            +
                      end
         
     | 
| 
      
 24 
     | 
    
         
            +
                      condition.process
         
     | 
| 
      
 25 
     | 
    
         
            +
                      expect(run).to be_truthy
         
     | 
| 
       21 
26 
     | 
    
         
             
                    end
         
     | 
| 
       22 
     | 
    
         
            -
                    condition.process
         
     | 
| 
       23 
     | 
    
         
            -
                    expect(run).to be_true
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
27 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
                    it 'not call block if not match anything' do
         
     | 
| 
      
 29 
     | 
    
         
            +
                      run = false
         
     | 
| 
      
 30 
     | 
    
         
            +
                      condition = Rewriter::IfExistCondition.new instance, type: 'send', message: 'include', arguments: ['FactoryGirl::SyntaxMethods'] do
         
     | 
| 
      
 31 
     | 
    
         
            +
                        run = true
         
     | 
| 
      
 32 
     | 
    
         
            +
                      end
         
     | 
| 
      
 33 
     | 
    
         
            +
                      condition.process
         
     | 
| 
      
 34 
     | 
    
         
            +
                      expect(run).to be_falsey
         
     | 
| 
       30 
35 
     | 
    
         
             
                    end
         
     | 
| 
       31 
     | 
    
         
            -
                    condition.process
         
     | 
| 
       32 
     | 
    
         
            -
                    expect(run).to be_false
         
     | 
| 
       33 
36 
     | 
    
         
             
                  end
         
     | 
| 
       34 
37 
     | 
    
         
             
                end
         
     | 
| 
       35 
     | 
    
         
            -
              end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
              describe Rewriter::UnlessExistCondition do
         
     | 
| 
       38 
     | 
    
         
            -
                let(:source) {
         
     | 
| 
       39 
     | 
    
         
            -
                  """
         
     | 
| 
       40 
     | 
    
         
            -
                  RSpec.configure do |config|
         
     | 
| 
       41 
     | 
    
         
            -
                    config.include EmailSpec::Helpers
         
     | 
| 
       42 
     | 
    
         
            -
                    config.include EmailSpec::Methods
         
     | 
| 
       43 
     | 
    
         
            -
                  end
         
     | 
| 
       44 
     | 
    
         
            -
                  """
         
     | 
| 
       45 
     | 
    
         
            -
                }
         
     | 
| 
       46 
     | 
    
         
            -
                let(:node) { Parser::CurrentRuby.parse(source) }
         
     | 
| 
       47 
     | 
    
         
            -
                let(:instance) { double(:current_node => node, :current_source => source) }
         
     | 
| 
       48 
38 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
                describe  
     | 
| 
       50 
     | 
    
         
            -
                   
     | 
| 
       51 
     | 
    
         
            -
                     
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
                       
     | 
| 
      
 39 
     | 
    
         
            +
                describe Rewriter::UnlessExistCondition do
         
     | 
| 
      
 40 
     | 
    
         
            +
                  describe '#process' do
         
     | 
| 
      
 41 
     | 
    
         
            +
                    it 'call block if match anything' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                      run = false
         
     | 
| 
      
 43 
     | 
    
         
            +
                      condition = Rewriter::UnlessExistCondition.new instance, type: 'send', message: 'include', arguments: ['FactoryGirl::Syntax::Methods'] do
         
     | 
| 
      
 44 
     | 
    
         
            +
                        run = true
         
     | 
| 
      
 45 
     | 
    
         
            +
                      end
         
     | 
| 
      
 46 
     | 
    
         
            +
                      condition.process
         
     | 
| 
      
 47 
     | 
    
         
            +
                      expect(run).to be_truthy
         
     | 
| 
       54 
48 
     | 
    
         
             
                    end
         
     | 
| 
       55 
     | 
    
         
            -
                    condition.process
         
     | 
| 
       56 
     | 
    
         
            -
                    expect(run).to be_true
         
     | 
| 
       57 
     | 
    
         
            -
                  end
         
     | 
| 
       58 
49 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 50 
     | 
    
         
            +
                    it 'not call block if not match anything' do
         
     | 
| 
      
 51 
     | 
    
         
            +
                      run = false
         
     | 
| 
      
 52 
     | 
    
         
            +
                      condition = Rewriter::UnlessExistCondition.new instance, type: 'send', message: 'include', arguments: ['EmailSpec::Helpers'] do
         
     | 
| 
      
 53 
     | 
    
         
            +
                        run = true
         
     | 
| 
      
 54 
     | 
    
         
            +
                      end
         
     | 
| 
      
 55 
     | 
    
         
            +
                      condition.process
         
     | 
| 
      
 56 
     | 
    
         
            +
                      expect(run).to be_falsey
         
     | 
| 
       63 
57 
     | 
    
         
             
                    end
         
     | 
| 
       64 
     | 
    
         
            -
                    condition.process
         
     | 
| 
       65 
     | 
    
         
            -
                    expect(run).to be_false
         
     | 
| 
       66 
58 
     | 
    
         
             
                  end
         
     | 
| 
       67 
59 
     | 
    
         
             
                end
         
     | 
| 
       68 
     | 
    
         
            -
              end
         
     | 
| 
       69 
60 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
             
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
                describe Rewriter::IfOnlyExistCondition do
         
     | 
| 
      
 62 
     | 
    
         
            +
                  describe '#process' do
         
     | 
| 
      
 63 
     | 
    
         
            +
                    it 'gets matching nodes' do
         
     | 
| 
      
 64 
     | 
    
         
            +
                      source = """
         
     | 
| 
      
 65 
     | 
    
         
            +
                        RSpec.configure do |config|
         
     | 
| 
      
 66 
     | 
    
         
            +
                          config.include EmailSpec::Helpers
         
     | 
| 
      
 67 
     | 
    
         
            +
                        end
         
     | 
| 
      
 68 
     | 
    
         
            +
                      """
         
     | 
| 
      
 69 
     | 
    
         
            +
                      node = Parser::CurrentRuby.parse(source)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      instance = double(:current_node => node, :current_source => source)
         
     | 
| 
      
 71 
     | 
    
         
            +
                      Rewriter::Instance.current = instance
         
     | 
| 
      
 72 
     | 
    
         
            +
                      run = false
         
     | 
| 
      
 73 
     | 
    
         
            +
                      condition = Rewriter::IfOnlyExistCondition.new instance, type: 'send', message: 'include', arguments: ['EmailSpec::Helpers'] do
         
     | 
| 
      
 74 
     | 
    
         
            +
                        run = true
         
     | 
| 
       76 
75 
     | 
    
         
             
                      end
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                    instance = double(:current_node => node, :current_source => source)
         
     | 
| 
       80 
     | 
    
         
            -
                    run = false
         
     | 
| 
       81 
     | 
    
         
            -
                    condition = Rewriter::IfOnlyExistCondition.new instance, type: 'send', message: 'include', arguments: ['EmailSpec::Helpers'] do
         
     | 
| 
       82 
     | 
    
         
            -
                      run = true
         
     | 
| 
      
 76 
     | 
    
         
            +
                      condition.process
         
     | 
| 
      
 77 
     | 
    
         
            +
                      expect(run).to be_truthy
         
     | 
| 
       83 
78 
     | 
    
         
             
                    end
         
     | 
| 
       84 
     | 
    
         
            -
                    condition.process
         
     | 
| 
       85 
     | 
    
         
            -
                    expect(run).to be_true
         
     | 
| 
       86 
     | 
    
         
            -
                  end
         
     | 
| 
       87 
79 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                       
     | 
| 
       91 
     | 
    
         
            -
                         
     | 
| 
       92 
     | 
    
         
            -
                        config.include EmailSpec::Methods
         
     | 
| 
      
 80 
     | 
    
         
            +
                    it 'not call block if does not match' do
         
     | 
| 
      
 81 
     | 
    
         
            +
                      run = false
         
     | 
| 
      
 82 
     | 
    
         
            +
                      condition = Rewriter::IfOnlyExistCondition.new instance, type: 'send', message: 'include', arguments: ['EmailSpec::Helpers'] do
         
     | 
| 
      
 83 
     | 
    
         
            +
                        run = true
         
     | 
| 
       93 
84 
     | 
    
         
             
                      end
         
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
                    instance = double(:current_node => node, :current_source => source)
         
     | 
| 
       97 
     | 
    
         
            -
                    run = false
         
     | 
| 
       98 
     | 
    
         
            -
                    condition = Rewriter::IfOnlyExistCondition.new instance, type: 'send', message: 'include', arguments: ['EmailSpec::Helpers'] do
         
     | 
| 
       99 
     | 
    
         
            -
                      run = true
         
     | 
| 
      
 85 
     | 
    
         
            +
                      condition.process
         
     | 
| 
      
 86 
     | 
    
         
            +
                      expect(run).to be_falsey
         
     | 
| 
       100 
87 
     | 
    
         
             
                    end
         
     | 
| 
       101 
     | 
    
         
            -
                    condition.process
         
     | 
| 
       102 
     | 
    
         
            -
                    expect(run).to be_false
         
     | 
| 
       103 
88 
     | 
    
         
             
                  end
         
     | 
| 
       104 
89 
     | 
    
         
             
                end
         
     | 
| 
       105 
90 
     | 
    
         
             
              end
         
     | 
| 
         @@ -166,6 +166,30 @@ end 
     | 
|
| 
       166 
166 
     | 
    
         
             
                    expect(File).to receive(:write).with('config/environments/production.rb', output)
         
     | 
| 
       167 
167 
     | 
    
         
             
                    instance.process
         
     | 
| 
       168 
168 
     | 
    
         
             
                  end
         
     | 
| 
      
 169 
     | 
    
         
            +
             
     | 
| 
      
 170 
     | 
    
         
            +
                  describe "#check_conflict_actions" do
         
     | 
| 
      
 171 
     | 
    
         
            +
                    it "has no conflict" do
         
     | 
| 
      
 172 
     | 
    
         
            +
                      action1 = double(begin_pos: 10, end_pos: 20)
         
     | 
| 
      
 173 
     | 
    
         
            +
                      action2 = double(begin_pos: 30, end_pos: 40)
         
     | 
| 
      
 174 
     | 
    
         
            +
                      action3 = double(begin_pos: 50, end_pos: 60)
         
     | 
| 
      
 175 
     | 
    
         
            +
                      instance = Rewriter::Instance.new rewriter, 'spec/spec_helper.rb'
         
     | 
| 
      
 176 
     | 
    
         
            +
                      instance.instance_variable_set :@actions, [action1, action2, action3]
         
     | 
| 
      
 177 
     | 
    
         
            +
                      instance.send(:check_conflict_actions)
         
     | 
| 
      
 178 
     | 
    
         
            +
                      expect(instance.instance_variable_get :@conflict_actions).to eq []
         
     | 
| 
      
 179 
     | 
    
         
            +
                      expect(instance.instance_variable_get :@actions).to eq [action1, action2, action3]
         
     | 
| 
      
 180 
     | 
    
         
            +
                    end
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
                    it "has no conflict" do
         
     | 
| 
      
 183 
     | 
    
         
            +
                      action1 = double(begin_pos: 30, end_pos: 40)
         
     | 
| 
      
 184 
     | 
    
         
            +
                      action2 = double(begin_pos: 50, end_pos: 60)
         
     | 
| 
      
 185 
     | 
    
         
            +
                      action3 = double(begin_pos: 10, end_pos: 20)
         
     | 
| 
      
 186 
     | 
    
         
            +
                      instance = Rewriter::Instance.new rewriter, 'spec/spec_helper.rb'
         
     | 
| 
      
 187 
     | 
    
         
            +
                      instance.instance_variable_set :@actions, [action1, action2, action3]
         
     | 
| 
      
 188 
     | 
    
         
            +
                      instance.send(:check_conflict_actions)
         
     | 
| 
      
 189 
     | 
    
         
            +
                      expect(instance.instance_variable_get :@conflict_actions).to eq [action2, action1]
         
     | 
| 
      
 190 
     | 
    
         
            +
                      expect(instance.instance_variable_get :@actions).to eq [action3]
         
     | 
| 
      
 191 
     | 
    
         
            +
                    end
         
     | 
| 
      
 192 
     | 
    
         
            +
                  end
         
     | 
| 
       169 
193 
     | 
    
         
             
                end
         
     | 
| 
       170 
194 
     | 
    
         
             
              end
         
     | 
| 
       171 
195 
     | 
    
         
             
            end
         
     | 
| 
         @@ -18,6 +18,7 @@ end 
     | 
|
| 
       18 
18 
     | 
    
         
             
                }
         
     | 
| 
       19 
19 
     | 
    
         
             
                let(:node) { Parser::CurrentRuby.parse(source) }
         
     | 
| 
       20 
20 
     | 
    
         
             
                let(:instance) { double(:current_node => node, :current_node= => node, :current_source => source) }
         
     | 
| 
      
 21 
     | 
    
         
            +
                before { Rewriter::Instance.current = instance }
         
     | 
| 
       21 
22 
     | 
    
         | 
| 
       22 
23 
     | 
    
         
             
                describe '#process' do
         
     | 
| 
       23 
24 
     | 
    
         
             
                  it 'not call block if no matching node' do
         
     | 
| 
         @@ -26,7 +27,7 @@ end 
     | 
|
| 
       26 
27 
     | 
    
         
             
                      run = true
         
     | 
| 
       27 
28 
     | 
    
         
             
                    end
         
     | 
| 
       28 
29 
     | 
    
         
             
                    scope.process
         
     | 
| 
       29 
     | 
    
         
            -
                    expect(run).to  
     | 
| 
      
 30 
     | 
    
         
            +
                    expect(run).to be_falsey
         
     | 
| 
       30 
31 
     | 
    
         
             
                  end
         
     | 
| 
       31 
32 
     | 
    
         | 
| 
       32 
33 
     | 
    
         
             
                  it 'call block if there is matching node' do
         
     | 
| 
         @@ -35,7 +36,7 @@ end 
     | 
|
| 
       35 
36 
     | 
    
         
             
                      run = true
         
     | 
| 
       36 
37 
     | 
    
         
             
                    end
         
     | 
| 
       37 
38 
     | 
    
         
             
                    scope.process
         
     | 
| 
       38 
     | 
    
         
            -
                    expect(run).to  
     | 
| 
      
 39 
     | 
    
         
            +
                    expect(run).to be_truthy
         
     | 
| 
       39 
40 
     | 
    
         
             
                  end
         
     | 
| 
       40 
41 
     | 
    
         
             
                end
         
     | 
| 
       41 
42 
     | 
    
         
             
              end
         
     | 
| 
         @@ -73,7 +73,7 @@ module Synvert::Core 
     | 
|
| 
       73 
73 
     | 
    
         
             
                      add_file 'foo.bar', 'FooBar'
         
     | 
| 
       74 
74 
     | 
    
         
             
                    end
         
     | 
| 
       75 
75 
     | 
    
         
             
                    rewriter.process_with_sandbox
         
     | 
| 
       76 
     | 
    
         
            -
                    expect(File.exist?('./foo.bar')).to  
     | 
| 
      
 76 
     | 
    
         
            +
                    expect(File.exist?('./foo.bar')).to be_falsey
         
     | 
| 
       77 
77 
     | 
    
         
             
                  end
         
     | 
| 
       78 
78 
     | 
    
         
             
                end
         
     | 
| 
       79 
79 
     | 
    
         | 
| 
         @@ -84,7 +84,7 @@ module Synvert::Core 
     | 
|
| 
       84 
84 
     | 
    
         
             
                      remove_file 'foo.bar'
         
     | 
| 
       85 
85 
     | 
    
         
             
                    end
         
     | 
| 
       86 
86 
     | 
    
         
             
                    rewriter.process
         
     | 
| 
       87 
     | 
    
         
            -
                    expect(File.exist? './foo.bar').to  
     | 
| 
      
 87 
     | 
    
         
            +
                    expect(File.exist? './foo.bar').to be_falsey
         
     | 
| 
       88 
88 
     | 
    
         
             
                  end
         
     | 
| 
       89 
89 
     | 
    
         | 
| 
       90 
90 
     | 
    
         
             
                  it 'does nothing if file not exist' do
         
     | 
| 
         @@ -92,7 +92,7 @@ module Synvert::Core 
     | 
|
| 
       92 
92 
     | 
    
         
             
                      remove_file 'foo.bar'
         
     | 
| 
       93 
93 
     | 
    
         
             
                    end
         
     | 
| 
       94 
94 
     | 
    
         
             
                    rewriter.process
         
     | 
| 
       95 
     | 
    
         
            -
                    expect(File.exist? './foo.bar').to  
     | 
| 
      
 95 
     | 
    
         
            +
                    expect(File.exist? './foo.bar').to be_falsey
         
     | 
| 
       96 
96 
     | 
    
         
             
                  end
         
     | 
| 
       97 
97 
     | 
    
         | 
| 
       98 
98 
     | 
    
         
             
                  it 'does nothing in sandbox mode' do
         
     | 
| 
         @@ -101,7 +101,7 @@ module Synvert::Core 
     | 
|
| 
       101 
101 
     | 
    
         
             
                      add_file 'foo.bar', 'FooBar'
         
     | 
| 
       102 
102 
     | 
    
         
             
                    end
         
     | 
| 
       103 
103 
     | 
    
         
             
                    rewriter.process_with_sandbox
         
     | 
| 
       104 
     | 
    
         
            -
                    expect(File.exist?('./foo.bar')).to  
     | 
| 
      
 104 
     | 
    
         
            +
                    expect(File.exist?('./foo.bar')).to be_truthy
         
     | 
| 
       105 
105 
     | 
    
         
             
                    FileUtils.rm './foo.bar'
         
     | 
| 
       106 
106 
     | 
    
         
             
                  end
         
     | 
| 
       107 
107 
     | 
    
         
             
                end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: synvert-core
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.3.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Richard Huang
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2014- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2014-07-12 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: parser
         
     |