github_cli 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. data/.travis.yml +14 -3
  2. data/CHANGELOG.md +15 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +41 -44
  5. data/README.md +77 -14
  6. data/Rakefile +4 -2
  7. data/features/assignee.feature +1 -0
  8. data/features/blob.feature +1 -0
  9. data/features/collaborator.feature +1 -0
  10. data/features/commit.feature +2 -1
  11. data/features/config.feature +27 -28
  12. data/features/event.feature +1 -0
  13. data/features/init.feature +20 -23
  14. data/features/key.feature +5 -5
  15. data/features/milestone.feature +3 -2
  16. data/features/reference.feature +3 -2
  17. data/features/starring.feature +1 -0
  18. data/features/support/hooks.rb +1 -1
  19. data/features/tag.feature +2 -1
  20. data/features/tree.feature +17 -0
  21. data/features/watching.feature +1 -0
  22. data/fixtures/simple_config +3 -5
  23. data/github_cli.gemspec +1 -1
  24. data/lib/github_cli/api.rb +11 -6
  25. data/lib/github_cli/apis/event.rb +8 -8
  26. data/lib/github_cli/apis/label.rb +0 -12
  27. data/lib/github_cli/apis/starring.rb +5 -5
  28. data/lib/github_cli/apis/watching.rb +5 -5
  29. data/lib/github_cli/cli.rb +21 -30
  30. data/lib/github_cli/command.rb +1 -1
  31. data/lib/github_cli/commands/authorizations.rb +28 -2
  32. data/lib/github_cli/commands/collaborators.rb +12 -12
  33. data/lib/github_cli/commands/commits.rb +18 -2
  34. data/lib/github_cli/commands/events.rb +6 -8
  35. data/lib/github_cli/commands/followers.rb +1 -1
  36. data/lib/github_cli/commands/labels.rb +22 -20
  37. data/lib/github_cli/commands/milestones.rb +43 -13
  38. data/lib/github_cli/commands/references.rb +21 -6
  39. data/lib/github_cli/commands/starring.rb +3 -2
  40. data/lib/github_cli/commands/tags.rb +16 -1
  41. data/lib/github_cli/commands/trees.rb +11 -5
  42. data/lib/github_cli/commands/watching.rb +3 -2
  43. data/lib/github_cli/config.rb +15 -6
  44. data/lib/github_cli/dsl.rb +2 -2
  45. data/lib/github_cli/formatter.rb +2 -3
  46. data/lib/github_cli/formatters/csv.rb +29 -14
  47. data/lib/github_cli/formatters/table.rb +2 -3
  48. data/lib/github_cli/man/gcli-config.1 +17 -13
  49. data/lib/github_cli/man/gcli-config.1.txt +23 -21
  50. data/lib/github_cli/vendor/thor/actions/create_link.rb +3 -0
  51. data/lib/github_cli/vendor/thor/actions/directory.rb +29 -10
  52. data/lib/github_cli/vendor/thor/actions/file_manipulation.rb +9 -3
  53. data/lib/github_cli/vendor/thor/actions.rb +18 -18
  54. data/lib/github_cli/vendor/thor/base.rb +97 -89
  55. data/lib/github_cli/vendor/thor/{task.rb → command.rb} +16 -12
  56. data/lib/github_cli/vendor/thor/core_ext/hash_with_indifferent_access.rb +5 -0
  57. data/lib/github_cli/vendor/thor/core_ext/io_binary_read.rb +12 -0
  58. data/lib/github_cli/vendor/thor/error.rb +4 -7
  59. data/lib/github_cli/vendor/thor/group.rb +34 -32
  60. data/lib/github_cli/vendor/thor/invocation.rb +28 -26
  61. data/lib/github_cli/vendor/thor/parser/options.rb +66 -26
  62. data/lib/github_cli/vendor/thor/rake_compat.rb +3 -2
  63. data/lib/github_cli/vendor/thor/runner.rb +21 -20
  64. data/lib/github_cli/vendor/thor/shell/basic.rb +20 -16
  65. data/lib/github_cli/vendor/thor/shell/color.rb +13 -9
  66. data/lib/github_cli/vendor/thor/shell/html.rb +13 -9
  67. data/lib/github_cli/vendor/thor/util.rb +214 -210
  68. data/lib/github_cli/vendor/thor/version.rb +1 -1
  69. data/lib/github_cli/vendor/thor.rb +232 -153
  70. data/lib/github_cli/version.rb +1 -1
  71. data/man/gcli-config.1.ronn +14 -11
  72. data/spec/github_cli/commands/assignees_spec.rb +20 -0
  73. data/spec/github_cli/commands/blobs_spec.rb +21 -0
  74. data/spec/github_cli/commands/collaborators_spec.rb +31 -0
  75. data/spec/github_cli/commands/commits_spec.rb +26 -0
  76. data/spec/github_cli/commands/emails_spec.rb +24 -0
  77. data/spec/github_cli/commands/events_spec.rb +56 -0
  78. data/spec/github_cli/commands/followers_spec.rb +44 -0
  79. data/spec/github_cli/commands/keys_spec.rb +36 -0
  80. data/spec/github_cli/commands/labels_spec.rb +61 -0
  81. data/spec/github_cli/commands/milestones_spec.rb +47 -0
  82. data/spec/github_cli/commands/references_spec.rb +42 -0
  83. data/spec/github_cli/commands/starring_spec.rb +40 -0
  84. data/spec/github_cli/commands/tags_spec.rb +26 -0
  85. data/spec/github_cli/commands/trees_spec.rb +32 -0
  86. data/spec/github_cli/commands/watching_spec.rb +40 -0
  87. data/spec/github_cli/config_spec.rb +109 -116
  88. data/spec/github_cli/util/convert_value_spec.rb +19 -0
  89. data/spec/github_cli/util/convert_values_spec.rb +14 -0
  90. data/spec/github_cli/util_spec.rb +0 -29
  91. metadata +51 -19
  92. data/lib/github_cli/vendor/thor/core_ext/dir_escape.rb +0 -0
  93. data/lib/github_cli/vendor/thor/core_ext/file_binary_read.rb +0 -9
  94. data/lib/github_cli/vendor/thor/empty.txt +0 -0
