pedrozath-mercenary 0.3.6
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.rubocop.yml +174 -0
- data/.travis.yml +17 -0
- data/Gemfile +6 -0
- data/History.markdown +115 -0
- data/LICENSE.txt +22 -0
- data/README.md +249 -0
- data/Rakefile +3 -0
- data/examples/help_dialogue.rb +45 -0
- data/examples/logging.rb +35 -0
- data/examples/trace.rb +20 -0
- data/lib/mercenary/command.rb +283 -0
- data/lib/mercenary/option.rb +88 -0
- data/lib/mercenary/presenter.rb +97 -0
- data/lib/mercenary/program.rb +65 -0
- data/lib/mercenary/version.rb +5 -0
- data/lib/mercenary.rb +23 -0
- data/mercenary.gemspec +26 -0
- data/script/bootstrap +7 -0
- data/script/cibuild +7 -0
- data/script/console +3 -0
- data/script/examples +18 -0
- data/script/fmt +4 -0
- data/spec/command_spec.rb +98 -0
- data/spec/option_spec.rb +84 -0
- data/spec/presenter_spec.rb +41 -0
- data/spec/program_spec.rb +19 -0
- data/spec/spec_helper.rb +16 -0
- metadata +136 -0
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe(Mercenary::Command) do
|
6
|
+
context "a basic command" do
|
7
|
+
let(:command) { Mercenary::Command.new(:my_name) }
|
8
|
+
let(:parent) { Mercenary::Command.new(:my_parent) }
|
9
|
+
let(:with_sub) do
|
10
|
+
c = Mercenary::Command.new(:i_have_subcommand)
|
11
|
+
add_sub.call(c)
|
12
|
+
c
|
13
|
+
end
|
14
|
+
let(:command_with_parent) do
|
15
|
+
Mercenary::Command.new(
|
16
|
+
:i_have_parent,
|
17
|
+
parent
|
18
|
+
)
|
19
|
+
end
|
20
|
+
let(:add_sub) do
|
21
|
+
proc do |c|
|
22
|
+
c.command(:sub_command) { |p| }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "can be created with just a name" do
|
27
|
+
expect(command.name).to eql(:my_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "can hold a parent command" do
|
31
|
+
expect(command_with_parent.parent).to eql(parent)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can create subcommands" do
|
35
|
+
expect(add_sub.call(command)).to be_a(Mercenary::Command)
|
36
|
+
expect(add_sub.call(command).parent).to eq(command)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "can set its version" do
|
40
|
+
version = "1.4.2"
|
41
|
+
command.version version
|
42
|
+
expect(command.version).to eq(version)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can set its syntax" do
|
46
|
+
syntax_string = "my_name [options]"
|
47
|
+
cmd = described_class.new(:my_name)
|
48
|
+
cmd.syntax syntax_string
|
49
|
+
expect(cmd.syntax).to eq(syntax_string)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "can set its description" do
|
53
|
+
desc = "run all the things"
|
54
|
+
command.description desc
|
55
|
+
expect(command.description).to eq(desc)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "can set its options" do
|
59
|
+
name = "show_drafts"
|
60
|
+
opts = ["--drafts", "Render posts in the _drafts folder"]
|
61
|
+
option = Mercenary::Option.new(name, opts)
|
62
|
+
command.option name, *opts
|
63
|
+
expect(command.options).to eql([option])
|
64
|
+
expect(command.map.values).to include(name)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "knows its full name" do
|
68
|
+
expect(command_with_parent.full_name).to eql("my_parent i_have_parent")
|
69
|
+
end
|
70
|
+
|
71
|
+
it "knows its identity" do
|
72
|
+
command_with_parent.version "1.8.7"
|
73
|
+
expect(command_with_parent.identity).to eql("my_parent i_have_parent 1.8.7")
|
74
|
+
end
|
75
|
+
|
76
|
+
it "raises an ArgumentError if I specify a default_command that isn't there" do
|
77
|
+
c = command # some weird NameError with the block below?
|
78
|
+
expect { c.default_command(:nope) }.to raise_error(ArgumentError)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "sets the default_command" do
|
82
|
+
expect(with_sub.default_command(:sub_command).name).to eq(:sub_command)
|
83
|
+
end
|
84
|
+
|
85
|
+
context "with an alias" do
|
86
|
+
before(:each) do
|
87
|
+
command_with_parent.alias(:an_alias)
|
88
|
+
end
|
89
|
+
it "shows the alias in the summary" do
|
90
|
+
expect(command_with_parent.summarize).to eql(" i_have_parent, an_alias ")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "its names_and_aliases method reports both the name and alias" do
|
94
|
+
expect(command_with_parent.names_and_aliases).to eql("i_have_parent, an_alias")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/spec/option_spec.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe(Mercenary::Option) do
|
6
|
+
let(:config_key) { "largo" }
|
7
|
+
let(:description) { "This is a description" }
|
8
|
+
let(:switches) { ["-l", "--largo"] }
|
9
|
+
let(:option) { described_class.new(config_key, [switches, description].flatten.reject(&:nil?)) }
|
10
|
+
|
11
|
+
it "knows its config key" do
|
12
|
+
expect(option.config_key).to eql(config_key)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "knows its description" do
|
16
|
+
expect(option.description).to eql(description)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "knows its switches" do
|
20
|
+
expect(option.switches).to eql(switches)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "knows how to present itself" do
|
24
|
+
expect(option.to_s).to eql(" -l, --largo #{description}")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has an OptionParser representation" do
|
28
|
+
expect(option.for_option_parser).to eql([switches, description].flatten)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "compares itself with other options well" do
|
32
|
+
new_option = described_class.new(config_key, ["-l", "--largo", description])
|
33
|
+
expect(option.eql?(new_option)).to be(true)
|
34
|
+
expect(option.hash.eql?(new_option.hash)).to be(true)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "has a custom #hash" do
|
38
|
+
expect(option.hash.to_s).to match(%r!\d+!)
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with just the long switch" do
|
42
|
+
let(:switches) { ["--largo"] }
|
43
|
+
|
44
|
+
it "adds an empty string in place of the short switch" do
|
45
|
+
expect(option.switches).to eql(["", "--largo"])
|
46
|
+
end
|
47
|
+
|
48
|
+
it "sets its description properly" do
|
49
|
+
expect(option.description).to eql(description)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "knows how to present the switch" do
|
53
|
+
expect(option.formatted_switches).to eql(" --largo ")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "with just the short switch" do
|
58
|
+
let(:switches) { ["-l"] }
|
59
|
+
|
60
|
+
it "adds an empty string in place of the long switch" do
|
61
|
+
expect(option.switches).to eql(["-l", ""])
|
62
|
+
end
|
63
|
+
|
64
|
+
it "sets its description properly" do
|
65
|
+
expect(option.description).to eql(description)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "knows how to present the switch" do
|
69
|
+
expect(option.formatted_switches).to eql(" -l ")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "without a description" do
|
74
|
+
let(:description) { nil }
|
75
|
+
|
76
|
+
it "knows there is no description" do
|
77
|
+
expect(option.description).to be(nil)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "knows both inputs are switches" do
|
81
|
+
expect(option.switches).to eql(switches)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe(Mercenary::Presenter) do
|
6
|
+
let(:supercommand) { Mercenary::Command.new(:script_name) }
|
7
|
+
let(:command) { Mercenary::Command.new(:subcommand, supercommand) }
|
8
|
+
let(:presenter) { described_class.new(command) }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
command.version "1.4.2"
|
12
|
+
command.description "Do all the things."
|
13
|
+
command.option "one", "-1", "--one", "The first option"
|
14
|
+
command.option "two", "-2", "--two", "The second option"
|
15
|
+
command.alias :cmd
|
16
|
+
supercommand.commands[command.name] = command
|
17
|
+
end
|
18
|
+
|
19
|
+
it "knows how to present the command" do
|
20
|
+
expect(presenter.command_presentation).to eql("script_name subcommand 1.4.2 -- Do all the things.\n\nUsage:\n\n script_name subcommand\n\nOptions:\n -1, --one The first option\n -2, --two The second option")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "knows how to present the subcommands, without duplicates for aliases" do
|
24
|
+
expect(described_class.new(supercommand).subcommands_presentation).to eql(" subcommand, cmd Do all the things.")
|
25
|
+
end
|
26
|
+
|
27
|
+
it "knows how to present the usage" do
|
28
|
+
expect(presenter.usage_presentation).to eql(" script_name subcommand")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "knows how to present the options" do
|
32
|
+
expect(presenter.options_presentation).to eql(" -1, --one The first option\n -2, --two The second option")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "allows you to say print_* instead of *_presentation" do
|
36
|
+
expect(presenter.print_usage).to eql(presenter.usage_presentation)
|
37
|
+
expect(presenter.print_subcommands).to eql(presenter.subcommands_presentation)
|
38
|
+
expect(presenter.print_options).to eql(presenter.options_presentation)
|
39
|
+
expect(presenter.print_command).to eql(presenter.command_presentation)
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe(Mercenary::Program) do
|
6
|
+
context "a basic program" do
|
7
|
+
let(:program) { Mercenary::Program.new(:my_name) }
|
8
|
+
|
9
|
+
it "can be created with just a name" do
|
10
|
+
expect(program.name).to eql(:my_name)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "can set its version" do
|
14
|
+
version = Mercenary::VERSION
|
15
|
+
program.version version
|
16
|
+
expect(program.version).to eq(version)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require "mercenary"
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.run_all_when_everything_filtered = true
|
9
|
+
config.filter_run :focus
|
10
|
+
|
11
|
+
# Run specs in random order to surface order dependencies. If you find an
|
12
|
+
# order dependency and want to debug it, you can fix the order by providing
|
13
|
+
# the seed, which is printed after each run.
|
14
|
+
# --seed 1234
|
15
|
+
config.order = "random"
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pedrozath-mercenary
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tom Preston-Werner
|
8
|
+
- Parker Moore
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2018-02-18 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.3'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.3'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rake
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: rspec
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '3.0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '3.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rubocop
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0.51'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0.51'
|
70
|
+
description: Lightweight and flexible library for writing command-line apps in Ruby.
|
71
|
+
email:
|
72
|
+
- tom@mojombo.com
|
73
|
+
- parkrmoore@gmail.com
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- ".gitignore"
|
79
|
+
- ".rspec"
|
80
|
+
- ".rubocop.yml"
|
81
|
+
- ".travis.yml"
|
82
|
+
- Gemfile
|
83
|
+
- History.markdown
|
84
|
+
- LICENSE.txt
|
85
|
+
- README.md
|
86
|
+
- Rakefile
|
87
|
+
- examples/help_dialogue.rb
|
88
|
+
- examples/logging.rb
|
89
|
+
- examples/trace.rb
|
90
|
+
- lib/mercenary.rb
|
91
|
+
- lib/mercenary/command.rb
|
92
|
+
- lib/mercenary/option.rb
|
93
|
+
- lib/mercenary/presenter.rb
|
94
|
+
- lib/mercenary/program.rb
|
95
|
+
- lib/mercenary/version.rb
|
96
|
+
- mercenary.gemspec
|
97
|
+
- script/bootstrap
|
98
|
+
- script/cibuild
|
99
|
+
- script/console
|
100
|
+
- script/examples
|
101
|
+
- script/fmt
|
102
|
+
- spec/command_spec.rb
|
103
|
+
- spec/option_spec.rb
|
104
|
+
- spec/presenter_spec.rb
|
105
|
+
- spec/program_spec.rb
|
106
|
+
- spec/spec_helper.rb
|
107
|
+
homepage: https://github.com/jekyll/mercenary
|
108
|
+
licenses:
|
109
|
+
- MIT
|
110
|
+
metadata: {}
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options: []
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
requirements: []
|
126
|
+
rubyforge_project:
|
127
|
+
rubygems_version: 2.7.3
|
128
|
+
signing_key:
|
129
|
+
specification_version: 4
|
130
|
+
summary: Lightweight and flexible library for writing command-line apps in Ruby.
|
131
|
+
test_files:
|
132
|
+
- spec/command_spec.rb
|
133
|
+
- spec/option_spec.rb
|
134
|
+
- spec/presenter_spec.rb
|
135
|
+
- spec/program_spec.rb
|
136
|
+
- spec/spec_helper.rb
|