class Puma::StateFile

Puma::Launcher uses StateFile to write a yaml file for use with Puma::ControlCLI.

In previous versions of Puma, YAML was used to read/write the state file. Since Puma is similar to Bundler/RubyGems in that it may load before one's app does, minimizing the dependencies that may be shared with the app is desired.

At present, it only works with numeric and string values. It is still a valid yaml file, and the CI tests parse it with Psych.

Constants

ALLOWED_FIELDS

Public Class Methods

new() click to toggle source
# File lib/puma/state_file.rb, line 18
def initialize
  @options = {}
end

Public Instance Methods

load(path) click to toggle source
# File lib/puma/state_file.rb, line 42
def load(path)
  File.read(path).lines.each do |line|
    next if line.start_with? '#'
    k,v = line.split ':', 2
    next unless v && ALLOWED_FIELDS.include?(k)
    v = v.strip
    @options[k] =
      case v
      when ''              then nil
      when /\A\d+\z/       then v.to_i
      when /\A\d+\.\d+\z/  then v.to_f
      else                      v.gsub(/\A"|"\z/, '')
      end
  end
end
save(path, permission = nil) click to toggle source
# File lib/puma/state_file.rb, line 22
def save(path, permission = nil)
  contents = +"---\n"
  @options.each do |k,v|
    next unless ALLOWED_FIELDS.include? k
    case v
    when Numeric
      contents << "#{k}: #{v}\n"
    when String
      next if v.strip.empty?
      contents << (k == 'running_from' || v.to_s.include?(' ') ?
        "#{k}: \"#{v}\"\n" : "#{k}: #{v}\n")
    end
  end
  if permission
    File.write path, contents, mode: 'wb:UTF-8'
  else
    File.write path, contents, mode: 'wb:UTF-8', perm: permission
  end
end