@@ -94,6 +94,10 @@ class Thor
94
94
 
95
95
  protected
96
96
 
97
+ def can_display_colors?
98
+ stdout.tty?
99
+ end
100
+
97
101
  # Overwrite show_diff to show diff with colors if Diff::LCS is
98
102
  # available.
99
103
  #
@@ -112,15 +116,15 @@ class Thor
112
116
 
113
117
  def output_diff_line(diff) #:nodoc:
114
118
  case diff.action
115
- when '-'
116
- say "- #{diff.old_element.chomp}", :red, true
117
- when '+'
118
- say "+ #{diff.new_element.chomp}", :green, true
119
- when '!'
120
- say "- #{diff.old_element.chomp}", :red, true
121
- say "+ #{diff.new_element.chomp}", :green, true
122
- else
123
- say " #{diff.old_element.chomp}", nil, true
119
+ when '-'
120
+ say "- #{diff.old_element.chomp}", :red, true
121
+ when '+'
122
+ say "+ #{diff.new_element.chomp}", :green, true
123
+ when '!'
124
+ say "- #{diff.old_element.chomp}", :red, true
125
+ say "+ #{diff.new_element.chomp}", :green, true
126
+ else
127
+ say " #{diff.old_element.chomp}", nil, true
124
128
  end
125
129
  end
126
130
 
@@ -73,6 +73,10 @@ class Thor
73
73
 
74
74
  protected
75
75
 
76
+ def can_display_colors?
77
+ true
78
+ end
79
+
76
80
  # Overwrite show_diff to show diff with colors if Diff::LCS is
77
81
  # available.
78
82
  #
@@ -91,15 +95,15 @@ class Thor
91
95
 
92
96
  def output_diff_line(diff) #:nodoc:
93
97
  case diff.action
94
- when '-'
95
- say "- #{diff.old_element.chomp}", :red, true
96
- when '+'
97
- say "+ #{diff.new_element.chomp}", :green, true
98
- when '!'
99
- say "- #{diff.old_element.chomp}", :red, true
100
- say "+ #{diff.new_element.chomp}", :green, true
101
- else
102
- say " #{diff.old_element.chomp}", nil, true
98
+ when '-'
99
+ say "- #{diff.old_element.chomp}", :red, true
100
+ when '+'
101
+ say "+ #{diff.new_element.chomp}", :green, true
102
+ when '!'
103
+ say "- #{diff.old_element.chomp}", :red, true
104
+ say "+ #{diff.new_element.chomp}", :green, true
105
+ else
106
+ say " #{diff.old_element.chomp}", nil, true
103
107
  end
