cli-mastermind 0.2.2 → 0.3.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.
- 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.
|