Class: NetLinx::Compile::ExtensionDiscovery

Inherits:
Object
  • Object
show all
Defined in:
lib/netlinx/compile/extension_discovery.rb

Overview

Discovers and auto-requires add-on Ruby libraries for netlinx-compile.

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.handlersObject

An array of ExtensionHandlers installed on the system. #discover must be run before this array is populated.



10
11
12
# File 'lib/netlinx/compile/extension_discovery.rb', line 10

def handlers
  @handlers
end

Class Method Details

.discoverObject

Searches for gems with ‘netlinx-compile’ as a dependency. The ‘lib/netlinx/compile/extension/*’ path is checked for compiler extensions.



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
# File 'lib/netlinx/compile/extension_discovery.rb', line 17

def discover
  # Require extensions built into netlinx-compile.
  nc_gem = Gem::Specification.find_by_name 'netlinx-compile'
  nc_gem_path = File.expand_path 'lib/netlinx/compile/extension', nc_gem.gem_dir
  nc_gem_files = Dir["#{nc_gem_path}/*.rb"]
  nc_gem_files.each {|file| require file}
  
  # Find gems with a dependency on 'netlinx-compile'.
  gems = Gem::Specification.each
    .select{|gem| gem.dependencies
      .select{|dependency| dependency.name == 'netlinx-compile'}
      .empty? == false
    }
  
  # Load any Ruby files in their lib/netlinx/compile/extension paths.
  gems.each do |gem|
    extension_path = File.expand_path 'lib/netlinx/compile/extension', gem.gem_dir
    files = Dir["#{extension_path}/*.rb"]
    files.each {|file| require file}
  end
  
  # Register ExtensionHandler objects.
  @handlers = NetLinx::Compile::Extension.constants
    .map{|c| NetLinx::Compile::Extension.const_get c}
    .select{|c| c.is_a? Class}
    .map{|c| c.get_handler if c.respond_to? :get_handler}
    .select{|c| not c.nil?}
end

.get_handler(filename) ⇒ ExtensionHandler

Parameters:

Returns:



57
58
59
# File 'lib/netlinx/compile/extension_discovery.rb', line 57

def get_handler(filename)
  @handlers.select{|h| h.include? filename}.first
end

.workspace_extensionsArray<String>

Returns workspace file extensions.

Returns:

  • (Array<String>)

    workspace file extensions.



47
48
49
50
51
52
# File 'lib/netlinx/compile/extension_discovery.rb', line 47

def workspace_extensions
  @handlers
    .select{|h| h.is_a_workspace?}
    .map{|h| h.extensions}
    .flatten
end