Class: RFuse::FuseDelegator

Inherits:
Fuse
  • Object
show all
Defined in:
lib/rfuse.rb

Overview

This class is useful to make your filesystem implementation debuggable and testable without needing to mount an actual filesystem or inherit from Fuse

Instance Attribute Summary

Attributes inherited from Fuse

#mountpoint

Instance Method Summary collapse

Methods inherited from Fuse

#exit, #loop, #mounted?, #run, #trap_signals

Constructor Details

#initialize(fuse_object, mountpoint, *options) ⇒ FuseDelegator

Create and mount a filesystem

Parameters:

  • fuse_object (Object)

    your filesystem object that responds to fuse methods

  • mountpoint (String)

    existing directory where the filesystem will be mounted

  • options (String...)

    fuse mount options (use "-h" to see a list)



367
368
369
370
371
# File 'lib/rfuse.rb', line 367

def initialize(fuse_object, mountpoint, *options)
  @fuse_delegate = fuse_object
  @debug = $DEBUG
  super(mountpoint, *options)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args, &block) ⇒ Object



401
402
403
404
405
406
407
408
409
410
411
412
413
# File 'lib/rfuse.rb', line 401

def method_missing(method_name, *args, &block)
  return super unless FFI::Libfuse::FuseOperations.fuse_callbacks.include?(method_name) && @fuse_delegate.respond_to?(method_name)
  begin
    $stderr.puts "==> \#{ self }.#{method_name}(\#{args.inspect })" if debug?
    result = @fuse_delegate.send(method_name,*args,&block)
      $stderr.puts "<== \#{ self }.#{method_name}()"  if debug?
    result
  rescue => ex
    $@.delete_if{|s| /^\\(__FUSE_DELEGATE__\\):/ =~ s}
    $stderr.puts(ex.message) unless ex.respond_to?(:errno) || debug?
    Kernel::raise
  end
end

Instance Method Details

#call_sigmethod(sigmethod) ⇒ Object



415
416
417
418
419
420
# File 'lib/rfuse.rb', line 415

def call_sigmethod(sigmethod)
  warn "==> #{self}.#{sigmethod}()" if debug?
  dlg = @fuse_delegate.respond_to?(sigmethod) ? @fuse_delegate : self
  dlg.send(sigmethod)
  warn "<== #{self}.#{sigmethod}()" if debug?
end

#debug?Boolean

Returns:

  • (Boolean)


379
380
381
# File 'lib/rfuse.rb', line 379

def debug?
  @debug
end

#fuse_respond_to?(fuse_method) ⇒ Boolean

Returns:

  • (Boolean)


388
389
390
391
392
393
394
395
# File 'lib/rfuse.rb', line 388

def fuse_respond_to?(fuse_method)
  return false unless @fuse_delegate.respond_to?(fuse_method)

  m = @fuse_delegate.method(fuse_method)
  m = m.super_method while m && FFI::Libfuse::Adapter.include?(m.owner)

  m && true
end

#respond_sigmethod?(sigmethod) ⇒ Boolean

Returns:

  • (Boolean)


422
423
424
# File 'lib/rfuse.rb', line 422

def respond_sigmethod?(sigmethod)
  @fuse_delegate.respond_to?(sigmethod) || respond_to?(sigmethod)
end

#respond_to_missing?(method, private = false) ⇒ Boolean

Returns:

  • (Boolean)


397
398
399
# File 'lib/rfuse.rb', line 397

def respond_to_missing?(method, private=false)
  FFI::Libfuse::FuseOperations.fuse_callbacks.include?(method) ? @fuse_delegate.respond_to?(method, private) : super
end

#sigusr1void

This method returns an undefined value.

USR1 sig handler - toggle debugging of fuse methods



375
376
377
# File 'lib/rfuse.rb', line 375

def sigusr1
  @debug = !debug?
end