Class: Puma::StateFile

Inherits:
Object
  • Object
show all
Defined in:
lib/puma/state_file.rb

Overview

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.

Constant Summary collapse

ALLOWED_FIELDS =
%w!control_url control_auth_token pid running_from!

Instance Method Summary collapse

Constructor Details

#initializeStateFile

Returns a new instance of StateFile.



18
19
20
# File 'lib/puma/state_file.rb', line 18

def initialize
  @options = {}
end

Instance Method Details

#load(path) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 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) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 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