Class: Origen::Application::Plugins

Inherits:
Array show all
Defined in:
lib/origen/application/plugins.rb

Overview

Provides an API for working with the application's plugins

An instance of this class is instantiated as Origen.app.plugins

Instance Method Summary collapse

Methods inherited from Array

#dups, #dups?, #dups_with_index, #ids, #include_hash?, #include_hash_with_key?

Constructor Details

#initializePlugins

Returns a new instance of Plugins



7
8
9
10
11
12
# File 'lib/origen/application/plugins.rb', line 7

def initialize
  top = Origen.app
  Origen._applications_lookup[:name].each do |_name, app|
    self << app unless app == top
  end
end

Instance Method Details

#currentObject

Returns the current plugin's application instance



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/origen/application/plugins.rb', line 38

def current
  return nil if @temporary == :none
  return nil if @disabled
  name = @temporary || @current ||= begin
    if Origen.app.session.origen_core[:default_plugin]
      Origen.app.session.origen_core[:default_plugin]
    elsif Origen.app.config.default_plugin && !Origen.app.session.origen_core[:default_plugin_cleared_by_user]
      Origen.app.config.default_plugin
    end
  end
  find { |p| p.name.to_sym == name } if name
end

#current=(name) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/origen/application/plugins.rb', line 51

def current=(name)
  name = name.to_sym if name
  if name == :none || name.nil?
    @current = nil
    Origen.app.session.origen_core[:default_plugin] = nil
    Origen.app.session.origen_core[:default_plugin_cleared_by_user] = true
  else
    Origen.app.session.origen_core[:default_plugin] = name
    @current = name
  end
end

#defaultObject

Deprecated.


101
102
103
104
# File 'lib/origen/application/plugins.rb', line 101

def default
  Origen.deprecated 'Origen.current_plugin.default is deprecated, use Origen.app.plugins.current instead'
  current
end

#default=(name) ⇒ Object

Deprecated.


83
84
85
86
# File 'lib/origen/application/plugins.rb', line 83

def default=(name)
  Origen.deprecated 'Origen.current_plugin.default= is deprecated, use Origen.app.plugins.current= instead'
  self.current = name
end

#disable_currentObject

Temporarily set the current plugin to nil



69
70
71
72
73
74
75
# File 'lib/origen/application/plugins.rb', line 69

def disable_current
  @disabled = true
  if block_given?
    yield
    @disabled = false
  end
end

#enable_currentObject

Restore the current plugin after an earlier disable



78
79
80
# File 'lib/origen/application/plugins.rb', line 78

def enable_current
  @disabled = false
end

#instanceObject

Deprecated.


95
96
97
98
# File 'lib/origen/application/plugins.rb', line 95

def instance
  Origen.deprecated 'Origen.current_plugin.instance is deprecated, use Origen.app.plugins.current instead'
  current
end

#nameObject

Deprecated.


89
90
91
92
# File 'lib/origen/application/plugins.rb', line 89

def name
  Origen.deprecated 'Origen.current_plugin.name is deprecated, use Origen.app.plugins.current.name instead'
  current.name if current
end

#namesObject

Returns an array of symbols that represent the names of all plugins



33
34
35
# File 'lib/origen/application/plugins.rb', line 33

def names
  map(&:name)
end

#plugin_name_from_path(path) ⇒ Object Also known as: path_within_a_plugin

Return the plugin name if the path specified is from that plugin



116
117
118
119
120
121
122
123
124
# File 'lib/origen/application/plugins.rb', line 116

def plugin_name_from_path(path)
  path = Pathname.new(path).expand_path.cleanpath
  each do |plugin|
    if path.to_s =~ /^#{plugin.root}/
      return plugin.name
    end
  end
  nil
end

#shared_commandsObject



106
107
108
109
110
111
112
113
# File 'lib/origen/application/plugins.rb', line 106

def shared_commands
  [Origen.app, self].flatten.map do |plugin|
    shared = plugin.config.shared || {}
    if shared[:command_launcher]
      "#{plugin.root}/#{shared[:command_launcher]}"
    end
  end.compact
end

#temporary=(name) ⇒ Object



63
64
65
66
# File 'lib/origen/application/plugins.rb', line 63

def temporary=(name)
  name = name.to_sym if name
  @temporary = name
end

#validate_production_status(force = false) ⇒ Object

Will raise an error if any plugins are currently imported from a path reference in the Gemfile



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/origen/application/plugins.rb', line 16

def validate_production_status(force = false)
  if Origen.mode.production? || force
    if File.exist?("#{Origen.root}/Gemfile")
      File.readlines("#{Origen.root}/Gemfile").each do |line|
        # https://rubular.com/r/yNGDGB6M2r
        if line =~ /^\s*gem\s+(("|')\w+("|')),.*(:path\s*=>|path:)/
          fail "The following gem is defined as a path in your Gemfile, but that is not allowed in production: #{Regexp.last_match[1]}"
        end
        if line =~ /ORIGEN PLUGIN AUTO-GENERATED/
          fail 'Fetched gems are currently being used in your Gemfile, but that is not allowed in production!'
        end
      end
    end
  end
end