Class: Walker

Inherits:
Object
  • Object
show all
Defined in:
lib/ember/appkit/rails/walker.rb

Instance Method Summary collapse

Constructor Details

#initialize(resource, path, api_version) ⇒ Walker

Returns a new instance of Walker.



4
5
6
7
8
9
10
11
# File 'lib/ember/appkit/rails/walker.rb', line 4

def initialize(resource, path, api_version)
  @resource = resource
  @file = File.open(path, 'r+')
  content = @file.read
  @ast = Ripper.sexp(content)
  @lines = content.split("\n")
  @api_version = api_version
end

Instance Method Details

#find_api_namespace(ast) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/ember/appkit/rails/walker.rb', line 54

def find_api_namespace(ast)
  find_namespace(ast, 'api') do |ast|
    find_version_namespace(ast, @api_version)

    if @write_to.nil?
      @write_to = [:api, ast[1][1][2][0]]
    end

    # found the first instance of the namespace
    # immediately short-circuit
    return
  end
end

#find_namespace(ast, name) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/ember/appkit/rails/walker.rb', line 80

def find_namespace(ast, name)
  walk(ast) do |ast, node|
    if node == :method_add_block
      flat_ast = ast[1].flatten
      if flat_ast.include?('namespace') && flat_ast.include?(name)
        yield(ast)
      end
    end
  end
end

#find_version_namespace(ast, version) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
# File 'lib/ember/appkit/rails/walker.rb', line 68

def find_version_namespace(ast, version)
  find_namespace(ast, "v#{version}") do |ast|
    @write_to = [:version, ast[1][1][2][0]]

    # found the first instance of the namespace
    # immediately short-circuit
    return
  end

  @write_to
end

#runObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/ember/appkit/rails/walker.rb', line 13

def run
  find_api_namespace(@ast)

  output = nil
  line_number = @lines.index { |line| line =~ /routes\.draw do/ }

  if @write_to
    if @write_to.first == :version
      output = write_resource
    else
      output = write_version_namespace do
        write_resource
      end
    end
    line_number = @write_to.last - 1
  else
    output = write_api_namespace do
      write_version_namespace do
        write_resource
      end
    end
  end

  @lines.insert(line_number + 1, output)
  @file.rewind
  @file.write(@lines.join("\n"))
  @file.close
end

#walk(ast, &block) ⇒ Object



91
92
93
94
95
96
97
98
# File 'lib/ember/appkit/rails/walker.rb', line 91

def walk(ast, &block)
  if ast.is_a?(Array)
    ast.each do |node|
      yield(ast, node)
      walk(node, &block)
    end
  end
end

#write_api_namespaceObject



42
43
44
# File 'lib/ember/appkit/rails/walker.rb', line 42

def write_api_namespace
  "  namespace :api do\n#{yield}\n  end"
end

#write_resourceObject



50
51
52
# File 'lib/ember/appkit/rails/walker.rb', line 50

def write_resource
  "      resources :#{@resource}, except: [:new, :edit]"
end

#write_version_namespaceObject



46
47
48
# File 'lib/ember/appkit/rails/walker.rb', line 46

def write_version_namespace
  "    namespace :v#{@api_version} do\n#{yield}\n    end"
end