kknife 0.1.1 → 0.1.2

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.
data/README.md CHANGED
@@ -1,18 +1,25 @@
1
- ## kknife 0.1.1
1
+ ## kknife 0.1.2
2
2
 
3
- ### Shortcuts for the chef knife command
3
+ #### Shortcuts for the chef `knife` command
4
4
 
5
- `k n e somenode = knife node edit somenode`
6
- `k c u somebook = knife cookbook upload somebook`
7
- `k e u ff somefile = knife cookbook from_file somefile`
5
+ kknife lets you use the shortest substring to uniquely identify a knife sub command.
6
+ kknife also provides a `k` script to launch the lookups
7
+
8
+ `k n e somenode` = `knife node edit somenode`
9
+
10
+ `k c u somebook` = `knife cookbook upload somebook`
11
+
12
+ `k e u ff somefile` = `knife cookbook from_file somefile`
8
13
 
9
14
  `k -l` lists all your commands
10
15
 
11
16
  `k -d` might tell you what's going wrong.
12
17
 
13
- Lookups for shortcuts and ambiguous commands are currently statically defined in `lib/kknife/lookup.rb`. These will be user configurable/overridable. Some form of json/yml blob in ~/.chef/ should do.
18
+ #### Lookups
19
+
20
+ Shortcuts and ambiguous commands are currently statically defined in `lib/kknife/lookup.rb`. These will be user configurable/overridable. Some form of json/yml blob in ~/.chef/ should do.
14
21
 
15
- Shortcuts
22
+ ##### Shortcuts
16
23
  ```
17
24
  'ff' => [ 'from', 'file' ],
18
25
  'db' => [ 'data', 'bag' ],
@@ -22,7 +29,7 @@ Lookups for shortcuts and ambiguous commands are currently statically defined in
22
29
  'ns' => [ 'node', 'show' ],
23
30
  'rl' => [ 'run', 'list' ],
24
31
  ```
