feat: initial release of volumen — a file-based Markdown blog engine
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "optparse"
|
||||
require_relative "version"
|
||||
require_relative "config"
|
||||
require_relative "store"
|
||||
require_relative "password"
|
||||
|
||||
module Volumen
|
||||
# Command-line interface: serve, hash-password, version, help.
|
||||
class CLI
|
||||
USAGE = <<~TEXT.freeze
|
||||
volumen #{Volumen::VERSION} — a small, file-based Markdown blog engine.
|
||||
|
||||
Usage:
|
||||
volumen serve [--config PATH] [--content DIR] [--host HOST] [--port PORT]
|
||||
volumen hash-password
|
||||
volumen version
|
||||
volumen help
|
||||
TEXT
|
||||
|
||||
def self.run(argv)
|
||||
new(argv).run
|
||||
end
|
||||
|
||||
def initialize(argv)
|
||||
@argv = argv.dup
|
||||
end
|
||||
|
||||
def run
|
||||
command = @argv.shift
|
||||
case command
|
||||
when "version", "--version", "-v" then puts Volumen::VERSION
|
||||
when "help", "--help", "-h", nil then puts USAGE
|
||||
when "serve" then serve
|
||||
when "hash-password" then hash_password
|
||||
else
|
||||
warn "volumen: unknown command #{command.inspect}\n\n#{USAGE}"
|
||||
exit 1
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def serve
|
||||
options = parse_serve_options
|
||||
prepare_config(options[:config])
|
||||
config = Config.load(path: options[:config], overrides: options)
|
||||
|
||||
require_relative "server"
|
||||
store = Store.new(config.content_dir, default_lang: config.language)
|
||||
app = Server.configured(config: config, store: store)
|
||||
app.run!(bind: config.host, port: config.port)
|
||||
end
|
||||
|
||||
def parse_serve_options
|
||||
options = { config: Config::DEFAULT_PATH }
|
||||
OptionParser.new do |parser|
|
||||
parser.on("--config PATH") { |value| options[:config] = value }
|
||||
parser.on("--content DIR") { |value| options[:content] = value }
|
||||
parser.on("--host HOST") { |value| options[:host] = value }
|
||||
parser.on("--port PORT", Integer) { |value| options[:port] = value }
|
||||
end.parse!(@argv)
|
||||
options
|
||||
end
|
||||
|
||||
def prepare_config(path)
|
||||
if Config.generate_default(path)
|
||||
warn "volumen: wrote a default config to #{path}; review it and restart."
|
||||
elsif !File.exist?(path)
|
||||
warn "volumen: config #{path} not found; using built-in defaults."
|
||||
end
|
||||
end
|
||||
|
||||
def hash_password
|
||||
require "io/console"
|
||||
print "Password: "
|
||||
password = ($stdin.noecho(&:gets) || "").chomp
|
||||
puts
|
||||
if password.empty?
|
||||
warn "volumen: empty password"
|
||||
exit 1
|
||||
end
|
||||
puts Password.hash(password)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user