модуль Bundler::Thor::Util
В этом модуле содержатся несколько утилит:
1) Методы для преобразования пространств имён thor в константы и наоборот.
Bundler::Thor::Util.namespace_from_thor_class(Foo::Bar::Baz) #=> "foo:bar:baz"
2) Загрузка файлов thor и создание песочницы:
Bundler::Thor::Util.load_thorfile("~/.thor/foo")
Общедоступные методы класса
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 104
def camel_case(str)
return str if str !~ /_/ && str =~ /[A-Z]+.*/
str.split("_").map(&:capitalize).join
end Принимает строку и преобразует её в верблюжий регистр. camel_case возвращает CamelCase.
Параметры
Возвращает
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 263
def escape_globs(path)
path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
end Возвращает строку, в которой все символы подстановки заменены. Символы подстановки: `* ? { } [ ]`.
Примеры
Bundler::Thor::Util.escape_globs('[apps]') # => '\[apps\]'
Параметры
Возвращает
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 24
def find_by_namespace(namespace)
namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
Bundler::Thor::Base.subclasses.detect { |klass| klass.namespace == namespace }
end Принимает пространство имён и ищет его среди подклассов Bundler::Thor::Base.
Параметры
- namespace<String>
-
Пространство имён для поиска.
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 131
def find_class_and_command_by_namespace(namespace, fallback = true)
if namespace.include?(":") # look for a namespaced command
pieces = namespace.split(":")
command = pieces.pop
klass = Bundler::Thor::Util.find_by_namespace(pieces.join(":"))
end
unless klass # look for a Bundler::Thor::Group with the right name
klass = Bundler::Thor::Util.find_by_namespace(namespace)
command = nil
end
if !klass && fallback # try a command in the default namespace
command = namespace
klass = Bundler::Thor::Util.find_by_namespace("")
end
[klass, command]
end Принимает пространство имён и пытается получить класс Bundler::Thor или Bundler::Thor::Group из него. Сначала выполняется поиск класса по всему заданному пространству имён, если он не найден, удаляется самая старшая часть и выполняется поиск класса снова. Если найден, возвращается самая старшая часть как имя класса.
Примеры
class Foo::Bar < Bundler::Thor
def baz
end
end
class Baz::Foo < Bundler::Thor::Group
end
Bundler::Thor::Util.namespace_to_thor_class("foo:bar") #=> Foo::Bar, nil # will invoke default command
Bundler::Thor::Util.namespace_to_thor_class("baz:foo") #=> Baz::Foo, nil
Bundler::Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
Параметры
namespace<String>
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 212
def globs_for(path)
path = escape_globs(path)
["#{path}/Bundler::Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
end Где искать файлы Bundler::Thor.
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 152
def load_thorfile(path, content = nil, debug = false)
content ||= File.binread(path)
begin
Bundler::Thor::Sandbox.class_eval(content, path)
rescue StandardError => e
$stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
if debug
$stderr.puts(*e.backtrace)
else
$stderr.puts(e.backtrace.first)
end
end
end Принимает путь и загружает файл thor по этому пути. Файл оценивается внутри песочницы, чтобы избежать конфликтов имён.
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 43
def namespace_from_thor_class(constant)
constant = constant.to_s.gsub(/^Bundler::Thor::Sandbox::/, "")
constant = snake_case(constant).squeeze(":")
constant
end Принимает константу и преобразует её в пространство имён Bundler::Thor. Так как команды Bundler::Thor могут быть добавлены в песочницу, этот метод также отвечает за удаление пространства имён песочницы.
Этот метод не следует использовать в общем случае, поскольку он предназначен для работы со старыми версиями Bundler::Thor. В текущих версиях, если вам нужно получить пространство имён из класса, просто вызовите метод namespace на нём.
Параметры
- constant<Object>
-
Константа, которая будет преобразована в путь thor.
Возвращает
-
String -
Если мы получаем Foo::Bar::Baz, возвращает “foo:bar:baz”
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 58 def namespaces_in_content(contents, file = __FILE__) old_constants = Bundler::Thor::Base.subclasses.dup Bundler::Thor::Base.subclasses.clear load_thorfile(file, contents) new_constants = Bundler::Thor::Base.subclasses.dup Bundler::Thor::Base.subclasses.replace(old_constants) new_constants.map!(&:namespace) new_constants.compact! new_constants end
Принимает содержимое, оценивает его в песочнице и возвращает пространства имён, определённые в песочнице.
Параметры
contents<String>
Возвращает
Массив
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 220
def ruby_command
@ruby_command ||= begin
ruby_name = RbConfig::CONFIG["ruby_install_name"]
ruby = File.join(RbConfig::CONFIG["bindir"], ruby_name)
ruby << RbConfig::CONFIG["EXEEXT"]
# avoid using different name than ruby (on platforms supporting links)
if ruby_name != "ruby" && File.respond_to?(:readlink)
begin
alternate_ruby = File.join(RbConfig::CONFIG["bindir"], "ruby")
alternate_ruby << RbConfig::CONFIG["EXEEXT"]
# ruby is a symlink
if File.symlink? alternate_ruby
linked_ruby = File.readlink alternate_ruby
# symlink points to 'ruby_install_name'
ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
end
rescue NotImplementedError # rubocop:disable HandleExceptions
# just ignore on windows
end
end
# escape string in case path to ruby executable contain spaces.
ruby.sub!(/.*\s.*/m, '"\&"')
ruby
end
end Возвращает путь к интерпретатору ruby, учитывая несколько установок и расширения для Windows.
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 90
def snake_case(str)
return str.downcase if str =~ /^[A-Z_]+$/
str.gsub(/\B[A-Z]/, '_\&').squeeze("_") =~ /_*(.*)/
$+.downcase
end Принимает строку и преобразует её в змеиный регистр. SnakeCase возвращает snake_case.
Параметры
Возвращает
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 74
def thor_classes_in(klass)
stringfied_constants = klass.constants.map(&:to_s)
Bundler::Thor::Base.subclasses.select do |subclass|
next unless subclass.name
stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ""))
end
end Возвращает классы thor, объявленные внутри данного класса.
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 191
def thor_root
File.join(user_home, ".thor").tr('\\', "/")
end Возвращает корневую директорию, где находятся файлы thor, в зависимости от ОС.
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 202
def thor_root_glob
files = Dir["#{escape_globs(thor_root)}/*"]
files.map! do |file|
File.directory?(file) ? File.join(file, "main.thor") : file
end
end Возвращает файлы в корне thor. В Windows thor_root будет выглядеть примерно так:
C:\Documents and Settings\james\.thor
Если мы не заменим \ символ, Dir.glob не сработает.
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 167
def user_home
@@user_home ||= if ENV["HOME"]
ENV["HOME"]
elsif ENV["USERPROFILE"]
ENV["USERPROFILE"]
elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
elsif ENV["APPDATA"]
ENV["APPDATA"]
else
begin
File.expand_path("~")
rescue
if File::ALT_SEPARATOR
"C:/"
else
"/"
end
end
end
end
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.