104
108
  end
105
109
 
@@ -16,251 +16,255 @@ class Thor
16
16
  #
17
17
  module Util
18
18
 
19
- # Receives a namespace and search for it in the Thor::Base subclasses.
20
- #
21
- # ==== Parameters
22
- # namespace<String>:: The namespace to search for.
23
- #
24
- def self.find_by_namespace(namespace)
25
- namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
26
- Thor::Base.subclasses.find { |klass| klass.namespace == namespace }
27
- end
19
+ class << self
28
20
 
29
- # Receives a constant and converts it to a Thor namespace. Since Thor tasks
30
- # can be added to a sandbox, this method is also responsable for removing
31
- # the sandbox namespace.
32
- #
33
- # This method should not be used in general because it's used to deal with
34
- # older versions of Thor. On current versions, if you need to get the
35
- # namespace from a class, just call namespace on it.
36
- #
37
- # ==== Parameters
38
- # constant<Object>:: The constant to be converted to the thor path.
39
- #
40
- # ==== Returns
41
- # String:: If we receive Foo::Bar::Baz it returns "foo:bar:baz"
42
- #
43
- def self.namespace_from_thor_class(constant)
44
- constant = constant.to_s.gsub(/^Thor::Sandbox::/, "")
45
- constant = snake_case(constant).squeeze(":")
46
- constant
47
- end
21
+ # Receives a namespace and search for it in the Thor::Base subclasses.
22
+ #
23
+ # ==== Parameters
24
+ # namespace<String>:: The namespace to search for.
25
+ #
26
+ def find_by_namespace(namespace)
27
+ namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
28
+ Thor::Base.subclasses.find { |klass| klass.namespace == namespace }
29
+ end
48
30
 
49
- # Given the contents, evaluate it inside the sandbox and returns the
50
- # namespaces defined in the sandbox.
51
- #
52
- # ==== Parameters
53
- # contents<String>
54
- #
55
- # ==== Returns
56
- # Array[Object]
57
- #
58
- def self.namespaces_in_content(contents, file=__FILE__)
59
- old_constants = Thor::Base.subclasses.dup
60
- Thor::Base.subclasses.clear
31
+ # Receives a constant and converts it to a Thor namespace. Since Thor
32
+ # commands can be added to a sandbox, this method is also responsable for
33
+ # removing the sandbox namespace.
34
+ #
35
+ # This method should not be used in general because it's used to deal with
36
+ # older versions of Thor. On current versions, if you need to get the
37
+ # namespace from a class, just call namespace on it.
38
+ #
39
+ # ==== Parameters
40
+ # constant<Object>:: The constant to be converted to the thor path.
41
+ #
42
+ # ==== Returns
43
+ # String:: If we receive Foo::Bar::Baz it returns "foo:bar:baz"
44
+ #
45
+ def namespace_from_thor_class(constant)
46
+ constant = constant.to_s.gsub(/^Thor::Sandbox::/, "")
47
+ constant = snake_case(constant).squeeze(":")
48
+ constant
49
+ end
61
50
 
62
- load_thorfile(file, contents)
51
+ # Given the contents, evaluate it inside the sandbox and returns the
52
+ # namespaces defined in the sandbox.
53
+ #
54
+ # ==== Parameters
55
+ # contents<String>
56
+ #
57
+ # ==== Returns
58
+ # Array[Object]
59
+ #
60
+ def namespaces_in_content(contents, file=__FILE__)
61
+ old_constants = Thor::Base.subclasses.dup
62
+ Thor::Base.subclasses.clear
63
63
 
64
- new_constants = Thor::Base.subclasses.dup
65
- Thor::Base.subclasses.replace(old_constants)
64
+ load_thorfile(file, contents)
66
65
 
67
- new_constants.map!{ |c| c.namespace }
68
- new_constants.compact!
69
- new_constants
70
- end
66
+ new_constants = Thor::Base.subclasses.dup
67
+ Thor::Base.subclasses.replace(old_constants)
71
68
 
72
- # Returns the thor classes declared inside the given class.
73
- #
74
- def self.thor_classes_in(klass)
75
- stringfied_constants = klass.constants.map { |c| c.to_s }
76
- Thor::Base.subclasses.select do |subclass|
77
- next unless subclass.name
78
- stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ''))
69
+ new_constants.map!{ |c| c.namespace }
70
+ new_constants.compact!
71
+ new_constants
79
72
  end
