cli-mastermind 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cli/mastermind.rb +5 -2
- data/lib/cli/mastermind/arg_parse.rb +36 -1
- data/lib/cli/mastermind/configuration.rb +36 -0
- data/lib/cli/mastermind/loader/planfile_loader.rb +4 -0
- data/lib/cli/mastermind/plan/interface.rb +9 -0
- data/lib/cli/mastermind/version.rb +2 -2
- metadata +9 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ca718b72ecdee995987b9d86bc5f16b968eca9e0d9e255413de7e6801ac0dc5
|
4
|
+
data.tar.gz: a68679268a6c51cbeb4d62976e92095c3534acd1bb4af38ab80fe2184b16579c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a116593dfd1b67d34c8f4e3de01def373adc463ba773c589fac1c8c1585d89097656606fef5a0b9cde8f2cca54a286b0c065c4c4099627dafd63bebd61ba79e3
|
7
|
+
data.tar.gz: b27841d28333c9fc0438ebbfe2e241507196fec5e95f3985f4791f0f46e0e3dead181ac28a132892ced3f4bddce96cb26361472b4f790df73e7d6e69ae6c6ac3
|
data/lib/cli/mastermind.rb
CHANGED
@@ -129,13 +129,16 @@ module CLI
|
|
129
129
|
end
|
130
130
|
|
131
131
|
def process_plan_names
|
132
|
+
@arguments.do_command_expansion!(@config)
|
133
|
+
|
132
134
|
@plan_stack = []
|
133
135
|
|
134
|
-
@selected_plan =
|
136
|
+
@selected_plan = @plans
|
135
137
|
|
136
138
|
while @arguments.has_additional_plan_names?
|
137
139
|
plan_name = @arguments.get_next_plan_name
|
138
|
-
|
140
|
+
|
141
|
+
@selected_plan = @selected_plan[plan_name]
|
139
142
|
@plan_stack << titleize(plan_name)
|
140
143
|
|
141
144
|
if @selected_plan.nil?
|
@@ -21,6 +21,18 @@ module CLI::Mastermind
|
|
21
21
|
parse_arguments
|
22
22
|
end
|
23
23
|
|
24
|
+
def do_command_expansion!(config)
|
25
|
+
@alias_arguments = []
|
26
|
+
|
27
|
+
@mastermind_arguments.map! do |argument|
|
28
|
+
expand_argument(config, argument)
|
29
|
+
end
|
30
|
+
|
31
|
+
@plan_arguments = @alias_arguments + @plan_arguments
|
32
|
+
|
33
|
+
@mastermind_arguments.flatten!
|
34
|
+
end
|
35
|
+
|
24
36
|
def display_plans?
|
25
37
|
!@pattern.nil?
|
26
38
|
end
|
@@ -79,9 +91,32 @@ module CLI::Mastermind
|
|
79
91
|
|
80
92
|
private
|
81
93
|
|
94
|
+
def expand_argument(config, argument)
|
95
|
+
dealiased = config.map_alias(argument)
|
96
|
+
|
97
|
+
if dealiased.is_a? Array
|
98
|
+
partitioned = dealiased.slice_before('--').to_a
|
99
|
+
|
100
|
+
# Recursively expand plan names
|
101
|
+
# NOTE: This does not defend against circular dependencies!
|
102
|
+
plan_names = partitioned.shift.map { |arg| expand_argument(config, arg) }.flatten
|
103
|
+
|
104
|
+
plan_arguments = partitioned.shift
|
105
|
+
|
106
|
+
if plan_arguments
|
107
|
+
plan_arguments.shift # removes the --
|
108
|
+
@alias_arguments.concat plan_arguments
|
109
|
+
end
|
110
|
+
|
111
|
+
dealiased = plan_names
|
112
|
+
end
|
113
|
+
|
114
|
+
dealiased
|
115
|
+
end
|
116
|
+
|
82
117
|
def parse_arguments
|
83
118
|
@mastermind_arguments = @initial_arguments.take_while { |arg| arg != '--' }
|
84
|
-
@plan_arguments = @initial_arguments[(@mastermind_arguments.size + 1)..-1]
|
119
|
+
@plan_arguments = @initial_arguments[(@mastermind_arguments.size + 1)..-1] || []
|
85
120
|
|
86
121
|
unless @mastermind_arguments.empty?
|
87
122
|
@mastermind_arguments = parser.parse *@mastermind_arguments
|
@@ -51,6 +51,9 @@ module CLI
|
|
51
51
|
@loaded_masterplans = Set.new
|
52
52
|
@plan_files = Set.new
|
53
53
|
|
54
|
+
# If no alias exists for a particular value, return that value
|
55
|
+
@aliases = Hash.new { |_,k| k }
|
56
|
+
|
54
57
|
lookup_and_load_masterplans
|
55
58
|
load_masterplan MASTER_PLAN
|
56
59
|
end
|
@@ -75,6 +78,25 @@ module CLI
|
|
75
78
|
@plans = top_level_plan.children
|
76
79
|
end
|
77
80
|
|
81
|
+
def execute_plan(*plan_stack, arguments: nil)
|
82
|
+
if plan_stack.size == 1
|
83
|
+
case plan_stack.first
|
84
|
+
when Array
|
85
|
+
plan_stack = plan_stack.first
|
86
|
+
when String
|
87
|
+
plan_stack = plan_stack.first.split(' ')
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
plan = @plans
|
92
|
+
|
93
|
+
plan_stack.each do |plan_name|
|
94
|
+
plan = plan[plan_name]
|
95
|
+
end
|
96
|
+
|
97
|
+
plan.call(arguments)
|
98
|
+
end
|
99
|
+
|
78
100
|
# Loads a masterplan using the DSL, if it exists and hasn't been loaded already
|
79
101
|
def load_masterplan filename
|
80
102
|
if File.exists? filename and !@loaded_masterplans.include? filename
|
@@ -83,6 +105,16 @@ module CLI
|
|
83
105
|
end
|
84
106
|
end
|
85
107
|
|
108
|
+
def define_alias(alias_from, alias_to)
|
109
|
+
arguments = alias_to.split(' ') if alias_to.is_a? String
|
110
|
+
|
111
|
+
@aliases[alias_from] = arguments unless @aliases.has_key? alias_from
|
112
|
+
end
|
113
|
+
|
114
|
+
def map_alias(input)
|
115
|
+
@aliases[input]
|
116
|
+
end
|
117
|
+
|
86
118
|
private
|
87
119
|
|
88
120
|
# Walks up the file tree looking for masterplans.
|
@@ -136,6 +168,10 @@ module CLI
|
|
136
168
|
@config.public_send "#{attribute}=", value, &block
|
137
169
|
end
|
138
170
|
|
171
|
+
def alias(name, arguments)
|
172
|
+
@config.define_alias(name, arguments)
|
173
|
+
end
|
174
|
+
|
139
175
|
private
|
140
176
|
|
141
177
|
def supported_extensions
|
@@ -26,6 +26,9 @@ module CLI::Mastermind
|
|
26
26
|
# The file this plan was loaded from, if any
|
27
27
|
attr_reader :filename
|
28
28
|
|
29
|
+
# Provides shorter names for the plan
|
30
|
+
attr_reader :aliases
|
31
|
+
|
29
32
|
include UserInterface
|
30
33
|
end
|
31
34
|
end
|
@@ -35,6 +38,7 @@ module CLI::Mastermind
|
|
35
38
|
@description = description.freeze
|
36
39
|
@filename = filename
|
37
40
|
@block = block
|
41
|
+
@aliases = Set.new
|
38
42
|
end
|
39
43
|
|
40
44
|
def has_children?
|
@@ -45,6 +49,11 @@ module CLI::Mastermind
|
|
45
49
|
raise NotImplementedError
|
46
50
|
end
|
47
51
|
|
52
|
+
def add_alias(alias_to)
|
53
|
+
config.define_alias(alias_to, name)
|
54
|
+
@aliases.add alias_to
|
55
|
+
end
|
56
|
+
|
48
57
|
# Delegate configuration to the top-level configuration object
|
49
58
|
def_delegator :'CLI::Mastermind', :configuration
|
50
59
|
alias_method :config, :configuration
|
metadata
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cli-mastermind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Hall
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cli-ui
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.2'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 1.2.0
|
20
|
+
- - "~>"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.2'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.2'
|
30
27
|
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: 1.2.0
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '1.2'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: bundler
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,8 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
requirements: []
|
105
|
-
|
106
|
-
rubygems_version: 2.7.7
|
105
|
+
rubygems_version: 3.0.2
|
107
106
|
signing_key:
|
108
107
|
specification_version: 4
|
109
108
|
summary: Mastermind is a framework for constructing command line toolboxes.
|