module BFS

Public Class Methods

defer(obj, method) click to toggle source
# File lib/bfs.rb, line 83
def self.defer(obj, method)
  owner = Process.pid
  ObjectSpace.define_finalizer(obj, ->(*) { obj.send(method) if Process.pid == owner })
end
norm_mode(mode) click to toggle source
# File lib/bfs.rb, line 78
def self.norm_mode(mode)
  mode = mode.to_i(8) if mode.is_a?(String)
  mode & 0o000777
end
norm_path(path) click to toggle source
# File lib/bfs.rb, line 70
def self.norm_path(path)
  path = path.to_s.dup
  path.gsub!(File::SEPARATOR, '/')
  path.sub!(%r{^/+}, '')
  path.sub!(%r{/+$}, '')
  path
end
register(*schemes, &resolver) click to toggle source
# File lib/bfs.rb, line 38
def self.register(*schemes, &resolver)
  @registry ||= {}
  schemes.each do |scheme|
    scheme = scheme.to_s
    raise(ArgumentError, "scheme #{scheme} is already registered") if @registry.key?(scheme)

    @registry[scheme] = resolver
  end
end
resolve(url, &block) click to toggle source
# File lib/bfs.rb, line 58
def self.resolve(url, &block)
  url = url.is_a?(::URI) ? url.dup : URI.parse(url)
  rsl = @registry[url.scheme]
  raise ArgumentError, "Unable to resolve #{url}, scheme #{url.scheme} is not registered" unless rsl

  opts = {}
  CGI.parse(url.query.to_s).each do |key, values|
    opts[key.to_sym] = values.first
  end
  rsl.call(url, opts, block)
end
unregister(*schemes) click to toggle source
# File lib/bfs.rb, line 48
def self.unregister(*schemes)
  @registry ||= {}
  schemes.each do |scheme|
    scheme = scheme.to_s
    raise(ArgumentError, "scheme #{scheme} is not registered") unless @registry.key?(scheme)

    @registry.delete(scheme)
  end
end