93 lines
1.8 KiB
Ruby
93 lines
1.8 KiB
Ruby
require "foreman"
|
|
|
|
# Reads and writes Procfiles
|
|
#
|
|
# A valid Procfile entry is captured by this regex:
|
|
#
|
|
# /^([A-Za-z0-9_]+):\s*(.+)$/
|
|
#
|
|
# All other lines are ignored.
|
|
#
|
|
class Foreman::Procfile
|
|
|
|
# Initialize a Procfile
|
|
#
|
|
# @param [String] filename (nil) An optional filename to read from
|
|
#
|
|
def initialize(filename=nil)
|
|
@entries = []
|
|
load(filename) if filename
|
|
end
|
|
|
|
# Yield each +Procfile+ entry in order
|
|
#
|
|
def entries(&blk)
|
|
@entries.each do |(name, command)|
|
|
yield name, command
|
|
end
|
|
end
|
|
|
|
# Retrieve a +Procfile+ command by name
|
|
#
|
|
# @param [String] name The name of the Procfile entry to retrieve
|
|
#
|
|
def [](name)
|
|
@entries.detect { |n,c| name == n }.last
|
|
end
|
|
|
|
# Create a +Procfile+ entry
|
|
#
|
|
# @param [String] name The name of the +Procfile+ entry to create
|
|
# @param [String] command The command of the +Procfile+ entry to create
|
|
#
|
|
def []=(name, command)
|
|
delete name
|
|
@entries << [name, command]
|
|
end
|
|
|
|
# Remove a +Procfile+ entry
|
|
#
|
|
# @param [String] name The name of the +Procfile+ entry to remove
|
|
#
|
|
def delete(name)
|
|
@entries.reject! { |n,c| name == n }
|
|
end
|
|
|
|
# Load a Procfile from a file
|
|
#
|
|
# @param [String] filename The filename of the +Procfile+ to load
|
|
#
|
|
def load(filename)
|
|
@entries.replace parse(filename)
|
|
end
|
|
|
|
# Save a Procfile to a file
|
|
#
|
|
# @param [String] filename Save the +Procfile+ to this file
|
|
#
|
|
def save(filename)
|
|
File.open(filename, 'w') do |file|
|
|
file.puts self.to_s
|
|
end
|
|
end
|
|
|
|
# Get the +Procfile+ as a +String+
|
|
#
|
|
def to_s
|
|
@entries.map do |name, command|
|
|
[ name, command ].join(": ")
|
|
end.join("\n")
|
|
end
|
|
|
|
private
|
|
|
|
def parse(filename)
|
|
File.read(filename).gsub("\r\n","\n").split("\n").map do |line|
|
|
if line =~ /^([A-Za-z0-9_-]+):\s*(.+)$/
|
|
[$1, $2]
|
|
end
|
|
end.compact
|
|
end
|
|
|
|
end
|