aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorelijah <elijah@riseup.net>2012-12-09 22:24:57 -0800
committerelijah <elijah@riseup.net>2013-02-23 16:46:28 -0800
commit0db0bc3b6f0bc616fa9b1319be3083e4ea6affce (patch)
tree2ea0c6390a86143b773a7dc66304ca074046ffc4 /lib
parentef718864cabfa95d4fbed037022f6688d86f87b1 (diff)
downloadleap_cli-0db0bc3b6f0bc616fa9b1319be3083e4ea6affce.tar.gz
leap_cli-0db0bc3b6f0bc616fa9b1319be3083e4ea6affce.tar.bz2
initial experiments with auto doc creation
Diffstat (limited to 'lib')
-rw-r--r--lib/leap_cli/app.rb57
-rw-r--r--lib/lib_ext/markdown_document_listener.rb122
2 files changed, 179 insertions, 0 deletions
diff --git a/lib/leap_cli/app.rb b/lib/leap_cli/app.rb
new file mode 100644
index 0000000..90c4ae9
--- /dev/null
+++ b/lib/leap_cli/app.rb
@@ -0,0 +1,57 @@
+require 'gli'
+require 'highline'
+require 'forwardable'
+require 'lib_ext/gli' # our custom extensions to gli
+
+#
+# Typically, GLI and Highline methods are loaded into the global namespace.
+# Instead, here we load these into the module LeapCli::Commands in order to
+# ensure that the cli logic and code is kept isolated to leap_cli/commands/*.rb
+#
+# no cheating!
+#
+module LeapCli::Commands
+ extend GLI::App
+ extend Forwardable
+
+ #
+ # delegate highline methods to make them available to sub-commands
+ #
+ @terminal = HighLine.new
+ def_delegator :@terminal, :ask, 'self.ask'
+ def_delegator :@terminal, :agree, 'self.agree'
+ def_delegator :@terminal, :choose, 'self.choose'
+ def_delegator :@terminal, :say, 'self.say'
+ def_delegator :@terminal, :color, 'self.color'
+ def_delegator :@terminal, :list, 'self.list'
+
+ #
+ # make config manager available as 'manager'
+ #
+ def self.manager
+ @manager ||= begin
+ manager = LeapCli::Config::Manager.new
+ manager.load
+ manager
+ end
+ end
+
+ #
+ # info about leap command line suite
+ #
+ program_desc LeapCli::SUMMARY
+ program_long_desc LeapCli::DESCRIPTION
+
+ #
+ # handle --version ourselves
+ #
+ if ARGV.grep(/--version/).any?
+ puts "leap #{LeapCli::VERSION}, ruby #{RUBY_VERSION}"
+ exit(0)
+ end
+
+ #
+ # load commands and run
+ #
+ commands_from('leap_cli/commands')
+end
diff --git a/lib/lib_ext/markdown_document_listener.rb b/lib/lib_ext/markdown_document_listener.rb
new file mode 100644
index 0000000..55026e9
--- /dev/null
+++ b/lib/lib_ext/markdown_document_listener.rb
@@ -0,0 +1,122 @@
+require 'stringio'
+require 'gli/commands/help_modules/arg_name_formatter'
+
+#
+# adaption of RdocDocumentListener to use Markdown
+# see http://rtomayko.github.com/ronn/ronn-format.7
+#
+
+module GLI
+ module Commands
+ class MarkdownDocumentListener
+
+ def initialize(global_options,options,arguments)
+ @io = STDOUT #File.new(File.basename($0) + ".rdoc",'w')
+ @nest = ''
+ @arg_name_formatter = GLI::Commands::HelpModules::ArgNameFormatter.new
+ end
+
+ def beginning
+ end
+
+ # Called when processing has completed
+ def ending
+ #@io.close
+ end
+
+ # Gives you the program description
+ def program_desc(desc)
+ @io.puts "== #{File.basename($0)} - #{desc}"
+ @io.puts
+ end
+
+ def program_long_desc(desc)
+ @io.puts desc
+ @io.puts
+ end
+
+ # Gives you the program version
+ def version(version)
+ @io.puts "v#{version}"
+ @io.puts
+ end
+
+ def options
+ if @nest.size == 0
+ @io.puts "=== Global Options"
+ else
+ @io.puts "#{@nest}=== Options"
+ end
+ end
+
+ # Gives you a flag in the current context
+ def flag(name,aliases,desc,long_desc,default_value,arg_name,must_match,type)
+ invocations = ([name] + Array(aliases)).map { |_| add_dashes(_) }.join('|')
+ usage = "#{invocations} #{arg_name || 'arg'}"
+ @io.puts "#{@nest}=== #{usage}"
+ @io.puts
+ @io.puts String(desc).strip
+ @io.puts
+ @io.puts "[Default Value] #{default_value || 'None'}"
+ @io.puts "[Must Match] #{must_match.to_s}" unless must_match.nil?
+ @io.puts String(long_desc).strip
+ @io.puts
+ end
+
+ # Gives you a switch in the current context
+ def switch(name,aliases,desc,long_desc,negetable)
+ if negetable
+ name = "[no-]#{name}" if name.to_s.length > 1
+ aliases = aliases.map { |_| _.to_s.length > 1 ? "[no-]#{_}" : _ }
+ end
+ invocations = ([name] + aliases).map { |_| add_dashes(_) }.join('|')
+ @io.puts "#{@nest}=== #{invocations}"
+ @io.puts String(desc).strip
+ @io.puts
+ @io.puts String(long_desc).strip
+ @io.puts
+ end
+
+ def end_options
+ end
+
+ def commands
+ @io.puts "#{@nest}=== Commands"
+ @nest = "#{@nest}="
+ end
+
+ # Gives you a command in the current context and creates a new context of this command
+ def command(name,aliases,desc,long_desc,arg_name,arg_options)
+ @io.puts "#{@nest}=== Command: <tt>#{([name] + aliases).join('|')} #{@arg_name_formatter.format(arg_name,arg_options)}</tt>"
+ @io.puts String(desc).strip
+ @io.puts
+ @io.puts String(long_desc).strip
+ @nest = "#{@nest}="
+ end
+
+ # Ends a command, and "pops" you back up one context
+ def end_command(name)
+ @nest.gsub!(/=$/,'')
+ end
+
+ # Gives you the name of the current command in the current context
+ def default_command(name)
+ @io.puts "[Default Command] #{name}" unless name.nil?
+ end
+
+ def end_commands
+ @nest.gsub!(/=$/,'')
+ end
+
+ private
+
+ def add_dashes(name)
+ name = "-#{name}"
+ name = "-#{name}" if name.length > 2
+ name
+ end
+
+
+ end
+ end
+end