class GirFFI::Builders::ModuleBuilder

Builds a module based on information found in the introspection repository.

Public Class Methods

new(module_name, namespace: module_name, version: nil) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 14
def initialize(module_name, namespace: module_name, version: nil)
  @namespace = namespace
  @version = version
  @safe_namespace = module_name
end

Public Instance Methods

build_namespaced_class(classname) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 38
def build_namespaced_class(classname)
  info = find_namespaced_class_info(classname)
  Builder.build_class info
end
find_namespaced_class_info(classname) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 43
def find_namespaced_class_info(classname)
  name = classname.to_s
  info = gir.find_by_name(@namespace, name) ||
         gir.find_by_name(@namespace, name.sub(/^./, &:downcase))
  unless info
    raise NameError,
          "Class #{classname} not found in namespace #{@namespace}"
  end
  info
end
generate() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 20
def generate
  modul
end
method_available?(method) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 34
def method_available?(method)
  function_introspection_data(method.to_s) and true
end
setup_method(method) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 24
def setup_method(method)
  go = function_introspection_data method.to_s
  return false unless go

  Builder.attach_ffi_function lib, go
  modul.class_eval FunctionBuilder.new(go).method_definition, __FILE__, __LINE__

  true
end

Private Instance Methods

already_set_up() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 83
def already_set_up
  @module.const_defined? :GIR_FFI_BUILDER
end
build_dependencies() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 66
def build_dependencies
  deps = gir.dependencies @namespace
  deps.each do |dep|
    name, version = dep.split "-"
    Builder.build_module name, version
  end
end
function_introspection_data(function) click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 108
def function_introspection_data(function)
  info = gir.find_by_name @namespace, function.to_s
  return unless info

  info.info_type == :function ? info : nil
end
gir() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 115
def gir
  @gir ||= GObjectIntrospection::IRepository.default.tap do |it|
    it.require @namespace, @version
  end
end
instantiate_module() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 74
def instantiate_module
  @module = get_or_define_module ::Object, @safe_namespace
end
lib() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 104
def lib
  @lib ||= get_or_define_module modul, :Lib
end
lib_already_set_up() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 100
def lib_already_set_up
  (class << lib; self; end).include? FFI::Library
end
modul() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 56
def modul
  unless defined? @module
    build_dependencies
    instantiate_module
    setup_lib_for_ffi unless lib_already_set_up
    setup_module unless already_set_up
  end
  @module
end
setup_lib_for_ffi() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 87
def setup_lib_for_ffi
  lib.extend FFI::Library
  lib.extend FFI::BitMasks
  lib.ffi_lib_flags :global, :lazy
  if shared_library_specification
    lib.ffi_lib(*shared_library_specification.split(/,/))
  end
end
setup_module() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 78
def setup_module
  @module.extend ModuleBase
  @module.const_set :GIR_FFI_BUILDER, self
end
shared_library_specification() click to toggle source
# File lib/gir_ffi/builders/module_builder.rb, line 96
def shared_library_specification
  @shared_library_specification ||= gir.shared_library(@namespace)
end