class Kamaze::Project::Tools::ProcessLocker

Process Locker

@see github.com/ianheggie/process_lock

Attributes

fs[R]

@return [Module<FileUtils>]

inflector[R]

@return [Dry::Inflector]

lockdir[R]

@return [String]

Public Class Methods

method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/kamaze/project/tools/process_locker.rb, line 77
def method_missing(method, *args, &block)
  if respond_to_missing?(method)
    return self.new.public_send(method, *args, &block)
  end

  super
end
respond_to_missing?(method, include_private = false) click to toggle source
Calls superclass method
# File lib/kamaze/project/tools/process_locker.rb, line 85
def respond_to_missing?(method, include_private = false)
  return true if self.new.respond_to?(method, include_private)

  super(method, include_private)
end

Public Instance Methods

lock(lockname) { || ... } click to toggle source

Manage lock on given block

@return [Object]

# File lib/kamaze/project/tools/process_locker.rb, line 46
def lock(lockname)
  mklock(lockname).acquire { yield }
end
lock!(lockname) { || ... } click to toggle source

Manage lock on given block

@raise [Errno::EALREADY] @raise [ProcessLock::AlreadyLocked] @return [Object]

# File lib/kamaze/project/tools/process_locker.rb, line 55
def lock!(lockname)
  mklock(lockname).acquire! { yield }
rescue ProcessLock::AlreadyLocked
  # noinspection RubyResolve
  raise Errno::EALREADY if mklock(lockname).alive?

  raise
end
lockdir=(lockdir) click to toggle source

Set name for lockdir.

@see tmpdir @see setup

# File lib/kamaze/project/tools/process_locker.rb, line 37
def lockdir=(lockdir)
  inflector.classify(lockdir).yield_self { |s| inflector.underscore(s) }.tap do |name|
    @lockdir = name
  end
end
mutable_attributes() click to toggle source
# File lib/kamaze/project/tools/process_locker.rb, line 29
def mutable_attributes
  [:lockdir]
end
tmpdir() click to toggle source

Get tmpdir where lock files are stored.

@return [Pathname]

# File lib/kamaze/project/tools/process_locker.rb, line 67
def tmpdir
  require 'tmpdir' unless Dir.respond_to?(:tmpdir)

  Pathname.new(Dir.tmpdir).join('%<libname>s.%<uid>s' % { # @formatter:off
    libname: inflector.underscore(self.class.name).split('/')[0..1].join('-'),
    uid: Etc.getpwnam(Etc.getlogin).uid, # @formatter:on
  }, lockdir)
end

Protected Instance Methods

mklock(lockname) click to toggle source

@param [String] lockname @return [ProcessLock]

# File lib/kamaze/project/tools/process_locker.rb, line 115
def mklock(lockname)
  mktemp(lockname).yield_self { |lockfile| ProcessLock.new(lockfile) }
end
mktemp(lockname) click to toggle source

Create a temporary file

@param [String] lockname @return [Pathname]

# File lib/kamaze/project/tools/process_locker.rb, line 123
def mktemp(lockname)
  Pathname.new(lockname.to_s).basename('.*').yield_self { |fp| mktmpdir.join(fp) }
end
mktmpdir(**options) click to toggle source

Create “tmpdir“

@return [Pathname]

# File lib/kamaze/project/tools/process_locker.rb, line 130
def mktmpdir(**options)
  self.tmpdir.tap do |tmpdir|
    options[:mode] ||= 0o700

    fs.mkdir_p(tmpdir, **options)
  end
end
setup() click to toggle source
# File lib/kamaze/project/tools/process_locker.rb, line 100
def setup
  @fs ||= FileUtils
  @inflector ||= Kamaze::Project::Inflector.new

  unless lockdir # rubocop:disable Style/GuardClause
    self.lockdir = lambda do
      return Kamaze::Project.instance.name if Kamaze::Project.instance

      Digest::SHA1.hexdigest(__FILE__) # Does not avoid collision if package is globally installed
    end.call
  end
end