Class: CMSScanner::Formatter::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/cms_scanner/formatter.rb

Overview

Base Formatter

Direct Known Subclasses

Cli, Json

Constant Summary collapse

ERB_SUPPORTS_KVARGS =

Ruby 2.6+

::ERB.instance_method(:initialize).parameters.assoc(:key)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBase

Returns a new instance of Base.



54
55
56
57
# File 'lib/cms_scanner/formatter.rb', line 54

def initialize
  # Can't put this at the top level of the class, due to the NS::
  extend NS::Formatter::InstanceMethods
end

Instance Attribute Details

#controller_nameObject (readonly)

Returns the value of attribute controller_name.



52
53
54
# File 'lib/cms_scanner/formatter.rb', line 52

def controller_name
  @controller_name
end

Instance Method Details

#base_formatString

Returns The underscored format to use as a base.

Returns:

  • (String)

    The underscored format to use as a base



70
# File 'lib/cms_scanner/formatter.rb', line 70

def base_format; end

#beautifyObject

This is called after the scan and used in some formatters (e.g JSON) to indent results



80
# File 'lib/cms_scanner/formatter.rb', line 80

def beautify; end

#formatString

Returns The underscored name of the class.

Returns:

  • (String)

    The underscored name of the class



60
61
62
# File 'lib/cms_scanner/formatter.rb', line 60

def format
  self.class.name.demodulize.underscore
end

#formatsArray<String>

Returns:

  • (Array<String>)


73
74
75
# File 'lib/cms_scanner/formatter.rb', line 73

def formats
  [format, base_format].compact
end

#output(tpl, vars = {}, controller_name = nil) ⇒ Object

See Also:



83
84
85
# File 'lib/cms_scanner/formatter.rb', line 83

def output(tpl, vars = {}, controller_name = nil)
  puts render(tpl, vars, controller_name)
end

#render(tpl, vars = {}, controller_name = nil) ⇒ Object

Parameters:

  • tpl (String)
  • vars (Hash) (defaults to: {})
  • controller_name (String) (defaults to: nil)


92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/cms_scanner/formatter.rb', line 92

def render(tpl, vars = {}, controller_name = nil)
  template_vars(vars)
  @controller_name = controller_name if controller_name

  # '-' is used to disable new lines when -%> is used
  # See http://www.ruby-doc.org/stdlib-2.1.1/libdoc/erb/rdoc/ERB.html
  # Since ruby 2.6, KVARGS are supported and passing argument is deprecated in ruby 3+
  if ERB_SUPPORTS_KVARGS
    ERB.new(File.read(view_path(tpl)), trim_mode: '-').result(binding)
  else
    ERB.new(File.read(view_path(tpl)), nil, '-').result(binding)
  end
end

#template_vars(vars) ⇒ Void

Parameters:

  • vars (Hash)

Returns:

  • (Void)


109
110
111
112
113
# File 'lib/cms_scanner/formatter.rb', line 109

def template_vars(vars)
  vars.each do |key, value|
    instance_variable_set("@#{key}", value) unless key == :views_directories
  end
end

#user_interaction?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/cms_scanner/formatter.rb', line 65

def user_interaction?
  format == 'cli'
end

#view_path(tpl) ⇒ String

Returns The path of the view.

Parameters:

  • tpl (String)

Returns:

  • (String)

    The path of the view



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/cms_scanner/formatter.rb', line 118

def view_path(tpl)
  if tpl[0, 1] == '@' # Global Template
    tpl = tpl.delete('@')
  else
    raise 'The controller_name can not be nil' unless controller_name

    tpl = "#{controller_name}/#{tpl}"
  end

  raise "Wrong tpl format: '#{tpl}'" unless %r{\A[\w/_]+\z}.match?(tpl)

  views_directories.reverse_each do |dir|
    formats.each do |format|
      potential_file = File.join(dir, format, "#{tpl}.erb")

      return potential_file if File.exist?(potential_file)
    end
  end

  raise "View not found for #{format}/#{tpl}"
end

#views_directoriesArray<String>

Returns The directories to look into for views.

Returns:

  • (Array<String>)

    The directories to look into for views



141
142
143
144
145
146
# File 'lib/cms_scanner/formatter.rb', line 141

def views_directories
  @views_directories ||= [
    APP_DIR, NS::APP_DIR,
    File.join(Dir.home, ".#{NS.app_name}"), File.join(Dir.pwd, ".#{NS.app_name}")
  ].uniq.reduce([]) { |acc, elem| acc << Pathname.new(elem).join('views').to_s }
end