Module: Plugin

Defined in:
lib/plugin/filter.rb,
lib/plugin.rb,
lib/plugin/metadata.rb,
lib/plugin/filter_manager.rb

Overview

loaded really early

Defined Under Namespace

Classes: CustomEmoji, Filter, FilterManager, Instance, Metadata

Class Method Summary collapse

Class Method Details

.initialization_guard(&block) ⇒ Object



4
5
6
7
8
9
10
11
12
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/plugin.rb', line 4

def self.initialization_guard(&block)
  begin
    block.call
  rescue => error
    plugins_directory = Rails.root + "plugins"

    if error.backtrace && error.backtrace_locations
      plugin_path =
        error
          .backtrace_locations
          .lazy
          .map do |location|
            Pathname
              .new(location.absolute_path)
              .ascend
              .lazy
              .find { |path| path.parent == plugins_directory }
          end
          .next

      raise unless plugin_path

      stack_trace =
        error
          .backtrace
          .each_with_index
          .inject([]) do |messages, (line, index)|
            if index == 0
              messages << "#{line}: #{error} (#{error.class})"
            else
              messages << "\t#{index}: from #{line}"
            end
          end
          .reverse
          .join("\n")

      STDERR.puts <<~TEXT
        #{stack_trace}

        ** INCOMPATIBLE PLUGIN **

        You are unable to build Discourse due to errors in the plugin at
        #{plugin_path}

        Please try removing this plugin and rebuilding again!
      TEXT
    else
      STDERR.puts <<~TEXT
        ** PLUGIN FAILURE **

        You are unable to build Discourse due to this error during plugin
        initialization:

        #{error}

        #{error.backtrace.join("\n")}
      TEXT
    end
    exit 1
  end
end