80
- end
81
-
82
- # Receives a string and convert it to snake case. SnakeCase returns snake_case.
83
- #
84
- # ==== Parameters
85
- # String
86
- #
87
- # ==== Returns
88
- # String
89
- #
90
- def self.snake_case(str)
91
- return str.downcase if str =~ /^[A-Z_]+$/
92
- str.gsub(/\B[A-Z]/, '_\&').squeeze('_') =~ /_*(.*)/
93
- return $+.downcase
94
- end
95
-
96
- # Receives a string and convert it to camel case. camel_case returns CamelCase.
97
- #
98
- # ==== Parameters
99
- # String
100
- #
101
- # ==== Returns
102
- # String
103
- #
104
- def self.camel_case(str)
105
- return str if str !~ /_/ && str =~ /[A-Z]+.*/
106
- str.split('_').map { |i| i.capitalize }.join
107
- end
108
73
 
109
- # Receives a namespace and tries to retrieve a Thor or Thor::Group class
110
- # from it. It first searches for a class using the all the given namespace,
111
- # if it's not found, removes the highest entry and searches for the class
112
- # again. If found, returns the highest entry as the class name.
113
- #
114
- # ==== Examples
115
- #
116
- # class Foo::Bar < Thor
117
- # def baz
118
- # end
119
- # end
120
- #
121
- # class Baz::Foo < Thor::Group
122
- # end
123
- #
124
- # Thor::Util.namespace_to_thor_class("foo:bar") #=> Foo::Bar, nil # will invoke default task
125
- # Thor::Util.namespace_to_thor_class("baz:foo") #=> Baz::Foo, nil
126
- # Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
127
- #
128
- # ==== Parameters
129
- # namespace<String>
130
- #
131
- def self.find_class_and_task_by_namespace(namespace, fallback = true)
132
- if namespace.include?(?:) # look for a namespaced task
133
- pieces = namespace.split(":")
134
- task = pieces.pop
135
- klass = Thor::Util.find_by_namespace(pieces.join(":"))
136
- end
137
- unless klass # look for a Thor::Group with the right name
138
- klass, task = Thor::Util.find_by_namespace(namespace), nil
74
+ # Returns the thor classes declared inside the given class.
75
+ #
76
+ def thor_classes_in(klass)
77
+ stringfied_constants = klass.constants.map { |c| c.to_s }
78
+ Thor::Base.subclasses.select do |subclass|
79
+ next unless subclass.name
80
+ stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ''))
81
+ end
139
82
  end
140
- if !klass && fallback # try a task in the default namespace
141
- task = namespace
142
- klass = Thor::Util.find_by_namespace('')
83
+
84
+ # Receives a string and convert it to snake case. SnakeCase returns snake_case.
85
+ #
86
+ # ==== Parameters
87
+ # String
88
+ #
89
+ # ==== Returns
90
+ # String
91
+ #
92
+ def snake_case(str)
93
+ return str.downcase if str =~ /^[A-Z_]+$/
94
+ str.gsub(/\B[A-Z]/, '_\&').squeeze('_') =~ /_*(.*)/
95
+ return $+.downcase
143
96
  end
144
- return klass, task
145
- end
146
97
 
147
- # Receives a path and load the thor file in the path. The file is evaluated
148
- # inside the sandbox to avoid namespacing conflicts.
149
- #
150
- def self.load_thorfile(path, content=nil, debug=false)
151
- content ||= File.binread(path)
98
+ # Receives a string and convert it to camel case. camel_case returns CamelCase.
99
+ #
100
+ # ==== Parameters
101
+ # String
102
+ #
103
+ # ==== Returns
104
+ # String
105
+ #
106
+ def camel_case(str)
107
+ return str if str !~ /_/ && str =~ /[A-Z]+.*/
108
+ str.split('_').map { |i| i.capitalize }.join
109
+ end
152
110
 
