jedi 0.0.1

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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +31 -0
  6. data/Rakefile +2 -0
  7. data/bin/jedi +6 -0
  8. data/jedi.gemspec +23 -0
  9. data/lib/jedi.rb +5 -0
  10. data/lib/jedi/cli.rb +27 -0
  11. data/lib/jedi/vendor/thor-0.19.1/lib/thor.rb +484 -0
  12. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions.rb +319 -0
  13. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/create_file.rb +103 -0
  14. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/create_link.rb +59 -0
  15. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/directory.rb +118 -0
  16. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/empty_directory.rb +135 -0
  17. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/file_manipulation.rb +316 -0
  18. data/lib/jedi/vendor/thor-0.19.1/lib/thor/actions/inject_into_file.rb +107 -0
  19. data/lib/jedi/vendor/thor-0.19.1/lib/thor/base.rb +656 -0
  20. data/lib/jedi/vendor/thor-0.19.1/lib/thor/command.rb +133 -0
  21. data/lib/jedi/vendor/thor-0.19.1/lib/thor/core_ext/hash_with_indifferent_access.rb +77 -0
  22. data/lib/jedi/vendor/thor-0.19.1/lib/thor/core_ext/io_binary_read.rb +10 -0
  23. data/lib/jedi/vendor/thor-0.19.1/lib/thor/core_ext/ordered_hash.rb +98 -0
  24. data/lib/jedi/vendor/thor-0.19.1/lib/thor/error.rb +32 -0
  25. data/lib/jedi/vendor/thor-0.19.1/lib/thor/group.rb +281 -0
  26. data/lib/jedi/vendor/thor-0.19.1/lib/thor/invocation.rb +178 -0
  27. data/lib/jedi/vendor/thor-0.19.1/lib/thor/line_editor.rb +17 -0
  28. data/lib/jedi/vendor/thor-0.19.1/lib/thor/line_editor/basic.rb +35 -0
  29. data/lib/jedi/vendor/thor-0.19.1/lib/thor/line_editor/readline.rb +88 -0
  30. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser.rb +4 -0
  31. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/argument.rb +73 -0
  32. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/arguments.rb +175 -0
  33. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/option.rb +125 -0
  34. data/lib/jedi/vendor/thor-0.19.1/lib/thor/parser/options.rb +218 -0
  35. data/lib/jedi/vendor/thor-0.19.1/lib/thor/rake_compat.rb +71 -0
  36. data/lib/jedi/vendor/thor-0.19.1/lib/thor/runner.rb +322 -0
  37. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell.rb +81 -0
  38. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell/basic.rb +421 -0
  39. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell/color.rb +149 -0
  40. data/lib/jedi/vendor/thor-0.19.1/lib/thor/shell/html.rb +126 -0
  41. data/lib/jedi/vendor/thor-0.19.1/lib/thor/util.rb +267 -0
  42. data/lib/jedi/vendor/thor-0.19.1/lib/thor/version.rb +3 -0
  43. data/lib/jedi/vendored_thor.rb +5 -0
  44. data/lib/jedi/version.rb +3 -0
  45. metadata +116 -0
