wojtekmach-cli 0.0.1 → 0.1.0
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/.gitignore +7 -3
- data/.rspec +2 -0
- data/.yardopts +1 -0
- data/Gemfile +3 -0
- data/Guardfile +17 -0
- data/LICENSE +18 -0
- data/README.md +45 -0
- data/Rakefile +3 -18
- data/cli.gemspec +24 -0
- data/lib/cli/app.rb +92 -0
- data/lib/cli/version.rb +4 -0
- data/lib/cli.rb +5 -24
- data/spec/cli/app_spec.rb +82 -0
- data/spec/spec_helper.rb +2 -0
- metadata +50 -28
- data/VERSION +0 -1
- data/examples/rcat +0 -20
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
-
|
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :version => 2 do
|
5
|
+
watch(%r{^spec/.+_spec\.rb})
|
6
|
+
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch('spec/spec_helper.rb') { "spec" }
|
11
|
+
watch('config/routes.rb') { "spec/routing" }
|
12
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
13
|
+
watch(%r{^spec/.+_spec\.rb})
|
14
|
+
watch(%r{^app/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
|
15
|
+
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
16
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
17
|
+
end
|
data/LICENSE
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Copyright (c) 2011 Wojciech Mach
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to
|
5
|
+
deal in the Software without restriction, including without limitation the
|
6
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
16
|
+
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# CLI
|
2
|
+
|
3
|
+
A CLI app framework
|
4
|
+
|
5
|
+
## Setup
|
6
|
+
|
7
|
+
git clone /path/to/cli.git
|
8
|
+
cd cli
|
9
|
+
rake install
|
10
|
+
|
11
|
+
## Example
|
12
|
+
|
13
|
+
Let's say you have a file `hello.rb`:
|
14
|
+
|
15
|
+
#!/usr/bin/env ruby
|
16
|
+
require "rubygems"
|
17
|
+
require "cli"
|
18
|
+
|
19
|
+
CLI.app do
|
20
|
+
name "hello"
|
21
|
+
version "0.0.1"
|
22
|
+
|
23
|
+
option "-m", "--message MSG" do |msg|
|
24
|
+
options[:msg] = msg
|
25
|
+
end
|
26
|
+
|
27
|
+
action "hi" do
|
28
|
+
puts "Hi, World!"
|
29
|
+
end
|
30
|
+
|
31
|
+
default do
|
32
|
+
str = options[:msg] || "Hello"
|
33
|
+
puts "#{str}, World!"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
You can now use it like this:
|
38
|
+
|
39
|
+
ruby hello.rb # => Hello, World!
|
40
|
+
ruby hello.rb hi # => Hi, World!
|
41
|
+
ruby hello.rb -m Bye # => Bye, World!
|
42
|
+
|
43
|
+
## Licence
|
44
|
+
|
45
|
+
CLI is Copyright (c) 2011 Wojciech Mach and distributed under the MIT license. See the LICENCE file for more info.
|
data/Rakefile
CHANGED
@@ -1,18 +1,3 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gemspec|
|
7
|
-
gemspec.name = "wojtekmach-cli"
|
8
|
-
gemspec.summary = "Create simple CLI apps"
|
9
|
-
gemspec.description = "Create simple CLI apps"
|
10
|
-
gemspec.email = "wojtekmach1@gmail.com"
|
11
|
-
gemspec.authors = ["Wojtek Mach"]
|
12
|
-
end
|
13
|
-
Jeweler::GemcutterTasks.new
|
14
|
-
rescue LoadError
|
15
|
-
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
16
|
-
end
|
17
|
-
|
18
|
-
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
1
|
+
require 'bundler'
|
2
|
+
|
3
|
+
Bundler::GemHelper.install_tasks
|
data/cli.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "cli/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "wojtekmach-cli"
|
7
|
+
s.version = CLI::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Wojciech Mach"]
|
10
|
+
s.email = ["wojtekmach1@gmail.com"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = "cli-#{s.version}"
|
13
|
+
s.description = %q{CLI apps framework.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "cli"
|
16
|
+
|
17
|
+
s.add_development_dependency "rspec"
|
18
|
+
s.add_development_dependency "guard"
|
19
|
+
|
20
|
+
s.files = `git ls-files`.split("\n")
|
21
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
end
|
data/lib/cli/app.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
module CLI
|
4
|
+
# An App
|
5
|
+
class App
|
6
|
+
attr_accessor :binary, :name, :version
|
7
|
+
attr_reader :proxy, :args, :opts, :options
|
8
|
+
|
9
|
+
def initialize(binary, &block)
|
10
|
+
@binary = binary
|
11
|
+
@name = binary
|
12
|
+
@actions = {}
|
13
|
+
@proxy = Proxy.new(self)
|
14
|
+
@args = []
|
15
|
+
@opts = OptionParser.new
|
16
|
+
@options = {}
|
17
|
+
proxy.instance_eval &block
|
18
|
+
end
|
19
|
+
|
20
|
+
# Hash of action_name => block to be executed
|
21
|
+
def actions
|
22
|
+
@actions
|
23
|
+
end
|
24
|
+
|
25
|
+
# Defines an action
|
26
|
+
def action(name, &block)
|
27
|
+
@actions[name] = block
|
28
|
+
end
|
29
|
+
|
30
|
+
# Runs an action
|
31
|
+
def run(action_name)
|
32
|
+
block = @actions[action_name]
|
33
|
+
|
34
|
+
unless block
|
35
|
+
raise ArgumentError, "action '#{action_name}' not found"
|
36
|
+
end
|
37
|
+
|
38
|
+
instance_eval &block
|
39
|
+
end
|
40
|
+
|
41
|
+
# Parses the arguments (with OptionParser) and runs
|
42
|
+
# specified or default action.
|
43
|
+
def run!(args)
|
44
|
+
@opts.parse!(args)
|
45
|
+
@args = args
|
46
|
+
|
47
|
+
begin
|
48
|
+
if args == []
|
49
|
+
run "default"
|
50
|
+
else
|
51
|
+
run args[0]
|
52
|
+
end
|
53
|
+
rescue => e
|
54
|
+
puts e.message.capitalize
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Proxy class is responsible for cool DSL inside CLI.app do ... end block
|
60
|
+
class Proxy
|
61
|
+
attr_reader :app
|
62
|
+
|
63
|
+
def initialize(app)
|
64
|
+
@app = app
|
65
|
+
end
|
66
|
+
|
67
|
+
# Sets the App name
|
68
|
+
def name(val)
|
69
|
+
app.name = val
|
70
|
+
end
|
71
|
+
|
72
|
+
# Sets the App version
|
73
|
+
def version(val)
|
74
|
+
app.version = val
|
75
|
+
end
|
76
|
+
|
77
|
+
# Defines the default action
|
78
|
+
def default(&block)
|
79
|
+
app.action("default", &block)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Define option for OptionParser
|
83
|
+
def option(*args, &block)
|
84
|
+
app.opts.on(*args, &block)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Delegates to App
|
88
|
+
def method_missing(name, *attrs, &block)
|
89
|
+
app.send(name, *attrs, &block)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/cli/version.rb
ADDED
data/lib/cli.rb
CHANGED
@@ -1,29 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "cli/app"
|
2
2
|
|
3
|
+
# A CLI app framework
|
3
4
|
module CLI
|
5
|
+
# Create a new App object with $0 as the binary name and runs it with ARGV
|
4
6
|
def self.app(&block)
|
5
|
-
App.new(
|
6
|
-
|
7
|
-
|
8
|
-
class App
|
9
|
-
attr_reader :argv, :opts
|
10
|
-
|
11
|
-
def initialize(argv, &block)
|
12
|
-
@argv = argv
|
13
|
-
instance_eval(&block)
|
14
|
-
end
|
15
|
-
|
16
|
-
def options(&block)
|
17
|
-
@opts = OptionParser.new
|
18
|
-
instance_eval(&block)
|
19
|
-
@opts.parse!
|
20
|
-
end
|
21
|
-
|
22
|
-
def run(&block)
|
23
|
-
instance_eval(&block)
|
24
|
-
end
|
25
|
-
|
26
|
-
def name(value) @name = value end
|
27
|
-
def version(value) @version = value end
|
7
|
+
@app = App.new($0, &block)
|
8
|
+
@app.run!(ARGV)
|
28
9
|
end
|
29
10
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module CLI
|
4
|
+
describe App do
|
5
|
+
before do
|
6
|
+
@app = App.new("hello") do
|
7
|
+
name "Hello"
|
8
|
+
version "0.0.1"
|
9
|
+
|
10
|
+
option "-m", "--message MESSAGE" do |msg|
|
11
|
+
options[:msg] = msg
|
12
|
+
end
|
13
|
+
|
14
|
+
action "hi" do
|
15
|
+
puts "Hi!"
|
16
|
+
end
|
17
|
+
|
18
|
+
default do
|
19
|
+
puts options[:msg] || "Hello, World!"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a binary name" do
|
25
|
+
@app.binary.should eq("hello")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has a name" do
|
29
|
+
@app.name.should eq("Hello")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has a version" do
|
33
|
+
@app.version.should eq("0.0.1")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "runs an action" do
|
37
|
+
$stdout.should_receive(:puts).with("Hi!")
|
38
|
+
@app.run("hi")
|
39
|
+
end
|
40
|
+
|
41
|
+
it "fails when action is not found" do
|
42
|
+
lambda do
|
43
|
+
@app.run("bad")
|
44
|
+
end.should raise_error(ArgumentError, "action 'bad' not found")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "runs the default action" do
|
48
|
+
$stdout.should_receive(:puts).with("Hello, World!")
|
49
|
+
@app.run("default")
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#run!" do
|
53
|
+
describe "when arguments are empty" do
|
54
|
+
it "runs the default action" do
|
55
|
+
@app.should_receive(:run).with("default")
|
56
|
+
@app.run!([])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "when 1st argument is a valid action name" do
|
61
|
+
it "runs the action" do
|
62
|
+
@app.should_receive(:run).with("hi")
|
63
|
+
@app.run!(%w( hi ))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "when 1st argument is an invalid action name" do
|
68
|
+
it "prints error message" do
|
69
|
+
$stdout.should_receive(:puts).with("Action 'bad' not found")
|
70
|
+
@app.run!(%w( bad ))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "with a valid option" do
|
75
|
+
it "sets the option and runs the default action" do
|
76
|
+
$stdout.should_receive(:puts).with("Goodmorning!")
|
77
|
+
@app.run!(%w( -m Goodmorning! ))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,25 +1,42 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wojtekmach-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
version: 0.0.1
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
|
-
-
|
8
|
+
- Wojciech Mach
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date:
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
date: 2011-06-11 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
type: :development
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: guard
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id002
|
37
|
+
description: CLI apps framework.
|
38
|
+
email:
|
39
|
+
- wojtekmach1@gmail.com
|
23
40
|
executables: []
|
24
41
|
|
25
42
|
extensions: []
|
@@ -28,17 +45,25 @@ extra_rdoc_files: []
|
|
28
45
|
|
29
46
|
files:
|
30
47
|
- .gitignore
|
48
|
+
- .rspec
|
49
|
+
- .yardopts
|
50
|
+
- Gemfile
|
51
|
+
- Guardfile
|
52
|
+
- LICENSE
|
53
|
+
- README.md
|
31
54
|
- Rakefile
|
32
|
-
-
|
33
|
-
- examples/rcat
|
55
|
+
- cli.gemspec
|
34
56
|
- lib/cli.rb
|
35
|
-
|
36
|
-
|
57
|
+
- lib/cli/app.rb
|
58
|
+
- lib/cli/version.rb
|
59
|
+
- spec/cli/app_spec.rb
|
60
|
+
- spec/spec_helper.rb
|
61
|
+
homepage: ""
|
37
62
|
licenses: []
|
38
63
|
|
39
64
|
post_install_message:
|
40
|
-
rdoc_options:
|
41
|
-
|
65
|
+
rdoc_options: []
|
66
|
+
|
42
67
|
require_paths:
|
43
68
|
- lib
|
44
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -46,23 +71,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
46
71
|
requirements:
|
47
72
|
- - ">="
|
48
73
|
- !ruby/object:Gem::Version
|
49
|
-
segments:
|
50
|
-
- 0
|
51
74
|
version: "0"
|
52
75
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
76
|
none: false
|
54
77
|
requirements:
|
55
78
|
- - ">="
|
56
79
|
- !ruby/object:Gem::Version
|
57
|
-
segments:
|
58
|
-
- 0
|
59
80
|
version: "0"
|
60
81
|
requirements: []
|
61
82
|
|
62
|
-
rubyforge_project:
|
63
|
-
rubygems_version: 1.
|
83
|
+
rubyforge_project: cli
|
84
|
+
rubygems_version: 1.8.5
|
64
85
|
signing_key:
|
65
86
|
specification_version: 3
|
66
|
-
summary:
|
67
|
-
test_files:
|
68
|
-
|
87
|
+
summary: cli-0.1.0
|
88
|
+
test_files:
|
89
|
+
- spec/cli/app_spec.rb
|
90
|
+
- spec/spec_helper.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.1
|
data/examples/rcat
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
$: << File.dirname(__FILE__) + "/../lib"
|
3
|
-
|
4
|
-
require 'cli'
|
5
|
-
|
6
|
-
CLI.app do
|
7
|
-
name "rcat"
|
8
|
-
version "0.0.1"
|
9
|
-
|
10
|
-
options do
|
11
|
-
opts.on("-h", "--help") do
|
12
|
-
puts "rcat 0.0.1. See cat(1)"
|
13
|
-
exit
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
run do
|
18
|
-
puts ARGF.read
|
19
|
-
end
|
20
|
-
end
|