153
- begin
154
- Thor::Sandbox.class_eval(content, path)
155
- rescue Exception => e
156
- $stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
157
- if debug
158
- $stderr.puts(*e.backtrace)
159
- else
160
- $stderr.puts(e.backtrace.first)
111
+ # Receives a namespace and tries to retrieve a Thor or Thor::Group class
112
+ # from it. It first searches for a class using the all the given namespace,
113
+ # if it's not found, removes the highest entry and searches for the class
114
+ # again. If found, returns the highest entry as the class name.
115
+ #
116
+ # ==== Examples
117
+ #
118
+ # class Foo::Bar < Thor
119
+ # def baz
120
+ # end
121
+ # end
122
+ #
123
+ # class Baz::Foo < Thor::Group
124
+ # end
125
+ #
126
+ # Thor::Util.namespace_to_thor_class("foo:bar") #=> Foo::Bar, nil # will invoke default command
127
+ # Thor::Util.namespace_to_thor_class("baz:foo") #=> Baz::Foo, nil
128
+ # Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
129
+ #
130
+ # ==== Parameters
131
+ # namespace<String>
132
+ #
133
+ def find_class_and_command_by_namespace(namespace, fallback = true)
134
+ if namespace.include?(?:) # look for a namespaced command
135
+ pieces = namespace.split(":")
136
+ command = pieces.pop
137
+ klass = Thor::Util.find_by_namespace(pieces.join(":"))
138
+ end
139
+ unless klass # look for a Thor::Group with the right name
140
+ klass, command = Thor::Util.find_by_namespace(namespace), nil
141
+ end
142
+ if !klass && fallback # try a command in the default namespace
143
+ command = namespace
144
+ klass = Thor::Util.find_by_namespace('')
161
145
  end
146
+ return klass, command
162
147
  end
163
- end
148
+ alias find_class_and_task_by_namespace find_class_and_command_by_namespace
149
+
150
+ # Receives a path and load the thor file in the path. The file is evaluated
151
+ # inside the sandbox to avoid namespacing conflicts.
152
+ #
153
+ def load_thorfile(path, content=nil, debug=false)
154
+ content ||= File.binread(path)
164
155
 
165
- def self.user_home
166
- @@user_home ||= if ENV["HOME"]
167
- ENV["HOME"]
168
- elsif ENV["USERPROFILE"]
169
- ENV["USERPROFILE"]
170
- elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
171
- File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
172
- elsif ENV["APPDATA"]
173
- ENV["APPDATA"]
174
- else
175
156
  begin
176
- File.expand_path("~")
177
- rescue
178
- if File::ALT_SEPARATOR
179
- "C:/"
157
+ Thor::Sandbox.class_eval(content, path)
158
+ rescue Exception => e
159
+ $stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
160
+ if debug
161
+ $stderr.puts(*e.backtrace)
180
162
  else
181
- "/"
163
+ $stderr.puts(e.backtrace.first)
182
164
  end
183
165
  end
184
166
  end
185
- end
186
167
 
187
- # Returns the root where thor files are located, depending on the OS.
188
- #
189
- def self.thor_root
190
- File.join(user_home, ".thor").gsub(/\\/, '/')
191
- end
168
+ def user_home
169
+ @@user_home ||= if ENV["HOME"]
170
+ ENV["HOME"]
171
+ elsif ENV["USERPROFILE"]
172
+ ENV["USERPROFILE"]
173
+ elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
174
+ File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
175
+ elsif ENV["APPDATA"]
176
+ ENV["APPDATA"]
177
+ else
178
+ begin
179
+ File.expand_path("~")
180
+ rescue
181
+ if File::ALT_SEPARATOR
182
+ "C:/"
183
+ else
184
+ "/"
185
+ end
186
+ end
187
+ end
188
+ end
189
+
190
+ # Returns the root where thor files are located, depending on the OS.
191
+ #
192
+ def thor_root
193
+ File.join(user_home, ".thor").gsub(/\\/, '/')
194
+ end
192
195
 
193
- # Returns the files in the thor root. On Windows thor_root will be something
194
- # like this:
195
- #
196
- # C:\Documents and Settings\james\.thor
197
- #
198
- # If we don't #gsub the \ character, Dir.glob will fail.
199
- #
200
- def self.thor_root_glob
201
- files = Dir["#{escape_globs(thor_root)}/*"]
196
+ # Returns the files in the thor root. On Windows thor_root will be something
197
+ # like this:
198
+ #
199
+ # C:\Documents and Settings\james\.thor
200
+ #
201
+ # If we don't #gsub the \ character, Dir.glob will fail.
202
+ #
203
+ def thor_root_glob
204
+ files = Dir["#{escape_globs(thor_root)}/*"]
202
205
 
