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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 33bb65a17bf27a8204453ec5aa84042c8ee79d63517660a1dd64f7b9da47fb78
4
- data.tar.gz: fc57a1838d2b65d7aff0184ead1bb58646c61fb650f4d4456fd9691c83e901e3
3
+ metadata.gz: 0ca718b72ecdee995987b9d86bc5f16b968eca9e0d9e255413de7e6801ac0dc5
4
+ data.tar.gz: a68679268a6c51cbeb4d62976e92095c3534acd1bb4af38ab80fe2184b16579c
5
5
  SHA512:
6
- metadata.gz: 4a79e90625e8c13b8ed8b8bebee2c3cd4781732f59c739b3189d07fe69074649c2f87de6045f23c3933777746bd54318e75062d76cada487f506203d986bba76
7
- data.tar.gz: 1ca37ab292f411ea6a75cdff758046e417b356929e84a7d77a495dbf0fbbb3632e1fe0c41cf4c4a269a6b7134a09b460cc7e93fa851ee96263e841c991fc1b28
6
+ metadata.gz: a116593dfd1b67d34c8f4e3de01def373adc463ba773c589fac1c8c1585d89097656606fef5a0b9cde8f2cca54a286b0c065c4c4099627dafd63bebd61ba79e3
7
+ data.tar.gz: b27841d28333c9fc0438ebbfe2e241507196fec5e95f3985f4791f0f46e0e3dead181ac28a132892ced3f4bddce96cb26361472b4f790df73e7d6e69ae6c6ac3
@@ -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 = nil
136
+ @selected_plan = @plans
135
137
 
136
138
  while @arguments.has_additional_plan_names?
137
139
  plan_name = @arguments.get_next_plan_name
138
- @selected_plan = (@selected_plan || @plans)[plan_name]
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
@@ -46,6 +46,10 @@ module CLI::Mastermind
46
46
  @description = nil
47
47
  end
48
48
  alias_method :task, :plan
49
+
50
+ def alias(alias_to)
51
+ @plans.last.add_alias(alias_to)
52
+ end
49
53
  end
50
54
  end
51
55
  end
@@ -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
@@ -7,8 +7,8 @@ module CLI
7
7
 
8
8
  module VERSION
9
9
  RELEASE = 0
10
- MAJOR = 2
11
- MINOR = 2
10
+ MAJOR = 3
11
+ MINOR = 0
12
12
  PATCH = nil
13
13
 
14
14
  STRING = [RELEASE, MAJOR, MINOR, PATCH].compact.join('.').freeze
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.2.2
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-02-28 00:00:00.000000000 Z
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
- rubyforge_project:
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.