Spec-Zone.ru › Ruby 2.7

модуль 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")

Публичные методы класса

camel_case(str) Показать исходный код
# 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.

Параметры

String

Возвращает

String

escape_globs(path) Показать исходный код
# 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\]'

Параметры

String

Возвращает

String

escape_html(string) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 279
def escape_html(string)
  CGI.escapeHTML(string)
end

Возвращает строку, в которой все HTML-символы экранированы.

Примеры

Bundler::Thor::Util.escape_html('<div>')   # => "&lt;div&gt;"

Параметры

String

Возвращает

String

find_by_namespace(namespace) Показать исходный код
# 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>

Пространство имён, которое нужно найти.

find_class_and_command_by_namespace(namespace, fallback = true) Показать исходный код
# 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>

Также алиас: find_class_and_task_by_namespace
find_class_and_task_by_namespace(namespace, fallback = true)
Псевдоним для: find_class_and_command_by_namespace
globs_for(path) Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 212
def globs_for(path)
  path = escape_globs(path)
  ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/*.thor"]
end

Место поиска файлов Bundler::Thor.

load_thorfile(path, content = nil, debug = false) Показать исходный код
# 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 по этому пути. Файл оценивается в защищённой среде, чтобы избежать конфликтов имён.

namespace_from_thor_class(constant) Показать исходный код
# 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»

namespaces_in_content(contents, file = __FILE__) Показать исходный код
# 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>

Возвращает

Массив

ruby_command() Показать исходный код
# 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.

snake_case(str) Показать исходный код
# 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.

Параметры

String

Возвращает

String

thor_classes_in(klass) Показать исходный код
# 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, объявленные внутри данного класса.

thor_root() Показать исходный код
# File lib/bundler/vendor/thor/lib/thor/util.rb, line 191
def thor_root
  File.join(user_home, ".thor").tr('\\', "/")
end

Возвращает корневую директорию, в которой находятся файлы thor, в зависимости от ОС.

thor_root_glob() Показать исходный код
# 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 не сработает.

user_home() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API