From 021233a77749dfe629e99fb621fd89d0ba0bd83d Mon Sep 17 00:00:00 2001 From: Kevin Dew Date: Wed, 21 Sep 2016 10:55:31 +0100 Subject: [PATCH] Binary to run govspeak from CLI Introduces a `govspeak` bin which can take input in three ways: 1. As an argument: `govspeak "render me"` 2. From a file: `govspeak --file render-me.md` 3. From stdin: `echo "render-me" | govspeak` All output to stdout Govspeak options can be passed in as JSON as a string through `--options` or as a file through `--options-file options.json` --- bin/govspeak | 8 +++++++ govspeak.gemspec | 4 ++++ lib/govspeak/cli.rb | 51 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100755 bin/govspeak create mode 100644 lib/govspeak/cli.rb diff --git a/bin/govspeak b/bin/govspeak new file mode 100755 index 00000000..92beab84 --- /dev/null +++ b/bin/govspeak @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby + +lib = File.expand_path("../../lib", __FILE__) +$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) + +require "govspeak/cli" + +Govspeak::CLI.new.run diff --git a/govspeak.gemspec b/govspeak.gemspec index 835da577..9b28784a 100644 --- a/govspeak.gemspec +++ b/govspeak.gemspec @@ -15,6 +15,7 @@ Gem::Specification.new do |s| library for use in the UK Government Single Domain project} s.files = Dir[ + 'bin/*', 'lib/**/*', 'README.md', 'CHANGELOG.md', @@ -22,6 +23,8 @@ library for use in the UK Government Single Domain project} 'Rakefile' ] s.test_files = Dir['test/**/*'] + s.bindir = "bin" + s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) } s.require_paths = ["lib"] s.add_dependency 'kramdown', '~> 1.10.0' @@ -32,6 +35,7 @@ library for use in the UK Government Single Domain project} s.add_dependency 'actionview', '~> 4.1' s.add_dependency 'i18n', '~> 0.7' s.add_dependency 'money', '~> 6.7' + s.add_dependency 'commander', '~> 4.4' s.add_development_dependency 'rake', '~> 0.9.0' s.add_development_dependency 'gem_publisher', '~> 1.1.1' diff --git a/lib/govspeak/cli.rb b/lib/govspeak/cli.rb new file mode 100644 index 00000000..4395e633 --- /dev/null +++ b/lib/govspeak/cli.rb @@ -0,0 +1,51 @@ +require 'govspeak/version' +require 'govspeak' +require 'commander' + +module Govspeak + class CLI + include Commander::Methods + + def run + program(:name, 'Govspeak') + program(:version, Govspeak::VERSION) + program(:description, "A tool for rendering the GOV.UK dialect of markdown into HTML") + default_command(:render) + command(:render) do |command| + command.syntax = "govspeak render [options] " + command.description = "Render Govspeak into HTML, can be sourced from stdin, as an argument or from a file" + command.option("--file FILENAME", String, "File to render") + command.option("--options JSON", String, "JSON to use as options") + command.option("--options-file FILENAME", String, "A file of JSON options") + command.action do |args, options| + input = get_input($stdin, args, options) + raise "Nothing to render. Use --help for assistance" unless input + puts Govspeak::Document.new(input, govspeak_options(options)).to_html + end + end + run! + end + + private + + def get_input(stdin, args, options) + return stdin.read unless stdin.tty? + return read_file(options.file) if options.file + args.empty? ? nil : args.join(" ") + end + + def read_file(file_path) + path = Pathname.new(file_path).realpath + File.read(path) + end + + def govspeak_options(command_options) + string = if command_options.options_file + read_file(command_options.options_file) + else + command_options.options + end + string ? JSON.load(string) : {} + end + end +end