Merge pull request #9495 from Homebrew/dependabot/bundler/Library/Homebrew/activesupport-6.1.0
build(deps): bump activesupport from 6.0.3.4 to 6.1.0 in /Library/Homebrew
This commit is contained in:
commit
e1451496c6
@ -1,12 +1,12 @@
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
activesupport (6.0.3.4)
|
activesupport (6.1.0)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
minitest (~> 5.1)
|
minitest (>= 5.1)
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 2.0)
|
||||||
zeitwerk (~> 2.2, >= 2.2.2)
|
zeitwerk (~> 2.3)
|
||||||
ast (2.4.1)
|
ast (2.4.1)
|
||||||
bindata (2.4.8)
|
bindata (2.4.8)
|
||||||
byebug (11.1.3)
|
byebug (11.1.3)
|
||||||
@ -151,9 +151,8 @@ GEM
|
|||||||
spoom
|
spoom
|
||||||
thor (>= 0.19.2)
|
thor (>= 0.19.2)
|
||||||
thor (1.0.1)
|
thor (1.0.1)
|
||||||
thread_safe (0.3.6)
|
tzinfo (2.0.3)
|
||||||
tzinfo (1.2.8)
|
concurrent-ruby (~> 1.0)
|
||||||
thread_safe (~> 0.1)
|
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.7.7)
|
unf_ext (0.0.7.7)
|
||||||
|
|||||||
@ -1,8 +0,0 @@
|
|||||||
# DO NOT EDIT MANUALLY
|
|
||||||
# This is an autogenerated file for types exported from the `activesupport` gem.
|
|
||||||
# Please instead update this file by running `tapioca sync`.
|
|
||||||
|
|
||||||
# typed: false
|
|
||||||
|
|
||||||
# THIS IS AN EMPTY RBI FILE.
|
|
||||||
# see https://github.com/Shopify/tapioca/blob/master/README.md#manual-gem-requires
|
|
||||||
608
Library/Homebrew/sorbet/rbi/gems/activesupport@6.1.0.rbi
Normal file
608
Library/Homebrew/sorbet/rbi/gems/activesupport@6.1.0.rbi
Normal file
@ -0,0 +1,608 @@
|
|||||||
|
# DO NOT EDIT MANUALLY
|
||||||
|
# This is an autogenerated file for types exported from the `activesupport` gem.
|
||||||
|
# Please instead update this file by running `tapioca sync`.
|
||||||
|
|
||||||
|
# typed: false
|
||||||
|
|
||||||
|
module ActiveSupport
|
||||||
|
extend(::ActiveSupport::LazyLoadHooks)
|
||||||
|
end
|
||||||
|
|
||||||
|
module ActiveSupport::Inflector
|
||||||
|
extend(::ActiveSupport::Inflector)
|
||||||
|
|
||||||
|
def camelize(term, uppercase_first_letter = T.unsafe(nil)); end
|
||||||
|
def classify(table_name); end
|
||||||
|
def constantize(camel_cased_word); end
|
||||||
|
def dasherize(underscored_word); end
|
||||||
|
def deconstantize(path); end
|
||||||
|
def demodulize(path); end
|
||||||
|
def foreign_key(class_name, separate_class_name_and_id_with_underscore = T.unsafe(nil)); end
|
||||||
|
def humanize(lower_case_and_underscored_word, capitalize: T.unsafe(nil), keep_id_suffix: T.unsafe(nil)); end
|
||||||
|
def inflections(locale = T.unsafe(nil)); end
|
||||||
|
def ordinal(number); end
|
||||||
|
def ordinalize(number); end
|
||||||
|
def parameterize(string, separator: T.unsafe(nil), preserve_case: T.unsafe(nil), locale: T.unsafe(nil)); end
|
||||||
|
def pluralize(word, locale = T.unsafe(nil)); end
|
||||||
|
def safe_constantize(camel_cased_word); end
|
||||||
|
def singularize(word, locale = T.unsafe(nil)); end
|
||||||
|
def tableize(class_name); end
|
||||||
|
def titleize(word, keep_id_suffix: T.unsafe(nil)); end
|
||||||
|
def transliterate(string, replacement = T.unsafe(nil), locale: T.unsafe(nil)); end
|
||||||
|
def underscore(camel_cased_word); end
|
||||||
|
def upcase_first(string); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def apply_inflections(word, rules, locale = T.unsafe(nil)); end
|
||||||
|
def const_regexp(camel_cased_word); end
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveSupport::Inflector::ALLOWED_ENCODINGS_FOR_TRANSLITERATE = T.let(T.unsafe(nil), Array)
|
||||||
|
|
||||||
|
class ActiveSupport::Inflector::Inflections
|
||||||
|
def initialize; end
|
||||||
|
|
||||||
|
def acronym(word); end
|
||||||
|
def acronyms; end
|
||||||
|
def acronyms_camelize_regex; end
|
||||||
|
def acronyms_underscore_regex; end
|
||||||
|
def clear(scope = T.unsafe(nil)); end
|
||||||
|
def human(rule, replacement); end
|
||||||
|
def humans; end
|
||||||
|
def irregular(singular, plural); end
|
||||||
|
def plural(rule, replacement); end
|
||||||
|
def plurals; end
|
||||||
|
def singular(rule, replacement); end
|
||||||
|
def singulars; end
|
||||||
|
def uncountable(*words); end
|
||||||
|
def uncountables; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def define_acronym_regex_patterns; end
|
||||||
|
def initialize_dup(orig); end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def instance(locale = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ActiveSupport::Inflector::Inflections::Uncountables < ::Array
|
||||||
|
def initialize; end
|
||||||
|
|
||||||
|
def <<(*word); end
|
||||||
|
def add(words); end
|
||||||
|
def delete(entry); end
|
||||||
|
def uncountable?(str); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def to_regex(string); end
|
||||||
|
end
|
||||||
|
|
||||||
|
module ActiveSupport::LazyLoadHooks
|
||||||
|
def on_load(name, options = T.unsafe(nil), &block); end
|
||||||
|
def run_load_hooks(name, base = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def execute_hook(name, base, options, block); end
|
||||||
|
def with_execution_control(name, block, once); end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def extended(base); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module ActiveSupport::Multibyte
|
||||||
|
class << self
|
||||||
|
def proxy_class; end
|
||||||
|
def proxy_class=(klass); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ActiveSupport::Multibyte::Chars
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def initialize(string); end
|
||||||
|
|
||||||
|
def <=>(*args, &block); end
|
||||||
|
def =~(*args, &block); end
|
||||||
|
def acts_like_string?(*args, &block); end
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def compose; end
|
||||||
|
def decompose; end
|
||||||
|
def grapheme_length; end
|
||||||
|
def limit(limit); end
|
||||||
|
def match?(*args, &block); end
|
||||||
|
def method_missing(method, *args, &block); end
|
||||||
|
def reverse; end
|
||||||
|
def reverse!(*args); end
|
||||||
|
def slice!(*args); end
|
||||||
|
def split(*args); end
|
||||||
|
def tidy_bytes(force = T.unsafe(nil)); end
|
||||||
|
def tidy_bytes!(*args); end
|
||||||
|
def titlecase; end
|
||||||
|
def titleize; end
|
||||||
|
def to_s; end
|
||||||
|
def to_str; end
|
||||||
|
def wrapped_string; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def chars(string); end
|
||||||
|
def respond_to_missing?(method, include_private); end
|
||||||
|
end
|
||||||
|
|
||||||
|
module ActiveSupport::Multibyte::Unicode
|
||||||
|
extend(::ActiveSupport::Multibyte::Unicode)
|
||||||
|
|
||||||
|
def compose(codepoints); end
|
||||||
|
def decompose(type, codepoints); end
|
||||||
|
def default_normalization_form; end
|
||||||
|
def default_normalization_form=(_); end
|
||||||
|
def tidy_bytes(string, force = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def recode_windows1252_chars(string); end
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveSupport::Multibyte::Unicode::UNICODE_VERSION = T.let(T.unsafe(nil), String)
|
||||||
|
|
||||||
|
module ActiveSupport::BigDecimalWithDefaultFormat
|
||||||
|
def to_s(format = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
module ActiveSupport::JSON
|
||||||
|
class << self
|
||||||
|
def decode(json); end
|
||||||
|
def encode(value, options = T.unsafe(nil)); end
|
||||||
|
def parse_error; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def convert_dates_from(data); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveSupport::JSON::DATETIME_REGEX = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
ActiveSupport::JSON::DATE_REGEX = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
module ActiveSupport::JSON::Encoding
|
||||||
|
class << self
|
||||||
|
def escape_html_entities_in_json; end
|
||||||
|
def escape_html_entities_in_json=(_arg0); end
|
||||||
|
def json_encoder; end
|
||||||
|
def json_encoder=(_arg0); end
|
||||||
|
def time_precision; end
|
||||||
|
def time_precision=(_arg0); end
|
||||||
|
def use_standard_json_time_format; end
|
||||||
|
def use_standard_json_time_format=(_arg0); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ActiveSupport::JSON::Encoding::JSONGemEncoder
|
||||||
|
def initialize(options = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
def encode(value); end
|
||||||
|
def options; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def jsonify(value); end
|
||||||
|
def stringify(jsonified); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class ActiveSupport::TimeZone
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def initialize(name, utc_offset = T.unsafe(nil), tzinfo = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
def <=>(zone); end
|
||||||
|
def =~(re); end
|
||||||
|
def at(*args); end
|
||||||
|
def encode_with(coder); end
|
||||||
|
def formatted_offset(colon = T.unsafe(nil), alternate_utc_string = T.unsafe(nil)); end
|
||||||
|
def init_with(coder); end
|
||||||
|
def iso8601(str); end
|
||||||
|
def local(*args); end
|
||||||
|
def local_to_utc(time, dst = T.unsafe(nil)); end
|
||||||
|
def match?(re); end
|
||||||
|
def name; end
|
||||||
|
def now; end
|
||||||
|
def parse(str, now = T.unsafe(nil)); end
|
||||||
|
def period_for_local(time, dst = T.unsafe(nil)); end
|
||||||
|
def period_for_utc(time); end
|
||||||
|
def periods_for_local(time); end
|
||||||
|
def rfc3339(str); end
|
||||||
|
def strptime(str, format, now = T.unsafe(nil)); end
|
||||||
|
def to_s; end
|
||||||
|
def today; end
|
||||||
|
def tomorrow; end
|
||||||
|
def tzinfo; end
|
||||||
|
def utc_offset; end
|
||||||
|
def utc_to_local(time); end
|
||||||
|
def yesterday; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def parts_to_time(parts, now); end
|
||||||
|
def time_now; end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def [](arg); end
|
||||||
|
def all; end
|
||||||
|
def clear; end
|
||||||
|
def country_zones(country_code); end
|
||||||
|
def create(*_arg0); end
|
||||||
|
def find_tzinfo(name); end
|
||||||
|
def new(name); end
|
||||||
|
def seconds_to_utc_offset(seconds, colon = T.unsafe(nil)); end
|
||||||
|
def us_zones; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def load_country_zones(code); end
|
||||||
|
def zones_map; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveSupport::TimeZone::MAPPING = T.let(T.unsafe(nil), Hash)
|
||||||
|
|
||||||
|
module ActiveSupport::ToJsonWithActiveSupportEncoder
|
||||||
|
def to_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Array
|
||||||
|
include(::Enumerable)
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::Array)
|
||||||
|
include(::Plist::Emit)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class BigDecimal < ::Numeric
|
||||||
|
include(::ActiveSupport::BigDecimalWithDefaultFormat)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
BigDecimal::EXCEPTION_NaN = T.let(T.unsafe(nil), Integer)
|
||||||
|
|
||||||
|
BigDecimal::VERSION = T.let(T.unsafe(nil), String)
|
||||||
|
|
||||||
|
class Date
|
||||||
|
include(::Comparable)
|
||||||
|
include(::DateAndTime::Zones)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def inspect; end
|
||||||
|
def readable_inspect; end
|
||||||
|
def to_formatted_s(format = T.unsafe(nil)); end
|
||||||
|
def to_s(format = T.unsafe(nil)); end
|
||||||
|
def to_time(form = T.unsafe(nil)); end
|
||||||
|
def xmlschema; end
|
||||||
|
end
|
||||||
|
|
||||||
|
Date::DATE_FORMATS = T.let(T.unsafe(nil), Hash)
|
||||||
|
|
||||||
|
module DateAndTime
|
||||||
|
end
|
||||||
|
|
||||||
|
module DateAndTime::Zones
|
||||||
|
def in_time_zone(zone = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def time_with_zone(time, zone); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class DateTime < ::Date
|
||||||
|
def <=>(other); end
|
||||||
|
def advance(options); end
|
||||||
|
def ago(seconds); end
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def at_beginning_of_day; end
|
||||||
|
def at_beginning_of_hour; end
|
||||||
|
def at_beginning_of_minute; end
|
||||||
|
def at_end_of_day; end
|
||||||
|
def at_end_of_hour; end
|
||||||
|
def at_end_of_minute; end
|
||||||
|
def at_midday; end
|
||||||
|
def at_middle_of_day; end
|
||||||
|
def at_midnight; end
|
||||||
|
def at_noon; end
|
||||||
|
def beginning_of_day; end
|
||||||
|
def beginning_of_hour; end
|
||||||
|
def beginning_of_minute; end
|
||||||
|
def change(options); end
|
||||||
|
def end_of_day; end
|
||||||
|
def end_of_hour; end
|
||||||
|
def end_of_minute; end
|
||||||
|
def formatted_offset(colon = T.unsafe(nil), alternate_utc_string = T.unsafe(nil)); end
|
||||||
|
def getgm; end
|
||||||
|
def getlocal(utc_offset = T.unsafe(nil)); end
|
||||||
|
def getutc; end
|
||||||
|
def gmtime; end
|
||||||
|
def in(seconds); end
|
||||||
|
def inspect; end
|
||||||
|
def localtime(utc_offset = T.unsafe(nil)); end
|
||||||
|
def midday; end
|
||||||
|
def middle_of_day; end
|
||||||
|
def midnight; end
|
||||||
|
def noon; end
|
||||||
|
def nsec; end
|
||||||
|
def readable_inspect; end
|
||||||
|
def seconds_since_midnight; end
|
||||||
|
def seconds_until_end_of_day; end
|
||||||
|
def since(seconds); end
|
||||||
|
def subsec; end
|
||||||
|
def to_f; end
|
||||||
|
def to_formatted_s(format = T.unsafe(nil)); end
|
||||||
|
def to_i; end
|
||||||
|
def to_s(format = T.unsafe(nil)); end
|
||||||
|
def usec; end
|
||||||
|
def utc; end
|
||||||
|
def utc?; end
|
||||||
|
def utc_offset; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def offset_in_seconds; end
|
||||||
|
def seconds_since_unix_epoch; end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def civil_from_format(utc_or_local, year, month = T.unsafe(nil), day = T.unsafe(nil), hour = T.unsafe(nil), min = T.unsafe(nil), sec = T.unsafe(nil)); end
|
||||||
|
def current; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module Enumerable
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Exception
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class FalseClass
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::FalseClass)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def blank?; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Float < ::Numeric
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::Float)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Hash
|
||||||
|
include(::Enumerable)
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::Hash)
|
||||||
|
include(::Plist::Emit)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def deep_merge(other_hash, &block); end
|
||||||
|
def deep_merge!(other_hash, &block); end
|
||||||
|
def except(*keys); end
|
||||||
|
def except!(*keys); end
|
||||||
|
def extract!(*keys); end
|
||||||
|
def slice!(*keys); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class IO
|
||||||
|
include(::Enumerable)
|
||||||
|
include(::File::Constants)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
IO::EWOULDBLOCKWaitReadable = IO::EAGAINWaitReadable
|
||||||
|
|
||||||
|
IO::EWOULDBLOCKWaitWritable = IO::EAGAINWaitWritable
|
||||||
|
|
||||||
|
class Module
|
||||||
|
def cattr_accessor(*syms, instance_reader: T.unsafe(nil), instance_writer: T.unsafe(nil), instance_accessor: T.unsafe(nil), default: T.unsafe(nil), &blk); end
|
||||||
|
def cattr_reader(*syms, instance_reader: T.unsafe(nil), instance_accessor: T.unsafe(nil), default: T.unsafe(nil), location: T.unsafe(nil)); end
|
||||||
|
def cattr_writer(*syms, instance_writer: T.unsafe(nil), instance_accessor: T.unsafe(nil), default: T.unsafe(nil), location: T.unsafe(nil)); end
|
||||||
|
def delegate(*methods, to: T.unsafe(nil), prefix: T.unsafe(nil), allow_nil: T.unsafe(nil), private: T.unsafe(nil)); end
|
||||||
|
def delegate_missing_to(target, allow_nil: T.unsafe(nil)); end
|
||||||
|
def mattr_accessor(*syms, instance_reader: T.unsafe(nil), instance_writer: T.unsafe(nil), instance_accessor: T.unsafe(nil), default: T.unsafe(nil), &blk); end
|
||||||
|
def mattr_reader(*syms, instance_reader: T.unsafe(nil), instance_accessor: T.unsafe(nil), default: T.unsafe(nil), location: T.unsafe(nil)); end
|
||||||
|
def mattr_writer(*syms, instance_writer: T.unsafe(nil), instance_accessor: T.unsafe(nil), default: T.unsafe(nil), location: T.unsafe(nil)); end
|
||||||
|
def method_visibility(method); end
|
||||||
|
def redefine_method(method, &block); end
|
||||||
|
def redefine_singleton_method(method, &block); end
|
||||||
|
def silence_redefinition_of_method(method); end
|
||||||
|
end
|
||||||
|
|
||||||
|
Module::DELEGATION_RESERVED_KEYWORDS = T.let(T.unsafe(nil), Array)
|
||||||
|
|
||||||
|
Module::DELEGATION_RESERVED_METHOD_NAMES = T.let(T.unsafe(nil), Set)
|
||||||
|
|
||||||
|
class Module::DelegationError < ::NoMethodError
|
||||||
|
end
|
||||||
|
|
||||||
|
Module::RUBY_RESERVED_KEYWORDS = T.let(T.unsafe(nil), Array)
|
||||||
|
|
||||||
|
class NilClass
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::NilClass)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def blank?; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Numeric
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def blank?; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Object < ::BasicObject
|
||||||
|
include(::ActiveSupport::ToJsonWithActiveSupportEncoder)
|
||||||
|
include(::Kernel)
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::Object)
|
||||||
|
include(::PP::ObjectMixin)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def blank?; end
|
||||||
|
def instance_values; end
|
||||||
|
def instance_variable_names; end
|
||||||
|
def presence; end
|
||||||
|
def present?; end
|
||||||
|
end
|
||||||
|
|
||||||
|
::APPLE_GEM_HOME = T.let(T.unsafe(nil), String)
|
||||||
|
|
||||||
|
::RUBY_FRAMEWORK = T.let(T.unsafe(nil), TrueClass)
|
||||||
|
|
||||||
|
::RUBY_FRAMEWORK_VERSION = T.let(T.unsafe(nil), String)
|
||||||
|
|
||||||
|
class Pathname
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Process::Status
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Range
|
||||||
|
include(::Enumerable)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Regexp
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
Regexp::TOKEN_KEYS = T.let(T.unsafe(nil), Array)
|
||||||
|
|
||||||
|
class Regexp::Token < ::Struct
|
||||||
|
def conditional_level; end
|
||||||
|
def conditional_level=(_); end
|
||||||
|
def length; end
|
||||||
|
def level; end
|
||||||
|
def level=(_); end
|
||||||
|
def next; end
|
||||||
|
def next=(_arg0); end
|
||||||
|
def offset; end
|
||||||
|
def previous; end
|
||||||
|
def previous=(_arg0); end
|
||||||
|
def set_level; end
|
||||||
|
def set_level=(_); end
|
||||||
|
def te; end
|
||||||
|
def te=(_); end
|
||||||
|
def text; end
|
||||||
|
def text=(_); end
|
||||||
|
def token; end
|
||||||
|
def token=(_); end
|
||||||
|
def ts; end
|
||||||
|
def ts=(_); end
|
||||||
|
def type; end
|
||||||
|
def type=(_); end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def [](*_arg0); end
|
||||||
|
def inspect; end
|
||||||
|
def members; end
|
||||||
|
def new(*_arg0); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class String
|
||||||
|
include(::Comparable)
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::String)
|
||||||
|
include(::Colorize::InstanceMethods)
|
||||||
|
extend(::JSON::Ext::Generator::GeneratorMethods::String::Extend)
|
||||||
|
extend(::Colorize::ClassMethods)
|
||||||
|
|
||||||
|
def acts_like_string?; end
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def at(position); end
|
||||||
|
def blank?; end
|
||||||
|
def camelcase(first_letter = T.unsafe(nil)); end
|
||||||
|
def camelize(first_letter = T.unsafe(nil)); end
|
||||||
|
def classify; end
|
||||||
|
def constantize; end
|
||||||
|
def dasherize; end
|
||||||
|
def deconstantize; end
|
||||||
|
def demodulize; end
|
||||||
|
def first(limit = T.unsafe(nil)); end
|
||||||
|
def foreign_key(separate_class_name_and_id_with_underscore = T.unsafe(nil)); end
|
||||||
|
def from(position); end
|
||||||
|
def humanize(capitalize: T.unsafe(nil), keep_id_suffix: T.unsafe(nil)); end
|
||||||
|
def is_utf8?; end
|
||||||
|
def last(limit = T.unsafe(nil)); end
|
||||||
|
def mb_chars; end
|
||||||
|
def parameterize(separator: T.unsafe(nil), preserve_case: T.unsafe(nil), locale: T.unsafe(nil)); end
|
||||||
|
def pluralize(count = T.unsafe(nil), locale = T.unsafe(nil)); end
|
||||||
|
def safe_constantize; end
|
||||||
|
def singularize(locale = T.unsafe(nil)); end
|
||||||
|
def tableize; end
|
||||||
|
def titlecase(keep_id_suffix: T.unsafe(nil)); end
|
||||||
|
def titleize(keep_id_suffix: T.unsafe(nil)); end
|
||||||
|
def to(position); end
|
||||||
|
def underscore; end
|
||||||
|
def upcase_first; end
|
||||||
|
end
|
||||||
|
|
||||||
|
String::BLANK_RE = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
String::ENCODED_BLANKS = T.let(T.unsafe(nil), Concurrent::Map)
|
||||||
|
|
||||||
|
class Struct
|
||||||
|
include(::Enumerable)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
Struct::Group = Etc::Group
|
||||||
|
|
||||||
|
Struct::HTMLElementDescription = Struct
|
||||||
|
|
||||||
|
Struct::Passwd = Etc::Passwd
|
||||||
|
|
||||||
|
Struct::Tms = Process::Tms
|
||||||
|
|
||||||
|
class Symbol
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def end_with?(*suffixes); end
|
||||||
|
def ends_with?(*suffixes); end
|
||||||
|
def start_with?(*prefixes); end
|
||||||
|
def starts_with?(*prefixes); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Time
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def blank?; end
|
||||||
|
def formatted_offset(colon = T.unsafe(nil), alternate_utc_string = T.unsafe(nil)); end
|
||||||
|
def to_formatted_s(format = T.unsafe(nil)); end
|
||||||
|
def to_s(format = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
Time::DATE_FORMATS = T.let(T.unsafe(nil), Hash)
|
||||||
|
|
||||||
|
class TrueClass
|
||||||
|
include(::JSON::Ext::Generator::GeneratorMethods::TrueClass)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
def blank?; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class URI::Generic
|
||||||
|
include(::URI::RFC2396_REGEXP)
|
||||||
|
include(::URI)
|
||||||
|
|
||||||
|
def as_json(options = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
@ -1,7 +0,0 @@
|
|||||||
# DO NOT EDIT MANUALLY
|
|
||||||
# This is an autogenerated file for types exported from the `thread_safe` gem.
|
|
||||||
# Please instead update this file by running `tapioca generate --exclude json`.
|
|
||||||
|
|
||||||
# typed: true
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
# DO NOT EDIT MANUALLY
|
|
||||||
# This is an autogenerated file for types exported from the `tzinfo` gem.
|
|
||||||
# Please instead update this file by running `tapioca sync`.
|
|
||||||
|
|
||||||
# typed: true
|
|
||||||
|
|
||||||
# THIS IS AN EMPTY RBI FILE.
|
|
||||||
# see https://github.com/Shopify/tapioca/blob/master/README.md#manual-gem-requires
|
|
||||||
566
Library/Homebrew/sorbet/rbi/gems/tzinfo@2.0.3.rbi
Normal file
566
Library/Homebrew/sorbet/rbi/gems/tzinfo@2.0.3.rbi
Normal file
@ -0,0 +1,566 @@
|
|||||||
|
# DO NOT EDIT MANUALLY
|
||||||
|
# This is an autogenerated file for types exported from the `tzinfo` gem.
|
||||||
|
# Please instead update this file by running `tapioca sync`.
|
||||||
|
|
||||||
|
# typed: true
|
||||||
|
|
||||||
|
module TZInfo
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::AbsoluteDayOfYearTransitionRule
|
||||||
|
def initialize(day, transition_at = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
def ==(r); end
|
||||||
|
def eql?(r); end
|
||||||
|
def is_always_first_day_of_year?; end
|
||||||
|
def is_always_last_day_of_year?; end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def get_day(offset, year); end
|
||||||
|
def hash_args; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::AmbiguousTime < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::Country
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def initialize(info); end
|
||||||
|
|
||||||
|
def <=>(c); end
|
||||||
|
def =~(regexp); end
|
||||||
|
def _dump(limit); end
|
||||||
|
def code; end
|
||||||
|
def eql?(c); end
|
||||||
|
def hash; end
|
||||||
|
def inspect; end
|
||||||
|
def name; end
|
||||||
|
def to_s; end
|
||||||
|
def zone_identifiers; end
|
||||||
|
def zone_info; end
|
||||||
|
def zone_names; end
|
||||||
|
def zones; end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def _load(data); end
|
||||||
|
def all; end
|
||||||
|
def all_codes; end
|
||||||
|
def get(code); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def data_source; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::CountryTimezone
|
||||||
|
def initialize(identifier, latitude, longitude, description = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
def ==(ct); end
|
||||||
|
def description; end
|
||||||
|
def description_or_friendly_identifier; end
|
||||||
|
def eql?(ct); end
|
||||||
|
def hash; end
|
||||||
|
def identifier; end
|
||||||
|
def latitude; end
|
||||||
|
def longitude; end
|
||||||
|
def timezone; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSource
|
||||||
|
def initialize; end
|
||||||
|
|
||||||
|
def country_codes; end
|
||||||
|
def data_timezone_identifiers; end
|
||||||
|
def get_country_info(code); end
|
||||||
|
def get_timezone_info(identifier); end
|
||||||
|
def inspect; end
|
||||||
|
def linked_timezone_identifiers; end
|
||||||
|
def timezone_identifiers; end
|
||||||
|
def to_s; end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def load_country_info(code); end
|
||||||
|
def load_timezone_info(identifier); end
|
||||||
|
def lookup_country_info(hash, code, encoding = T.unsafe(nil)); end
|
||||||
|
def timezone_identifier_encoding; end
|
||||||
|
def validate_timezone_identifier(identifier); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def build_timezone_identifiers; end
|
||||||
|
def find_timezone_identifier(identifier); end
|
||||||
|
def raise_invalid_data_source(method_name); end
|
||||||
|
def try_with_encoding(string, encoding); end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def get; end
|
||||||
|
def set(data_source_or_type, *args); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_default_data_source; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSourceNotFound < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
module TZInfo::DataSources
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::ConstantOffsetDataTimezoneInfo < ::TZInfo::DataSources::DataTimezoneInfo
|
||||||
|
def initialize(identifier, constant_offset); end
|
||||||
|
|
||||||
|
def constant_offset; end
|
||||||
|
def period_for(timestamp); end
|
||||||
|
def periods_for_local(local_timestamp); end
|
||||||
|
def transitions_up_to(to_timestamp, from_timestamp = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def constant_period; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::CountryInfo
|
||||||
|
def initialize(code, name, zones); end
|
||||||
|
|
||||||
|
def code; end
|
||||||
|
def inspect; end
|
||||||
|
def name; end
|
||||||
|
def zones; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::DataTimezoneInfo < ::TZInfo::DataSources::TimezoneInfo
|
||||||
|
def create_timezone; end
|
||||||
|
def period_for(timestamp); end
|
||||||
|
def periods_for_local(local_timestamp); end
|
||||||
|
def transitions_up_to(to_timestamp, from_timestamp = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def raise_not_implemented(method_name); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::InvalidZoneinfoDirectory < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::InvalidZoneinfoFile < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::LinkedTimezoneInfo < ::TZInfo::DataSources::TimezoneInfo
|
||||||
|
def initialize(identifier, link_to_identifier); end
|
||||||
|
|
||||||
|
def create_timezone; end
|
||||||
|
def link_to_identifier; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::RubyDataSource < ::TZInfo::DataSource
|
||||||
|
def initialize; end
|
||||||
|
|
||||||
|
def country_codes; end
|
||||||
|
def data_timezone_identifiers; end
|
||||||
|
def inspect; end
|
||||||
|
def linked_timezone_identifiers; end
|
||||||
|
def to_s; end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def load_country_info(code); end
|
||||||
|
def load_timezone_info(identifier); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def require_data(*file); end
|
||||||
|
def require_definition(identifier); end
|
||||||
|
def require_index(name); end
|
||||||
|
def version_info; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::TZInfoDataNotFound < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::TimezoneInfo
|
||||||
|
def initialize(identifier); end
|
||||||
|
|
||||||
|
def create_timezone; end
|
||||||
|
def identifier; end
|
||||||
|
def inspect; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def raise_not_implemented(method_name); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::TransitionsDataTimezoneInfo < ::TZInfo::DataSources::DataTimezoneInfo
|
||||||
|
def initialize(identifier, transitions); end
|
||||||
|
|
||||||
|
def period_for(timestamp); end
|
||||||
|
def periods_for_local(local_timestamp); end
|
||||||
|
def transitions; end
|
||||||
|
def transitions_up_to(to_timestamp, from_timestamp = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def find_minimum_transition(&block); end
|
||||||
|
def transition_on_or_after_timestamp?(transition, timestamp); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::ZoneinfoDataSource < ::TZInfo::DataSource
|
||||||
|
def initialize(zoneinfo_dir = T.unsafe(nil), alternate_iso3166_tab_path = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
def country_codes; end
|
||||||
|
def data_timezone_identifiers; end
|
||||||
|
def inspect; end
|
||||||
|
def linked_timezone_identifiers; end
|
||||||
|
def to_s; end
|
||||||
|
def zoneinfo_dir; end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def load_country_info(code); end
|
||||||
|
def load_timezone_info(identifier); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def dms_to_rational(sign, degrees, minutes, seconds = T.unsafe(nil)); end
|
||||||
|
def enum_timezones(dir, exclude = T.unsafe(nil), &block); end
|
||||||
|
def find_zoneinfo_dir; end
|
||||||
|
def load_countries(iso3166_tab_path, zone_tab_path); end
|
||||||
|
def load_timezone_identifiers; end
|
||||||
|
def resolve_tab_path(zoneinfo_path, standard_names, tab_name); end
|
||||||
|
def validate_zoneinfo_dir(path, iso3166_tab_path = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def alternate_iso3166_tab_search_path; end
|
||||||
|
def alternate_iso3166_tab_search_path=(alternate_iso3166_tab_search_path); end
|
||||||
|
def search_path; end
|
||||||
|
def search_path=(search_path); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def process_search_path(path, default); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataSources::ZoneinfoDirectoryNotFound < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DataTimezone < ::TZInfo::InfoTimezone
|
||||||
|
def canonical_zone; end
|
||||||
|
def period_for(time); end
|
||||||
|
def periods_for_local(local_time); end
|
||||||
|
def transitions_up_to(to, from = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::DateTimeWithOffset < ::DateTime
|
||||||
|
include(::TZInfo::WithOffset)
|
||||||
|
|
||||||
|
def downto(min); end
|
||||||
|
def england; end
|
||||||
|
def gregorian; end
|
||||||
|
def italy; end
|
||||||
|
def julian; end
|
||||||
|
def new_start(start = T.unsafe(nil)); end
|
||||||
|
def set_timezone_offset(timezone_offset); end
|
||||||
|
def step(limit, step = T.unsafe(nil)); end
|
||||||
|
def timezone_offset; end
|
||||||
|
def to_time; end
|
||||||
|
def upto(max); end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def clear_timezone_offset; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::InfoTimezone < ::TZInfo::Timezone
|
||||||
|
def initialize(info); end
|
||||||
|
|
||||||
|
def identifier; end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def info; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::InvalidCountryCode < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::InvalidDataSource < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::InvalidTimezoneIdentifier < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::LinkedTimezone < ::TZInfo::InfoTimezone
|
||||||
|
def initialize(info); end
|
||||||
|
|
||||||
|
def canonical_zone; end
|
||||||
|
def period_for(time); end
|
||||||
|
def periods_for_local(local_time); end
|
||||||
|
def transitions_up_to(to, from = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::OffsetTimezonePeriod < ::TZInfo::TimezonePeriod
|
||||||
|
def initialize(offset); end
|
||||||
|
|
||||||
|
def ==(p); end
|
||||||
|
def end_transition; end
|
||||||
|
def eql?(p); end
|
||||||
|
def hash; end
|
||||||
|
def start_transition; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::PeriodNotFound < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::TimeWithOffset < ::Time
|
||||||
|
include(::TZInfo::WithOffset)
|
||||||
|
|
||||||
|
def dst?; end
|
||||||
|
def getlocal(*args); end
|
||||||
|
def gmtime; end
|
||||||
|
def isdst; end
|
||||||
|
def localtime(*args); end
|
||||||
|
def round(ndigits = T.unsafe(nil)); end
|
||||||
|
def set_timezone_offset(timezone_offset); end
|
||||||
|
def timezone_offset; end
|
||||||
|
def to_a; end
|
||||||
|
def to_datetime; end
|
||||||
|
def utc; end
|
||||||
|
def zone; end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def clear_timezone_offset; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::Timestamp
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def initialize(value, sub_second = T.unsafe(nil), utc_offset = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
def <=>(t); end
|
||||||
|
def add_and_set_utc_offset(seconds, utc_offset); end
|
||||||
|
def eql?(_arg0); end
|
||||||
|
def hash; end
|
||||||
|
def inspect; end
|
||||||
|
def strftime(format); end
|
||||||
|
def sub_second; end
|
||||||
|
def to_datetime; end
|
||||||
|
def to_i; end
|
||||||
|
def to_s; end
|
||||||
|
def to_time; end
|
||||||
|
def utc; end
|
||||||
|
def utc?; end
|
||||||
|
def utc_offset; end
|
||||||
|
def value; end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def new_datetime(klass = T.unsafe(nil)); end
|
||||||
|
def new_time(klass = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def initialize!(value, sub_second = T.unsafe(nil), utc_offset = T.unsafe(nil)); end
|
||||||
|
def sub_second_to_s; end
|
||||||
|
def value_and_sub_second_to_s(offset = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def create(year, month = T.unsafe(nil), day = T.unsafe(nil), hour = T.unsafe(nil), minute = T.unsafe(nil), second = T.unsafe(nil), sub_second = T.unsafe(nil), utc_offset = T.unsafe(nil)); end
|
||||||
|
def for(value, offset = T.unsafe(nil)); end
|
||||||
|
def utc(value, sub_second = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def for_datetime(datetime, ignore_offset, target_utc_offset); end
|
||||||
|
def for_time(time, ignore_offset, target_utc_offset); end
|
||||||
|
def for_time_like(time_like, ignore_offset, target_utc_offset); end
|
||||||
|
def for_timestamp(timestamp, ignore_offset, target_utc_offset); end
|
||||||
|
def is_time_like?(value); end
|
||||||
|
def new!(value, sub_second = T.unsafe(nil), utc_offset = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::TimestampWithOffset < ::TZInfo::Timestamp
|
||||||
|
include(::TZInfo::WithOffset)
|
||||||
|
|
||||||
|
def set_timezone_offset(timezone_offset); end
|
||||||
|
def timezone_offset; end
|
||||||
|
def to_datetime; end
|
||||||
|
def to_time; end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def set_timezone_offset(timestamp, timezone_offset); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::Timezone
|
||||||
|
include(::Comparable)
|
||||||
|
|
||||||
|
def <=>(tz); end
|
||||||
|
def =~(regexp); end
|
||||||
|
def _dump(limit); end
|
||||||
|
def abbr(time = T.unsafe(nil)); end
|
||||||
|
def abbreviation(time = T.unsafe(nil)); end
|
||||||
|
def base_utc_offset(time = T.unsafe(nil)); end
|
||||||
|
def canonical_identifier; end
|
||||||
|
def canonical_zone; end
|
||||||
|
def current_period; end
|
||||||
|
def current_period_and_time; end
|
||||||
|
def current_time_and_period; end
|
||||||
|
def dst?(time = T.unsafe(nil)); end
|
||||||
|
def eql?(tz); end
|
||||||
|
def friendly_identifier(skip_first_part = T.unsafe(nil)); end
|
||||||
|
def hash; end
|
||||||
|
def identifier; end
|
||||||
|
def inspect; end
|
||||||
|
def local_datetime(year, month = T.unsafe(nil), day = T.unsafe(nil), hour = T.unsafe(nil), minute = T.unsafe(nil), second = T.unsafe(nil), sub_second = T.unsafe(nil), dst = T.unsafe(nil), &block); end
|
||||||
|
def local_time(year, month = T.unsafe(nil), day = T.unsafe(nil), hour = T.unsafe(nil), minute = T.unsafe(nil), second = T.unsafe(nil), sub_second = T.unsafe(nil), dst = T.unsafe(nil), &block); end
|
||||||
|
def local_timestamp(year, month = T.unsafe(nil), day = T.unsafe(nil), hour = T.unsafe(nil), minute = T.unsafe(nil), second = T.unsafe(nil), sub_second = T.unsafe(nil), dst = T.unsafe(nil), &block); end
|
||||||
|
def local_to_utc(local_time, dst = T.unsafe(nil)); end
|
||||||
|
def name; end
|
||||||
|
def now; end
|
||||||
|
def observed_utc_offset(time = T.unsafe(nil)); end
|
||||||
|
def offsets_up_to(to, from = T.unsafe(nil)); end
|
||||||
|
def period_for(time); end
|
||||||
|
def period_for_local(local_time, dst = T.unsafe(nil)); end
|
||||||
|
def period_for_utc(utc_time); end
|
||||||
|
def periods_for_local(local_time); end
|
||||||
|
def strftime(format, time = T.unsafe(nil)); end
|
||||||
|
def to_local(time); end
|
||||||
|
def to_s; end
|
||||||
|
def transitions_up_to(to, from = T.unsafe(nil)); end
|
||||||
|
def utc_offset(time = T.unsafe(nil)); end
|
||||||
|
def utc_to_local(utc_time); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def raise_unknown_timezone; end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def _load(data); end
|
||||||
|
def all; end
|
||||||
|
def all_country_zone_identifiers; end
|
||||||
|
def all_country_zones; end
|
||||||
|
def all_data_zone_identifiers; end
|
||||||
|
def all_data_zones; end
|
||||||
|
def all_identifiers; end
|
||||||
|
def all_linked_zone_identifiers; end
|
||||||
|
def all_linked_zones; end
|
||||||
|
def default_dst; end
|
||||||
|
def default_dst=(value); end
|
||||||
|
def get(identifier); end
|
||||||
|
def get_proxy(identifier); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def data_source; end
|
||||||
|
def get_proxies(identifiers); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::TimezoneOffset
|
||||||
|
def initialize(base_utc_offset, std_offset, abbreviation); end
|
||||||
|
|
||||||
|
def ==(toi); end
|
||||||
|
def abbr; end
|
||||||
|
def abbreviation; end
|
||||||
|
def base_utc_offset; end
|
||||||
|
def dst?; end
|
||||||
|
def eql?(toi); end
|
||||||
|
def hash; end
|
||||||
|
def inspect; end
|
||||||
|
def observed_utc_offset; end
|
||||||
|
def std_offset; end
|
||||||
|
def utc_offset; end
|
||||||
|
def utc_total_offset; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::TimezonePeriod
|
||||||
|
def initialize(offset); end
|
||||||
|
|
||||||
|
def abbr; end
|
||||||
|
def abbreviation; end
|
||||||
|
def base_utc_offset; end
|
||||||
|
def dst?; end
|
||||||
|
def end_transition; end
|
||||||
|
def ends_at; end
|
||||||
|
def local_ends_at; end
|
||||||
|
def local_starts_at; end
|
||||||
|
def observed_utc_offset; end
|
||||||
|
def offset; end
|
||||||
|
def start_transition; end
|
||||||
|
def starts_at; end
|
||||||
|
def std_offset; end
|
||||||
|
def utc_offset; end
|
||||||
|
def utc_total_offset; end
|
||||||
|
def zone_identifier; end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def raise_not_implemented(method_name); end
|
||||||
|
def timestamp(transition); end
|
||||||
|
def timestamp_with_offset(transition); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::TimezoneProxy < ::TZInfo::Timezone
|
||||||
|
def initialize(identifier); end
|
||||||
|
|
||||||
|
def _dump(limit); end
|
||||||
|
def canonical_zone; end
|
||||||
|
def identifier; end
|
||||||
|
def period_for(time); end
|
||||||
|
def periods_for_local(local_time); end
|
||||||
|
def transitions_up_to(to, from = T.unsafe(nil)); end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def real_timezone; end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
def _load(data); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::TimezoneTransition
|
||||||
|
def initialize(offset, previous_offset, timestamp_value); end
|
||||||
|
|
||||||
|
def ==(tti); end
|
||||||
|
def at; end
|
||||||
|
def eql?(tti); end
|
||||||
|
def hash; end
|
||||||
|
def local_end_at; end
|
||||||
|
def local_start_at; end
|
||||||
|
def offset; end
|
||||||
|
def previous_offset; end
|
||||||
|
def timestamp_value; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::TransitionsTimezonePeriod < ::TZInfo::TimezonePeriod
|
||||||
|
def initialize(start_transition, end_transition); end
|
||||||
|
|
||||||
|
def ==(p); end
|
||||||
|
def end_transition; end
|
||||||
|
def eql?(p); end
|
||||||
|
def hash; end
|
||||||
|
def inspect; end
|
||||||
|
def start_transition; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TZInfo::UnknownTimezone < ::StandardError
|
||||||
|
end
|
||||||
|
|
||||||
|
TZInfo::VERSION = T.let(T.unsafe(nil), String)
|
||||||
|
|
||||||
|
module TZInfo::WithOffset
|
||||||
|
def strftime(format); end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def if_timezone_offset(result = T.unsafe(nil)); end
|
||||||
|
end
|
||||||
File diff suppressed because it is too large
Load Diff
@ -6,10 +6,9 @@ path = File.expand_path('..', __FILE__)
|
|||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/concurrent-ruby-1.1.7/lib/concurrent-ruby"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/concurrent-ruby-1.1.7/lib/concurrent-ruby"
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/i18n-1.8.5/lib"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/i18n-1.8.5/lib"
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/minitest-5.14.2/lib"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/minitest-5.14.2/lib"
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/thread_safe-0.3.6/lib"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/tzinfo-2.0.3/lib"
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/tzinfo-1.2.8/lib"
|
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/zeitwerk-2.4.2/lib"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/zeitwerk-2.4.2/lib"
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/activesupport-6.0.3.4/lib"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/activesupport-6.1.0/lib"
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ast-2.4.1/lib"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/ast-2.4.1/lib"
|
||||||
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/bindata-2.4.8/lib"
|
$:.unshift "#{path}/../#{ruby_engine}/#{ruby_version}/gems/bindata-2.4.8/lib"
|
||||||
$:.unshift "#{path}/"
|
$:.unshift "#{path}/"
|
||||||
|
|||||||
@ -1,5 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/deprecation"
|
|
||||||
|
|
||||||
ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Array#append and Array#prepend natively, so requiring active_support/core_ext/array/prepend_and_append is no longer necessary. Requiring it will raise LoadError in Rails 6.1."
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class Class
|
|
||||||
begin
|
|
||||||
# Test if this Ruby supports each_object against singleton_class
|
|
||||||
ObjectSpace.each_object(Numeric.singleton_class) { }
|
|
||||||
|
|
||||||
# Returns an array with all classes that are < than its receiver.
|
|
||||||
#
|
|
||||||
# class C; end
|
|
||||||
# C.descendants # => []
|
|
||||||
#
|
|
||||||
# class B < C; end
|
|
||||||
# C.descendants # => [B]
|
|
||||||
#
|
|
||||||
# class A < B; end
|
|
||||||
# C.descendants # => [B, A]
|
|
||||||
#
|
|
||||||
# class D < C; end
|
|
||||||
# C.descendants # => [B, A, D]
|
|
||||||
def descendants
|
|
||||||
descendants = []
|
|
||||||
ObjectSpace.each_object(singleton_class) do |k|
|
|
||||||
next if k.singleton_class?
|
|
||||||
descendants.unshift k unless k == self
|
|
||||||
end
|
|
||||||
descendants
|
|
||||||
end
|
|
||||||
rescue StandardError # JRuby 9.0.4.0 and earlier
|
|
||||||
def descendants
|
|
||||||
descendants = []
|
|
||||||
ObjectSpace.each_object(Class) do |k|
|
|
||||||
descendants.unshift k if k < self
|
|
||||||
end
|
|
||||||
descendants.uniq!
|
|
||||||
descendants
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns an array with the direct children of +self+.
|
|
||||||
#
|
|
||||||
# class Foo; end
|
|
||||||
# class Bar < Foo; end
|
|
||||||
# class Baz < Bar; end
|
|
||||||
#
|
|
||||||
# Foo.subclasses # => [Bar]
|
|
||||||
def subclasses
|
|
||||||
subclasses, chain = [], descendants
|
|
||||||
chain.each do |k|
|
|
||||||
subclasses << k unless chain.any? { |c| c > k }
|
|
||||||
end
|
|
||||||
subclasses
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/core_ext/module/attribute_accessors"
|
|
||||||
|
|
||||||
module DateAndTime
|
|
||||||
module Compatibility
|
|
||||||
# If true, +to_time+ preserves the timezone offset of receiver.
|
|
||||||
#
|
|
||||||
# NOTE: With Ruby 2.4+ the default for +to_time+ changed from
|
|
||||||
# converting to the local system time, to preserving the offset
|
|
||||||
# of the receiver. For backwards compatibility we're overriding
|
|
||||||
# this behavior, but new apps will have an initializer that sets
|
|
||||||
# this to true, because the new behavior is preferred.
|
|
||||||
mattr_accessor :preserve_timezone, instance_writer: false, default: false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/deprecation"
|
|
||||||
|
|
||||||
ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Hash#compact and Hash#compact! natively, so requiring active_support/core_ext/hash/compact is no longer necessary. Requiring it will raise LoadError in Rails 6.1."
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/deprecation"
|
|
||||||
|
|
||||||
ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Hash#transform_values natively, so requiring active_support/core_ext/hash/transform_values is no longer necessary. Requiring it will raise LoadError in Rails 6.1."
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/core_ext/module/anonymous"
|
|
||||||
require "active_support/core_ext/string/inflections"
|
|
||||||
|
|
||||||
ActiveSupport::Deprecation.warn("reachable is deprecated and will be removed from the framework.")
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/deprecation"
|
|
||||||
|
|
||||||
ActiveSupport::Deprecation.warn "Ruby 2.5+ (required by Rails 6) provides Numeric#positive? and Numeric#negative? natively, so requiring active_support/core_ext/numeric/inquiry is no longer necessary. Requiring it will raise LoadError in Rails 6.1."
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/deprecation"
|
|
||||||
|
|
||||||
ActiveSupport::Deprecation.warn "You have required `active_support/core_ext/range/include_range`. " \
|
|
||||||
"This file will be removed in Rails 6.1. You should require `active_support/core_ext/range/compare_range` " \
|
|
||||||
"instead."
|
|
||||||
|
|
||||||
require "active_support/core_ext/range/compare_range"
|
|
||||||
@ -1,7 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class Regexp #:nodoc:
|
|
||||||
def multiline?
|
|
||||||
options & MULTILINE == MULTILINE
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class String
|
|
||||||
alias_method :starts_with?, :start_with?
|
|
||||||
alias_method :ends_with?, :end_with?
|
|
||||||
end
|
|
||||||
@ -1,234 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "set"
|
|
||||||
require "pathname"
|
|
||||||
require "concurrent/atomic/atomic_boolean"
|
|
||||||
|
|
||||||
module ActiveSupport
|
|
||||||
# Allows you to "listen" to changes in a file system.
|
|
||||||
# The evented file updater does not hit disk when checking for updates
|
|
||||||
# instead it uses platform specific file system events to trigger a change
|
|
||||||
# in state.
|
|
||||||
#
|
|
||||||
# The file checker takes an array of files to watch or a hash specifying directories
|
|
||||||
# and file extensions to watch. It also takes a block that is called when
|
|
||||||
# EventedFileUpdateChecker#execute is run or when EventedFileUpdateChecker#execute_if_updated
|
|
||||||
# is run and there have been changes to the file system.
|
|
||||||
#
|
|
||||||
# Note: Forking will cause the first call to `updated?` to return `true`.
|
|
||||||
#
|
|
||||||
# Example:
|
|
||||||
#
|
|
||||||
# checker = ActiveSupport::EventedFileUpdateChecker.new(["/tmp/foo"]) { puts "changed" }
|
|
||||||
# checker.updated?
|
|
||||||
# # => false
|
|
||||||
# checker.execute_if_updated
|
|
||||||
# # => nil
|
|
||||||
#
|
|
||||||
# FileUtils.touch("/tmp/foo")
|
|
||||||
#
|
|
||||||
# checker.updated?
|
|
||||||
# # => true
|
|
||||||
# checker.execute_if_updated
|
|
||||||
# # => "changed"
|
|
||||||
#
|
|
||||||
class EventedFileUpdateChecker #:nodoc: all
|
|
||||||
def initialize(files, dirs = {}, &block)
|
|
||||||
unless block
|
|
||||||
raise ArgumentError, "A block is required to initialize an EventedFileUpdateChecker"
|
|
||||||
end
|
|
||||||
|
|
||||||
@ph = PathHelper.new
|
|
||||||
@files = files.map { |f| @ph.xpath(f) }.to_set
|
|
||||||
|
|
||||||
@dirs = {}
|
|
||||||
dirs.each do |dir, exts|
|
|
||||||
@dirs[@ph.xpath(dir)] = Array(exts).map { |ext| @ph.normalize_extension(ext) }
|
|
||||||
end
|
|
||||||
|
|
||||||
@block = block
|
|
||||||
@updated = Concurrent::AtomicBoolean.new(false)
|
|
||||||
@lcsp = @ph.longest_common_subpath(@dirs.keys)
|
|
||||||
@pid = Process.pid
|
|
||||||
@boot_mutex = Mutex.new
|
|
||||||
|
|
||||||
dtw = directories_to_watch
|
|
||||||
@dtw, @missing = dtw.partition(&:exist?)
|
|
||||||
|
|
||||||
if @dtw.any?
|
|
||||||
# Loading listen triggers warnings. These are originated by a legit
|
|
||||||
# usage of attr_* macros for private attributes, but adds a lot of noise
|
|
||||||
# to our test suite. Thus, we lazy load it and disable warnings locally.
|
|
||||||
silence_warnings do
|
|
||||||
require "listen"
|
|
||||||
rescue LoadError => e
|
|
||||||
raise LoadError, "Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile", e.backtrace
|
|
||||||
end
|
|
||||||
end
|
|
||||||
boot!
|
|
||||||
end
|
|
||||||
|
|
||||||
def updated?
|
|
||||||
@boot_mutex.synchronize do
|
|
||||||
if @pid != Process.pid
|
|
||||||
boot!
|
|
||||||
@pid = Process.pid
|
|
||||||
@updated.make_true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if @missing.any?(&:exist?)
|
|
||||||
@boot_mutex.synchronize do
|
|
||||||
appeared, @missing = @missing.partition(&:exist?)
|
|
||||||
shutdown!
|
|
||||||
|
|
||||||
@dtw += appeared
|
|
||||||
boot!
|
|
||||||
|
|
||||||
@updated.make_true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@updated.true?
|
|
||||||
end
|
|
||||||
|
|
||||||
def execute
|
|
||||||
@updated.make_false
|
|
||||||
@block.call
|
|
||||||
end
|
|
||||||
|
|
||||||
def execute_if_updated
|
|
||||||
if updated?
|
|
||||||
yield if block_given?
|
|
||||||
execute
|
|
||||||
true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def boot!
|
|
||||||
normalize_dirs!
|
|
||||||
|
|
||||||
unless @dtw.empty?
|
|
||||||
Listen.to(*@dtw, &method(:changed)).start
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def shutdown!
|
|
||||||
Listen.stop
|
|
||||||
end
|
|
||||||
|
|
||||||
def normalize_dirs!
|
|
||||||
@dirs.transform_keys! do |dir|
|
|
||||||
dir.exist? ? dir.realpath : dir
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def changed(modified, added, removed)
|
|
||||||
unless updated?
|
|
||||||
@updated.make_true if (modified + added + removed).any? { |f| watching?(f) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def watching?(file)
|
|
||||||
file = @ph.xpath(file)
|
|
||||||
|
|
||||||
if @files.member?(file)
|
|
||||||
true
|
|
||||||
elsif file.directory?
|
|
||||||
false
|
|
||||||
else
|
|
||||||
ext = @ph.normalize_extension(file.extname)
|
|
||||||
|
|
||||||
file.dirname.ascend do |dir|
|
|
||||||
matching = @dirs[dir]
|
|
||||||
|
|
||||||
if matching && (matching.empty? || matching.include?(ext))
|
|
||||||
break true
|
|
||||||
elsif dir == @lcsp || dir.root?
|
|
||||||
break false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def directories_to_watch
|
|
||||||
dtw = @files.map(&:dirname) + @dirs.keys
|
|
||||||
dtw.compact!
|
|
||||||
dtw.uniq!
|
|
||||||
|
|
||||||
normalized_gem_paths = Gem.path.map { |path| File.join path, "" }
|
|
||||||
dtw = dtw.reject do |path|
|
|
||||||
normalized_gem_paths.any? { |gem_path| path.to_s.start_with?(gem_path) }
|
|
||||||
end
|
|
||||||
|
|
||||||
@ph.filter_out_descendants(dtw)
|
|
||||||
end
|
|
||||||
|
|
||||||
class PathHelper
|
|
||||||
def xpath(path)
|
|
||||||
Pathname.new(path).expand_path
|
|
||||||
end
|
|
||||||
|
|
||||||
def normalize_extension(ext)
|
|
||||||
ext.to_s.sub(/\A\./, "")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Given a collection of Pathname objects returns the longest subpath
|
|
||||||
# common to all of them, or +nil+ if there is none.
|
|
||||||
def longest_common_subpath(paths)
|
|
||||||
return if paths.empty?
|
|
||||||
|
|
||||||
lcsp = Pathname.new(paths[0])
|
|
||||||
|
|
||||||
paths[1..-1].each do |path|
|
|
||||||
until ascendant_of?(lcsp, path)
|
|
||||||
if lcsp.root?
|
|
||||||
# If we get here a root directory is not an ascendant of path.
|
|
||||||
# This may happen if there are paths in different drives on
|
|
||||||
# Windows.
|
|
||||||
return
|
|
||||||
else
|
|
||||||
lcsp = lcsp.parent
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
lcsp
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns the deepest existing ascendant, which could be the argument itself.
|
|
||||||
def existing_parent(dir)
|
|
||||||
dir.ascend do |ascendant|
|
|
||||||
break ascendant if ascendant.directory?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Filters out directories which are descendants of others in the collection (stable).
|
|
||||||
def filter_out_descendants(dirs)
|
|
||||||
return dirs if dirs.length < 2
|
|
||||||
|
|
||||||
dirs_sorted_by_nparts = dirs.sort_by { |dir| dir.each_filename.to_a.length }
|
|
||||||
descendants = []
|
|
||||||
|
|
||||||
until dirs_sorted_by_nparts.empty?
|
|
||||||
dir = dirs_sorted_by_nparts.shift
|
|
||||||
|
|
||||||
dirs_sorted_by_nparts.reject! do |possible_descendant|
|
|
||||||
ascendant_of?(dir, possible_descendant) && descendants << possible_descendant
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Array#- preserves order.
|
|
||||||
dirs - descendants
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def ascendant_of?(base, other)
|
|
||||||
base != other && other.ascend do |ascendant|
|
|
||||||
break true if base == ascendant
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/concern"
|
|
||||||
require "active_support/core_ext/module/attribute_accessors"
|
|
||||||
require "active_support/logger_thread_safe_level"
|
|
||||||
|
|
||||||
module LoggerSilence
|
|
||||||
extend ActiveSupport::Concern
|
|
||||||
|
|
||||||
included do
|
|
||||||
ActiveSupport::Deprecation.warn(
|
|
||||||
"Including LoggerSilence is deprecated and will be removed in Rails 6.1. " \
|
|
||||||
"Please use `ActiveSupport::LoggerSilence` instead"
|
|
||||||
)
|
|
||||||
|
|
||||||
include ActiveSupport::LoggerSilence
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
module ActiveSupport
|
|
||||||
module LoggerSilence
|
|
||||||
extend ActiveSupport::Concern
|
|
||||||
|
|
||||||
included do
|
|
||||||
cattr_accessor :silencer, default: true
|
|
||||||
include ActiveSupport::LoggerThreadSafeLevel
|
|
||||||
end
|
|
||||||
|
|
||||||
# Silences the logger for the duration of the block.
|
|
||||||
def silence(temporary_level = Logger::ERROR)
|
|
||||||
if silencer
|
|
||||||
begin
|
|
||||||
old_local_level = local_level
|
|
||||||
self.local_level = temporary_level
|
|
||||||
|
|
||||||
yield self
|
|
||||||
ensure
|
|
||||||
self.local_level = old_local_level
|
|
||||||
end
|
|
||||||
else
|
|
||||||
yield self
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "active_support/concern"
|
|
||||||
require "active_support/core_ext/module/attribute_accessors"
|
|
||||||
require "concurrent"
|
|
||||||
require "fiber"
|
|
||||||
|
|
||||||
module ActiveSupport
|
|
||||||
module LoggerThreadSafeLevel # :nodoc:
|
|
||||||
extend ActiveSupport::Concern
|
|
||||||
|
|
||||||
included do
|
|
||||||
cattr_accessor :local_levels, default: Concurrent::Map.new(initial_capacity: 2), instance_accessor: false
|
|
||||||
end
|
|
||||||
|
|
||||||
Logger::Severity.constants.each do |severity|
|
|
||||||
class_eval(<<-EOT, __FILE__, __LINE__ + 1)
|
|
||||||
def #{severity.downcase}? # def debug?
|
|
||||||
Logger::#{severity} >= level # DEBUG >= level
|
|
||||||
end # end
|
|
||||||
EOT
|
|
||||||
end
|
|
||||||
|
|
||||||
def after_initialize
|
|
||||||
ActiveSupport::Deprecation.warn(
|
|
||||||
"Logger don't need to call #after_initialize directly anymore. It will be deprecated without replacement in " \
|
|
||||||
"Rails 6.1."
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def local_log_id
|
|
||||||
Fiber.current.__id__
|
|
||||||
end
|
|
||||||
|
|
||||||
def local_level
|
|
||||||
self.class.local_levels[local_log_id]
|
|
||||||
end
|
|
||||||
|
|
||||||
def local_level=(level)
|
|
||||||
if level
|
|
||||||
self.class.local_levels[local_log_id] = level
|
|
||||||
else
|
|
||||||
self.class.local_levels.delete(local_log_id)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def level
|
|
||||||
local_level || super
|
|
||||||
end
|
|
||||||
|
|
||||||
def add(severity, message = nil, progname = nil, &block) # :nodoc:
|
|
||||||
return true if @logdev.nil? || (severity || UNKNOWN) < level
|
|
||||||
super
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "digest/sha2"
|
|
||||||
|
|
||||||
module ActiveSupport
|
|
||||||
module SecurityUtils
|
|
||||||
# Constant time string comparison, for fixed length strings.
|
|
||||||
#
|
|
||||||
# The values compared should be of fixed length, such as strings
|
|
||||||
# that have already been processed by HMAC. Raises in case of length mismatch.
|
|
||||||
def fixed_length_secure_compare(a, b)
|
|
||||||
raise ArgumentError, "string length mismatch." unless a.bytesize == b.bytesize
|
|
||||||
|
|
||||||
l = a.unpack "C#{a.bytesize}"
|
|
||||||
|
|
||||||
res = 0
|
|
||||||
b.each_byte { |byte| res |= byte ^ l.shift }
|
|
||||||
res == 0
|
|
||||||
end
|
|
||||||
module_function :fixed_length_secure_compare
|
|
||||||
|
|
||||||
# Constant time string comparison, for variable length strings.
|
|
||||||
#
|
|
||||||
# The values are first processed by SHA256, so that we don't leak length info
|
|
||||||
# via timing attacks.
|
|
||||||
def secure_compare(a, b)
|
|
||||||
fixed_length_secure_compare(::Digest::SHA256.digest(a), ::Digest::SHA256.digest(b)) && a == b
|
|
||||||
end
|
|
||||||
module_function :secure_compare
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,5 +1,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "active_support/core_ext/symbol/starts_ends_with"
|
||||||
|
|
||||||
module ActiveSupport
|
module ActiveSupport
|
||||||
# Wrapping an array in an +ArrayInquirer+ gives a friendlier way to check
|
# Wrapping an array in an +ArrayInquirer+ gives a friendlier way to check
|
||||||
# its string-like contents:
|
# its string-like contents:
|
||||||
@ -34,11 +36,11 @@ module ActiveSupport
|
|||||||
|
|
||||||
private
|
private
|
||||||
def respond_to_missing?(name, include_private = false)
|
def respond_to_missing?(name, include_private = false)
|
||||||
(name[-1] == "?") || super
|
name.end_with?("?") || super
|
||||||
end
|
end
|
||||||
|
|
||||||
def method_missing(name, *args)
|
def method_missing(name, *args)
|
||||||
if name[-1] == "?"
|
if name.end_with?("?")
|
||||||
any?(name[0..-2])
|
any?(name[0..-2])
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
@ -16,7 +16,7 @@ module ActiveSupport
|
|||||||
#
|
#
|
||||||
# bc = ActiveSupport::BacktraceCleaner.new
|
# bc = ActiveSupport::BacktraceCleaner.new
|
||||||
# bc.add_filter { |line| line.gsub(Rails.root.to_s, '') } # strip the Rails.root prefix
|
# bc.add_filter { |line| line.gsub(Rails.root.to_s, '') } # strip the Rails.root prefix
|
||||||
# bc.add_silencer { |line| line =~ /puma|rubygems/ } # skip any lines from puma or rubygems
|
# bc.add_silencer { |line| /puma|rubygems/.match?(line) } # skip any lines from puma or rubygems
|
||||||
# bc.clean(exception.backtrace) # perform the cleanup
|
# bc.clean(exception.backtrace) # perform the cleanup
|
||||||
#
|
#
|
||||||
# To reconfigure an existing BacktraceCleaner (like the default one in Rails)
|
# To reconfigure an existing BacktraceCleaner (like the default one in Rails)
|
||||||
@ -65,7 +65,7 @@ module ActiveSupport
|
|||||||
# for a given line, it will be excluded from the clean backtrace.
|
# for a given line, it will be excluded from the clean backtrace.
|
||||||
#
|
#
|
||||||
# # Will reject all lines that include the word "puma", like "/gems/puma/server.rb" or "/app/my_puma_server/rb"
|
# # Will reject all lines that include the word "puma", like "/gems/puma/server.rb" or "/app/my_puma_server/rb"
|
||||||
# backtrace_cleaner.add_silencer { |line| line =~ /puma/ }
|
# backtrace_cleaner.add_silencer { |line| /puma/.match?(line) }
|
||||||
def add_silencer(&block)
|
def add_silencer(&block)
|
||||||
@silencers << block
|
@silencers << block
|
||||||
end
|
end
|
||||||
@ -91,7 +91,7 @@ module ActiveSupport
|
|||||||
gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) }
|
gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) }
|
||||||
return if gems_paths.empty?
|
return if gems_paths.empty?
|
||||||
|
|
||||||
gems_regexp = %r{(#{gems_paths.join('|')})/(bundler/)?gems/([^/]+)-([\w.]+)/(.*)}
|
gems_regexp = %r{\A(#{gems_paths.join('|')})/(bundler/)?gems/([^/]+)-([\w.]+)/(.*)}
|
||||||
gems_result = '\3 (\4) \5'
|
gems_result = '\3 (\4) \5'
|
||||||
add_filter { |line| line.sub(gems_regexp, gems_result) }
|
add_filter { |line| line.sub(gems_regexp, gems_result) }
|
||||||
end
|
end
|
||||||
@ -41,7 +41,7 @@ module ActiveSupport
|
|||||||
|
|
||||||
result = nil
|
result = nil
|
||||||
ms = Benchmark.ms { result = options[:silence] ? logger.silence { yield } : yield }
|
ms = Benchmark.ms { result = options[:silence] ? logger.silence { yield } : yield }
|
||||||
logger.send(options[:level], "%s (%.1fms)" % [ message, ms ])
|
logger.public_send(options[:level], "%s (%.1fms)" % [ message, ms ])
|
||||||
result
|
result
|
||||||
else
|
else
|
||||||
yield
|
yield
|
||||||
@ -4,10 +4,7 @@ require "active_support/concern"
|
|||||||
require "active_support/descendants_tracker"
|
require "active_support/descendants_tracker"
|
||||||
require "active_support/core_ext/array/extract_options"
|
require "active_support/core_ext/array/extract_options"
|
||||||
require "active_support/core_ext/class/attribute"
|
require "active_support/core_ext/class/attribute"
|
||||||
require "active_support/core_ext/kernel/reporting"
|
|
||||||
require "active_support/core_ext/kernel/singleton_class"
|
|
||||||
require "active_support/core_ext/string/filters"
|
require "active_support/core_ext/string/filters"
|
||||||
require "active_support/deprecation"
|
|
||||||
require "thread"
|
require "thread"
|
||||||
|
|
||||||
module ActiveSupport
|
module ActiveSupport
|
||||||
@ -103,32 +100,6 @@ module ActiveSupport
|
|||||||
env = Filters::Environment.new(self, false, nil)
|
env = Filters::Environment.new(self, false, nil)
|
||||||
next_sequence = callbacks.compile
|
next_sequence = callbacks.compile
|
||||||
|
|
||||||
invoke_sequence = Proc.new do
|
|
||||||
skipped = nil
|
|
||||||
while true
|
|
||||||
current = next_sequence
|
|
||||||
current.invoke_before(env)
|
|
||||||
if current.final?
|
|
||||||
env.value = !env.halted && (!block_given? || yield)
|
|
||||||
elsif current.skip?(env)
|
|
||||||
(skipped ||= []) << current
|
|
||||||
next_sequence = next_sequence.nested
|
|
||||||
next
|
|
||||||
else
|
|
||||||
next_sequence = next_sequence.nested
|
|
||||||
begin
|
|
||||||
target, block, method, *arguments = current.expand_call_template(env, invoke_sequence)
|
|
||||||
target.send(method, *arguments, &block)
|
|
||||||
ensure
|
|
||||||
next_sequence = current
|
|
||||||
end
|
|
||||||
end
|
|
||||||
current.invoke_after(env)
|
|
||||||
skipped.pop.invoke_after(env) while skipped && skipped.first
|
|
||||||
break env.value
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Common case: no 'around' callbacks defined
|
# Common case: no 'around' callbacks defined
|
||||||
if next_sequence.final?
|
if next_sequence.final?
|
||||||
next_sequence.invoke_before(env)
|
next_sequence.invoke_before(env)
|
||||||
@ -136,6 +107,33 @@ module ActiveSupport
|
|||||||
next_sequence.invoke_after(env)
|
next_sequence.invoke_after(env)
|
||||||
env.value
|
env.value
|
||||||
else
|
else
|
||||||
|
invoke_sequence = Proc.new do
|
||||||
|
skipped = nil
|
||||||
|
|
||||||
|
while true
|
||||||
|
current = next_sequence
|
||||||
|
current.invoke_before(env)
|
||||||
|
if current.final?
|
||||||
|
env.value = !env.halted && (!block_given? || yield)
|
||||||
|
elsif current.skip?(env)
|
||||||
|
(skipped ||= []) << current
|
||||||
|
next_sequence = next_sequence.nested
|
||||||
|
next
|
||||||
|
else
|
||||||
|
next_sequence = next_sequence.nested
|
||||||
|
begin
|
||||||
|
target, block, method, *arguments = current.expand_call_template(env, invoke_sequence)
|
||||||
|
target.send(method, *arguments, &block)
|
||||||
|
ensure
|
||||||
|
next_sequence = current
|
||||||
|
end
|
||||||
|
end
|
||||||
|
current.invoke_after(env)
|
||||||
|
skipped.pop.invoke_after(env) while skipped&.first
|
||||||
|
break env.value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
invoke_sequence.call
|
invoke_sequence.call
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -145,7 +143,7 @@ module ActiveSupport
|
|||||||
# A hook invoked every time a before callback is halted.
|
# A hook invoked every time a before callback is halted.
|
||||||
# This can be overridden in ActiveSupport::Callbacks implementors in order
|
# This can be overridden in ActiveSupport::Callbacks implementors in order
|
||||||
# to provide better debugging/logging.
|
# to provide better debugging/logging.
|
||||||
def halted_callback_hook(filter)
|
def halted_callback_hook(filter, name)
|
||||||
end
|
end
|
||||||
|
|
||||||
module Conditionals # :nodoc:
|
module Conditionals # :nodoc:
|
||||||
@ -161,17 +159,17 @@ module ActiveSupport
|
|||||||
Environment = Struct.new(:target, :halted, :value)
|
Environment = Struct.new(:target, :halted, :value)
|
||||||
|
|
||||||
class Before
|
class Before
|
||||||
def self.build(callback_sequence, user_callback, user_conditions, chain_config, filter)
|
def self.build(callback_sequence, user_callback, user_conditions, chain_config, filter, name)
|
||||||
halted_lambda = chain_config[:terminator]
|
halted_lambda = chain_config[:terminator]
|
||||||
|
|
||||||
if user_conditions.any?
|
if user_conditions.any?
|
||||||
halting_and_conditional(callback_sequence, user_callback, user_conditions, halted_lambda, filter)
|
halting_and_conditional(callback_sequence, user_callback, user_conditions, halted_lambda, filter, name)
|
||||||
else
|
else
|
||||||
halting(callback_sequence, user_callback, halted_lambda, filter)
|
halting(callback_sequence, user_callback, halted_lambda, filter, name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.halting_and_conditional(callback_sequence, user_callback, user_conditions, halted_lambda, filter)
|
def self.halting_and_conditional(callback_sequence, user_callback, user_conditions, halted_lambda, filter, name)
|
||||||
callback_sequence.before do |env|
|
callback_sequence.before do |env|
|
||||||
target = env.target
|
target = env.target
|
||||||
value = env.value
|
value = env.value
|
||||||
@ -181,7 +179,7 @@ module ActiveSupport
|
|||||||
result_lambda = -> { user_callback.call target, value }
|
result_lambda = -> { user_callback.call target, value }
|
||||||
env.halted = halted_lambda.call(target, result_lambda)
|
env.halted = halted_lambda.call(target, result_lambda)
|
||||||
if env.halted
|
if env.halted
|
||||||
target.send :halted_callback_hook, filter
|
target.send :halted_callback_hook, filter, name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -190,7 +188,7 @@ module ActiveSupport
|
|||||||
end
|
end
|
||||||
private_class_method :halting_and_conditional
|
private_class_method :halting_and_conditional
|
||||||
|
|
||||||
def self.halting(callback_sequence, user_callback, halted_lambda, filter)
|
def self.halting(callback_sequence, user_callback, halted_lambda, filter, name)
|
||||||
callback_sequence.before do |env|
|
callback_sequence.before do |env|
|
||||||
target = env.target
|
target = env.target
|
||||||
value = env.value
|
value = env.value
|
||||||
@ -199,9 +197,8 @@ module ActiveSupport
|
|||||||
unless halted
|
unless halted
|
||||||
result_lambda = -> { user_callback.call target, value }
|
result_lambda = -> { user_callback.call target, value }
|
||||||
env.halted = halted_lambda.call(target, result_lambda)
|
env.halted = halted_lambda.call(target, result_lambda)
|
||||||
|
|
||||||
if env.halted
|
if env.halted
|
||||||
target.send :halted_callback_hook, filter
|
target.send :halted_callback_hook, filter, name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -300,8 +297,8 @@ module ActiveSupport
|
|||||||
@kind = kind
|
@kind = kind
|
||||||
@filter = filter
|
@filter = filter
|
||||||
@key = compute_identifier filter
|
@key = compute_identifier filter
|
||||||
@if = check_conditionals(Array(options[:if]))
|
@if = check_conditionals(options[:if])
|
||||||
@unless = check_conditionals(Array(options[:unless]))
|
@unless = check_conditionals(options[:unless])
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter; @key; end
|
def filter; @key; end
|
||||||
@ -339,7 +336,7 @@ module ActiveSupport
|
|||||||
|
|
||||||
case kind
|
case kind
|
||||||
when :before
|
when :before
|
||||||
Filters::Before.build(callback_sequence, user_callback.make_lambda, user_conditions, chain_config, @filter)
|
Filters::Before.build(callback_sequence, user_callback.make_lambda, user_conditions, chain_config, @filter, name)
|
||||||
when :after
|
when :after
|
||||||
Filters::After.build(callback_sequence, user_callback.make_lambda, user_conditions, chain_config)
|
Filters::After.build(callback_sequence, user_callback.make_lambda, user_conditions, chain_config)
|
||||||
when :around
|
when :around
|
||||||
@ -352,7 +349,13 @@ module ActiveSupport
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
EMPTY_ARRAY = [].freeze
|
||||||
|
private_constant :EMPTY_ARRAY
|
||||||
|
|
||||||
def check_conditionals(conditionals)
|
def check_conditionals(conditionals)
|
||||||
|
return EMPTY_ARRAY if conditionals.blank?
|
||||||
|
|
||||||
|
conditionals = Array(conditionals)
|
||||||
if conditionals.any? { |c| c.is_a?(String) }
|
if conditionals.any? { |c| c.is_a?(String) }
|
||||||
raise ArgumentError, <<-MSG.squish
|
raise ArgumentError, <<-MSG.squish
|
||||||
Passing string to be evaluated in :if and :unless conditional
|
Passing string to be evaluated in :if and :unless conditional
|
||||||
@ -361,7 +364,7 @@ module ActiveSupport
|
|||||||
MSG
|
MSG
|
||||||
end
|
end
|
||||||
|
|
||||||
conditionals
|
conditionals.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
def compute_identifier(filter)
|
def compute_identifier(filter)
|
||||||
@ -403,21 +406,17 @@ module ActiveSupport
|
|||||||
# The actual invocation is left up to the caller to minimize
|
# The actual invocation is left up to the caller to minimize
|
||||||
# call stack pollution.
|
# call stack pollution.
|
||||||
def expand(target, value, block)
|
def expand(target, value, block)
|
||||||
result = @arguments.map { |arg|
|
expanded = [@override_target || target, @override_block || block, @method_name]
|
||||||
|
|
||||||
|
@arguments.each do |arg|
|
||||||
case arg
|
case arg
|
||||||
when :value; value
|
when :value then expanded << value
|
||||||
when :target; target
|
when :target then expanded << target
|
||||||
when :block; block || raise(ArgumentError)
|
when :block then expanded << (block || raise(ArgumentError))
|
||||||
end
|
end
|
||||||
}
|
end
|
||||||
|
|
||||||
result.unshift @method_name
|
expanded
|
||||||
result.unshift @override_block || block
|
|
||||||
result.unshift @override_target || target
|
|
||||||
|
|
||||||
# target, block, method, *arguments = result
|
|
||||||
# target.send(method, *arguments, &block)
|
|
||||||
result
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Return a lambda that will make this call when given the input
|
# Return a lambda that will make this call when given the input
|
||||||
@ -845,8 +844,18 @@ module ActiveSupport
|
|||||||
__callbacks[name.to_sym]
|
__callbacks[name.to_sym]
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_callbacks(name, callbacks) # :nodoc:
|
if Module.instance_method(:method_defined?).arity == 1 # Ruby 2.5 and older
|
||||||
self.__callbacks = __callbacks.merge(name.to_sym => callbacks)
|
def set_callbacks(name, callbacks) # :nodoc:
|
||||||
|
self.__callbacks = __callbacks.merge(name.to_sym => callbacks)
|
||||||
|
end
|
||||||
|
else # Ruby 2.6 and newer
|
||||||
|
def set_callbacks(name, callbacks) # :nodoc:
|
||||||
|
unless singleton_class.method_defined?(:__callbacks, false)
|
||||||
|
self.__callbacks = __callbacks.dup
|
||||||
|
end
|
||||||
|
self.__callbacks[name.to_sym] = callbacks
|
||||||
|
self.__callbacks
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -19,7 +19,7 @@ module ActiveSupport
|
|||||||
# By using <tt>ActiveSupport::Concern</tt> the above module could instead be
|
# By using <tt>ActiveSupport::Concern</tt> the above module could instead be
|
||||||
# written as:
|
# written as:
|
||||||
#
|
#
|
||||||
# require 'active_support/concern'
|
# require "active_support/concern"
|
||||||
#
|
#
|
||||||
# module M
|
# module M
|
||||||
# extend ActiveSupport::Concern
|
# extend ActiveSupport::Concern
|
||||||
@ -76,7 +76,7 @@ module ActiveSupport
|
|||||||
# is the +Bar+ module, not the +Host+ class. With <tt>ActiveSupport::Concern</tt>,
|
# is the +Bar+ module, not the +Host+ class. With <tt>ActiveSupport::Concern</tt>,
|
||||||
# module dependencies are properly resolved:
|
# module dependencies are properly resolved:
|
||||||
#
|
#
|
||||||
# require 'active_support/concern'
|
# require "active_support/concern"
|
||||||
#
|
#
|
||||||
# module Foo
|
# module Foo
|
||||||
# extend ActiveSupport::Concern
|
# extend ActiveSupport::Concern
|
||||||
@ -99,6 +99,14 @@ module ActiveSupport
|
|||||||
# class Host
|
# class Host
|
||||||
# include Bar # It works, now Bar takes care of its dependencies
|
# include Bar # It works, now Bar takes care of its dependencies
|
||||||
# end
|
# end
|
||||||
|
#
|
||||||
|
# === Prepending concerns
|
||||||
|
#
|
||||||
|
# Just like <tt>include</tt>, concerns also support <tt>prepend</tt> with a corresponding
|
||||||
|
# <tt>prepended do</tt> callback. <tt>module ClassMethods</tt> or <tt>class_methods do</tt> are
|
||||||
|
# prepended as well.
|
||||||
|
#
|
||||||
|
# <tt>prepend</tt> is also used for any dependencies.
|
||||||
module Concern
|
module Concern
|
||||||
class MultipleIncludedBlocks < StandardError #:nodoc:
|
class MultipleIncludedBlocks < StandardError #:nodoc:
|
||||||
def initialize
|
def initialize
|
||||||
@ -106,6 +114,12 @@ module ActiveSupport
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class MultiplePrependBlocks < StandardError #:nodoc:
|
||||||
|
def initialize
|
||||||
|
super "Cannot define multiple 'prepended' blocks for a Concern"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.extended(base) #:nodoc:
|
def self.extended(base) #:nodoc:
|
||||||
base.instance_variable_set(:@_dependencies, [])
|
base.instance_variable_set(:@_dependencies, [])
|
||||||
end
|
end
|
||||||
@ -123,6 +137,19 @@ module ActiveSupport
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def prepend_features(base) #:nodoc:
|
||||||
|
if base.instance_variable_defined?(:@_dependencies)
|
||||||
|
base.instance_variable_get(:@_dependencies).unshift self
|
||||||
|
false
|
||||||
|
else
|
||||||
|
return false if base < self
|
||||||
|
@_dependencies.each { |dep| base.prepend(dep) }
|
||||||
|
super
|
||||||
|
base.singleton_class.prepend const_get(:ClassMethods) if const_defined?(:ClassMethods)
|
||||||
|
base.class_eval(&@_prepended_block) if instance_variable_defined?(:@_prepended_block)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Evaluate given block in context of base class,
|
# Evaluate given block in context of base class,
|
||||||
# so that you can write class macros here.
|
# so that you can write class macros here.
|
||||||
# When you define more than one +included+ block, it raises an exception.
|
# When you define more than one +included+ block, it raises an exception.
|
||||||
@ -140,6 +167,23 @@ module ActiveSupport
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Evaluate given block in context of base class,
|
||||||
|
# so that you can write class macros here.
|
||||||
|
# When you define more than one +prepended+ block, it raises an exception.
|
||||||
|
def prepended(base = nil, &block)
|
||||||
|
if base.nil?
|
||||||
|
if instance_variable_defined?(:@_prepended_block)
|
||||||
|
if @_prepended_block.source_location != block.source_location
|
||||||
|
raise MultiplePrependBlocks
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@_prepended_block = block
|
||||||
|
end
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Define class methods from given block.
|
# Define class methods from given block.
|
||||||
# You can define private class methods as well.
|
# You can define private class methods as well.
|
||||||
#
|
#
|
||||||
@ -5,7 +5,7 @@ require "active_support/ordered_options"
|
|||||||
|
|
||||||
module ActiveSupport
|
module ActiveSupport
|
||||||
# Configurable provides a <tt>config</tt> method to store and retrieve
|
# Configurable provides a <tt>config</tt> method to store and retrieve
|
||||||
# configuration options as an <tt>OrderedHash</tt>.
|
# configuration options as an <tt>OrderedOptions</tt>.
|
||||||
module Configurable
|
module Configurable
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
@ -124,9 +124,9 @@ module ActiveSupport
|
|||||||
private :config_accessor
|
private :config_accessor
|
||||||
end
|
end
|
||||||
|
|
||||||
# Reads and writes attributes from a configuration <tt>OrderedHash</tt>.
|
# Reads and writes attributes from a configuration <tt>OrderedOptions</tt>.
|
||||||
#
|
#
|
||||||
# require 'active_support/configurable'
|
# require "active_support/configurable"
|
||||||
#
|
#
|
||||||
# class User
|
# class User
|
||||||
# include ActiveSupport::Configurable
|
# include ActiveSupport::Configurable
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module ActiveSupport
|
||||||
|
# Reads a YAML configuration file, evaluating any ERB, then
|
||||||
|
# parsing the resulting YAML.
|
||||||
|
#
|
||||||
|
# Warns in case of YAML confusing characters, like invisible
|
||||||
|
# non-breaking spaces.
|
||||||
|
class ConfigurationFile # :nodoc:
|
||||||
|
class FormatError < StandardError; end
|
||||||
|
|
||||||
|
def initialize(content_path)
|
||||||
|
@content_path = content_path.to_s
|
||||||
|
@content = read content_path
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.parse(content_path, **options)
|
||||||
|
new(content_path).parse(**options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse(context: nil, **options)
|
||||||
|
YAML.load(render(context), **options) || {}
|
||||||
|
rescue Psych::SyntaxError => error
|
||||||
|
raise "YAML syntax error occurred while parsing #{@content_path}. " \
|
||||||
|
"Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
|
||||||
|
"Error: #{error.message}"
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def read(content_path)
|
||||||
|
require "yaml"
|
||||||
|
require "erb"
|
||||||
|
|
||||||
|
File.read(content_path).tap do |content|
|
||||||
|
if content.include?("\u00A0")
|
||||||
|
warn "File contains invisible non-breaking spaces, you may want to remove those"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def render(context)
|
||||||
|
erb = ERB.new(@content).tap { |e| e.filename = @content_path }
|
||||||
|
context ? erb.result(context) : erb.result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -10,7 +10,7 @@ class << Benchmark
|
|||||||
#
|
#
|
||||||
# Benchmark.ms { User.all }
|
# Benchmark.ms { User.all }
|
||||||
# # => 0.074
|
# # => 0.074
|
||||||
def ms
|
def ms(&block)
|
||||||
1000 * realtime { yield }
|
1000 * realtime(&block)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1,8 +1,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "active_support/core_ext/kernel/singleton_class"
|
|
||||||
require "active_support/core_ext/module/redefine_method"
|
require "active_support/core_ext/module/redefine_method"
|
||||||
require "active_support/core_ext/array/extract_options"
|
|
||||||
|
|
||||||
class Class
|
class Class
|
||||||
# Declare a class-level attribute whose value is inheritable by subclasses.
|
# Declare a class-level attribute whose value is inheritable by subclasses.
|
||||||
@ -84,58 +82,50 @@ class Class
|
|||||||
# To set a default value for the attribute, pass <tt>default:</tt>, like so:
|
# To set a default value for the attribute, pass <tt>default:</tt>, like so:
|
||||||
#
|
#
|
||||||
# class_attribute :settings, default: {}
|
# class_attribute :settings, default: {}
|
||||||
def class_attribute(
|
def class_attribute(*attrs, instance_accessor: true,
|
||||||
*attrs,
|
instance_reader: instance_accessor, instance_writer: instance_accessor, instance_predicate: true, default: nil)
|
||||||
instance_accessor: true,
|
|
||||||
instance_reader: instance_accessor,
|
class_methods, methods = [], []
|
||||||
instance_writer: instance_accessor,
|
|
||||||
instance_predicate: true,
|
|
||||||
default: nil
|
|
||||||
)
|
|
||||||
attrs.each do |name|
|
attrs.each do |name|
|
||||||
singleton_class.silence_redefinition_of_method(name)
|
unless name.is_a?(Symbol) || name.is_a?(String)
|
||||||
define_singleton_method(name) { default }
|
raise TypeError, "#{name.inspect} is not a symbol nor a string"
|
||||||
|
|
||||||
singleton_class.silence_redefinition_of_method("#{name}?")
|
|
||||||
define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate
|
|
||||||
|
|
||||||
ivar = "@#{name}".to_sym
|
|
||||||
|
|
||||||
singleton_class.silence_redefinition_of_method("#{name}=")
|
|
||||||
define_singleton_method("#{name}=") do |val|
|
|
||||||
redefine_singleton_method(name) { val }
|
|
||||||
|
|
||||||
if singleton_class?
|
|
||||||
class_eval do
|
|
||||||
redefine_method(name) do
|
|
||||||
if instance_variable_defined? ivar
|
|
||||||
instance_variable_get ivar
|
|
||||||
else
|
|
||||||
singleton_class.send name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
val
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if instance_reader
|
class_methods << <<~RUBY # In case the method exists and is not public
|
||||||
redefine_method(name) do
|
silence_redefinition_of_method def #{name}
|
||||||
if instance_variable_defined?(ivar)
|
|
||||||
instance_variable_get ivar
|
|
||||||
else
|
|
||||||
self.class.public_send name
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
redefine_method("#{name}?") { !!public_send(name) } if instance_predicate
|
methods << <<~RUBY if instance_reader
|
||||||
end
|
silence_redefinition_of_method def #{name}
|
||||||
|
defined?(@#{name}) ? @#{name} : self.class.#{name}
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
if instance_writer
|
class_methods << <<~RUBY
|
||||||
redefine_method("#{name}=") do |val|
|
silence_redefinition_of_method def #{name}=(value)
|
||||||
instance_variable_set ivar, val
|
redefine_method(:#{name}) { value } if singleton_class?
|
||||||
|
redefine_singleton_method(:#{name}) { value }
|
||||||
|
value
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
methods << <<~RUBY if instance_writer
|
||||||
|
silence_redefinition_of_method(:#{name}=)
|
||||||
|
attr_writer :#{name}
|
||||||
|
RUBY
|
||||||
|
|
||||||
|
if instance_predicate
|
||||||
|
class_methods << "silence_redefinition_of_method def #{name}?; !!self.#{name}; end"
|
||||||
|
if instance_reader
|
||||||
|
methods << "silence_redefinition_of_method def #{name}?; !!self.#{name}; end"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
location = caller_locations(1, 1).first
|
||||||
|
class_eval(["class << self", *class_methods, "end", *methods].join(";").tr("\n", ";"), location.path, location.lineno)
|
||||||
|
|
||||||
|
attrs.each { |name| public_send("#{name}=", default) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class Class
|
||||||
|
# Returns an array with all classes that are < than its receiver.
|
||||||
|
#
|
||||||
|
# class C; end
|
||||||
|
# C.descendants # => []
|
||||||
|
#
|
||||||
|
# class B < C; end
|
||||||
|
# C.descendants # => [B]
|
||||||
|
#
|
||||||
|
# class A < B; end
|
||||||
|
# C.descendants # => [B, A]
|
||||||
|
#
|
||||||
|
# class D < C; end
|
||||||
|
# C.descendants # => [B, A, D]
|
||||||
|
def descendants
|
||||||
|
ObjectSpace.each_object(singleton_class).reject do |k|
|
||||||
|
k.singleton_class? || k == self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns an array with the direct children of +self+.
|
||||||
|
#
|
||||||
|
# class Foo; end
|
||||||
|
# class Bar < Foo; end
|
||||||
|
# class Baz < Bar; end
|
||||||
|
#
|
||||||
|
# Foo.subclasses # => [Bar]
|
||||||
|
def subclasses
|
||||||
|
descendants.select { |descendant| descendant.superclass == self }
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -10,6 +10,7 @@ class Date
|
|||||||
short: "%d %b",
|
short: "%d %b",
|
||||||
long: "%B %d, %Y",
|
long: "%B %d, %Y",
|
||||||
db: "%Y-%m-%d",
|
db: "%Y-%m-%d",
|
||||||
|
inspect: "%Y-%m-%d",
|
||||||
number: "%Y%m%d",
|
number: "%Y%m%d",
|
||||||
long_ordinal: lambda { |date|
|
long_ordinal: lambda { |date|
|
||||||
day_format = ActiveSupport::Inflector.ordinalize(date.day)
|
day_format = ActiveSupport::Inflector.ordinalize(date.day)
|
||||||
@ -80,7 +81,7 @@ class Date
|
|||||||
# If the *application's* timezone is needed, then use +in_time_zone+ instead.
|
# If the *application's* timezone is needed, then use +in_time_zone+ instead.
|
||||||
def to_time(form = :local)
|
def to_time(form = :local)
|
||||||
raise ArgumentError, "Expected :local or :utc, got #{form.inspect}." unless [:local, :utc].include?(form)
|
raise ArgumentError, "Expected :local or :utc, got #{form.inspect}." unless [:local, :utc].include?(form)
|
||||||
::Time.send(form, year, month, day)
|
::Time.public_send(form, year, month, day)
|
||||||
end
|
end
|
||||||
|
|
||||||
silence_redefinition_of_method :xmlschema
|
silence_redefinition_of_method :xmlschema
|
||||||
@ -1,6 +1,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "active_support/core_ext/object/try"
|
require "active_support/core_ext/object/try"
|
||||||
|
require "active_support/core_ext/date_time/conversions"
|
||||||
|
|
||||||
module DateAndTime
|
module DateAndTime
|
||||||
module Calculations
|
module Calculations
|
||||||
@ -30,6 +31,18 @@ module DateAndTime
|
|||||||
to_date == ::Date.current
|
to_date == ::Date.current
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns true if the date/time is tomorrow.
|
||||||
|
def tomorrow?
|
||||||
|
to_date == ::Date.current.tomorrow
|
||||||
|
end
|
||||||
|
alias :next_day? :tomorrow?
|
||||||
|
|
||||||
|
# Returns true if the date/time is yesterday.
|
||||||
|
def yesterday?
|
||||||
|
to_date == ::Date.current.yesterday
|
||||||
|
end
|
||||||
|
alias :prev_day? :yesterday?
|
||||||
|
|
||||||
# Returns true if the date/time is in the past.
|
# Returns true if the date/time is in the past.
|
||||||
def past?
|
def past?
|
||||||
self < self.class.current
|
self < self.class.current
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "active_support/core_ext/module/attribute_accessors"
|
||||||
|
|
||||||
|
module DateAndTime
|
||||||
|
module Compatibility
|
||||||
|
# If true, +to_time+ preserves the timezone offset of receiver.
|
||||||
|
#
|
||||||
|
# NOTE: With Ruby 2.4+ the default for +to_time+ changed from
|
||||||
|
# converting to the local system time, to preserving the offset
|
||||||
|
# of the receiver. For backwards compatibility we're overriding
|
||||||
|
# this behavior, but new apps will have an initializer that sets
|
||||||
|
# this to true, because the new behavior is preferred.
|
||||||
|
mattr_accessor :preserve_timezone, instance_writer: false, default: false
|
||||||
|
|
||||||
|
# Change the output of <tt>ActiveSupport::TimeZone.utc_to_local</tt>.
|
||||||
|
#
|
||||||
|
# When `true`, it returns local times with an UTC offset, with `false` local
|
||||||
|
# times are returned as UTC.
|
||||||
|
#
|
||||||
|
# # Given this zone:
|
||||||
|
# zone = ActiveSupport::TimeZone["Eastern Time (US & Canada)"]
|
||||||
|
#
|
||||||
|
# # With `utc_to_local_returns_utc_offset_times = false`, local time is converted to UTC:
|
||||||
|
# zone.utc_to_local(Time.utc(2000, 1)) # => 1999-12-31 19:00:00 UTC
|
||||||
|
#
|
||||||
|
# # With `utc_to_local_returns_utc_offset_times = true`, local time is returned with UTC offset:
|
||||||
|
# zone.utc_to_local(Time.utc(2000, 1)) # => 1999-12-31 19:00:00 -0500
|
||||||
|
mattr_accessor :utc_to_local_returns_utc_offset_times, instance_writer: false, default: false
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -44,7 +44,8 @@ module Enumerable
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Convert an enumerable to a hash keying it by the block return value.
|
# Convert an enumerable to a hash, using the block result as the key and the
|
||||||
|
# element as the value.
|
||||||
#
|
#
|
||||||
# people.index_by(&:login)
|
# people.index_by(&:login)
|
||||||
# # => { "nextangle" => <Person ...>, "chade-" => <Person ...>, ...}
|
# # => { "nextangle" => <Person ...>, "chade-" => <Person ...>, ...}
|
||||||
@ -61,12 +62,19 @@ module Enumerable
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Convert an enumerable to a hash keying it with the enumerable items and with the values returned in the block.
|
# Convert an enumerable to a hash, using the element as the key and the block
|
||||||
|
# result as the value.
|
||||||
#
|
#
|
||||||
# post = Post.new(title: "hey there", body: "what's up?")
|
# post = Post.new(title: "hey there", body: "what's up?")
|
||||||
#
|
#
|
||||||
# %i( title body ).index_with { |attr_name| post.public_send(attr_name) }
|
# %i( title body ).index_with { |attr_name| post.public_send(attr_name) }
|
||||||
# # => { title: "hey there", body: "what's up?" }
|
# # => { title: "hey there", body: "what's up?" }
|
||||||
|
#
|
||||||
|
# If an argument is passed instead of a block, it will be used as the value
|
||||||
|
# for all elements:
|
||||||
|
#
|
||||||
|
# %i( created_at updated_at ).index_with(Time.now)
|
||||||
|
# # => { created_at: 2020-03-09 22:31:47, updated_at: 2020-03-09 22:31:47 }
|
||||||
def index_with(default = INDEX_WITH_DEFAULT)
|
def index_with(default = INDEX_WITH_DEFAULT)
|
||||||
if block_given?
|
if block_given?
|
||||||
result = {}
|
result = {}
|
||||||
@ -134,7 +142,7 @@ module Enumerable
|
|||||||
excluding(*elements)
|
excluding(*elements)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Convert an enumerable to an array based on the given key.
|
# Extract the given key from each element in the enumerable.
|
||||||
#
|
#
|
||||||
# [{ name: "David" }, { name: "Rafael" }, { name: "Aaron" }].pluck(:name)
|
# [{ name: "David" }, { name: "Rafael" }, { name: "Aaron" }].pluck(:name)
|
||||||
# # => ["David", "Rafael", "Aaron"]
|
# # => ["David", "Rafael", "Aaron"]
|
||||||
@ -145,9 +153,62 @@ module Enumerable
|
|||||||
if keys.many?
|
if keys.many?
|
||||||
map { |element| keys.map { |key| element[key] } }
|
map { |element| keys.map { |key| element[key] } }
|
||||||
else
|
else
|
||||||
map { |element| element[keys.first] }
|
key = keys.first
|
||||||
|
map { |element| element[key] }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Extract the given key from the first element in the enumerable.
|
||||||
|
#
|
||||||
|
# [{ name: "David" }, { name: "Rafael" }, { name: "Aaron" }].pick(:name)
|
||||||
|
# # => "David"
|
||||||
|
#
|
||||||
|
# [{ id: 1, name: "David" }, { id: 2, name: "Rafael" }].pick(:id, :name)
|
||||||
|
# # => [1, "David"]
|
||||||
|
def pick(*keys)
|
||||||
|
return if none?
|
||||||
|
|
||||||
|
if keys.many?
|
||||||
|
keys.map { |key| first[key] }
|
||||||
|
else
|
||||||
|
first[keys.first]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns a new +Array+ without the blank items.
|
||||||
|
# Uses Object#blank? for determining if an item is blank.
|
||||||
|
#
|
||||||
|
# [1, "", nil, 2, " ", [], {}, false, true].compact_blank
|
||||||
|
# # => [1, 2, true]
|
||||||
|
#
|
||||||
|
# Set.new([nil, "", 1, 2])
|
||||||
|
# # => [2, 1] (or [1, 2])
|
||||||
|
#
|
||||||
|
# When called on a +Hash+, returns a new +Hash+ without the blank values.
|
||||||
|
#
|
||||||
|
# { a: "", b: 1, c: nil, d: [], e: false, f: true }.compact_blank
|
||||||
|
# #=> { b: 1, f: true }
|
||||||
|
def compact_blank
|
||||||
|
reject(&:blank?)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Hash
|
||||||
|
# Hash#reject has its own definition, so this needs one too.
|
||||||
|
def compact_blank #:nodoc:
|
||||||
|
reject { |_k, v| v.blank? }
|
||||||
|
end
|
||||||
|
|
||||||
|
# Removes all blank values from the +Hash+ in place and returns self.
|
||||||
|
# Uses Object#blank? for determining if a value is blank.
|
||||||
|
#
|
||||||
|
# h = { a: "", b: 1, c: nil, d: [], e: false, f: true }
|
||||||
|
# h.compact_blank!
|
||||||
|
# # => { b: 1, f: true }
|
||||||
|
def compact_blank!
|
||||||
|
# use delete_if rather than reject! because it always returns self even if nothing changed
|
||||||
|
delete_if { |_k, v| v.blank? }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class Range #:nodoc:
|
class Range #:nodoc:
|
||||||
@ -185,4 +246,15 @@ class Array #:nodoc:
|
|||||||
super
|
super
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Removes all blank elements from the +Array+ in place and returns self.
|
||||||
|
# Uses Object#blank? for determining if an item is blank.
|
||||||
|
#
|
||||||
|
# a = [1, "", nil, 2, " ", [], {}, false, true]
|
||||||
|
# a.compact_blank!
|
||||||
|
# # => [1, 2, true]
|
||||||
|
def compact_blank!
|
||||||
|
# use delete_if rather than reject! because it always returns self even if nothing changed
|
||||||
|
delete_if(&:blank?)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@ -1,10 +1,10 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require "active_support/xml_mini"
|
require "active_support/xml_mini"
|
||||||
require "active_support/time"
|
|
||||||
require "active_support/core_ext/object/blank"
|
require "active_support/core_ext/object/blank"
|
||||||
require "active_support/core_ext/object/to_param"
|
require "active_support/core_ext/object/to_param"
|
||||||
require "active_support/core_ext/object/to_query"
|
require "active_support/core_ext/object/to_query"
|
||||||
|
require "active_support/core_ext/object/try"
|
||||||
require "active_support/core_ext/array/wrap"
|
require "active_support/core_ext/array/wrap"
|
||||||
require "active_support/core_ext/hash/reverse_merge"
|
require "active_support/core_ext/hash/reverse_merge"
|
||||||
require "active_support/core_ext/string/inflections"
|
require "active_support/core_ext/string/inflections"
|
||||||
@ -208,7 +208,7 @@ module ActiveSupport
|
|||||||
elsif become_empty_string?(value)
|
elsif become_empty_string?(value)
|
||||||
""
|
""
|
||||||
elsif become_hash?(value)
|
elsif become_hash?(value)
|
||||||
xml_value = Hash[value.map { |k, v| [k, deep_to_h(v)] }]
|
xml_value = value.transform_values { |v| deep_to_h(v) }
|
||||||
|
|
||||||
# Turn { files: { file: #<StringIO> } } into { files: #<StringIO> } so it is compatible with
|
# Turn { files: { file: #<StringIO> } } into { files: #<StringIO> } so it is compatible with
|
||||||
# how multipart uploaded files from HTML appear
|
# how multipart uploaded files from HTML appear
|
||||||
@ -21,7 +21,7 @@ class Hash
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
# support methods for deep transforming nested hashes and arrays
|
# Support methods for deep transforming nested hashes and arrays.
|
||||||
def _deep_transform_values_in_object(object, &block)
|
def _deep_transform_values_in_object(object, &block)
|
||||||
case object
|
case object
|
||||||
when Hash
|
when Hash
|
||||||
@ -11,7 +11,7 @@ class Hash
|
|||||||
# @person.update(params[:person].except(:admin))
|
# @person.update(params[:person].except(:admin))
|
||||||
def except(*keys)
|
def except(*keys)
|
||||||
slice(*self.keys - keys)
|
slice(*self.keys - keys)
|
||||||
end
|
end unless method_defined?(:except)
|
||||||
|
|
||||||
# Removes the given keys from hash and returns it.
|
# Removes the given keys from hash and returns it.
|
||||||
# hash = { a: true, b: false, c: nil }
|
# hash = { a: true, b: false, c: nil }
|
||||||
@ -112,7 +112,7 @@ class Hash
|
|||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
# support methods for deep transforming nested hashes and arrays
|
# Support methods for deep transforming nested hashes and arrays.
|
||||||
def _deep_transform_keys_in_object(object, &block)
|
def _deep_transform_keys_in_object(object, &block)
|
||||||
case object
|
case object
|
||||||
when Hash
|
when Hash
|
||||||
@ -18,8 +18,9 @@ class Hash
|
|||||||
|
|
||||||
# Removes and returns the key/value pairs matching the given keys.
|
# Removes and returns the key/value pairs matching the given keys.
|
||||||
#
|
#
|
||||||
# { a: 1, b: 2, c: 3, d: 4 }.extract!(:a, :b) # => {:a=>1, :b=>2}
|
# hash = { a: 1, b: 2, c: 3, d: 4 }
|
||||||
# { a: 1, b: 2 }.extract!(:a, :x) # => {:a=>1}
|
# hash.extract!(:a, :b) # => {:a=>1, :b=>2}
|
||||||
|
# hash # => {:c=>3, :d=>4}
|
||||||
def extract!(*keys)
|
def extract!(*keys)
|
||||||
keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) }
|
keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) }
|
||||||
end
|
end
|
||||||
@ -4,6 +4,6 @@ class LoadError
|
|||||||
# Returns true if the given path name (except perhaps for the ".rb"
|
# Returns true if the given path name (except perhaps for the ".rb"
|
||||||
# extension) is the missing file which caused the exception to be raised.
|
# extension) is the missing file which caused the exception to be raised.
|
||||||
def is_missing?(location)
|
def is_missing?(location)
|
||||||
location.sub(/\.rb$/, "") == path.to_s.sub(/\.rb$/, "")
|
location.delete_suffix(".rb") == path.to_s.delete_suffix(".rb")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1,5 +1,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require "active_support/core_ext/string/inflections"
|
||||||
|
|
||||||
module ActiveSupport
|
module ActiveSupport
|
||||||
module MarshalWithAutoloading # :nodoc:
|
module MarshalWithAutoloading # :nodoc:
|
||||||
def load(source, proc = nil)
|
def load(source, proc = nil)
|
||||||
@ -28,9 +28,9 @@ class Module
|
|||||||
end
|
end
|
||||||
|
|
||||||
def attr_internal_define(attr_name, type)
|
def attr_internal_define(attr_name, type)
|
||||||
internal_name = attr_internal_ivar_name(attr_name).sub(/\A@/, "")
|
internal_name = attr_internal_ivar_name(attr_name).delete_prefix("@")
|
||||||
# use native attr_* methods as they are faster on some Ruby implementations
|
# use native attr_* methods as they are faster on some Ruby implementations
|
||||||
send("attr_#{type}", internal_name)
|
public_send("attr_#{type}", internal_name)
|
||||||
attr_name, internal_name = "#{attr_name}=", "#{internal_name}=" if type == :writer
|
attr_name, internal_name = "#{attr_name}=", "#{internal_name}=" if type == :writer
|
||||||
alias_method attr_name, internal_name
|
alias_method attr_name, internal_name
|
||||||
remove_method internal_name
|
remove_method internal_name
|
||||||
@ -48,28 +48,25 @@ class Module
|
|||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# Person.new.hair_colors # => [:brown, :black, :blonde, :red]
|
# Person.new.hair_colors # => [:brown, :black, :blonde, :red]
|
||||||
def mattr_reader(*syms, instance_reader: true, instance_accessor: true, default: nil)
|
def mattr_reader(*syms, instance_reader: true, instance_accessor: true, default: nil, location: nil)
|
||||||
|
raise TypeError, "module attributes should be defined directly on class, not singleton" if singleton_class?
|
||||||
|
location ||= caller_locations(1, 1).first
|
||||||
|
|
||||||
|
definition = []
|
||||||
syms.each do |sym|
|
syms.each do |sym|
|
||||||
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
||||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
|
||||||
@@#{sym} = nil unless defined? @@#{sym}
|
|
||||||
|
|
||||||
def self.#{sym}
|
definition << "def self.#{sym}; @@#{sym}; end"
|
||||||
@@#{sym}
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
|
|
||||||
if instance_reader && instance_accessor
|
if instance_reader && instance_accessor
|
||||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
definition << "def #{sym}; @@#{sym}; end"
|
||||||
def #{sym}
|
|
||||||
@@#{sym}
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
end
|
end
|
||||||
|
|
||||||
sym_default_value = (block_given? && default.nil?) ? yield : default
|
sym_default_value = (block_given? && default.nil?) ? yield : default
|
||||||
class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil?
|
class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil? && class_variable_defined?("@@#{sym}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module_eval(definition.join(";"), location.path, location.lineno)
|
||||||
end
|
end
|
||||||
alias :cattr_reader :mattr_reader
|
alias :cattr_reader :mattr_reader
|
||||||
|
|
||||||
@ -115,28 +112,24 @@ class Module
|
|||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
||||||
def mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil)
|
def mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil, location: nil)
|
||||||
|
raise TypeError, "module attributes should be defined directly on class, not singleton" if singleton_class?
|
||||||
|
location ||= caller_locations(1, 1).first
|
||||||
|
|
||||||
|
definition = []
|
||||||
syms.each do |sym|
|
syms.each do |sym|
|
||||||
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
raise NameError.new("invalid attribute name: #{sym}") unless /\A[_A-Za-z]\w*\z/.match?(sym)
|
||||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
definition << "def self.#{sym}=(val); @@#{sym} = val; end"
|
||||||
@@#{sym} = nil unless defined? @@#{sym}
|
|
||||||
|
|
||||||
def self.#{sym}=(obj)
|
|
||||||
@@#{sym} = obj
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
|
|
||||||
if instance_writer && instance_accessor
|
if instance_writer && instance_accessor
|
||||||
class_eval(<<-EOS, __FILE__, __LINE__ + 1)
|
definition << "def #{sym}=(val); @@#{sym} = val; end"
|
||||||
def #{sym}=(obj)
|
|
||||||
@@#{sym} = obj
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
end
|
end
|
||||||
|
|
||||||
sym_default_value = (block_given? && default.nil?) ? yield : default
|
sym_default_value = (block_given? && default.nil?) ? yield : default
|
||||||
send("#{sym}=", sym_default_value) unless sym_default_value.nil?
|
class_variable_set("@@#{sym}", sym_default_value) unless sym_default_value.nil? && class_variable_defined?("@@#{sym}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module_eval(definition.join(";"), location.path, location.lineno)
|
||||||
end
|
end
|
||||||
alias :cattr_writer :mattr_writer
|
alias :cattr_writer :mattr_writer
|
||||||
|
|
||||||
@ -205,8 +198,9 @@ class Module
|
|||||||
#
|
#
|
||||||
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
# Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
|
||||||
def mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil, &blk)
|
def mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil, &blk)
|
||||||
mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor, default: default, &blk)
|
location = caller_locations(1, 1).first
|
||||||
mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor, default: default)
|
mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor, default: default, location: location, &blk)
|
||||||
|
mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor, default: default, location: location)
|
||||||
end
|
end
|
||||||
alias :cattr_accessor :mattr_accessor
|
alias :cattr_accessor :mattr_accessor
|
||||||
end
|
end
|
||||||
@ -33,7 +33,7 @@ class Module
|
|||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# Current.new.user # => NoMethodError
|
# Current.new.user # => NoMethodError
|
||||||
def thread_mattr_reader(*syms, instance_reader: true, instance_accessor: true) # :nodoc:
|
def thread_mattr_reader(*syms, instance_reader: true, instance_accessor: true, default: nil) # :nodoc:
|
||||||
syms.each do |sym|
|
syms.each do |sym|
|
||||||
raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym)
|
raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym)
|
||||||
|
|
||||||
@ -52,6 +52,8 @@ class Module
|
|||||||
end
|
end
|
||||||
EOS
|
EOS
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Thread.current["attr_" + name + "_#{sym}"] = default unless default.nil?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
alias :thread_cattr_reader :thread_mattr_reader
|
alias :thread_cattr_reader :thread_mattr_reader
|
||||||
@ -74,7 +76,7 @@ class Module
|
|||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# Current.new.user = "DHH" # => NoMethodError
|
# Current.new.user = "DHH" # => NoMethodError
|
||||||
def thread_mattr_writer(*syms, instance_writer: true, instance_accessor: true) # :nodoc:
|
def thread_mattr_writer(*syms, instance_writer: true, instance_accessor: true, default: nil) # :nodoc:
|
||||||
syms.each do |sym|
|
syms.each do |sym|
|
||||||
raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym)
|
raise NameError.new("invalid attribute name: #{sym}") unless /^[_A-Za-z]\w*$/.match?(sym)
|
||||||
|
|
||||||
@ -93,6 +95,8 @@ class Module
|
|||||||
end
|
end
|
||||||
EOS
|
EOS
|
||||||
end
|
end
|
||||||
|
|
||||||
|
public_send("#{sym}=", default) unless default.nil?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
alias :thread_cattr_writer :thread_mattr_writer
|
alias :thread_cattr_writer :thread_mattr_writer
|
||||||
@ -136,8 +140,8 @@ class Module
|
|||||||
#
|
#
|
||||||
# Current.new.user = "DHH" # => NoMethodError
|
# Current.new.user = "DHH" # => NoMethodError
|
||||||
# Current.new.user # => NoMethodError
|
# Current.new.user # => NoMethodError
|
||||||
def thread_mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true)
|
def thread_mattr_accessor(*syms, instance_reader: true, instance_writer: true, instance_accessor: true, default: nil)
|
||||||
thread_mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor)
|
thread_mattr_reader(*syms, instance_reader: instance_reader, instance_accessor: instance_accessor, default: default)
|
||||||
thread_mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor)
|
thread_mattr_writer(*syms, instance_writer: instance_writer, instance_accessor: instance_accessor)
|
||||||
end
|
end
|
||||||
alias :thread_cattr_accessor :thread_mattr_accessor
|
alias :thread_cattr_accessor :thread_mattr_accessor
|
||||||
@ -104,10 +104,16 @@ class Module
|
|||||||
# * grok the behavior of our class in one glance,
|
# * grok the behavior of our class in one glance,
|
||||||
# * clean up monolithic junk-drawer classes by separating their concerns, and
|
# * clean up monolithic junk-drawer classes by separating their concerns, and
|
||||||
# * stop leaning on protected/private for crude "this is internal stuff" modularity.
|
# * stop leaning on protected/private for crude "this is internal stuff" modularity.
|
||||||
|
#
|
||||||
|
# === Prepending concerning
|
||||||
|
#
|
||||||
|
# <tt>concerning</tt> supports a <tt>prepend: true</tt> argument which will <tt>prepend</tt> the
|
||||||
|
# concern instead of using <tt>include</tt> for it.
|
||||||
module Concerning
|
module Concerning
|
||||||
# Define a new concern and mix it in.
|
# Define a new concern and mix it in.
|
||||||
def concerning(topic, &block)
|
def concerning(topic, prepend: false, &block)
|
||||||
include concern(topic, &block)
|
method = prepend ? :prepend : :include
|
||||||
|
__send__(method, concern(topic, &block))
|
||||||
end
|
end
|
||||||
|
|
||||||
# A low-cruft shortcut to define a concern.
|
# A low-cruft shortcut to define a concern.
|
||||||
@ -170,7 +170,7 @@ class Module
|
|||||||
# The target method must be public, otherwise it will raise +NoMethodError+.
|
# The target method must be public, otherwise it will raise +NoMethodError+.
|
||||||
def delegate(*methods, to: nil, prefix: nil, allow_nil: nil, private: nil)
|
def delegate(*methods, to: nil, prefix: nil, allow_nil: nil, private: nil)
|
||||||
unless to
|
unless to
|
||||||
raise ArgumentError, "Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, to: :greeter)."
|
raise ArgumentError, "Delegation needs a target. Supply a keyword argument 'to' (e.g. delegate :hello, to: :greeter)."
|
||||||
end
|
end
|
||||||
|
|
||||||
if prefix == true && /^[^a-z_]/.match?(to)
|
if prefix == true && /^[^a-z_]/.match?(to)
|
||||||
@ -190,7 +190,13 @@ class Module
|
|||||||
to = to.to_s
|
to = to.to_s
|
||||||
to = "self.#{to}" if DELEGATION_RESERVED_METHOD_NAMES.include?(to)
|
to = "self.#{to}" if DELEGATION_RESERVED_METHOD_NAMES.include?(to)
|
||||||
|
|
||||||
method_names = methods.map do |method|
|
method_def = []
|
||||||
|
method_names = []
|
||||||
|
|
||||||
|
methods.map do |method|
|
||||||
|
method_name = prefix ? "#{method_prefix}#{method}" : method
|
||||||
|
method_names << method_name.to_sym
|
||||||
|
|
||||||
# Attribute writer methods only accept one argument. Makes sure []=
|
# Attribute writer methods only accept one argument. Makes sure []=
|
||||||
# methods still accept two arguments.
|
# methods still accept two arguments.
|
||||||
definition = if /[^\]]=$/.match?(method)
|
definition = if /[^\]]=$/.match?(method)
|
||||||
@ -209,34 +215,33 @@ class Module
|
|||||||
# whereas conceptually, from the user point of view, the delegator should
|
# whereas conceptually, from the user point of view, the delegator should
|
||||||
# be doing one call.
|
# be doing one call.
|
||||||
if allow_nil
|
if allow_nil
|
||||||
method_def = [
|
method = method.to_s
|
||||||
"def #{method_prefix}#{method}(#{definition})",
|
|
||||||
"_ = #{to}",
|
|
||||||
"if !_.nil? || nil.respond_to?(:#{method})",
|
|
||||||
" _.#{method}(#{definition})",
|
|
||||||
"end",
|
|
||||||
"end"
|
|
||||||
].join ";"
|
|
||||||
else
|
|
||||||
exception = %(raise DelegationError, "#{self}##{method_prefix}#{method} delegated to #{to}.#{method}, but #{to} is nil: \#{self.inspect}")
|
|
||||||
|
|
||||||
method_def = [
|
method_def <<
|
||||||
"def #{method_prefix}#{method}(#{definition})",
|
"def #{method_name}(#{definition})" <<
|
||||||
" _ = #{to}",
|
" _ = #{to}" <<
|
||||||
" _.#{method}(#{definition})",
|
" if !_.nil? || nil.respond_to?(:#{method})" <<
|
||||||
"rescue NoMethodError => e",
|
" _.#{method}(#{definition})" <<
|
||||||
" if _.nil? && e.name == :#{method}",
|
" end" <<
|
||||||
" #{exception}",
|
"end"
|
||||||
" else",
|
else
|
||||||
" raise",
|
method = method.to_s
|
||||||
" end",
|
method_name = method_name.to_s
|
||||||
|
|
||||||
|
method_def <<
|
||||||
|
"def #{method_name}(#{definition})" <<
|
||||||
|
" _ = #{to}" <<
|
||||||
|
" _.#{method}(#{definition})" <<
|
||||||
|
"rescue NoMethodError => e" <<
|
||||||
|
" if _.nil? && e.name == :#{method}" <<
|
||||||
|
%( raise DelegationError, "#{self}##{method_name} delegated to #{to}.#{method}, but #{to} is nil: \#{self.inspect}") <<
|
||||||
|
" else" <<
|
||||||
|
" raise" <<
|
||||||
|
" end" <<
|
||||||
"end"
|
"end"
|
||||||
].join ";"
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module_eval(method_def, file, line)
|
|
||||||
end
|
end
|
||||||
|
module_eval(method_def.join(";"), file, line)
|
||||||
private(*method_names) if private
|
private(*method_names) if private
|
||||||
method_names
|
method_names
|
||||||
end
|
end
|
||||||
@ -280,13 +285,14 @@ class Module
|
|||||||
# variables, methods, constants, etc.
|
# variables, methods, constants, etc.
|
||||||
#
|
#
|
||||||
# The delegated method must be public on the target, otherwise it will
|
# The delegated method must be public on the target, otherwise it will
|
||||||
# raise +NoMethodError+.
|
# raise +DelegationError+. If you wish to instead return +nil+,
|
||||||
|
# use the <tt>:allow_nil</tt> option.
|
||||||
#
|
#
|
||||||
# The <tt>marshal_dump</tt> and <tt>_dump</tt> methods are exempt from
|
# The <tt>marshal_dump</tt> and <tt>_dump</tt> methods are exempt from
|
||||||
# delegation due to possible interference when calling
|
# delegation due to possible interference when calling
|
||||||
# <tt>Marshal.dump(object)</tt>, should the delegation target method
|
# <tt>Marshal.dump(object)</tt>, should the delegation target method
|
||||||
# of <tt>object</tt> add or remove instance variables.
|
# of <tt>object</tt> add or remove instance variables.
|
||||||
def delegate_missing_to(target)
|
def delegate_missing_to(target, allow_nil: nil)
|
||||||
target = target.to_s
|
target = target.to_s
|
||||||
target = "self.#{target}" if DELEGATION_RESERVED_METHOD_NAMES.include?(target)
|
target = "self.#{target}" if DELEGATION_RESERVED_METHOD_NAMES.include?(target)
|
||||||
|
|
||||||
@ -307,7 +313,11 @@ class Module
|
|||||||
super
|
super
|
||||||
rescue NoMethodError
|
rescue NoMethodError
|
||||||
if #{target}.nil?
|
if #{target}.nil?
|
||||||
raise DelegationError, "\#{method} delegated to #{target}, but #{target} is nil"
|
if #{allow_nil == true}
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
raise DelegationError, "\#{method} delegated to #{target}, but #{target} is nil"
|
||||||
|
end
|
||||||
else
|
else
|
||||||
raise
|
raise
|
||||||
end
|
end
|
||||||
@ -11,20 +11,12 @@ class Module
|
|||||||
if defined?(@parent_name)
|
if defined?(@parent_name)
|
||||||
@parent_name
|
@parent_name
|
||||||
else
|
else
|
||||||
parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
|
parent_name = name =~ /::[^:]+\z/ ? -$` : nil
|
||||||
@parent_name = parent_name unless frozen?
|
@parent_name = parent_name unless frozen?
|
||||||
parent_name
|
parent_name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def parent_name
|
|
||||||
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
|
||||||
`Module#parent_name` has been renamed to `module_parent_name`.
|
|
||||||
`parent_name` is deprecated and will be removed in Rails 6.1.
|
|
||||||
MSG
|
|
||||||
module_parent_name
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns the module which contains this one according to its name.
|
# Returns the module which contains this one according to its name.
|
||||||
#
|
#
|
||||||
# module M
|
# module M
|
||||||
@ -44,14 +36,6 @@ class Module
|
|||||||
module_parent_name ? ActiveSupport::Inflector.constantize(module_parent_name) : Object
|
module_parent_name ? ActiveSupport::Inflector.constantize(module_parent_name) : Object
|
||||||
end
|
end
|
||||||
|
|
||||||
def parent
|
|
||||||
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
|
||||||
`Module#parent` has been renamed to `module_parent`.
|
|
||||||
`parent` is deprecated and will be removed in Rails 6.1.
|
|
||||||
MSG
|
|
||||||
module_parent
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns all the parents of this module according to its name, ordered from
|
# Returns all the parents of this module according to its name, ordered from
|
||||||
# nested outwards. The receiver is not contained within the result.
|
# nested outwards. The receiver is not contained within the result.
|
||||||
#
|
#
|
||||||
@ -76,12 +60,4 @@ class Module
|
|||||||
parents << Object unless parents.include? Object
|
parents << Object unless parents.include? Object
|
||||||
parents
|
parents
|
||||||
end
|
end
|
||||||
|
|
||||||
def parents
|
|
||||||
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
|
||||||
`Module#parents` has been renamed to `module_parents`.
|
|
||||||
`parents` is deprecated and will be removed in Rails 6.1.
|
|
||||||
MSG
|
|
||||||
module_parents
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
@ -14,9 +14,22 @@ class NameError
|
|||||||
# It extends NameError#message with spell corrections which are SLOW.
|
# It extends NameError#message with spell corrections which are SLOW.
|
||||||
# We should use original_message message instead.
|
# We should use original_message message instead.
|
||||||
message = respond_to?(:original_message) ? original_message : self.message
|
message = respond_to?(:original_message) ? original_message : self.message
|
||||||
|
return unless message.start_with?("uninitialized constant ")
|
||||||
|
|
||||||
if /undefined local variable or method/ !~ message
|
receiver = begin
|
||||||
$1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ message
|
self.receiver
|
||||||
|
rescue ArgumentError
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if receiver == Object
|
||||||
|
name.to_s
|
||||||
|
elsif receiver
|
||||||
|
"#{real_mod_name(receiver)}::#{self.name}"
|
||||||
|
else
|
||||||
|
if match = message.match(/((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/)
|
||||||
|
match[1]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -35,4 +48,18 @@ class NameError
|
|||||||
missing_name == name.to_s
|
missing_name == name.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
UNBOUND_METHOD_MODULE_NAME = Module.instance_method(:name)
|
||||||
|
private_constant :UNBOUND_METHOD_MODULE_NAME
|
||||||
|
|
||||||
|
if UnboundMethod.method_defined?(:bind_call)
|
||||||
|
def real_mod_name(mod)
|
||||||
|
UNBOUND_METHOD_MODULE_NAME.bind_call(mod)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
def real_mod_name(mod)
|
||||||
|
UNBOUND_METHOD_MODULE_NAME.bind(mod).call
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user