Class: Gon::Jbuilder::Parser

Inherits:
Object
  • Object
show all
Includes:
ActionView::Helpers
Defined in:
lib/gon/jbuilder/parser.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parse_params) ⇒ Parser

Returns a new instance of Parser.



10
11
12
13
14
15
# File 'lib/gon/jbuilder/parser.rb', line 10

def initialize(parse_params)
  @template_location = parse_params[:template_path]
  @controller        = parse_params[:controller]
  @_controller_name  = parse_params[:controller_name]
  @locals            = parse_params[:locals] || {}
end

Instance Attribute Details

#_controller_nameObject

Returns the value of attribute _controller_name.



8
9
10
# File 'lib/gon/jbuilder/parser.rb', line 8

def _controller_name
  @_controller_name
end

#controllerObject

Returns the value of attribute controller.



8
9
10
# File 'lib/gon/jbuilder/parser.rb', line 8

def controller
  @controller
end

#localsObject

Returns the value of attribute locals.



8
9
10
# File 'lib/gon/jbuilder/parser.rb', line 8

def locals
  @locals
end

#template_locationObject

Returns the value of attribute template_location.



8
9
10
# File 'lib/gon/jbuilder/parser.rb', line 8

def template_location
  @template_location
end

Instance Method Details

#assign_controller_variables(controller) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/gon/jbuilder/parser.rb', line 30

def assign_controller_variables(controller)
  controller.instance_variables.each do |name|
    self.instance_variable_set \
      name,
      controller.instance_variable_get(name)
  end
end

#construct_path(args) ⇒ Object



105
106
107
108
109
110
# File 'lib/gon/jbuilder/parser.rb', line 105

def construct_path(args)
  last_arg = args.pop
  tmp_path = 'app/views/' + args.join('/')
  path = path_with_ext(tmp_path + "/_#{last_arg}")
  path || path_with_ext(tmp_path + "/#{last_arg}")
end

#eval_controller_helpers(controller) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/gon/jbuilder/parser.rb', line 38

def eval_controller_helpers(controller)
  controller._helper_methods.each do |meth|
    self.class.class_eval "        def \#{meth}(*args, &blk)                               # def current_user(*args, &blk)\n          __controller.send(%(\#{meth}), *args, &blk)             #   controller.send(:current_user, *args, &blk)\n        end                                                    # end\n      ruby_eval\n  end\nend\n", __FILE__, __LINE__ + 1

#eval_controller_url_helpers(controller) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/gon/jbuilder/parser.rb', line 48

def eval_controller_url_helpers(controller)
  if defined?(Rails) && Rails.respond_to?(:application)
    Rails.application.routes.url_helpers.instance_methods.each do |meth|
      self.class.class_eval "        def \#{meth}(*args, &blk)                                         # def user_path(*args, &blk)\n          __controller.send(%(\#{meth}), *args, &blk)                     #   controller.send(:user_path, *args, &blk)\n        end                                                              # end\n      ruby_eval\n    end\n  end\nend\n", __FILE__, __LINE__ + 1

#find_partials(lines = []) ⇒ Object



118
119
120
121
122
123
124
125
126
# File 'lib/gon/jbuilder/parser.rb', line 118

def find_partials(lines = [])
  lines.map do |line|
    if line =~ /partial!/
      parse_partial line
    else
      line
    end
  end.flatten
end

#parse!Object



17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/gon/jbuilder/parser.rb', line 17

def parse!
  assign_controller_variables controller
  eval_controller_helpers controller
  eval_controller_url_helpers controller
  locals['__controller'] = controller
  wrap_locals_in_methods locals

  partials = find_partials(File.readlines(template_location))
  source = partials.join('')

  parse_source source, controller
end

#parse_partial(partial_line) ⇒ Object



77
78
79
80
81
82
83
84
85
# File 'lib/gon/jbuilder/parser.rb', line 77

def parse_partial(partial_line)
  path = partial_line.match(/['"]([^'"]*)['"]/)[1]
  path = parse_path path
  options_hash = partial_line.match(/,(.*)/)[1]

  set_options_from_hash(options_hash) if options_hash.present?

  find_partials File.readlines(path)
end

#parse_path(path) ⇒ Object



95
96
97
98
99
100
101
102
103
# File 'lib/gon/jbuilder/parser.rb', line 95

def parse_path(path)
  return path if File.exist?(path)
  if (splitted = path.split('/')).blank?
      raise 'Something wrong with partial path in your jbuilder templates'
  elsif splitted.size == 1
      splitted.shift(@_controller_name)
  end
  construct_path(splitted)
end

#parse_source(source, controller) ⇒ Object



70
71
72
73
74
75
# File 'lib/gon/jbuilder/parser.rb', line 70

def parse_source(source, controller)
  output = ::JbuilderTemplate.encode(controller) do |json|
    eval source
  end
  JSON.parse(output)
end

#path_with_ext(path) ⇒ Object



112
113
114
115
116
# File 'lib/gon/jbuilder/parser.rb', line 112

def path_with_ext(path)
  return path if File.exist?(path)
  return "#{path}.jbuilder" if File.exist?("#{path}.jbuilder")
  return "#{path}.json.jbuilder" if File.exist?("#{path}.json.jbuilder")
end

#set_options_from_hash(options_hash) ⇒ Object



87
88
89
90
91
92
93
# File 'lib/gon/jbuilder/parser.rb', line 87

def set_options_from_hash(options_hash)
  options = eval "{#{options_hash}}"
  options.each do |name, val|
    self.instance_variable_set("@#{name.to_s}", val)
    eval "def #{name}; self.instance_variable_get('@' + '#{name.to_s}'); end"
  end
end

#wrap_locals_in_methods(locals) ⇒ Object



60
61
62
63
64
65
66
67
68
# File 'lib/gon/jbuilder/parser.rb', line 60

def wrap_locals_in_methods(locals)
  locals.each do |name, value|
    self.class.class_eval do
      define_method "#{name}" do
        return value
      end
    end
  end
end