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 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.