Class: Synvert::Rewriter

Inherits:
Object
  • Object
show all
Defined in:
lib/synvert/rewriter.rb

Overview

Rewriter is the top level namespace in a snippet.

One Rewriter can contain one or many [Synvert::Rewriter::Instance], which define the behavior what files and what codes to detect and rewrite to what code.

Synvert::Rewriter.new 'factory_girl_short_syntax', 'use FactoryGirl short syntax' do
  if_gem 'factory_girl', {gte: '2.0.0'}

  within_files 'spec/**/*.rb' do
    with_node type: 'send', receiver: 'FactoryGirl', message: 'create' do
      replace_with "create({{arguments}})"
    end
  end
end

Defined Under Namespace

Classes: Action, AppendAction, Condition, GemSpec, IfExistCondition, IfOnlyExistCondition, InsertAction, InsertAfterAction, Instance, RemoveAction, ReplaceWithAction, Scope, UnlessExistCondition

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, &block) ⇒ Synvert::Rewriter

Initialize a rewriter. When a rewriter is initialized, it is also registered.

Parameters:

  • name (String)

    name of the rewriter.

  • block (Block)

    a block defines the behaviors of the rewriter, block code won’t be called when initialization.



94
95
96
97
98
99
100
# File 'lib/synvert/rewriter.rb', line 94

def initialize(name, &block)
  @name = name
  @block = block
  @helpers = []
  @sub_snippets = []
  self.class.register(name, self)
end

Instance Attribute Details

#nameString (readonly)

Returns the unique name of rewriter.

Returns:

  • (String)

    the unique name of rewriter



86
87
88
# File 'lib/synvert/rewriter.rb', line 86

def name
  @name
end

#sub_snippetsObject (readonly)

Returns the value of attribute sub_snippets.



86
# File 'lib/synvert/rewriter.rb', line 86

attr_reader :name, :sub_snippets

Class Method Details

.availablesArray<Synvert::Rewriter>

Get all available rewriters

Returns:



72
73
74
# File 'lib/synvert/rewriter.rb', line 72

def availables
  @rewriters.values
end

.call(name) ⇒ Synvert::Rewriter

Get a registered rewriter by name and process that rewriter.

Parameters:

  • name (String)

    the rewriter name.

Returns:

Raises:



60
61
62
63
64
65
66
67
# File 'lib/synvert/rewriter.rb', line 60

def call(name)
  if (rewriter = @rewriters[name.to_s])
    rewriter.process
    rewriter
  else
    raise RewriterNotFound.new "Rewriter #{name} not found"
  end
end

.clearObject

Clear all registered rewriters.



77
78
79
# File 'lib/synvert/rewriter.rb', line 77

def clear
  @rewriters.clear
end

.fetch(name) ⇒ Synvert::Rewriter

Fetch a rewriter by name.

Parameters:

  • name (String)

    rewrtier name.

Returns:



51
52
53
# File 'lib/synvert/rewriter.rb', line 51

def fetch(name)
  @rewriters[name.to_s]
end

.register(name, rewriter) ⇒ Object

Register a rewriter with its name.

Parameters:

  • name (String)

    the unique rewriter name.

  • rewriter (Synvert::Rewriter)

    the rewriter to register.



42
43
44
45
# File 'lib/synvert/rewriter.rb', line 42

def register(name, rewriter)
  @rewriters ||= {}
  @rewriters[name.to_s] = rewriter
end

Instance Method Details

#add_file(filename, content) ⇒ Object

Parses add_file dsl, it adds a new file.

Parameters:

  • filename (String)

    file name of newly created file.

  • content (String)

    file body of newly created file.



164
165
166
167
168
169
170
# File 'lib/synvert/rewriter.rb', line 164

def add_file(filename, content)
  return if @sandbox

  File.open filename, 'w' do |file|
    file.write content
  end
end

#add_snippet(name) ⇒ Object

Parse add_snippet dsl, it calls anther rewriter.

Parameters:

  • name (String)

    name of another rewriter.



175
176
177
# File 'lib/synvert/rewriter.rb', line 175

def add_snippet(name)
  @sub_snippets << self.class.call(name)
end

#description(description = nil) ⇒ Object

Parse description dsl, it sets description of the rewrite. Or get description.

Parameters:

  • description (String) (defaults to: nil)

    rewriter description.

Returns:

  • rewriter description.



125
126
127
128
129
130
131
# File 'lib/synvert/rewriter.rb', line 125

def description(description=nil)
  if description
    @description = description
  else
    @description
  end
end

#helper_method(name, &block) ⇒ Object

Parse helper_method dsl, it defines helper method for [Synvert::Rewriter::Instance].

Parameters:

  • name (String)

    helper method name.

  • block (Block)

    helper method block.



183
184
185
# File 'lib/synvert/rewriter.rb', line 183

def helper_method(name, &block)
  @helpers << {name: name, block: block}
end

#if_gem(name, comparator) ⇒ Object

Parse if_gem dsl, it compares version of the specified gem.

Parameters:

  • name (String)

    gem name.

  • comparator (Hash)

    equal, less than or greater than specified version, e.g. ‘2.0.0’, key can be eq, lt, gt, lte, gte or ne.



138
139
140
# File 'lib/synvert/rewriter.rb', line 138

def if_gem(name, comparator)
  @gem_spec = Rewriter::GemSpec.new(name, comparator)
end

#processObject

Process the rewriter. It will call the block.



104
105
106
# File 'lib/synvert/rewriter.rb', line 104

def process
  self.instance_eval &@block
end

#process_with_sandboxObject

Process rewriter with sandbox mode. It will call the block but doesn’t change any file.



110
111
112
113
114
# File 'lib/synvert/rewriter.rb', line 110

def process_with_sandbox
  @sandbox = true
  self.process
  @sandbox = false
end

#todo(todo = nil) ⇒ String

Parse todo dsl, it sets todo of the rewriter. Or get todo.

Parameters:

  • todo_list (String)

    rewriter todo.

Returns:

  • (String)

    rewriter todo.



192
193
194
195
196
197
198
# File 'lib/synvert/rewriter.rb', line 192

def todo(todo=nil)
  if todo
    @todo = todo
  else
    @todo
  end
end

#within_files(file_pattern, &block) ⇒ Object Also known as: within_file

Parse within_files dsl, it finds specified files. It creates a [Synvert::Rewriter::Instance] to rewrite code.

Parameters:

  • file_pattern (String)

    pattern to find files, e.g. spec/*/_spec.rb

  • block (Block)

    the block to rewrite code in the matching files.



147
148
149
150
151
152
153
154
155
# File 'lib/synvert/rewriter.rb', line 147

def within_files(file_pattern, &block)
  return if @sandbox

  if !@gem_spec || @gem_spec.match?
    instance = Rewriter::Instance.new(file_pattern, &block)
    @helpers.each { |helper| instance.singleton_class.send(:define_method, helper[:name], &helper[:block]) }
    instance.process
  end
end