@@ -0,0 +1,81 @@
1
+ require "rbconfig"
2
+
3
+ class Thor
4
+ module Base
5
+ class << self
6
+ attr_writer :shell
7
+
8
+ # Returns the shell used in all Thor classes. If you are in a Unix platform
9
+ # it will use a colored log, otherwise it will use a basic one without color.
10
+ #
11
+ def shell
12
+ @shell ||= if ENV["THOR_SHELL"] && ENV["THOR_SHELL"].size > 0
13
+ Thor::Shell.const_get(ENV["THOR_SHELL"])
14
+ elsif RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ && !ENV["ANSICON"]
15
+ Thor::Shell::Basic
16
+ else
17
+ Thor::Shell::Color
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ module Shell
24
+ SHELL_DELEGATED_METHODS = [:ask, :error, :set_color, :yes?, :no?, :say, :say_status, :print_in_columns, :print_table, :print_wrapped, :file_collision, :terminal_width]
25
+ attr_writer :shell
26
+
27
+ autoload :Basic, "thor/shell/basic"
28
+ autoload :Color, "thor/shell/color"
29
+ autoload :HTML, "thor/shell/html"
30
+
31
+ # Add shell to initialize config values.
32
+ #
33
+ # ==== Configuration
34
+ # shell<Object>:: An instance of the shell to be used.
35
+ #
36
+ # ==== Examples
37
+ #
38
+ # class MyScript < Thor
39
+ # argument :first, :type => :numeric
40
+ # end
41
+ #
42
+ # MyScript.new [1.0], { :foo => :bar }, :shell => Thor::Shell::Basic.new
43
+ #
44
+ def initialize(args = [], options = {}, config = {})
45
+ super
46
+ self.shell = config[:shell]
47
+ shell.base ||= self if shell.respond_to?(:base)
48
+ end
49
+
50
+ # Holds the shell for the given Thor instance. If no shell is given,
51
+ # it gets a default shell from Thor::Base.shell.
52
+ def shell
53
+ @shell ||= Thor::Base.shell.new
54
+ end
55
+
56
+ # Common methods that are delegated to the shell.
57
+ SHELL_DELEGATED_METHODS.each do |method|
58
+ module_eval <<-METHOD, __FILE__, __LINE__
59
+ def #{method}(*args,&block)
60
+ shell.#{method}(*args,&block)
61
+ end
62
+ METHOD
63
+ end
64
+
65
+ # Yields the given block with padding.
66
+ def with_padding
67
+ shell.padding += 1
68
+ yield
69
+ ensure
70
+ shell.padding -= 1
71
+ end
72
+
73
+ protected
74
+
75
+ # Allow shell to be shared between invocations.
76
+ #
77
+ def _shared_configuration #:nodoc:
78
+ super.merge!(:shell => shell)
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,421 @@
1
+ require "tempfile"
2
+ require "io/console" if RUBY_VERSION > "1.9.2"
3
+
4
+ class Thor
5
+ module Shell
6
+ class Basic # rubocop:disable ClassLength
7
+ attr_accessor :base
8
+ attr_reader :padding
9
+
10
+ # Initialize base, mute and padding to nil.
11
+ #
12
+ def initialize #:nodoc:
13
+ @base, @mute, @padding, @always_force = nil, false, 0, false
14
+ end
15
+
16
+ # Mute everything that's inside given block
17
+ #
18
+ def mute
19
+ @mute = true
20
+ yield
21
+ ensure
22
+ @mute = false
23
+ end
24
+
25
+ # Check if base is muted
26
+ #
27
+ def mute? # rubocop:disable TrivialAccessors
28
+ @mute
29
+ end
30
+
31
+ # Sets the output padding, not allowing less than zero values.
32
+ #
33
+ def padding=(value)
34
+ @padding = [0, value].max
35
+ end
36
+
37
+ # Asks something to the user and receives a response.
38
+ #
39
+ # If asked to limit the correct responses, you can pass in an
40
+ # array of acceptable answers. If one of those is not supplied,
41
+ # they will be shown a message stating that one of those answers
42
+ # must be given and re-asked the question.
43
+ #
44
+ # If asking for sensitive information, the :echo option can be set
45
+ # to false to mask user input from $stdin.
46
+ #
47
+ # If the required input is a path, then set the path option to
48
+ # true. This will enable tab completion for file paths relative
49
+ # to the current working directory on systems that support
50
+ # Readline.
51
+ #
52
+ # ==== Example
53
+ # ask("What is your name?")
54
+ #
55
+ # ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])
56
+ #
57
+ # ask("What is your password?", :echo => false)
58
+ #
59
+ # ask("Where should the file be saved?", :path => true)
60
+ #
61
+ def ask(statement, *args)
62
+ options = args.last.is_a?(Hash) ? args.pop : {}
63
+ color = args.first
64
+
65
+ if options[:limited_to]
66
+ ask_filtered(statement, color, options)
67
+ else
68
+ ask_simply(statement, color, options)
69
+ end
70
+ end
71
+
72
+ # Say (print) something to the user. If the sentence ends with a whitespace
73
+ # or tab character, a new line is not appended (print + flush). Otherwise
74
+ # are passed straight to puts (behavior got from Highline).
75
+ #
76
+ # ==== Example
77
+ # say("I know you knew that.")
78
+ #
79
+ def say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
80
+ buffer = prepare_message(message, *color)
81
+ buffer << "\n" if force_new_line && !message.to_s.end_with?("\n")
82
+
83
+ stdout.print(buffer)
84
+ stdout.flush
85
+ end
86
+
87
+ # Say a status with the given color and appends the message. Since this
88
+ # method is used frequently by actions, it allows nil or false to be given
89
+ # in log_status, avoiding the message from being shown. If a Symbol is
90
+ # given in log_status, it's used as the color.
91
+ #
92
+ def say_status(status, message, log_status = true)
93
+ return if quiet? || log_status == false
94
+ spaces = " " * (padding + 1)
95
+ color = log_status.is_a?(Symbol) ? log_status : :green
96
+
97
+ status = status.to_s.rjust(12)
98
+ status = set_color status, color, true if color
99
+
100
+ buffer = "#{status}#{spaces}#{message}"
101
+ buffer << "\n" unless buffer.end_with?("\n")
102
+
103
+ stdout.print(buffer)
104
+ stdout.flush
105
+ end
106
+
107
+ # Make a question the to user and returns true if the user replies "y" or
108
+ # "yes".
109
+ #
110
+ def yes?(statement, color = nil)
111
+ !!(ask(statement, color, :add_to_history => false) =~ is?(:yes))
112
+ end
113
+
114
+ # Make a question the to user and returns true if the user replies "n" or
115
+ # "no".
116
+ #
117
+ def no?(statement, color = nil)
118
+ !!(ask(statement, color, :add_to_history => false) =~ is?(:no))
119
+ end
120
+
121
+ # Prints values in columns
122
+ #
123
+ # ==== Parameters
124
+ # Array[String, String, ...]
125
+ #
126
+ def print_in_columns(array)
127
+ return if array.empty?
128
+ colwidth = (array.map { |el| el.to_s.size }.max || 0) + 2
129
+ array.each_with_index do |value, index|
130
+ # Don't output trailing spaces when printing the last column
131
+ if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
132
+ stdout.puts value
133
+ else
134
+ stdout.printf("%-#{colwidth}s", value)
135
+ end
136
+ end
137
+ end
138
+
139
+ # Prints a table.
140
+ #
141
+ # ==== Parameters
142
+ # Array[Array[String, String, ...]]
143
+ #
144
+ # ==== Options
145
+ # indent<Integer>:: Indent the first column by indent value.
146
+ # colwidth<Integer>:: Force the first column to colwidth spaces wide.
147
+ #
148
+ def print_table(array, options = {}) # rubocop:disable MethodLength
149
+ return if array.empty?
150
+
151
+ formats, indent, colwidth = [], options[:indent].to_i, options[:colwidth]
152
+ options[:truncate] = terminal_width if options[:truncate] == true
153
+
154
+ formats << "%-#{colwidth + 2}s" if colwidth
155
+ start = colwidth ? 1 : 0
156
+
157
+ colcount = array.max { |a, b| a.size <=> b.size }.size
158
+
159
+ maximas = []
160
+
161
+ start.upto(colcount - 1) do |index|
162
+ maxima = array.map { |row| row[index] ? row[index].to_s.size : 0 }.max
163
+ maximas << maxima
164
+ if index == colcount - 1
165
+ # Don't output 2 trailing spaces when printing the last column
166
+ formats << "%-s"
167
+ else
168
+ formats << "%-#{maxima + 2}s"
169
+ end
170
+ end
171
+
172
+ formats[0] = formats[0].insert(0, " " * indent)
173
+ formats << "%s"
174
+
175
+ array.each do |row|
176
+ sentence = ""
177
+
178
+ row.each_with_index do |column, index|
179
+ maxima = maximas[index]
180
+
181
+ if column.is_a?(Numeric)
182
+ if index == row.size - 1
183
+ # Don't output 2 trailing spaces when printing the last column
184
+ f = "%#{maxima}s"
185
+ else
186
+ f = "%#{maxima}s "
187
+ end
188
+ else
189
+ f = formats[index]
190
+ end
191
+ sentence << f % column.to_s
192
+ end
193
+
194
+ sentence = truncate(sentence, options[:truncate]) if options[:truncate]
195
+ stdout.puts sentence
196
+ end
197
+ end
198
+
199
+ # Prints a long string, word-wrapping the text to the current width of the
200
+ # terminal display. Ideal for printing heredocs.
201
+ #
202
+ # ==== Parameters
203
+ # String
204
+ #
205
+ # ==== Options
206
+ # indent<Integer>:: Indent each line of the printed paragraph by indent value.
207
+ #
208
+ def print_wrapped(message, options = {})
209
+ indent = options[:indent] || 0
210
+ width = terminal_width - indent
211
+ paras = message.split("\n\n")
212
+
213
+ paras.map! do |unwrapped|
214
+ unwrapped.strip.gsub(/\n/, " ").squeeze(" ").gsub(/.{1,#{width}}(?:\s|\Z)/) { ($& + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n") }
215
+ end
216
+
217
+ paras.each do |para|
218
+ para.split("\n").each do |line|
219
+ stdout.puts line.insert(0, " " * indent)
220
+ end
221
+ stdout.puts unless para == paras.last
222
+ end
223
+ end
224
+
225
+ # Deals with file collision and returns true if the file should be
226
+ # overwritten and false otherwise. If a block is given, it uses the block
227
+ # response as the content for the diff.
228
+ #
229
+ # ==== Parameters
230
+ # destination<String>:: the destination file to solve conflicts
231
+ # block<Proc>:: an optional block that returns the value to be used in diff
232
+ #
233
+ def file_collision(destination) # rubocop:disable MethodLength
234
+ return true if @always_force
235
+ options = block_given? ? "[Ynaqdh]" : "[Ynaqh]"
236
+
237
+ loop do
238
+ answer = ask(
239
+ %[Overwrite #{destination}? (enter "h" for help) #{options}],
240
+ :add_to_history => false
241
+ )
242
+
243
+ case answer
244
+ when is?(:yes), is?(:force), ""
245
+ return true
246
+ when is?(:no), is?(:skip)
247
+ return false
248
+ when is?(:always)
249
+ return @always_force = true
250
+ when is?(:quit)
251
+ say "Aborting..."
252
+ fail SystemExit
253
+ when is?(:diff)
254
+ show_diff(destination, yield) if block_given?
255
+ say "Retrying..."
256
+ else
257
+ say file_collision_help
258
+ end
259
+ end
260
+ end
261
+
262
+ # This code was copied from Rake, available under MIT-LICENSE
263
+ # Copyright (c) 2003, 2004 Jim Weirich
264
+ def terminal_width
265
+ if ENV["THOR_COLUMNS"]
266
+ result = ENV["THOR_COLUMNS"].to_i
267
+ else
268
+ result = unix? ? dynamic_width : 80
269
+ end
270
+ result < 10 ? 80 : result
271
+ rescue
272
+ 80
273
+ end
274
+
275
+ # Called if something goes wrong during the execution. This is used by Thor
276
+ # internally and should not be used inside your scripts. If something went
277
+ # wrong, you can always raise an exception. If you raise a Thor::Error, it
278
+ # will be rescued and wrapped in the method below.
279
+ #
280
+ def error(statement)
281
+ stderr.puts statement
282
+ end
283
+
284
+ # Apply color to the given string with optional bold. Disabled in the
285
+ # Thor::Shell::Basic class.
286
+ #
287
+ def set_color(string, *args) #:nodoc:
288
+ string
289
+ end
290
+
291
+ protected
292
+
293
+ def prepare_message(message, *color)
294
+ spaces = " " * padding
295
+ spaces + set_color(message.to_s, *color)
296
+ end
297
+
298
+ def can_display_colors?
299
+ false
300
+ end
301
+
302
+ def lookup_color(color)
303
+ return color unless color.is_a?(Symbol)
304
+ self.class.const_get(color.to_s.upcase)
305
+ end
306
+
307
+ def stdout
308
+ $stdout
309
+ end
310
+
311
+ def stderr
312
+ $stderr
313
+ end
314
+
315
+ def is?(value) #:nodoc:
316
+ value = value.to_s
317
+
318
+ if value.size == 1
319
+ /\A#{value}\z/i
320
+ else
321
+ /\A(#{value}|#{value[0, 1]})\z/i
322
+ end
323
+ end
324
+
325
+ def file_collision_help #:nodoc:
326
+ <<-HELP
327
+ Y - yes, overwrite
328
+ n - no, do not overwrite
329
+ a - all, overwrite this and all others
330
+ q - quit, abort
331
+ d - diff, show the differences between the old and the new
332
+ h - help, show this help
333
+ HELP
334
+ end
335
+
336
+ def show_diff(destination, content) #:nodoc:
337
+ diff_cmd = ENV["THOR_DIFF"] || ENV["RAILS_DIFF"] || "diff -u"
338
+
339
+ Tempfile.open(File.basename(destination), File.dirname(destination)) do |temp|
340
+ temp.write content
341
+ temp.rewind
342
+ system %(#{diff_cmd} "#{destination}" "#{temp.path}")
343
+ end
344
+ end
345
+
346
+ def quiet? #:nodoc:
347
+ mute? || (base && base.options[:quiet])
348
+ end
349
+
350
+ # Calculate the dynamic width of the terminal
351
+ def dynamic_width
352
+ @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
353
+ end
354
+
355
+ def dynamic_width_stty
356
+ %x(stty size 2>/dev/null).split[1].to_i
357
+ end
358
+
359
+ def dynamic_width_tput
360
+ %x(tput cols 2>/dev/null).to_i
361
+ end
362
+
363
+ def unix?
364
+ RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
365
+ end
366
+
367
+ def truncate(string, width)
368
+ as_unicode do
369
+ chars = string.chars.to_a
370
+ if chars.length <= width
371
+ chars.join
372
+ else
373
+ ( chars[0, width - 3].join) + "..."
374
+ end
375
+ end
376
+ end
377
+
378
+ if "".respond_to?(:encode)
379
+ def as_unicode
380
+ yield
381
+ end
382
+ else
383
+ def as_unicode
384
+ old, $KCODE = $KCODE, "U"
385
+ yield
386
+ ensure
387
+ $KCODE = old
388
+ end
389
+ end
390
+
391
+ def ask_simply(statement, color, options)
392
+ default = options[:default]
393
+ message = [statement, ("(#{default})" if default), nil].uniq.join(" ")
394
+ message = prepare_message(message, color)
395
+ result = Thor::LineEditor.readline(message, options)
396
+
397
+ return unless result
398
+
399
+ result.strip!
400
+
401
+ if default && result == ""
402
+ default
403
+ else
404
+ result
405
+ end
406
+ end
407
+
408
+ def ask_filtered(statement, color, options)
409
+ answer_set = options[:limited_to]
410
+ correct_answer = nil
411
+ until correct_answer
412
+ answers = answer_set.join(", ")
413
+ answer = ask_simply("#{statement} [#{answers}]", color, options)
414
+ correct_answer = answer_set.include?(answer) ? answer : nil
415
+ say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
416
+ end
417
+ correct_answer
418
+ end
419
+ end
420
+ end
421
+ end