25
- Ambiguities
32
+ ##### Ambiguities
26
33
  ```
27
34
  'd' => ['download'],
28
35
  'e' => ['environment'],
@@ -17,16 +17,34 @@
17
17
  require 'kknife/dbg'
18
18
 
19
19
  ### Command
20
- # This is used to store a tree of commands
21
- # Allow you to navigate up and down the tree.
20
+ #
21
+ # This is used to store a tree of Commands by name
22
+ # Like a hash, but with a few extra features
23
+ #
24
+ # knife
25
+ # node
26
+ # list
27
+ # edit
28
+ # environment
29
+ # list
30
+ # edit
31
+ #
32
+ # Allows you to navigate up and down the tree.
22
33
 
23
34
  class Command
24
35
 
25
36
  include Dbg
26
37
 
38
+ # For the end of the tree
27
39
  class NoMoreSubCommands < StandardError; end
40
+
41
+ # For the end of the user commands
28
42
  class NoMoreSuppliedCommands < StandardError; end
43
+
44
+ # When more than one Command is looked up
29
45
  class AmbiguousCommand < StandardError; end
46
+
47
+ # When no Command's can be found
30
48
  class NotFoundCommand < StandardError; end
31
49
 
32
50
  attr_accessor :cmd, :cmd_short, :sub_commands, :source, :level, :parent, :root, :controller
@@ -62,7 +80,7 @@ class Command
62
80
  debug_logger.debug( 'Command init' )
63
81
  end
64
82
 
65
- # return the command
83
+ # return the command string
66
84
  def to_s
67
85
  @cmd
68
86
  end
@@ -78,7 +96,7 @@ class Command
78
96
  end
79
97
 
80
98
 
81
- # Print current command recurse through sub commands
99
+ # Print current command as a tree, recurse through sub commands
82
100
  def pp
83
101
  printf "%s%s\n", ' ' * level, cmd
84
102
  @sub_commands.each_key do |key|
@@ -86,6 +104,8 @@ class Command
86
104
  end
87
105
  end
88
106
 
107
+ # Print the current command on a single line if it's the last
108
+ # in the tree, otherwise move down.
89
109
  def pp_single
90
110
  printf "%s\n", command_lookup.reverse.join(' ') if has_no_sub_commands?
91
111
  @sub_commands.each_key do |key|
@@ -93,6 +113,7 @@ class Command
93
113
  end
94
114
  end
95
115
 
116
+ # Recurse back down the Command tree and return the full command
96
117
  def command_lookup
97
118
  return [ @cmd ] + @parent.command_lookup unless @parent.nil?
98
119
  [ @cmd ]
@@ -147,6 +168,7 @@ class Command
147
168
  dbg 'list', sub_command_list
148
169
  dbg 'rest', rest_commands
149
170
 
171
+ # If we have a command or can look one up, all is good
150
172
  if has_sub_command? first_command or sub_command_list.length == 1
151
173
 
152
174
  cmd = sub_command first_command
@@ -159,9 +181,9 @@ class Command
159
181
  return cmd.process_lookup rest_commands
160
182
 
161
183
 
184
+ # If there was more than one match, check the ambiguity config
185
+ # or error
162
186
  elsif sub_command_list.length > 1
163
- # If there was more than one match, check the ambiguity config
164
- # or error
165
187
 
166
188
  if Lookup.ambiguity( first_command )
167
189
  process_lookup Lookup.ambiguity( first_command ) + rest_commands
@@ -171,9 +193,9 @@ class Command
171
193
  end
172
194
 
173
195
 
196
+ # If there's an underscore, split it out
174
197
  elsif first_command.index(/_/)
175
- # If there's an underscore, split it out
176
-
198
+
177
199
  cmdsplit = first_command.split( /_/ )
178
200
 
179
201
  # notify the controller of the command changes
@@ -187,17 +209,17 @@ class Command
187
209
  process_lookup [ first_command ] + rest_commands
188
210
 
189
211
 
212
+ # Otherwise the command wasn't found,
213
+ # Look up shortcuts before giving up
190
214
  else
191
- # Otherwise the command wasn't found,
192
- # Look up shortcuts before giving up
193
215
 
194
216
  shortcut = Lookup.shortcut( first_command )
217
+
195
218
  if shortcut
196
219
  @controller.found_shortcut shortcut
197
220
  process_lookup shortcut + rest_commands
198
-
199
221
  else
200
- raise NotFoundCommand, "not found [#{first_command}.*]"
222
+ raise NotFoundCommand, "sub command not found: [#{first_command}*]"
201
223
  end
202
224
 
203
225
  end
@@ -17,17 +17,16 @@
17
17
  require 'logger'
18
18
 
19
19
  ### Dbg
20
- # a quick debug logger
21
- # classes can run `dbg`
22
-
23
- # ```
24
- # class Yours
25
- # include Dbg
26
- # def method
27
- # dbg 'some', values, logged
28
- # end
29
- # end
30
- # ```
20
+ #
21
+ # A quick debug logger so lasses can call `dbg`
22
+ #
23
+ # class Yours
24
+ # include Dbg
25
+ # def method
26
+ # dbg 'some', values, logged
27
+ # end
28
+ # end
29
+
31
30
 
32
31
  module Dbg
33
32
 
@@ -20,9 +20,11 @@ require 'chef/knife'
20
20
  require 'chef/application/knife'
21
21
 
22
22
  ### Knifecmd
23
- # Used as the base for the knife command.
24
- # Stories information about the run and the
25
- # Command tree
23
+ #
24
+ # Used as the base for the knife commands.
25
+ #
26
+ # Stores information about the current lookup
27
+ # and the Command tree
26
28
 
27
29
  class Knifecmd
28
30
 
@@ -128,10 +130,10 @@ class Knifecmd
128
130
  @cmd_root.process_lookup commands
129
131
 
130
132
  rescue Command::AmbiguousCommand => e
131
- raise "error [#{commands.to_s}] #{e}"
133
+ abort "error looking up [#{commands.to_s}]. #{e}"
132
134
 
133
135
  rescue Command::NotFoundCommand => e