203
- files.map! do |file|
204
- File.directory?(file) ? File.join(file, "main.thor") : file
206
+ files.map! do |file|
207
+ File.directory?(file) ? File.join(file, "main.thor") : file
208
+ end
205
209
  end
206
- end
207
210
 
208
- # Where to look for Thor files.
209
- #
210
- def self.globs_for(path)
211
- path = escape_globs(path)
212
- ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
213
- end
211
+ # Where to look for Thor files.
212
+ #
213
+ def globs_for(path)
214
+ path = escape_globs(path)
215
+ ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
216
+ end
214
217
 
215
- # Return the path to the ruby interpreter taking into account multiple
216
- # installations and windows extensions.
217
- #
218
- def self.ruby_command
219
- @ruby_command ||= begin
220
- ruby_name = RbConfig::CONFIG['ruby_install_name']
221
- ruby = File.join(RbConfig::CONFIG['bindir'], ruby_name)
222
- ruby << RbConfig::CONFIG['EXEEXT']
218
+ # Return the path to the ruby interpreter taking into account multiple
219
+ # installations and windows extensions.
220
+ #
221
+ def ruby_command
222
+ @ruby_command ||= begin
223
+ ruby_name = RbConfig::CONFIG['ruby_install_name']
224
+ ruby = File.join(RbConfig::CONFIG['bindir'], ruby_name)
225
+ ruby << RbConfig::CONFIG['EXEEXT']
223
226
 
224
- # avoid using different name than ruby (on platforms supporting links)
225
- if ruby_name != 'ruby' && File.respond_to?(:readlink)
226
- begin
227
- alternate_ruby = File.join(RbConfig::CONFIG['bindir'], 'ruby')
228
- alternate_ruby << RbConfig::CONFIG['EXEEXT']
227
+ # avoid using different name than ruby (on platforms supporting links)
228
+ if ruby_name != 'ruby' && File.respond_to?(:readlink)
229
+ begin
230
+ alternate_ruby = File.join(RbConfig::CONFIG['bindir'], 'ruby')
231
+ alternate_ruby << RbConfig::CONFIG['EXEEXT']
229
232
 
230
- # ruby is a symlink
231
- if File.symlink? alternate_ruby
232
- linked_ruby = File.readlink alternate_ruby
233
+ # ruby is a symlink
234
+ if File.symlink? alternate_ruby
235
+ linked_ruby = File.readlink alternate_ruby
233
236
 
234
- # symlink points to 'ruby_install_name'
235
- ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
237
+ # symlink points to 'ruby_install_name'
238
+ ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
239
+ end
240
+ rescue NotImplementedError
241
+ # just ignore on windows
236
242
  end
237
- rescue NotImplementedError
238
- # just ignore on windows
239
243
  end
244
+
245
+ # escape string in case path to ruby executable contain spaces.
246
+ ruby.sub!(/.*\s.*/m, '"\&"')
247
+ ruby
240
248
  end
249
+ end
241
250
 
242
- # escape string in case path to ruby executable contain spaces.
243
- ruby.sub!(/.*\s.*/m, '"\&"')
244
- ruby
251
+ # Returns a string that has had any glob characters escaped.
252
+ # The glob characters are `* ? { } [ ]`.
253
+ #
254
+ # ==== Examples
255
+ #
256
+ # Thor::Util.escape_globs('[apps]') # => '\[apps\]'
257
+ #
258
+ # ==== Parameters
259
+ # String
260
+ #
261
+ # ==== Returns
262
+ # String
263
+ #
264
+ def escape_globs(path)
265
+ path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
245
266
  end
246
- end
247
267
 
248
- # Returns a string that has had any glob characters escaped.
249
- # The glob characters are `* ? { } [ ]`.
250
- #
251
- # ==== Examples
252
- #
253
- # Thor::Util.escape_globs('[apps]') # => '\[apps\]'
254
- #
255
- # ==== Parameters
256
- # String
257
- #
258
- # ==== Returns
259
- # String
260
- #
261
- def self.escape_globs(path)
262
- path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
263
268
  end
264
-
265
269
  end
266
270
  end
@@ -1,3 +1,3 @@
1
1
  class Thor
2
- VERSION = "0.16.0"
2
+ VERSION = "0.17.0"
3
3
  end