Class: Processing::LibraryLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby-processing/library_loader.rb

Overview

Encapsulate library loader functionality as a class

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLibraryLoader

Returns a new instance of LibraryLoader.



6
7
8
9
# File 'lib/ruby-processing/library_loader.rb', line 6

def initialize
  @sketchbook_library_path = File.join(find_sketchbook_path, 'libraries')
  @loaded_libraries = Hash.new(false)
end

Instance Attribute Details

#sketchbook_library_pathObject (readonly)

Returns the value of attribute sketchbook_library_path.



4
5
6
# File 'lib/ruby-processing/library_loader.rb', line 4

def sketchbook_library_path
  @sketchbook_library_path
end

Instance Method Details

#get_library_paths(library_name, extension = nil) ⇒ Object



97
98
99
100
# File 'lib/ruby-processing/library_loader.rb', line 97

def get_library_paths(library_name, extension = nil)
  dir = get_library_directory_path(library_name, extension)
  Dir.glob("#{dir}/*.{rb,jar}")
end

#get_platform_specific_library_paths(basename) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
# File 'lib/ruby-processing/library_loader.rb', line 85

def get_platform_specific_library_paths(basename)
  bits = 'universal'  # for MacOSX, but does this even work, or does Mac return '64'?
  if java.lang.System.getProperty('sun.arch.data.model') == '32' ||
    java.lang.System.getProperty('java.vm.name').index('32')
    bits = '32'
  elsif java.lang.System.getProperty('sun.arch.data.model') == '64' ||
    java.lang.System.getProperty('java.vm.name').index('64')
    bits = '64' unless platform =~ /macosx/
  end
  [platform, platform + bits].map { |p| File.join(basename, p) }
end

#library_loaded?(library_name) ⇒ Boolean

Detect if a library has been loaded (for conditional loading)

Returns:

  • (Boolean)


12
13
14
# File 'lib/ruby-processing/library_loader.rb', line 12

def library_loaded?(library_name)
  @loaded_libraries[library_name.to_sym]
end

#load_java_library(library_name) ⇒ Object

HACK: For pure java libraries, such as the ones that are available on this page: processing.org/reference/libraries/index.html that include native code, we mess with the ‘Java ClassLoader’, so that you don’t have to futz with your PATH. But it’s probably bad juju.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/ruby-processing/library_loader.rb', line 52

def load_java_library(library_name)
  library_name = library_name.to_sym
  return true if @loaded_libraries.include?(library_name)
  jpath = get_library_directory_path(library_name, 'jar')
  jars = get_library_paths(library_name, 'jar')
  return false if jars.empty?
  jars.each { |jar| require jar }
  platform_specific_library_paths = get_platform_specific_library_paths(jpath)
  platform_specific_library_paths = platform_specific_library_paths.select do |ppath|
    test(?d, ppath) && !Dir.glob(File.join(ppath, '*.{so,dll,jnilib}')).empty?
  end
  unless platform_specific_library_paths.empty?
    platform_specific_library_paths << java.lang.System.getProperty('java.library.path')
    new_library_path = platform_specific_library_paths.join(java.io.File.pathSeparator)
    java.lang.System.setProperty('java.library.path', new_library_path)
    field = java.lang.Class.for_name('java.lang.ClassLoader').get_declared_field('sys_paths')
    if field
      field.accessible = true
      field.set(java.lang.Class.for_name('java.lang.System').get_class_loader, nil)
    end
  end
  @loaded_libraries[library_name] = true
end

#load_libraries(*args) ⇒ Object Also known as: load_library

Load a list of Ruby or Java libraries (in that order) Usage: load_libraries :opengl, :boids

If a library is put into a ‘library’ folder next to the sketch it will be used instead of the library that ships with Ruby-Processing.



21
22
23
24
25
26
27
# File 'lib/ruby-processing/library_loader.rb', line 21

def load_libraries(*args)
  message = 'no such file to load -- %s'
  args.each do |lib|
    loaded = load_ruby_library(lib) || load_java_library(lib)
    fail(LoadError.new, format(message, lib)) unless loaded
  end
end

#load_ruby_library(library_name) ⇒ Object

For pure ruby libraries. The library should have an initialization ruby file of the same name as the library folder.



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/ruby-processing/library_loader.rb', line 33

def load_ruby_library(library_name)
  library_name = library_name.to_sym
  return true if @loaded_libraries.include?(library_name)
  if Processing.exported?
    begin
      return @loaded_libraries[library_name] = (require_relative "../library/#{library_name}")
    rescue LoadError => e
      return false
    end
  end
  path = get_library_paths(library_name, 'rb').first
  return false unless path
  @loaded_libraries[library_name] = (require path)
end

#platformObject



76
77
78
79
80
81
82
83
# File 'lib/ruby-processing/library_loader.rb', line 76

def platform
  match = %w(mac linux windows).find do |os|
    java.lang.System.getProperty('os.name').downcase.index(os)
  end
  return 'other' unless match
  return match unless match =~ /mac/
  'macosx'
end