1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00
puma--puma/lib/puma/state_file.rb
Kazuki Nishikawa 93815b234b
Fix Puma::StateFile#load returns empty string instead of nil (#2810)
Bug introduced in 2b6968f9d4 #2784

Until 5.5.2, empty values were read as `nil`.
Since 5.6.0, empty values are read as `""`.
2022-01-27 08:16:01 -06:00

71 lines
1.9 KiB
Ruby

# frozen_string_literal: true
module Puma
# 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.
#
class StateFile
ALLOWED_FIELDS = %w!control_url control_auth_token pid running_from!
# @deprecated 6.0.0
FIELDS = ALLOWED_FIELDS
def initialize
@options = {}
end
def save(path, permission = nil)
contents = "---\n".dup
@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
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
ALLOWED_FIELDS.each do |f|
define_method f do
@options[f]
end
define_method "#{f}=" do |v|
@options[f] = v
end
end
end
end