ruby_cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +99 -0
- data/bin/hello_world +17 -0
- data/lib/ruby_cli.rb +121 -0
- metadata +69 -0
data/README.rdoc
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
= Ruby CLI
|
2
|
+
|
3
|
+
Author:: Martin Velez
|
4
|
+
Copyright:: Copyright (c) 2011 Martin Velez
|
5
|
+
License:: Distributed under the same terms as Ruby
|
6
|
+
|
7
|
+
= Description
|
8
|
+
|
9
|
+
"RubyCLI" is a Ruby library which factors out the code needed to create Ruby
|
10
|
+
programswith a command line interface (CLI) which follows the Unix Philosophy
|
11
|
+
design method outlined in http://www.faqs.org/docs/artu/ch01s06.html.
|
12
|
+
|
13
|
+
Currently, RubyCLI is short and simple. It uses Ruby's core Option Parser library.
|
14
|
+
|
15
|
+
= Design
|
16
|
+
|
17
|
+
What does a command line application library need to do?
|
18
|
+
1. Provide a user interface (UI)
|
19
|
+
a. Process options (use Ruby's Option Parser)
|
20
|
+
b. Process arguments
|
21
|
+
2. Pass options and arguments as parameters to other functions defined in libraries or other executables.
|
22
|
+
|
23
|
+
What does a command line application library need not do?
|
24
|
+
1. A command line application does not need to validate options or arguments. Libraries or other executables should do this.
|
25
|
+
|
26
|
+
= Installation
|
27
|
+
|
28
|
+
gem install ruby_cli
|
29
|
+
|
30
|
+
= Alternative Tools
|
31
|
+
|
32
|
+
There are other tools out there which can be used to write command line
|
33
|
+
applications.
|
34
|
+
|
35
|
+
- clamp[http://github.com/mdub/clamp]
|
36
|
+
** I don't like to learn new DSLs
|
37
|
+
- optparse[http://ruby-doc.org/stdlib/libdoc/optparse/rdoc/index.html]
|
38
|
+
** This library uses this to parse options.
|
39
|
+
- Thor[http://github.com/wycats/thor]
|
40
|
+
** It does not try to follow the Unix Philosophy.
|
41
|
+
- Clip[http://clip.rubyforge.org/]
|
42
|
+
** OptionParser already exists.
|
43
|
+
|
44
|
+
= Usage
|
45
|
+
|
46
|
+
0. New File
|
47
|
+
1. Require the ruby_cli gem.
|
48
|
+
2. Create a Ruby class.
|
49
|
+
3. Call it "App", for example.
|
50
|
+
4. Include the RubyCLI module.
|
51
|
+
5. Define the command method.
|
52
|
+
* This is where your program does the actual work.
|
53
|
+
* At this point you have options and arguments available.
|
54
|
+
* Pass them as parameters to library functions or as options/arguments to other executables.
|
55
|
+
* Be smart! Have libraries and other executables do the heavy work.
|
56
|
+
* Be smart! Fewer lines of code (LOC) is good.
|
57
|
+
6. Define command options and defaults (optional)
|
58
|
+
* This is where you define a hash for your options and set the default values.
|
59
|
+
* Remember, options by definition are optional.
|
60
|
+
7. Define command arguments and defaults (optional)
|
61
|
+
|
62
|
+
= Usage Example
|
63
|
+
|
64
|
+
This example demonstrates how to use RubyCLI to create a
|
65
|
+
#!/usr/bin/ruby
|
66
|
+
|
67
|
+
require 'ruby_cli'
|
68
|
+
|
69
|
+
class App
|
70
|
+
include RubyCLI
|
71
|
+
|
72
|
+
def command
|
73
|
+
puts "hello world"
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
if __FILE__ == $0
|
79
|
+
app = App.new(ARGV)
|
80
|
+
app.run
|
81
|
+
end
|
82
|
+
|
83
|
+
= Dependencies
|
84
|
+
|
85
|
+
* Ruby 1.8.7 or greater
|
86
|
+
|
87
|
+
= Acknowledgements
|
88
|
+
|
89
|
+
Todd Werth[http://blog.toddwerth.com/entries/5]
|
90
|
+
* I used his Ruby command line application skeleton code. I borrowed
|
91
|
+
some ideas from there.
|
92
|
+
|
93
|
+
= TODO
|
94
|
+
|
95
|
+
* ?
|
96
|
+
|
97
|
+
= Source Code
|
98
|
+
|
99
|
+
https://github.com/martinvelez/ruby_cli
|
data/bin/hello_world
ADDED
data/lib/ruby_cli.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
# The goal of this library is to factor out code needed to create Ruby
|
4
|
+
# command line applications which follow the Unix Philosophy design method
|
5
|
+
# (http://www.faqs.org/docs/artu/ch01s06.html).
|
6
|
+
#
|
7
|
+
# What does a command line application library need to do?
|
8
|
+
# 1. Provide a UI
|
9
|
+
# a. Process options (use Ruby's Option Parser)
|
10
|
+
# b. Process arguments
|
11
|
+
# 2. Pass options and arguments as parameters to other functions defined in
|
12
|
+
# libraries or other executables.
|
13
|
+
#
|
14
|
+
# What does a command line application library need not do?
|
15
|
+
# 1. A command line application does not need to validate options or arguments.
|
16
|
+
# Libraries or other executables should do this.
|
17
|
+
#
|
18
|
+
# This module serves as a mixin for Ruby Command Line Applications (CLI).
|
19
|
+
# Ruby commands can be written much easier by including this class and following
|
20
|
+
# the convention that I have outlined here.
|
21
|
+
#
|
22
|
+
# This is the core algorithm of any Ruby CLI application.
|
23
|
+
# def run
|
24
|
+
# if parse_options? && arguments_valid?
|
25
|
+
# process_options
|
26
|
+
# process_arguments
|
27
|
+
# output_options_and_arguments if @default_options[:verbose]
|
28
|
+
# command
|
29
|
+
# else
|
30
|
+
# output_help(1)
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
module RubyCLI
|
34
|
+
|
35
|
+
# Initialization of this application requires the command line arguments.
|
36
|
+
def initialize(default_argv)
|
37
|
+
@default_argv = default_argv
|
38
|
+
@default_options = {:help => false, :verbose => false}
|
39
|
+
define_command_options
|
40
|
+
define_command_arguments
|
41
|
+
@opt_parser = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
# This method can be overwritten if you want to set defaults for your command
|
45
|
+
# specific options.
|
46
|
+
def define_command_options() @options = {} end
|
47
|
+
|
48
|
+
# This method can be overwritten if you want to set defaults for your command
|
49
|
+
# specific arguments.
|
50
|
+
def define_command_arguments() @arguments = {} end
|
51
|
+
|
52
|
+
# Run the application
|
53
|
+
def run
|
54
|
+
if parse_options? && arguments_valid?
|
55
|
+
process_options
|
56
|
+
process_arguments
|
57
|
+
output_options_and_arguments if @default_options[:verbose]
|
58
|
+
command
|
59
|
+
else
|
60
|
+
output_help(1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
# Parse the options
|
66
|
+
# Redefine this method if you want to add command specific options
|
67
|
+
def parse_options?
|
68
|
+
#configure an OptionParser
|
69
|
+
@opt_parser = OptionParser.new do |opts|
|
70
|
+
opts.banner = "Usage: #{__FILE__} [OPTIONS]... [ARGUMENTS]..."
|
71
|
+
opts.separator ""
|
72
|
+
opts.separator "Specific options:"
|
73
|
+
opts.on('-h', '--help', 'displays help information') do
|
74
|
+
@default_options[:help] = true
|
75
|
+
exit output_help(0)
|
76
|
+
end
|
77
|
+
opts.on('-V','--verbose','Run verbosely') do
|
78
|
+
@default_options[:verbose] = true
|
79
|
+
end
|
80
|
+
# TODO: If you redefine, you can add command specific options here!
|
81
|
+
end
|
82
|
+
@opt_parser.parse!(@default_argv) rescue return false
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
# Check if the required number of arguments remains in the
|
87
|
+
# argv array after it has been processed by the option parser
|
88
|
+
def arguments_valid?()
|
89
|
+
return true if @arguments.size == 0
|
90
|
+
@default_argv.size == @arguments.size
|
91
|
+
end
|
92
|
+
|
93
|
+
def output_options_and_arguments
|
94
|
+
puts "OPTIONS:"
|
95
|
+
@default_options.each {|name, value| puts "#{name} = #{value}"}
|
96
|
+
@options.each {|name, value| puts "#{name} = #{value}"}
|
97
|
+
puts "No options" if @options.length == 0
|
98
|
+
|
99
|
+
puts "ARGUMENTS:"
|
100
|
+
@arguments.each {|name,value| puts "#{name} = #{value}"}
|
101
|
+
puts "No arguments" if @arguments.length == 0
|
102
|
+
end
|
103
|
+
|
104
|
+
# Performs post-parse processing on options
|
105
|
+
# For instance, some options may be mutually exclusive
|
106
|
+
# Redefine if you need to process options.
|
107
|
+
def process_options() true end
|
108
|
+
|
109
|
+
# Redefine if you need to process options.
|
110
|
+
def process_arguments() true end
|
111
|
+
|
112
|
+
# Application logic
|
113
|
+
def command() raise "This method should be overwritten." end
|
114
|
+
|
115
|
+
def output_help(exit_code)
|
116
|
+
puts @opt_parser
|
117
|
+
puts exit_code if @default_options[:verbose]
|
118
|
+
return exit_code
|
119
|
+
end
|
120
|
+
|
121
|
+
end # Application
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby_cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Martin Velez
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-11-11 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Factors out code needed to create Ruby command line applications
|
23
|
+
email: mvelez999@gmail.com
|
24
|
+
executables:
|
25
|
+
- hello_world
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- lib/ruby_cli.rb
|
32
|
+
- README.rdoc
|
33
|
+
- bin/hello_world
|
34
|
+
has_rdoc: true
|
35
|
+
homepage: http://github.com/martinvelez/ruby_cli
|
36
|
+
licenses: []
|
37
|
+
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
hash: 3
|
49
|
+
segments:
|
50
|
+
- 0
|
51
|
+
version: "0"
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
requirements: []
|
62
|
+
|
63
|
+
rubyforge_project:
|
64
|
+
rubygems_version: 1.3.7
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: A command line application library
|
68
|
+
test_files: []
|
69
|
+
|