130 lines
3.2 KiB
Ruby
130 lines
3.2 KiB
Ruby
# Frozen-string-literal: true
|
|
# Copyright: 2015 - 2017 Jordon Bedwell - MIT License
|
|
# Encoding: utf-8
|
|
|
|
class Pathutil
|
|
module Helpers
|
|
extend self
|
|
|
|
# --
|
|
|
|
def allowed
|
|
return @allowed ||= begin
|
|
{
|
|
:yaml => {
|
|
:classes => [],
|
|
:symbols => []
|
|
}
|
|
}
|
|
end
|
|
end
|
|
|
|
# --
|
|
# Wraps around YAML and SafeYAML to provide alternatives to Rubies.
|
|
# @note We default aliases to yes so we can detect if you explicit true.
|
|
# @return Hash
|
|
# --
|
|
def load_yaml(data, safe: true, whitelist_classes: allowed[:yaml][:classes], \
|
|
whitelist_symbols: allowed[:yaml][:symbols], aliases: :yes)
|
|
|
|
require "yaml"
|
|
unless safe
|
|
return YAML.load(
|
|
data
|
|
)
|
|
end
|
|
|
|
if !YAML.respond_to?(:safe_load)
|
|
setup_safe_yaml whitelist_classes, aliases
|
|
SafeYAML.load(
|
|
data
|
|
)
|
|
|
|
else
|
|
YAML.safe_load(
|
|
data,
|
|
whitelist_classes,
|
|
whitelist_symbols,
|
|
aliases
|
|
)
|
|
end
|
|
end
|
|
|
|
# --
|
|
# Make a temporary name suitable for temporary files and directories.
|
|
# @return String
|
|
# --
|
|
def make_tmpname(prefix = "", suffix = nil, root = nil)
|
|
prefix = tmpname_prefix(prefix)
|
|
suffix = tmpname_suffix(suffix)
|
|
|
|
root ||= Dir::Tmpname.tmpdir
|
|
File.join(root, __make_tmpname(
|
|
prefix, suffix
|
|
))
|
|
end
|
|
|
|
# --
|
|
private
|
|
def __make_tmpname((prefix, suffix), number)
|
|
prefix &&= String.try_convert(prefix) || tmpname_agerr(:prefix, prefix)
|
|
suffix &&= String.try_convert(suffix) || tmpname_agerr(:suffix, suffix)
|
|
|
|
time = Time.now.strftime("%Y%m%d")
|
|
path = "#{prefix}#{time}-#{$$}-#{rand(0x100000000).to_s(36)}".dup
|
|
path << "-#{number}" if number
|
|
path << suffix if suffix
|
|
path
|
|
end
|
|
|
|
private
|
|
def tmpname_agerr(type, val)
|
|
raise ArgumentError, "unexpected #{type}: #{val.inspect}"
|
|
end
|
|
|
|
# --
|
|
private
|
|
def tmpname_suffix(suffix)
|
|
suffix = suffix.join("-") if suffix.is_a?(Array)
|
|
suffix = suffix.gsub(/\A\-/, "") unless !suffix || suffix.empty?
|
|
suffix
|
|
end
|
|
|
|
# --
|
|
# Cleanup the temp name prefix, joining if necessary.
|
|
# rubocop:disable Style/ParallelAssignment
|
|
# --
|
|
private
|
|
def tmpname_prefix(prefix)
|
|
ext, prefix = prefix, "" if !prefix.is_a?(Array) && prefix.start_with?(".")
|
|
ext = prefix.pop if prefix.is_a?(Array) && prefix[-1].start_with?(".")
|
|
prefix = prefix.join("-") if prefix.is_a?(Array)
|
|
|
|
unless prefix.empty?
|
|
prefix = prefix.gsub(/\-\Z/, "") \
|
|
+ "-"
|
|
end
|
|
|
|
return [
|
|
prefix, ext || ""
|
|
]
|
|
end
|
|
|
|
# --
|
|
# Wrap around, cleanup, deprecate and use SafeYAML.
|
|
# rubocop:enable Style/ParallelAssignment
|
|
# --
|
|
private
|
|
def setup_safe_yaml(whitelist_classes, aliases)
|
|
warn "WARN: SafeYAML does not support disabling of aliases." if aliases && aliases != :yes
|
|
warn "WARN: SafeYAML will be removed when Ruby 2.0 goes EOL."
|
|
require "safe_yaml/load"
|
|
|
|
SafeYAML.restore_defaults!
|
|
whitelist_classes.map(&SafeYAML.method(
|
|
:whitelist_class!
|
|
))
|
|
end
|
|
end
|
|
end
|