134
- raise "error [#{commands.to_s}] #{e}"
136
+ abort "error looking up [#{commands.to_s}]. #{e}"
135
137
 
136
138
  rescue Command::NoMoreSubCommands
137
139
  dbg "end of knife lookups", @cmd_found.join(','), @cmd_left.join(',')
@@ -145,7 +147,7 @@ class Knifecmd
145
147
  end
146
148
 
147
149
 
148
- # if the Command lookup needs to split a command
150
+ # If the Command lookup needs to split a command
149
151
  # remove the command from what's left and split it
150
152
  # into the componenets
151
153
  def cmd_split( split_command_array )
@@ -167,7 +169,7 @@ class Knifecmd
167
169
  end
168
170
 
169
171
 
170
- # if the Command lookup hits a shortcut, adjust local
172
+ # If the Command lookup hits a shortcut, adjust local
171
173
  # variables to match
172
174
  def found_shortcut( shortcut )
173
175
  dbg 'found_shortcut b4 ', shortcut.join(','), '|', @cmd_left.join(',')
@@ -177,20 +179,20 @@ class Knifecmd
177
179
  end
178
180
 
179
181
 
180
- # reset the command found instance variables
182
+ # Reset the command found instance variables
181
183
  def reset_found( commands = [] )
182
184
  @cmd_found = []
183
185
  @cmd_left = commands.dup
184
186
  end
185
187
 
186
188
 
187
- # return the found command as a space seperated string
189
+ # Return the found command as a space seperated string
188
190
  def found_string
189
191
  ([ @root ] + @cmd_found ).join(' ')
190
192
  end
191
193
 
192
194
 
193
- # resolve a list of commands into real commands
195
+ # Resolve a list of commands into real commands
194
196
  def resolve( commands )
195
197
  lookup commands
196
198
  @cmd_found + @cmd_left
@@ -17,38 +17,40 @@
17
17
  require 'logger'
18
18
 
19
19
  ### Log - a global logger instance for classes
20
-
20
+ #
21
21
  # Allows you to call a single logger instance easily from your classes
22
-
23
- # ```
24
- # class Yours
25
- # include Log
26
- # def method
27
- # log.info 'something'
28
- # end
29
- # end
30
- # ```
22
+ #
23
+ # class Yours
24
+ # include Log
25
+ # def method
26
+ # log.info 'something'
27
+ # end
28
+ # end
31
29
 
32
30
  module Log
33
31
 
34
32
  DefaultIO = STDOUT
35
33
 
34
+ # returns the singleton
36
35
  def log
37
36
  Logging.log
38
37
  end
39
38
 
39
+ # replace the logger with a new target
40
40
  def self.replace( io )
41
41
  l = Logger.new io
42
42
  l.level = @log.level
43
43
  @log = l
44
44
  end
45
45
 
46
+ # create a new logger
46
47
  def self.create
47
48
  l = Logger.new DefaultIO
48
49
  l.level = Logger::INFO
49
50
  l
50
51
  end
51
52
 
53
+ # return the singleton or create it
52
54
  def self.log
53
55
  @log ||= create
54
56
  end
@@ -1,3 +1,3 @@
1
1
  module Kknife
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -107,5 +107,24 @@ describe Knifecmd do
107
107
  end
108
108
  end
109
109
 
110
+
111
+ it "abort on ambiguous command" do
112
+ expect{
113
+ begin
114
+ @k.resolve( ['s'] )
115
+ rescue SystemExit
116
+ end
117
+ }.to stderr( "error looking up [[\"s\"]]. ambiguous [s] [search,show,ssh,status]\n" )
118
+ end
119
+
120
+ it "abort on ambiguous command" do
121
+ expect{
122
+ begin
123
+ @k.resolve( ['z','y'] )
124
+ rescue SystemExit
125
+ end
126
+ }.to stderr( "error looking up [[\"z\", \"y\"]]. sub command not found: [z*]\n" )
127
+ end
128
+
110
129
  end
111
130
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kknife
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-13 00:00:00.000000000 Z
12
+ date: 2013-12-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef