require "option_parser" require "yaml" module Guff class Config DEFAULTS = { "host": "localhost", "port": "8989", "data": "./data", "public": "./public", "environment": "development", "stuff": "/usr/local/share/guff/stuff", } DIRS = %w{ data public } def initialize(app, args) @data = defaults parse_args(app, args) end def [](key : String) : String @data[key] end def []=(key : String, val : String | Nil) : String @data[key] = val end private def defaults : Hash(String, String) DEFAULTS.merge(DEFAULTS.keys.reduce({} of String => String) do |r, key| env_key = "GUFF_" + key.upcase r[key] = ENV[env_key] if ENV.has_key?(env_key) r end) end private def parse_args(app, args) OptionParser.parse(args) do |p| p.on( "--config PATH", "Read config from YAML file." ) do |path| YAML.parse(File.read(path)).each do |k, v| self[k.as_s] = v.as_s end end p.on( "-h HOST", "--host HOST", "Host (defaults to \"%s\")." % [ DEFAULTS["host"] ] ) do |host| self["host"] = host end p.on( "-p PORT", "--port PORT", "Port (defaults to %s)." % [ DEFAULTS["port"] ] ) do |port| self["port"] = port end p.on( "-d PATH", "--data-dir PATH", "Path to data directory (defaults to \"%s\")." % [ DEFAULTS["data"], ] ) do |path| self["data"] = path end p.on( "--public-dir PATH", "Path to public directory (defaults to \"%s\")." % [ DEFAULTS["public"], ] ) do |path| self["public"] = path end p.on( "--stuff-dir PATH", "Path to Guff static files directory (defaults to \"%s\")." % [ DEFAULTS["stuff"], ] ) do |path| self["stuff"] = path end p.on( "-e ENV", "--environment ENV", "Environment (defaults to \"%s\")." % [ DEFAULTS["environment"], ] ) do |path| self["public"] = path end p.on( "--help", "Print usage" ) do puts p.to_s exit 0 end end # expand output directory paths and create them %w{data public}.each do |key| # expand path (unless it is absolute) self[key] = File.expand_path(File.join( File.dirname(app), self[key] )) unless self[key][0] == '/' # puts "DEBUG: %s: %s" % [key, self[key]] Dir.mkdir(self[key], 0o770) unless Dir.exists?(self[key]) end end end end