rbs_rails 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -94,6 +94,8 @@ module ActiveSupport
94
94
  # against it. Filters run first, then silencers.
95
95
  def clean: (untyped backtrace, ?::Symbol kind) -> untyped
96
96
 
97
+ alias filter clean
98
+
97
99
  # Adds a filter from the block provided. Each line in the backtrace will be
98
100
  # mapped against this filter.
99
101
  #
@@ -415,737 +417,739 @@ module ActiveSupport
415
417
  end
416
418
 
417
419
  module ActiveSupport
418
- # See ActiveSupport::Cache::Store for documentation.
419
420
  module Cache
420
- # These options mean something to all cache implementations. Individual cache
421
- # implementations may support additional options.
422
- UNIVERSAL_OPTIONS: ::Array[untyped]
423
-
424
- module Strategy
421
+ module ConnectionPoolLike
422
+ def with: () { (untyped) -> untyped } -> untyped
425
423
  end
426
424
 
427
- # Creates a new Store object according to the given options.
428
- #
429
- # If no arguments are passed to this method, then a new
430
- # ActiveSupport::Cache::MemoryStore object will be returned.
431
- #
432
- # If you pass a Symbol as the first argument, then a corresponding cache
433
- # store class under the ActiveSupport::Cache namespace will be created.
434
- # For example:
435
- #
436
- # ActiveSupport::Cache.lookup_store(:memory_store)
437
- # # => returns a new ActiveSupport::Cache::MemoryStore object
438
- #
439
- # ActiveSupport::Cache.lookup_store(:mem_cache_store)
440
- # # => returns a new ActiveSupport::Cache::MemCacheStore object
441
- #
442
- # Any additional arguments will be passed to the corresponding cache store
443
- # class's constructor:
425
+ # Redis cache store.
444
426
  #
445
- # ActiveSupport::Cache.lookup_store(:file_store, '/tmp/cache')
446
- # # => same as: ActiveSupport::Cache::FileStore.new('/tmp/cache')
427
+ # Deployment note: Take care to use a *dedicated Redis cache* rather
428
+ # than pointing this at your existing Redis server. It won't cope well
429
+ # with mixed usage patterns and it won't expire cache entries by default.
447
430
  #
448
- # If the first argument is not a Symbol, then it will simply be returned:
431
+ # Redis cache server setup guide: https://redis.io/topics/lru-cache
449
432
  #
450
- # ActiveSupport::Cache.lookup_store(MyOwnCacheStore.new)
451
- # # => returns MyOwnCacheStore.new
452
- def self.lookup_store: (?untyped? store, *untyped parameters) -> untyped
433
+ # * Supports vanilla Redis, hiredis, and Redis::Distributed.
434
+ # * Supports Memcached-like sharding across Redises with Redis::Distributed.
435
+ # * Fault tolerant. If the Redis server is unavailable, no exceptions are
436
+ # raised. Cache fetches are all misses and writes are dropped.
437
+ # * Local cache. Hot in-memory primary cache within block/middleware scope.
438
+ # * +read_multi+ and +write_multi+ support for Redis mget/mset. Use Redis::Distributed
439
+ # 4.0.1+ for distributed mget support.
440
+ # * +delete_matched+ support for Redis KEYS globs.
441
+ class RedisCacheStore < Store
442
+ # Keys are truncated with their own SHA2 digest if they exceed 1kB
443
+ MAX_KEY_BYTESIZE: ::Integer
453
444
 
454
- # Expands out the +key+ argument into a key that can be used for the
455
- # cache store. Optionally accepts a namespace, and all keys will be
456
- # scoped within that namespace.
457
- #
458
- # If the +key+ argument provided is an array, or responds to +to_a+, then
459
- # each of elements in the array will be turned into parameters/keys and
460
- # concatenated into a single key. For example:
461
- #
462
- # ActiveSupport::Cache.expand_cache_key([:foo, :bar]) # => "foo/bar"
463
- # ActiveSupport::Cache.expand_cache_key([:foo, :bar], "namespace") # => "namespace/foo/bar"
464
- #
465
- # The +key+ argument can also respond to +cache_key+ or +to_param+.
466
- def self.expand_cache_key: (untyped key, ?untyped? namespace) -> untyped
445
+ DEFAULT_REDIS_OPTIONS: ::Hash[untyped, untyped]
467
446
 
468
- def self.retrieve_cache_key: (untyped key) -> untyped
447
+ DEFAULT_ERROR_HANDLER: untyped
469
448
 
470
- # Obtains the specified cache store class, given the name of the +store+.
471
- # Raises an error when the store class cannot be found.
472
- def self.retrieve_store_class: (untyped store) -> untyped
449
+ # The maximum number of entries to receive per SCAN call.
450
+ SCAN_BATCH_SIZE: ::Integer
473
451
 
474
- # An abstract cache store class. There are multiple cache store
475
- # implementations, each having its own additional features. See the classes
476
- # under the ActiveSupport::Cache module, e.g.
477
- # ActiveSupport::Cache::MemCacheStore. MemCacheStore is currently the most
478
- # popular cache store for large production websites.
479
- #
480
- # Some implementations may not support all methods beyond the basic cache
481
- # methods of +fetch+, +write+, +read+, +exist?+, and +delete+.
482
- #
483
- # ActiveSupport::Cache::Store can store any serializable Ruby object.
484
- #
485
- # cache = ActiveSupport::Cache::MemoryStore.new
486
- #
487
- # cache.read('city') # => nil
488
- # cache.write('city', "Duckburgh")
489
- # cache.read('city') # => "Duckburgh"
490
- #
491
- # Keys are always translated into Strings and are case sensitive. When an
492
- # object is specified as a key and has a +cache_key+ method defined, this
493
- # method will be called to define the key. Otherwise, the +to_param+
494
- # method will be called. Hashes and Arrays can also be used as keys. The
495
- # elements will be delimited by slashes, and the elements within a Hash
496
- # will be sorted by key so they are consistent.
497
- #
498
- # cache.read('city') == cache.read(:city) # => true
499
- #
500
- # Nil values can be cached.
501
- #
502
- # If your cache is on a shared infrastructure, you can define a namespace
503
- # for your cache entries. If a namespace is defined, it will be prefixed on
504
- # to every key. The namespace can be either a static value or a Proc. If it
505
- # is a Proc, it will be invoked when each key is evaluated so that you can
506
- # use application logic to invalidate keys.
507
- #
508
- # cache.namespace = -> { @last_mod_time } # Set the namespace to a variable
509
- # @last_mod_time = Time.now # Invalidate the entire cache by changing namespace
510
- #
511
- # Cached data larger than 1kB are compressed by default. To turn off
512
- # compression, pass <tt>compress: false</tt> to the initializer or to
513
- # individual +fetch+ or +write+ method calls. The 1kB compression
514
- # threshold is configurable with the <tt>:compress_threshold</tt> option,
515
- # specified in bytes.
516
- class Store
517
- attr_reader silence: untyped
452
+ # Advertise cache versioning support.
453
+ def self.supports_cache_versioning?: () -> ::TrueClass
518
454
 
519
- attr_reader options: untyped
455
+ module LocalCacheWithRaw
456
+ def write_entry: (untyped key, untyped entry, **untyped options) -> untyped
520
457
 
521
- def self.retrieve_pool_options: (untyped options) -> untyped
458
+ def write_multi_entries: (untyped entries, **untyped options) -> untyped
459
+ end
522
460
 
523
- def self.ensure_connection_pool_added!: () -> untyped
461
+ def self.build_redis: (?redis: untyped? redis, ?url: untyped? url, **untyped redis_options) -> untyped
524
462
 
525
- # Creates a new cache. The options will be passed to any write method calls
526
- # except for <tt>:namespace</tt> which can be used to set the global
527
- # namespace for the cache.
528
- def initialize: (?untyped? options) -> untyped
463
+ def self.build_redis_distributed_client: (urls: untyped urls, **untyped redis_options) -> untyped
529
464
 
530
- # Silences the logger.
531
- def silence!: () -> untyped
465
+ def self.build_redis_client: (url: untyped url, **untyped redis_options) -> untyped
532
466
 
533
- # Silences the logger within a block.
534
- def mute: () { () -> untyped } -> untyped
467
+ attr_reader redis_options: untyped
535
468
 
536
- # Fetches data from the cache, using the given key. If there is data in
537
- # the cache with the given key, then that data is returned.
469
+ attr_reader max_key_bytesize: untyped
470
+
471
+ # Creates a new Redis cache store.
538
472
  #
539
- # If there is no such data in the cache (a cache miss), then +nil+ will be
540
- # returned. However, if a block has been passed, that block will be passed
541
- # the key and executed in the event of a cache miss. The return value of the
542
- # block will be written to the cache under the given cache key, and that
543
- # return value will be returned.
473
+ # Handles four options: :redis block, :redis instance, single :url
474
+ # string, and multiple :url strings.
544
475
  #
545
- # cache.write('today', 'Monday')
546
- # cache.fetch('today') # => "Monday"
476
+ # Option Class Result
477
+ # :redis Proc -> options[:redis].call
478
+ # :redis Object -> options[:redis]
479
+ # :url String -> Redis.new(url: (trim non-ascii characters))
480
+ # :url Array -> Redis::Distributed.new([{ url: (trim non-ascii characters) }, { url: (trim non-ascii characters) }, (trim non-ascii characters)])
547
481
  #
548
- # cache.fetch('city') # => nil
549
- # cache.fetch('city') do
550
- # 'Duckburgh'
551
- # end
552
- # cache.fetch('city') # => "Duckburgh"
482
+ # No namespace is set by default. Provide one if the Redis cache
483
+ # server is shared with other apps: <tt>namespace: 'myapp-cache'</tt>.
553
484
  #
554
- # You may also specify additional options via the +options+ argument.
555
- # Setting <tt>force: true</tt> forces a cache "miss," meaning we treat
556
- # the cache value as missing even if it's present. Passing a block is
557
- # required when +force+ is true so this always results in a cache write.
485
+ # Compression is enabled by default with a 1kB threshold, so cached
486
+ # values larger than 1kB are automatically compressed. Disable by
487
+ # passing <tt>compress: false</tt> or change the threshold by passing
488
+ # <tt>compress_threshold: 4.kilobytes</tt>.
558
489
  #
559
- # cache.write('today', 'Monday')
560
- # cache.fetch('today', force: true) { 'Tuesday' } # => 'Tuesday'
561
- # cache.fetch('today', force: true) # => ArgumentError
490
+ # No expiry is set on cache entries by default. Redis is expected to
491
+ # be configured with an eviction policy that automatically deletes
492
+ # least-recently or -frequently used keys when it reaches max memory.
493
+ # See https://redis.io/topics/lru-cache for cache server setup.
562
494
  #
563
- # The +:force+ option is useful when you're calling some other method to
564
- # ask whether you should force a cache write. Otherwise, it's clearer to
565
- # just call <tt>Cache#write</tt>.
495
+ # Race condition TTL is not set by default. This can be used to avoid
496
+ # "thundering herd" cache writes when hot cache entries are expired.
497
+ # See <tt>ActiveSupport::Cache::Store#fetch</tt> for more.
498
+ def initialize: (?namespace: untyped? namespace, ?compress: bool compress, ?compress_threshold: untyped compress_threshold, ?expires_in: untyped? expires_in, ?race_condition_ttl: untyped? race_condition_ttl, ?error_handler: untyped error_handler, **untyped redis_options) -> untyped
499
+
500
+ def redis: () -> untyped
501
+
502
+ def inspect: () -> ::String
503
+
504
+ # Cache Store API implementation.
566
505
  #
567
- # Setting <tt>skip_nil: true</tt> will not cache nil result:
506
+ # Read multiple values at once. Returns a hash of requested keys ->
507
+ # fetched values.
508
+ def read_multi: (*untyped names) -> untyped
509
+
510
+ # Cache Store API implementation.
568
511
  #
569
- # cache.fetch('foo') { nil }
570
- # cache.fetch('bar', skip_nil: true) { nil }
571
- # cache.exist?('foo') # => true
572
- # cache.exist?('bar') # => false
512
+ # Supports Redis KEYS glob patterns:
573
513
  #
514
+ # h?llo matches hello, hallo and hxllo
515
+ # h*llo matches hllo and heeeello
516
+ # h[ae]llo matches hello and hallo, but not hillo
517
+ # h[^e]llo matches hallo, hbllo, ... but not hello
518
+ # h[a-b]llo matches hallo and hbllo
574
519
  #
575
- # Setting <tt>compress: false</tt> disables compression of the cache entry.
520
+ # Use \ to escape special characters if you want to match them verbatim.
576
521
  #
577
- # Setting <tt>:expires_in</tt> will set an expiration time on the cache.
578
- # All caches support auto-expiring content after a specified number of
579
- # seconds. This value can be specified as an option to the constructor
580
- # (in which case all entries will be affected), or it can be supplied to
581
- # the +fetch+ or +write+ method to effect just one entry.
522
+ # See https://redis.io/commands/KEYS for more.
582
523
  #
583
- # cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes)
584
- # cache.write(key, value, expires_in: 1.minute) # Set a lower value for one entry
524
+ # Failsafe: Raises errors.
525
+ def delete_matched: (untyped matcher, ?untyped? options) -> untyped
526
+
527
+ # Cache Store API implementation.
585
528
  #
586
- # Setting <tt>:version</tt> verifies the cache stored under <tt>name</tt>
587
- # is of the same version. nil is returned on mismatches despite contents.
588
- # This feature is used to support recyclable cache keys.
529
+ # Increment a cached value. This method uses the Redis incr atomic
530
+ # operator and can only be used on values written with the :raw option.
531
+ # Calling it on a value not stored with :raw will initialize that value
532
+ # to zero.
589
533
  #
590
- # Setting <tt>:race_condition_ttl</tt> is very useful in situations where
591
- # a cache entry is used very frequently and is under heavy load. If a
592
- # cache expires and due to heavy load several different processes will try
593
- # to read data natively and then they all will try to write to cache. To
594
- # avoid that case the first process to find an expired cache entry will
595
- # bump the cache expiration time by the value set in <tt>:race_condition_ttl</tt>.
596
- # Yes, this process is extending the time for a stale value by another few
597
- # seconds. Because of extended life of the previous cache, other processes
598
- # will continue to use slightly stale data for a just a bit longer. In the
599
- # meantime that first process will go ahead and will write into cache the
600
- # new value. After that all the processes will start getting the new value.
601
- # The key is to keep <tt>:race_condition_ttl</tt> small.
534
+ # Failsafe: Raises errors.
535
+ def increment: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
536
+
537
+ # Cache Store API implementation.
602
538
  #
603
- # If the process regenerating the entry errors out, the entry will be
604
- # regenerated after the specified number of seconds. Also note that the
605
- # life of stale cache is extended only if it expired recently. Otherwise
606
- # a new value is generated and <tt>:race_condition_ttl</tt> does not play
607
- # any role.
539
+ # Decrement a cached value. This method uses the Redis decr atomic
540
+ # operator and can only be used on values written with the :raw option.
541
+ # Calling it on a value not stored with :raw will initialize that value
542
+ # to zero.
608
543
  #
609
- # # Set all values to expire after one minute.
610
- # cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 1.minute)
544
+ # Failsafe: Raises errors.
545
+ def decrement: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
546
+
547
+ # Cache Store API implementation.
611
548
  #
612
- # cache.write('foo', 'original value')
613
- # val_1 = nil
614
- # val_2 = nil
615
- # sleep 60
616
- #
617
- # Thread.new do
618
- # val_1 = cache.fetch('foo', race_condition_ttl: 10.seconds) do
619
- # sleep 1
620
- # 'new value 1'
621
- # end
622
- # end
623
- #
624
- # Thread.new do
625
- # val_2 = cache.fetch('foo', race_condition_ttl: 10.seconds) do
626
- # 'new value 2'
627
- # end
628
- # end
629
- #
630
- # cache.fetch('foo') # => "original value"
631
- # sleep 10 # First thread extended the life of cache by another 10 seconds
632
- # cache.fetch('foo') # => "new value 1"
633
- # val_1 # => "new value 1"
634
- # val_2 # => "original value"
635
- #
636
- # Other options will be handled by the specific cache store implementation.
637
- # Internally, #fetch calls #read_entry, and calls #write_entry on a cache
638
- # miss. +options+ will be passed to the #read and #write calls.
639
- #
640
- # For example, MemCacheStore's #write method supports the +:raw+
641
- # option, which tells the memcached server to store all values as strings.
642
- # We can use this option with #fetch too:
643
- #
644
- # cache = ActiveSupport::Cache::MemCacheStore.new
645
- # cache.fetch("foo", force: true, raw: true) do
646
- # :bar
647
- # end
648
- # cache.fetch('foo') # => "bar"
649
- def fetch: (untyped name, ?untyped? options) { (untyped) -> untyped } -> untyped
549
+ # Removes expired entries. Handled natively by Redis least-recently-/
550
+ # least-frequently-used expiry, so manual cleanup is not supported.
551
+ def cleanup: (?untyped? options) -> untyped
650
552
 
651
- # Reads data from the cache, using the given key. If there is data in
652
- # the cache with the given key, then that data is returned. Otherwise,
653
- # +nil+ is returned.
654
- #
655
- # Note, if data was written with the <tt>:expires_in</tt> or
656
- # <tt>:version</tt> options, both of these conditions are applied before
657
- # the data is returned.
553
+ # Clear the entire cache on all Redis servers. Safe to use on
554
+ # shared servers if the cache is namespaced.
658
555
  #
659
- # Options are passed to the underlying cache implementation.
660
- def read: (untyped name, ?untyped? options) -> untyped
556
+ # Failsafe: Raises errors.
557
+ def clear: (?untyped? options) -> untyped
661
558
 
662
- # Reads multiple values at once from the cache. Options can be passed
663
- # in the last argument.
664
- #
665
- # Some cache implementation may optimize this method.
666
- #
667
- # Returns a hash mapping the names provided to the values found.
668
- def read_multi: (*untyped names) -> untyped
559
+ def mget_capable?: () -> untyped
669
560
 
670
- # Cache Storage API to write multiple values at once.
671
- def write_multi: (untyped hash, ?untyped? options) -> untyped
561
+ def mset_capable?: () -> untyped
672
562
 
673
- # Fetches data from the cache, using the given keys. If there is data in
674
- # the cache with the given keys, then that data is returned. Otherwise,
675
- # the supplied block is called for each key for which there was no data,
676
- # and the result will be written to the cache and returned.
677
- # Therefore, you need to pass a block that returns the data to be written
678
- # to the cache. If you do not want to write the cache when the cache is
679
- # not found, use #read_multi.
680
- #
681
- # Returns a hash with the data for each of the names. For example:
682
- #
683
- # cache.write("bim", "bam")
684
- # cache.fetch_multi("bim", "unknown_key") do |key|
685
- # "Fallback value for key: #{key}"
686
- # end
687
- # # => { "bim" => "bam",
688
- # # "unknown_key" => "Fallback value for key: unknown_key" }
689
- #
690
- # Options are passed to the underlying cache implementation. For example:
691
- #
692
- # cache.fetch_multi("fizz", expires_in: 5.seconds) do |key|
693
- # "buzz"
694
- # end
695
- # # => {"fizz"=>"buzz"}
696
- # cache.read("fizz")
697
- # # => "buzz"
698
- # sleep(6)
699
- # cache.read("fizz")
700
- # # => nil
701
- def fetch_multi: (*untyped names) { (untyped) -> untyped } -> untyped
563
+ def set_redis_capabilities: () -> untyped
702
564
 
703
- # Writes the value to the cache, with the key.
704
- #
705
- # Options are passed to the underlying cache implementation.
706
- def write: (untyped name, untyped value, ?untyped? options) -> untyped
565
+ # Store provider interface:
566
+ # Read an entry from the cache.
567
+ def read_entry: (untyped key, **untyped options) -> untyped
707
568
 
708
- # Deletes an entry in the cache. Returns +true+ if an entry is deleted.
709
- #
710
- # Options are passed to the underlying cache implementation.
711
- def delete: (untyped name, ?untyped? options) -> untyped
569
+ def read_multi_entries: (untyped names, **untyped options) -> untyped
712
570
 
713
- # Returns +true+ if the cache contains an entry for the given key.
714
- #
715
- # Options are passed to the underlying cache implementation.
716
- def exist?: (untyped name, ?untyped? options) -> untyped
571
+ def read_multi_mget: (*untyped names) -> (::Hash[untyped, untyped] | untyped)
717
572
 
718
- # Deletes all entries with keys matching the pattern.
719
- #
720
- # Options are passed to the underlying cache implementation.
573
+ # Write an entry to the cache.
721
574
  #
722
- # Some implementations may not support this method.
723
- def delete_matched: (untyped matcher, ?untyped? options) -> untyped
575
+ # Requires Redis 2.6.12+ for extended SET options.
576
+ def write_entry: (untyped key, untyped entry, ?unless_exist: bool unless_exist, ?raw: bool raw, ?expires_in: untyped? expires_in, ?race_condition_ttl: untyped? race_condition_ttl, **untyped options) -> untyped
724
577
 
725
- # Increments an integer value in the cache.
726
- #
727
- # Options are passed to the underlying cache implementation.
728
- #
729
- # Some implementations may not support this method.
730
- def increment: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
578
+ def write_key_expiry: (untyped client, untyped key, untyped options) -> untyped
731
579
 
732
- # Decrements an integer value in the cache.
733
- #
734
- # Options are passed to the underlying cache implementation.
735
- #
736
- # Some implementations may not support this method.
737
- def decrement: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
580
+ # Delete an entry from the cache.
581
+ def delete_entry: (untyped key, untyped options) -> untyped
738
582
 
739
- # Cleanups the cache by removing expired entries.
740
- #
741
- # Options are passed to the underlying cache implementation.
742
- #
743
- # Some implementations may not support this method.
744
- def cleanup: (?untyped? options) -> untyped
583
+ # Nonstandard store provider API to write multiple values at once.
584
+ def write_multi_entries: (untyped entries, ?expires_in: untyped? expires_in, **untyped options) -> untyped
745
585
 
746
- # Clears the entire cache. Be careful with this method since it could
747
- # affect other processes if shared cache is being used.
748
- #
749
- # The options hash is passed to the underlying cache implementation.
750
- #
751
- # Some implementations may not support this method.
752
- def clear: (?untyped? options) -> untyped
586
+ # Truncate keys that exceed 1kB.
587
+ def normalize_key: (untyped key, untyped options) -> untyped
753
588
 
754
- def key_matcher: (untyped pattern, untyped options) -> untyped
589
+ def truncate_key: (untyped key) -> untyped
755
590
 
756
- # Reads an entry from the cache implementation. Subclasses must implement
757
- # this method.
758
- def read_entry: (untyped key, **untyped options) -> untyped
591
+ def deserialize_entry: (untyped serialized_entry, raw: untyped raw) -> untyped
759
592
 
760
- # Writes an entry to the cache implementation. Subclasses must implement
761
- # this method.
762
- def write_entry: (untyped key, untyped entry, **untyped options) -> untyped
593
+ def serialize_entry: (untyped entry, ?raw: bool raw) -> untyped
763
594
 
764
- # Reads multiple entries from the cache implementation. Subclasses MAY
765
- # implement this method.
766
- def read_multi_entries: (untyped names, **untyped options) -> untyped
595
+ def serialize_entries: (untyped entries, ?raw: bool raw) -> untyped
767
596
 
768
- # Writes multiple entries to the cache implementation. Subclasses MAY
769
- # implement this method.
770
- def write_multi_entries: (untyped hash, **untyped options) -> untyped
597
+ def failsafe: (untyped method, ?returning: untyped? returning) { () -> untyped } -> untyped
771
598
 
772
- # Deletes an entry from the cache implementation. Subclasses must
773
- # implement this method.
774
- def delete_entry: (untyped key, **untyped options) -> untyped
599
+ def handle_exception: (exception: untyped exception, method: untyped method, returning: untyped returning) -> untyped
600
+ end
601
+ end
602
+ end
775
603
 
776
- # Merges the default options with ones specific to a method call.
777
- def merged_options: (untyped call_options) -> untyped
604
+ module ActiveSupport
605
+ module Cache
606
+ module Strategy
607
+ # Caches that implement LocalCache will be backed by an in-memory cache for the
608
+ # duration of a block. Repeated calls to the cache for the same key will hit the
609
+ # in-memory cache for faster access.
610
+ module LocalCache
611
+ class LocalCacheRegistry
612
+ # Class for storing and registering the local caches.
613
+ # :nodoc:
614
+ extend ActiveSupport::PerThreadRegistry
778
615
 
779
- # Expands and namespaces the cache key. May be overridden by
780
- # cache stores to do additional normalization.
781
- def normalize_key: (untyped key, ?untyped? options) -> untyped
616
+ def initialize: () -> untyped
782
617
 
783
- # Prefix the key with a namespace string:
784
- #
785
- # namespace_key 'foo', namespace: 'cache'
786
- # # => 'cache:foo'
787
- #
788
- # With a namespace block:
789
- #
790
- # namespace_key 'foo', namespace: -> { 'cache' }
791
- # # => 'cache:foo'
792
- def namespace_key: (untyped key, ?untyped? options) -> untyped
618
+ def cache_for: (untyped local_cache_key) -> untyped
793
619
 
794
- # Expands key to be a consistent string value. Invokes +cache_key+ if
795
- # object responds to +cache_key+. Otherwise, +to_param+ method will be
796
- # called. If the key is a Hash, then keys will be sorted alphabetically.
797
- def expanded_key: (untyped key) -> untyped
620
+ def set_cache_for: (untyped local_cache_key, untyped value) -> untyped
798
621
 
799
- def normalize_version: (untyped key, ?untyped? options) -> untyped
622
+ def self.set_cache_for: (untyped l, untyped v) -> untyped
800
623
 
801
- def expanded_version: (untyped key) -> untyped
624
+ def self.cache_for: (untyped l) -> untyped
625
+ end
802
626
 
803
- def instrument: (untyped operation, untyped key, ?untyped? options) { (untyped) -> untyped } -> untyped
627
+ # Simple memory backed cache. This cache is not thread safe and is intended only
628
+ # for serving as a temporary memory cache for a single thread.
629
+ class LocalStore < Store
630
+ def initialize: () -> untyped
804
631
 
805
- def log: () { () -> untyped } -> (nil | untyped)
632
+ def synchronize: () { () -> untyped } -> untyped
806
633
 
807
- def handle_expired_entry: (untyped entry, untyped key, untyped options) -> untyped
634
+ def clear: (?untyped? options) -> untyped
808
635
 
809
- def get_entry_value: (untyped entry, untyped name, untyped options) -> untyped
636
+ def read_entry: (untyped key, **untyped options) -> untyped
810
637
 
811
- def save_block_result_to_cache: (untyped name, **untyped options) { (untyped) -> untyped } -> untyped
812
- end
638
+ def read_multi_entries: (untyped keys, **untyped options) -> untyped
813
639
 
814
- class Entry
815
- # This class is used to represent cache entries. Cache entries have a value, an optional
816
- # expiration time, and an optional version. The expiration time is used to support the :race_condition_ttl option
817
- # on the cache. The version is used to support the :version option on the cache for rejecting
818
- # mismatches.
819
- #
820
- # Since cache entries in most instances will be serialized, the internals of this class are highly optimized
821
- # using short instance variable names that are lazily defined.
822
- # :nodoc:
823
- attr_reader version: untyped
640
+ def write_entry: (untyped key, untyped value, **untyped options) -> ::TrueClass
824
641
 
825
- DEFAULT_COMPRESS_LIMIT: untyped
642
+ def delete_entry: (untyped key, **untyped options) -> untyped
826
643
 
827
- # Creates a new cache entry for the specified value. Options supported are
828
- # +:compress+, +:compress_threshold+, +:version+ and +:expires_in+.
829
- def initialize: (untyped value, ?expires_in: untyped? expires_in, ?version: untyped? version, ?compress_threshold: untyped compress_threshold, ?compress: bool compress) -> untyped
644
+ def fetch_entry: (untyped key, ?untyped? options) { () -> untyped } -> untyped
645
+ end
830
646
 
831
- def value: () -> untyped
647
+ # Use a local cache for the duration of block.
648
+ def with_local_cache: () { () -> untyped } -> untyped
832
649
 
833
- def mismatched?: (untyped version) -> untyped
650
+ # Middleware class can be inserted as a Rack handler to be local cache for the
651
+ # duration of request.
652
+ def middleware: () -> untyped
834
653
 
835
- # Checks if the entry is expired. The +expires_in+ parameter can override
836
- # the value set when the entry was created.
837
- def expired?: () -> untyped
654
+ def clear: (**untyped options) -> untyped
838
655
 
839
- def expires_at: () -> untyped
656
+ def cleanup: (**untyped options) -> untyped
840
657
 
841
- def expires_at=: (untyped value) -> untyped
658
+ def increment: (untyped name, ?::Integer amount, **untyped options) -> untyped
842
659
 
843
- # Returns the size of the cached value. This could be less than
844
- # <tt>value.size</tt> if the data is compressed.
845
- def size: () -> untyped
660
+ def decrement: (untyped name, ?::Integer amount, **untyped options) -> untyped
846
661
 
847
- # Duplicates the value in a class. This is used by cache implementations that don't natively
848
- # serialize entries to protect against accidental cache modifications.
849
- def dup_value!: () -> untyped
662
+ def read_entry: (untyped key, **untyped options) -> untyped
850
663
 
851
- def compress!: (untyped compress_threshold) -> untyped
664
+ def read_multi_entries: (untyped keys, **untyped options) -> untyped
852
665
 
853
- def compressed?: () -> untyped
666
+ def write_entry: (untyped key, untyped entry, **untyped options) -> untyped
854
667
 
855
- def uncompress: (untyped value) -> untyped
668
+ def delete_entry: (untyped key, **untyped options) -> untyped
669
+
670
+ def write_cache_value: (untyped name, untyped value, **untyped options) -> untyped
671
+
672
+ def local_cache_key: () -> untyped
673
+
674
+ def local_cache: () -> untyped
675
+
676
+ def bypass_local_cache: () { () -> untyped } -> untyped
677
+
678
+ def use_temporary_local_cache: (untyped temporary_cache) { () -> untyped } -> untyped
679
+ end
856
680
  end
857
681
  end
858
682
  end
859
683
 
860
684
  module ActiveSupport
861
685
  module Cache
862
- module ConnectionPoolLike
863
- def with: () { (untyped) -> untyped } -> untyped
686
+ module Strategy
687
+ module LocalCache
688
+ class Middleware
689
+ # -
690
+ # This class wraps up local storage for middlewares. Only the middleware method should
691
+ # construct them.
692
+ # :nodoc:
693
+ attr_reader name: untyped
694
+
695
+ # -
696
+ # This class wraps up local storage for middlewares. Only the middleware method should
697
+ # construct them.
698
+ # :nodoc:
699
+ attr_reader local_cache_key: untyped
700
+
701
+ def initialize: (untyped name, untyped local_cache_key) -> untyped
702
+
703
+ def new: (untyped app) -> untyped
704
+
705
+ def call: (untyped env) -> untyped
706
+ end
707
+ end
864
708
  end
709
+ end
710
+ end
865
711
 
866
- # Redis cache store.
712
+ module ActiveSupport
713
+ # See ActiveSupport::Cache::Store for documentation.
714
+ module Cache
715
+ # These options mean something to all cache implementations. Individual cache
716
+ # implementations may support additional options.
717
+ UNIVERSAL_OPTIONS: ::Array[untyped]
718
+
719
+ module Strategy
720
+ end
721
+
722
+ # Creates a new Store object according to the given options.
867
723
  #
868
- # Deployment note: Take care to use a *dedicated Redis cache* rather
869
- # than pointing this at your existing Redis server. It won't cope well
870
- # with mixed usage patterns and it won't expire cache entries by default.
724
+ # If no arguments are passed to this method, then a new
725
+ # ActiveSupport::Cache::MemoryStore object will be returned.
871
726
  #
872
- # Redis cache server setup guide: https://redis.io/topics/lru-cache
727
+ # If you pass a Symbol as the first argument, then a corresponding cache
728
+ # store class under the ActiveSupport::Cache namespace will be created.
729
+ # For example:
873
730
  #
874
- # * Supports vanilla Redis, hiredis, and Redis::Distributed.
875
- # * Supports Memcached-like sharding across Redises with Redis::Distributed.
876
- # * Fault tolerant. If the Redis server is unavailable, no exceptions are
877
- # raised. Cache fetches are all misses and writes are dropped.
878
- # * Local cache. Hot in-memory primary cache within block/middleware scope.
879
- # * +read_multi+ and +write_multi+ support for Redis mget/mset. Use Redis::Distributed
880
- # 4.0.1+ for distributed mget support.
881
- # * +delete_matched+ support for Redis KEYS globs.
882
- class RedisCacheStore < Store
883
- # Keys are truncated with their own SHA2 digest if they exceed 1kB
884
- MAX_KEY_BYTESIZE: ::Integer
731
+ # ActiveSupport::Cache.lookup_store(:memory_store)
732
+ # # => returns a new ActiveSupport::Cache::MemoryStore object
733
+ #
734
+ # ActiveSupport::Cache.lookup_store(:mem_cache_store)
735
+ # # => returns a new ActiveSupport::Cache::MemCacheStore object
736
+ #
737
+ # Any additional arguments will be passed to the corresponding cache store
738
+ # class's constructor:
739
+ #
740
+ # ActiveSupport::Cache.lookup_store(:file_store, '/tmp/cache')
741
+ # # => same as: ActiveSupport::Cache::FileStore.new('/tmp/cache')
742
+ #
743
+ # If the first argument is not a Symbol, then it will simply be returned:
744
+ #
745
+ # ActiveSupport::Cache.lookup_store(MyOwnCacheStore.new)
746
+ # # => returns MyOwnCacheStore.new
747
+ def self.lookup_store: (?untyped? store, *untyped parameters) -> untyped
885
748
 
886
- DEFAULT_REDIS_OPTIONS: ::Hash[untyped, untyped]
749
+ # Expands out the +key+ argument into a key that can be used for the
750
+ # cache store. Optionally accepts a namespace, and all keys will be
751
+ # scoped within that namespace.
752
+ #
753
+ # If the +key+ argument provided is an array, or responds to +to_a+, then
754
+ # each of elements in the array will be turned into parameters/keys and
755
+ # concatenated into a single key. For example:
756
+ #
757
+ # ActiveSupport::Cache.expand_cache_key([:foo, :bar]) # => "foo/bar"
758
+ # ActiveSupport::Cache.expand_cache_key([:foo, :bar], "namespace") # => "namespace/foo/bar"
759
+ #
760
+ # The +key+ argument can also respond to +cache_key+ or +to_param+.
761
+ def self.expand_cache_key: (untyped key, ?untyped? namespace) -> untyped
887
762
 
888
- DEFAULT_ERROR_HANDLER: untyped
763
+ def self.retrieve_cache_key: (untyped key) -> untyped
889
764
 
890
- # The maximum number of entries to receive per SCAN call.
891
- SCAN_BATCH_SIZE: ::Integer
765
+ # Obtains the specified cache store class, given the name of the +store+.
766
+ # Raises an error when the store class cannot be found.
767
+ def self.retrieve_store_class: (untyped store) -> untyped
892
768
 
893
- # Advertise cache versioning support.
894
- def self.supports_cache_versioning?: () -> ::TrueClass
769
+ # An abstract cache store class. There are multiple cache store
770
+ # implementations, each having its own additional features. See the classes
771
+ # under the ActiveSupport::Cache module, e.g.
772
+ # ActiveSupport::Cache::MemCacheStore. MemCacheStore is currently the most
773
+ # popular cache store for large production websites.
774
+ #
775
+ # Some implementations may not support all methods beyond the basic cache
776
+ # methods of +fetch+, +write+, +read+, +exist?+, and +delete+.
777
+ #
778
+ # ActiveSupport::Cache::Store can store any serializable Ruby object.
779
+ #
780
+ # cache = ActiveSupport::Cache::MemoryStore.new
781
+ #
782
+ # cache.read('city') # => nil
783
+ # cache.write('city', "Duckburgh")
784
+ # cache.read('city') # => "Duckburgh"
785
+ #
786
+ # Keys are always translated into Strings and are case sensitive. When an
787
+ # object is specified as a key and has a +cache_key+ method defined, this
788
+ # method will be called to define the key. Otherwise, the +to_param+
789
+ # method will be called. Hashes and Arrays can also be used as keys. The
790
+ # elements will be delimited by slashes, and the elements within a Hash
791
+ # will be sorted by key so they are consistent.
792
+ #
793
+ # cache.read('city') == cache.read(:city) # => true
794
+ #
795
+ # Nil values can be cached.
796
+ #
797
+ # If your cache is on a shared infrastructure, you can define a namespace
798
+ # for your cache entries. If a namespace is defined, it will be prefixed on
799
+ # to every key. The namespace can be either a static value or a Proc. If it
800
+ # is a Proc, it will be invoked when each key is evaluated so that you can
801
+ # use application logic to invalidate keys.
802
+ #
803
+ # cache.namespace = -> { @last_mod_time } # Set the namespace to a variable
804
+ # @last_mod_time = Time.now # Invalidate the entire cache by changing namespace
805
+ #
806
+ # Cached data larger than 1kB are compressed by default. To turn off
807
+ # compression, pass <tt>compress: false</tt> to the initializer or to
808
+ # individual +fetch+ or +write+ method calls. The 1kB compression
809
+ # threshold is configurable with the <tt>:compress_threshold</tt> option,
810
+ # specified in bytes.
811
+ class Store
812
+ attr_reader silence: untyped
895
813
 
896
- module LocalCacheWithRaw
897
- def write_entry: (untyped key, untyped entry, **untyped options) -> untyped
814
+ attr_reader options: untyped
898
815
 
899
- def write_multi_entries: (untyped entries, **untyped options) -> untyped
900
- end
816
+ alias silence? silence
901
817
 
902
- def self.build_redis: (?url: untyped? url, ?redis: untyped? redis, **untyped redis_options) -> untyped
818
+ def self.retrieve_pool_options: (untyped options) -> untyped
903
819
 
904
- def self.build_redis_distributed_client: (urls: untyped urls, **untyped redis_options) -> untyped
820
+ def self.ensure_connection_pool_added!: () -> untyped
905
821
 
906
- def self.build_redis_client: (url: untyped url, **untyped redis_options) -> untyped
822
+ # Creates a new cache. The options will be passed to any write method calls
823
+ # except for <tt>:namespace</tt> which can be used to set the global
824
+ # namespace for the cache.
825
+ def initialize: (?untyped? options) -> untyped
907
826
 
908
- attr_reader redis_options: untyped
827
+ # Silences the logger.
828
+ def silence!: () -> untyped
909
829
 
910
- attr_reader max_key_bytesize: untyped
830
+ # Silences the logger within a block.
831
+ def mute: () { () -> untyped } -> untyped
911
832
 
912
- # Creates a new Redis cache store.
833
+ # Fetches data from the cache, using the given key. If there is data in
834
+ # the cache with the given key, then that data is returned.
913
835
  #
914
- # Handles four options: :redis block, :redis instance, single :url
915
- # string, and multiple :url strings.
836
+ # If there is no such data in the cache (a cache miss), then +nil+ will be
837
+ # returned. However, if a block has been passed, that block will be passed
838
+ # the key and executed in the event of a cache miss. The return value of the
839
+ # block will be written to the cache under the given cache key, and that
840
+ # return value will be returned.
916
841
  #
917
- # Option Class Result
918
- # :redis Proc -> options[:redis].call
919
- # :redis Object -> options[:redis]
920
- # :url String -> Redis.new(url: (trim non-ascii characters))
921
- # :url Array -> Redis::Distributed.new([{ url: (trim non-ascii characters) }, { url: (trim non-ascii characters) }, (trim non-ascii characters)])
842
+ # cache.write('today', 'Monday')
843
+ # cache.fetch('today') # => "Monday"
922
844
  #
923
- # No namespace is set by default. Provide one if the Redis cache
924
- # server is shared with other apps: <tt>namespace: 'myapp-cache'</tt>.
845
+ # cache.fetch('city') # => nil
846
+ # cache.fetch('city') do
847
+ # 'Duckburgh'
848
+ # end
849
+ # cache.fetch('city') # => "Duckburgh"
925
850
  #
926
- # Compression is enabled by default with a 1kB threshold, so cached
927
- # values larger than 1kB are automatically compressed. Disable by
928
- # passing <tt>compress: false</tt> or change the threshold by passing
929
- # <tt>compress_threshold: 4.kilobytes</tt>.
851
+ # You may also specify additional options via the +options+ argument.
852
+ # Setting <tt>force: true</tt> forces a cache "miss," meaning we treat
853
+ # the cache value as missing even if it's present. Passing a block is
854
+ # required when +force+ is true so this always results in a cache write.
930
855
  #
931
- # No expiry is set on cache entries by default. Redis is expected to
932
- # be configured with an eviction policy that automatically deletes
933
- # least-recently or -frequently used keys when it reaches max memory.
934
- # See https://redis.io/topics/lru-cache for cache server setup.
856
+ # cache.write('today', 'Monday')
857
+ # cache.fetch('today', force: true) { 'Tuesday' } # => 'Tuesday'
858
+ # cache.fetch('today', force: true) # => ArgumentError
935
859
  #
936
- # Race condition TTL is not set by default. This can be used to avoid
937
- # "thundering herd" cache writes when hot cache entries are expired.
938
- # See <tt>ActiveSupport::Cache::Store#fetch</tt> for more.
939
- def initialize: (?error_handler: untyped error_handler, ?race_condition_ttl: untyped? race_condition_ttl, ?expires_in: untyped? expires_in, ?compress_threshold: untyped compress_threshold, ?compress: bool compress, ?namespace: untyped? namespace, **untyped redis_options) -> untyped
940
-
941
- def redis: () -> untyped
942
-
943
- def inspect: () -> ::String
944
-
945
- # Cache Store API implementation.
860
+ # The +:force+ option is useful when you're calling some other method to
861
+ # ask whether you should force a cache write. Otherwise, it's clearer to
862
+ # just call <tt>Cache#write</tt>.
946
863
  #
947
- # Read multiple values at once. Returns a hash of requested keys ->
948
- # fetched values.
949
- def read_multi: (*untyped names) -> untyped
950
-
951
- # Cache Store API implementation.
864
+ # Setting <tt>skip_nil: true</tt> will not cache nil result:
952
865
  #
953
- # Supports Redis KEYS glob patterns:
866
+ # cache.fetch('foo') { nil }
867
+ # cache.fetch('bar', skip_nil: true) { nil }
868
+ # cache.exist?('foo') # => true
869
+ # cache.exist?('bar') # => false
954
870
  #
955
- # h?llo matches hello, hallo and hxllo
956
- # h*llo matches hllo and heeeello
957
- # h[ae]llo matches hello and hallo, but not hillo
958
- # h[^e]llo matches hallo, hbllo, ... but not hello
959
- # h[a-b]llo matches hallo and hbllo
960
871
  #
961
- # Use \ to escape special characters if you want to match them verbatim.
872
+ # Setting <tt>compress: false</tt> disables compression of the cache entry.
962
873
  #
963
- # See https://redis.io/commands/KEYS for more.
874
+ # Setting <tt>:expires_in</tt> will set an expiration time on the cache.
875
+ # All caches support auto-expiring content after a specified number of
876
+ # seconds. This value can be specified as an option to the constructor
877
+ # (in which case all entries will be affected), or it can be supplied to
878
+ # the +fetch+ or +write+ method to effect just one entry.
964
879
  #
965
- # Failsafe: Raises errors.
966
- def delete_matched: (untyped matcher, ?untyped? options) -> untyped
967
-
968
- # Cache Store API implementation.
880
+ # cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes)
881
+ # cache.write(key, value, expires_in: 1.minute) # Set a lower value for one entry
969
882
  #
970
- # Increment a cached value. This method uses the Redis incr atomic
971
- # operator and can only be used on values written with the :raw option.
972
- # Calling it on a value not stored with :raw will initialize that value
973
- # to zero.
883
+ # Setting <tt>:version</tt> verifies the cache stored under <tt>name</tt>
884
+ # is of the same version. nil is returned on mismatches despite contents.
885
+ # This feature is used to support recyclable cache keys.
974
886
  #
975
- # Failsafe: Raises errors.
976
- def increment: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
977
-
978
- # Cache Store API implementation.
887
+ # Setting <tt>:race_condition_ttl</tt> is very useful in situations where
888
+ # a cache entry is used very frequently and is under heavy load. If a
889
+ # cache expires and due to heavy load several different processes will try
890
+ # to read data natively and then they all will try to write to cache. To
891
+ # avoid that case the first process to find an expired cache entry will
892
+ # bump the cache expiration time by the value set in <tt>:race_condition_ttl</tt>.
893
+ # Yes, this process is extending the time for a stale value by another few
894
+ # seconds. Because of extended life of the previous cache, other processes
895
+ # will continue to use slightly stale data for a just a bit longer. In the
896
+ # meantime that first process will go ahead and will write into cache the
897
+ # new value. After that all the processes will start getting the new value.
898
+ # The key is to keep <tt>:race_condition_ttl</tt> small.
979
899
  #
980
- # Decrement a cached value. This method uses the Redis decr atomic
981
- # operator and can only be used on values written with the :raw option.
982
- # Calling it on a value not stored with :raw will initialize that value
983
- # to zero.
900
+ # If the process regenerating the entry errors out, the entry will be
901
+ # regenerated after the specified number of seconds. Also note that the
902
+ # life of stale cache is extended only if it expired recently. Otherwise
903
+ # a new value is generated and <tt>:race_condition_ttl</tt> does not play
904
+ # any role.
984
905
  #
985
- # Failsafe: Raises errors.
986
- def decrement: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
987
-
988
- # Cache Store API implementation.
906
+ # # Set all values to expire after one minute.
907
+ # cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 1.minute)
989
908
  #
990
- # Removes expired entries. Handled natively by Redis least-recently-/
991
- # least-frequently-used expiry, so manual cleanup is not supported.
992
- def cleanup: (?untyped? options) -> untyped
993
-
994
- # Clear the entire cache on all Redis servers. Safe to use on
995
- # shared servers if the cache is namespaced.
909
+ # cache.write('foo', 'original value')
910
+ # val_1 = nil
911
+ # val_2 = nil
912
+ # sleep 60
996
913
  #
997
- # Failsafe: Raises errors.
998
- def clear: (?untyped? options) -> untyped
999
-
1000
- def mget_capable?: () -> untyped
1001
-
1002
- def mset_capable?: () -> untyped
1003
-
1004
- def set_redis_capabilities: () -> untyped
1005
-
1006
- # Store provider interface:
1007
- # Read an entry from the cache.
1008
- def read_entry: (untyped key, **untyped options) -> untyped
1009
-
1010
- def read_multi_entries: (untyped names, **untyped options) -> untyped
1011
-
1012
- def read_multi_mget: (*untyped names) -> (::Hash[untyped, untyped] | untyped)
1013
-
1014
- # Write an entry to the cache.
914
+ # Thread.new do
915
+ # val_1 = cache.fetch('foo', race_condition_ttl: 10.seconds) do
916
+ # sleep 1
917
+ # 'new value 1'
918
+ # end
919
+ # end
1015
920
  #
1016
- # Requires Redis 2.6.12+ for extended SET options.
1017
- def write_entry: (untyped key, untyped entry, ?race_condition_ttl: untyped? race_condition_ttl, ?expires_in: untyped? expires_in, ?raw: bool raw, ?unless_exist: bool unless_exist, **untyped options) -> untyped
1018
-
1019
- def write_key_expiry: (untyped client, untyped key, untyped options) -> untyped
1020
-
1021
- # Delete an entry from the cache.
1022
- def delete_entry: (untyped key, untyped options) -> untyped
921
+ # Thread.new do
922
+ # val_2 = cache.fetch('foo', race_condition_ttl: 10.seconds) do
923
+ # 'new value 2'
924
+ # end
925
+ # end
926
+ #
927
+ # cache.fetch('foo') # => "original value"
928
+ # sleep 10 # First thread extended the life of cache by another 10 seconds
929
+ # cache.fetch('foo') # => "new value 1"
930
+ # val_1 # => "new value 1"
931
+ # val_2 # => "original value"
932
+ #
933
+ # Other options will be handled by the specific cache store implementation.
934
+ # Internally, #fetch calls #read_entry, and calls #write_entry on a cache
935
+ # miss. +options+ will be passed to the #read and #write calls.
936
+ #
937
+ # For example, MemCacheStore's #write method supports the +:raw+
938
+ # option, which tells the memcached server to store all values as strings.
939
+ # We can use this option with #fetch too:
940
+ #
941
+ # cache = ActiveSupport::Cache::MemCacheStore.new
942
+ # cache.fetch("foo", force: true, raw: true) do
943
+ # :bar
944
+ # end
945
+ # cache.fetch('foo') # => "bar"
946
+ def fetch: (untyped name, ?untyped? options) { (untyped) -> untyped } -> untyped
1023
947
 
1024
- # Nonstandard store provider API to write multiple values at once.
1025
- def write_multi_entries: (untyped entries, ?expires_in: untyped? expires_in, **untyped options) -> untyped
948
+ # Reads data from the cache, using the given key. If there is data in
949
+ # the cache with the given key, then that data is returned. Otherwise,
950
+ # +nil+ is returned.
951
+ #
952
+ # Note, if data was written with the <tt>:expires_in</tt> or
953
+ # <tt>:version</tt> options, both of these conditions are applied before
954
+ # the data is returned.
955
+ #
956
+ # Options are passed to the underlying cache implementation.
957
+ def read: (untyped name, ?untyped? options) -> untyped
1026
958
 
1027
- # Truncate keys that exceed 1kB.
1028
- def normalize_key: (untyped key, untyped options) -> untyped
959
+ # Reads multiple values at once from the cache. Options can be passed
960
+ # in the last argument.
961
+ #
962
+ # Some cache implementation may optimize this method.
963
+ #
964
+ # Returns a hash mapping the names provided to the values found.
965
+ def read_multi: (*untyped names) -> untyped
1029
966
 
1030
- def truncate_key: (untyped key) -> untyped
967
+ # Cache Storage API to write multiple values at once.
968
+ def write_multi: (untyped hash, ?untyped? options) -> untyped
1031
969
 
1032
- def deserialize_entry: (untyped serialized_entry, raw: untyped raw) -> untyped
970
+ # Fetches data from the cache, using the given keys. If there is data in
971
+ # the cache with the given keys, then that data is returned. Otherwise,
972
+ # the supplied block is called for each key for which there was no data,
973
+ # and the result will be written to the cache and returned.
974
+ # Therefore, you need to pass a block that returns the data to be written
975
+ # to the cache. If you do not want to write the cache when the cache is
976
+ # not found, use #read_multi.
977
+ #
978
+ # Returns a hash with the data for each of the names. For example:
979
+ #
980
+ # cache.write("bim", "bam")
981
+ # cache.fetch_multi("bim", "unknown_key") do |key|
982
+ # "Fallback value for key: #{key}"
983
+ # end
984
+ # # => { "bim" => "bam",
985
+ # # "unknown_key" => "Fallback value for key: unknown_key" }
986
+ #
987
+ # Options are passed to the underlying cache implementation. For example:
988
+ #
989
+ # cache.fetch_multi("fizz", expires_in: 5.seconds) do |key|
990
+ # "buzz"
991
+ # end
992
+ # # => {"fizz"=>"buzz"}
993
+ # cache.read("fizz")
994
+ # # => "buzz"
995
+ # sleep(6)
996
+ # cache.read("fizz")
997
+ # # => nil
998
+ def fetch_multi: (*untyped names) { (untyped) -> untyped } -> untyped
1033
999
 
1034
- def serialize_entry: (untyped entry, ?raw: bool raw) -> untyped
1000
+ # Writes the value to the cache, with the key.
1001
+ #
1002
+ # Options are passed to the underlying cache implementation.
1003
+ def write: (untyped name, untyped value, ?untyped? options) -> untyped
1035
1004
 
1036
- def serialize_entries: (untyped entries, ?raw: bool raw) -> untyped
1005
+ # Deletes an entry in the cache. Returns +true+ if an entry is deleted.
1006
+ #
1007
+ # Options are passed to the underlying cache implementation.
1008
+ def delete: (untyped name, ?untyped? options) -> untyped
1037
1009
 
1038
- def failsafe: (untyped method, ?returning: untyped? returning) { () -> untyped } -> untyped
1010
+ # Returns +true+ if the cache contains an entry for the given key.
1011
+ #
1012
+ # Options are passed to the underlying cache implementation.
1013
+ def exist?: (untyped name, ?untyped? options) -> untyped
1039
1014
 
1040
- def handle_exception: (returning: untyped returning, method: untyped method, exception: untyped exception) -> untyped
1041
- end
1042
- end
1043
- end
1015
+ # Deletes all entries with keys matching the pattern.
1016
+ #
1017
+ # Options are passed to the underlying cache implementation.
1018
+ #
1019
+ # Some implementations may not support this method.
1020
+ def delete_matched: (untyped matcher, ?untyped? options) -> untyped
1044
1021
 
1045
- module ActiveSupport
1046
- module Cache
1047
- module Strategy
1048
- module LocalCache
1049
- class Middleware
1050
- # -
1051
- # This class wraps up local storage for middlewares. Only the middleware method should
1052
- # construct them.
1053
- # :nodoc:
1054
- attr_reader name: untyped
1022
+ # Increments an integer value in the cache.
1023
+ #
1024
+ # Options are passed to the underlying cache implementation.
1025
+ #
1026
+ # Some implementations may not support this method.
1027
+ def increment: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
1055
1028
 
1056
- # -
1057
- # This class wraps up local storage for middlewares. Only the middleware method should
1058
- # construct them.
1059
- # :nodoc:
1060
- attr_reader local_cache_key: untyped
1029
+ # Decrements an integer value in the cache.
1030
+ #
1031
+ # Options are passed to the underlying cache implementation.
1032
+ #
1033
+ # Some implementations may not support this method.
1034
+ def decrement: (untyped name, ?::Integer amount, ?untyped? options) -> untyped
1061
1035
 
1062
- def initialize: (untyped name, untyped local_cache_key) -> untyped
1036
+ # Cleanups the cache by removing expired entries.
1037
+ #
1038
+ # Options are passed to the underlying cache implementation.
1039
+ #
1040
+ # Some implementations may not support this method.
1041
+ def cleanup: (?untyped? options) -> untyped
1063
1042
 
1064
- def new: (untyped app) -> untyped
1043
+ # Clears the entire cache. Be careful with this method since it could
1044
+ # affect other processes if shared cache is being used.
1045
+ #
1046
+ # The options hash is passed to the underlying cache implementation.
1047
+ #
1048
+ # Some implementations may not support this method.
1049
+ def clear: (?untyped? options) -> untyped
1065
1050
 
1066
- def call: (untyped env) -> untyped
1067
- end
1068
- end
1069
- end
1070
- end
1071
- end
1051
+ def key_matcher: (untyped pattern, untyped options) -> untyped
1072
1052
 
1073
- module ActiveSupport
1074
- module Cache
1075
- module Strategy
1076
- # Caches that implement LocalCache will be backed by an in-memory cache for the
1077
- # duration of a block. Repeated calls to the cache for the same key will hit the
1078
- # in-memory cache for faster access.
1079
- module LocalCache
1080
- class LocalCacheRegistry
1081
- # Class for storing and registering the local caches.
1082
- # :nodoc:
1083
- extend ActiveSupport::PerThreadRegistry
1053
+ # Reads an entry from the cache implementation. Subclasses must implement
1054
+ # this method.
1055
+ def read_entry: (untyped key, **untyped options) -> untyped
1084
1056
 
1085
- def initialize: () -> untyped
1057
+ # Writes an entry to the cache implementation. Subclasses must implement
1058
+ # this method.
1059
+ def write_entry: (untyped key, untyped entry, **untyped options) -> untyped
1086
1060
 
1087
- def cache_for: (untyped local_cache_key) -> untyped
1061
+ # Reads multiple entries from the cache implementation. Subclasses MAY
1062
+ # implement this method.
1063
+ def read_multi_entries: (untyped names, **untyped options) -> untyped
1088
1064
 
1089
- def set_cache_for: (untyped local_cache_key, untyped value) -> untyped
1065
+ # Writes multiple entries to the cache implementation. Subclasses MAY
1066
+ # implement this method.
1067
+ def write_multi_entries: (untyped hash, **untyped options) -> untyped
1090
1068
 
1091
- def self.set_cache_for: (untyped l, untyped v) -> untyped
1069
+ # Deletes an entry from the cache implementation. Subclasses must
1070
+ # implement this method.
1071
+ def delete_entry: (untyped key, **untyped options) -> untyped
1092
1072
 
1093
- def self.cache_for: (untyped l) -> untyped
1094
- end
1073
+ # Merges the default options with ones specific to a method call.
1074
+ def merged_options: (untyped call_options) -> untyped
1095
1075
 
1096
- # Simple memory backed cache. This cache is not thread safe and is intended only
1097
- # for serving as a temporary memory cache for a single thread.
1098
- class LocalStore < Store
1099
- def initialize: () -> untyped
1076
+ # Expands and namespaces the cache key. May be overridden by
1077
+ # cache stores to do additional normalization.
1078
+ def normalize_key: (untyped key, ?untyped? options) -> untyped
1100
1079
 
1101
- def synchronize: () { () -> untyped } -> untyped
1080
+ # Prefix the key with a namespace string:
1081
+ #
1082
+ # namespace_key 'foo', namespace: 'cache'
1083
+ # # => 'cache:foo'
1084
+ #
1085
+ # With a namespace block:
1086
+ #
1087
+ # namespace_key 'foo', namespace: -> { 'cache' }
1088
+ # # => 'cache:foo'
1089
+ def namespace_key: (untyped key, ?untyped? options) -> untyped
1102
1090
 
1103
- def clear: (?untyped? options) -> untyped
1091
+ # Expands key to be a consistent string value. Invokes +cache_key+ if
1092
+ # object responds to +cache_key+. Otherwise, +to_param+ method will be
1093
+ # called. If the key is a Hash, then keys will be sorted alphabetically.
1094
+ def expanded_key: (untyped key) -> untyped
1104
1095
 
1105
- def read_entry: (untyped key, **untyped options) -> untyped
1096
+ def normalize_version: (untyped key, ?untyped? options) -> untyped
1106
1097
 
1107
- def read_multi_entries: (untyped keys, **untyped options) -> untyped
1098
+ def expanded_version: (untyped key) -> untyped
1108
1099
 
1109
- def write_entry: (untyped key, untyped value, **untyped options) -> ::TrueClass
1100
+ def instrument: (untyped operation, untyped key, ?untyped? options) { (untyped) -> untyped } -> untyped
1110
1101
 
1111
- def delete_entry: (untyped key, **untyped options) -> untyped
1102
+ def log: () { () -> untyped } -> (nil | untyped)
1112
1103
 
1113
- def fetch_entry: (untyped key, ?untyped? options) { () -> untyped } -> untyped
1114
- end
1104
+ def handle_expired_entry: (untyped entry, untyped key, untyped options) -> untyped
1115
1105
 
1116
- # Use a local cache for the duration of block.
1117
- def with_local_cache: () { () -> untyped } -> untyped
1106
+ def get_entry_value: (untyped entry, untyped name, untyped options) -> untyped
1118
1107
 
1119
- # Middleware class can be inserted as a Rack handler to be local cache for the
1120
- # duration of request.
1121
- def middleware: () -> untyped
1108
+ def save_block_result_to_cache: (untyped name, **untyped options) { (untyped) -> untyped } -> untyped
1109
+ end
1122
1110
 
1123
- def clear: (**untyped options) -> untyped
1111
+ class Entry
1112
+ # This class is used to represent cache entries. Cache entries have a value, an optional
1113
+ # expiration time, and an optional version. The expiration time is used to support the :race_condition_ttl option
1114
+ # on the cache. The version is used to support the :version option on the cache for rejecting
1115
+ # mismatches.
1116
+ #
1117
+ # Since cache entries in most instances will be serialized, the internals of this class are highly optimized
1118
+ # using short instance variable names that are lazily defined.
1119
+ # :nodoc:
1120
+ attr_reader version: untyped
1124
1121
 
1125
- def cleanup: (**untyped options) -> untyped
1122
+ DEFAULT_COMPRESS_LIMIT: untyped
1126
1123
 
1127
- def increment: (untyped name, ?::Integer amount, **untyped options) -> untyped
1124
+ # Creates a new cache entry for the specified value. Options supported are
1125
+ # +:compress+, +:compress_threshold+, +:version+ and +:expires_in+.
1126
+ def initialize: (untyped value, ?compress: bool compress, ?compress_threshold: untyped compress_threshold, ?version: untyped? version, ?expires_in: untyped? expires_in) -> untyped
1128
1127
 
1129
- def decrement: (untyped name, ?::Integer amount, **untyped options) -> untyped
1128
+ def value: () -> untyped
1130
1129
 
1131
- def read_entry: (untyped key, **untyped options) -> untyped
1130
+ def mismatched?: (untyped version) -> untyped
1132
1131
 
1133
- def read_multi_entries: (untyped keys, **untyped options) -> untyped
1132
+ # Checks if the entry is expired. The +expires_in+ parameter can override
1133
+ # the value set when the entry was created.
1134
+ def expired?: () -> untyped
1134
1135
 
1135
- def write_entry: (untyped key, untyped entry, **untyped options) -> untyped
1136
+ def expires_at: () -> untyped
1136
1137
 
1137
- def delete_entry: (untyped key, **untyped options) -> untyped
1138
+ def expires_at=: (untyped value) -> untyped
1138
1139
 
1139
- def write_cache_value: (untyped name, untyped value, **untyped options) -> untyped
1140
+ # Returns the size of the cached value. This could be less than
1141
+ # <tt>value.size</tt> if the data is compressed.
1142
+ def size: () -> untyped
1140
1143
 
1141
- def local_cache_key: () -> untyped
1144
+ # Duplicates the value in a class. This is used by cache implementations that don't natively
1145
+ # serialize entries to protect against accidental cache modifications.
1146
+ def dup_value!: () -> untyped
1142
1147
 
1143
- def local_cache: () -> untyped
1148
+ def compress!: (untyped compress_threshold) -> untyped
1144
1149
 
1145
- def bypass_local_cache: () { () -> untyped } -> untyped
1150
+ def compressed?: () -> untyped
1146
1151
 
1147
- def use_temporary_local_cache: (untyped temporary_cache) { () -> untyped } -> untyped
1148
- end
1152
+ def uncompress: (untyped value) -> untyped
1149
1153
  end
1150
1154
  end
1151
1155
  end
@@ -1248,7 +1252,7 @@ module ActiveSupport
1248
1252
  end
1249
1253
 
1250
1254
  module Filters
1251
- class Environment < ::Struct[untyped]
1255
+ class Environment[T] < ::Struct[T]
1252
1256
  attr_accessor target(): untyped
1253
1257
 
1254
1258
  attr_accessor halted(): untyped
@@ -1293,7 +1297,7 @@ module ActiveSupport
1293
1297
 
1294
1298
  def raw_filter: () -> untyped
1295
1299
 
1296
- def merge_conditional_options: (untyped chain, unless_option: untyped unless_option, if_option: untyped if_option) -> untyped
1300
+ def merge_conditional_options: (untyped chain, if_option: untyped if_option, unless_option: untyped unless_option) -> untyped
1297
1301
 
1298
1302
  def matches?: (untyped _kind, untyped _filter) -> untyped
1299
1303
 
@@ -1752,7 +1756,7 @@ module ActiveSupport
1752
1756
  # is awaiting a lock, it is not running any other code. With
1753
1757
  # +purpose+ matching, it is possible to yield only to other
1754
1758
  # threads whose activity will not interfere.
1755
- def start_exclusive: (?no_wait: bool no_wait, ?compatible: untyped compatible, ?purpose: untyped? purpose) -> untyped
1759
+ def start_exclusive: (?purpose: untyped? purpose, ?compatible: untyped compatible, ?no_wait: bool no_wait) -> untyped
1756
1760
 
1757
1761
  # Relinquish the exclusive lock. Must only be called by the thread
1758
1762
  # that called start_exclusive (and currently holds the lock).
@@ -1768,7 +1772,7 @@ module ActiveSupport
1768
1772
  # the block.
1769
1773
  #
1770
1774
  # See +start_exclusive+ for other options.
1771
- def exclusive: (?no_wait: bool no_wait, ?after_compatible: untyped after_compatible, ?compatible: untyped compatible, ?purpose: untyped? purpose) { () -> untyped } -> untyped
1775
+ def exclusive: (?purpose: untyped? purpose, ?compatible: untyped compatible, ?after_compatible: untyped after_compatible, ?no_wait: bool no_wait) { () -> untyped } -> untyped
1772
1776
 
1773
1777
  # Execute the supplied block while holding the Share lock.
1774
1778
  def sharing: () { () -> untyped } -> untyped
@@ -1776,7 +1780,7 @@ module ActiveSupport
1776
1780
  # Temporarily give up all held Share locks while executing the
1777
1781
  # supplied block, allowing any +compatible+ exclusive lock request
1778
1782
  # to proceed.
1779
- def yield_shares: (?block_share: bool block_share, ?compatible: untyped compatible, ?purpose: untyped? purpose) { () -> untyped } -> untyped
1783
+ def yield_shares: (?purpose: untyped? purpose, ?compatible: untyped compatible, ?block_share: bool block_share) { () -> untyped } -> untyped
1780
1784
 
1781
1785
  # Must be called within synchronize
1782
1786
  def busy_for_exclusive?: (untyped purpose) -> untyped
@@ -1808,7 +1812,7 @@ module ActiveSupport
1808
1812
 
1809
1813
  def configure: () { (untyped) -> untyped } -> untyped
1810
1814
 
1811
- def config_accessor: (*untyped names, ?instance_accessor: bool instance_accessor, ?instance_writer: bool instance_writer, ?instance_reader: bool instance_reader) { () -> untyped } -> untyped
1815
+ def config_accessor: (*untyped names, ?instance_reader: bool instance_reader, ?instance_writer: bool instance_writer, ?instance_accessor: bool instance_accessor) { () -> untyped } -> untyped
1812
1816
  end
1813
1817
 
1814
1818
  # Reads and writes attributes from a configuration <tt>OrderedHash</tt>.
@@ -1967,6 +1971,8 @@ class Array[unchecked out Elem]
1967
1971
  # [1,2].to_formatted_s # => "[1, 2]"
1968
1972
  def to_formatted_s: (?::Symbol format) -> untyped
1969
1973
 
1974
+ alias to_default_s to_s
1975
+
1970
1976
  # Returns a string that represents the array in XML by invoking +to_xml+
1971
1977
  # on each element. Active Record collections delegate their representation
1972
1978
  # in XML to this method.
@@ -2045,6 +2051,16 @@ class Array[unchecked out Elem]
2045
2051
  def to_xml: (?::Hash[untyped, untyped] options) { (untyped) -> untyped } -> untyped
2046
2052
  end
2047
2053
 
2054
+ class Array[unchecked out Elem]
2055
+ # Removes and returns the elements for which the block returns a true value.
2056
+ # If no block is given, an Enumerator is returned instead.
2057
+ #
2058
+ # numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2059
+ # odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
2060
+ # numbers # => [0, 2, 4, 6, 8]
2061
+ def extract!: () { (untyped) -> untyped } -> untyped
2062
+ end
2063
+
2048
2064
  class Hash[unchecked out K, unchecked out V]
2049
2065
  # By default, only instances of Hash itself are extractable.
2050
2066
  # Subclasses of Hash may implement this method and return
@@ -2067,16 +2083,6 @@ class Array[unchecked out Elem]
2067
2083
  def extract_options!: () -> untyped
2068
2084
  end
2069
2085
 
2070
- class Array[unchecked out Elem]
2071
- # Removes and returns the elements for which the block returns a true value.
2072
- # If no block is given, an Enumerator is returned instead.
2073
- #
2074
- # numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2075
- # odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
2076
- # numbers # => [0, 2, 4, 6, 8]
2077
- def extract!: () { (untyped) -> untyped } -> untyped
2078
- end
2079
-
2080
2086
  class Array[unchecked out Elem]
2081
2087
  # Splits or iterates over the array in groups of size +number+,
2082
2088
  # padding any remaining slots with +fill_with+ unless it is +false+.
@@ -2136,7 +2142,7 @@ class Array[unchecked out Elem]
2136
2142
  #
2137
2143
  # pets.any?(:cat, :ferret) # => true
2138
2144
  # pets.any?(:ferret, :alligator) # => false
2139
- def inquiry: () -> untyped
2145
+ def inquiry: () -> ActiveSupport::ArrayInquirer[Elem]
2140
2146
  end
2141
2147
 
2142
2148
  class Array[unchecked out Elem]
@@ -2251,52 +2257,212 @@ class Class
2251
2257
  # object.setting # => false
2252
2258
  # Base.setting # => true
2253
2259
  #
2254
- # To opt out of the instance reader method, pass <tt>instance_reader: false</tt>.
2260
+ # To opt out of the instance reader method, pass <tt>instance_reader: false</tt>.
2261
+ #
2262
+ # object.setting # => NoMethodError
2263
+ # object.setting? # => NoMethodError
2264
+ #
2265
+ # To opt out of the instance writer method, pass <tt>instance_writer: false</tt>.
2266
+ #
2267
+ # object.setting = false # => NoMethodError
2268
+ #
2269
+ # To opt out of both instance methods, pass <tt>instance_accessor: false</tt>.
2270
+ #
2271
+ # To set a default value for the attribute, pass <tt>default:</tt>, like so:
2272
+ #
2273
+ # class_attribute :settings, default: {}
2274
+ def class_attribute: (*untyped attrs, ?instance_accessor: bool instance_accessor, ?instance_reader: untyped instance_reader, ?instance_writer: untyped instance_writer, ?instance_predicate: bool instance_predicate, ?default: untyped? default) -> untyped
2275
+ end
2276
+
2277
+ class Class
2278
+ # Returns an array with all classes that are < than its receiver.
2279
+ #
2280
+ # class C; end
2281
+ # C.descendants # => []
2282
+ #
2283
+ # class B < C; end
2284
+ # C.descendants # => [B]
2285
+ #
2286
+ # class A < B; end
2287
+ # C.descendants # => [B, A]
2288
+ #
2289
+ # class D < C; end
2290
+ # C.descendants # => [B, A, D]
2291
+ def descendants: () -> untyped
2292
+
2293
+ # Returns an array with the direct children of +self+.
2294
+ #
2295
+ # class Foo; end
2296
+ # class Bar < Foo; end
2297
+ # class Baz < Bar; end
2298
+ #
2299
+ # Foo.subclasses # => [Bar]
2300
+ def subclasses: () -> untyped
2301
+ end
2302
+
2303
+ class Date
2304
+ # Duck-types as a Date-like class. See Object#acts_like?.
2305
+ def acts_like_date?: () -> ::TrueClass
2306
+ end
2307
+
2308
+ class Date
2309
+ # nodoc:
2310
+ # No Date is blank:
2311
+ #
2312
+ # Date.today.blank? # => false
2313
+ #
2314
+ # @return [false]
2315
+ def blank?: () -> ::FalseClass
2316
+ end
2317
+
2318
+ class Date
2319
+ include DateAndTime::Calculations
2320
+
2321
+ attr_accessor beginning_of_week_default: untyped
2322
+
2323
+ # Returns the week start (e.g. :monday) for the current request, if this has been set (via Date.beginning_of_week=).
2324
+ # If <tt>Date.beginning_of_week</tt> has not been set for the current request, returns the week start specified in <tt>config.beginning_of_week</tt>.
2325
+ # If no config.beginning_of_week was specified, returns :monday.
2326
+ def self.beginning_of_week: () -> untyped
2327
+
2328
+ # Sets <tt>Date.beginning_of_week</tt> to a week start (e.g. :monday) for current request/thread.
2329
+ #
2330
+ # This method accepts any of the following day symbols:
2331
+ # :monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday
2332
+ def self.beginning_of_week=: (untyped week_start) -> untyped
2333
+
2334
+ # Returns week start day symbol (e.g. :monday), or raises an +ArgumentError+ for invalid day symbol.
2335
+ def self.find_beginning_of_week!: (untyped week_start) -> untyped
2336
+
2337
+ # Returns a new Date representing the date 1 day ago (i.e. yesterday's date).
2338
+ def self.yesterday: () -> untyped
2339
+
2340
+ # Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).
2341
+ def self.tomorrow: () -> untyped
2342
+
2343
+ # Returns Time.zone.today when <tt>Time.zone</tt> or <tt>config.time_zone</tt> are set, otherwise just returns Date.today.
2344
+ def self.current: () -> untyped
2345
+
2346
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
2347
+ # and then subtracts the specified number of seconds.
2348
+ def ago: (untyped seconds) -> untyped
2349
+
2350
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
2351
+ # and then adds the specified number of seconds
2352
+ def since: (untyped seconds) -> untyped
2353
+
2354
+ alias in since
2355
+
2356
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
2357
+ def beginning_of_day: () -> untyped
2358
+
2359
+ alias midnight beginning_of_day
2360
+
2361
+ alias at_midnight beginning_of_day
2362
+
2363
+ alias at_beginning_of_day beginning_of_day
2364
+
2365
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the middle of the day (12:00)
2366
+ def middle_of_day: () -> untyped
2367
+
2368
+ alias midday middle_of_day
2369
+
2370
+ alias noon middle_of_day
2371
+
2372
+ alias at_midday middle_of_day
2373
+
2374
+ alias at_noon middle_of_day
2375
+
2376
+ alias at_middle_of_day middle_of_day
2377
+
2378
+ # Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
2379
+ def end_of_day: () -> untyped
2380
+
2381
+ alias at_end_of_day end_of_day
2382
+
2383
+ def plus_with_duration: (untyped other) -> untyped
2384
+
2385
+ alias plus_without_duration +
2386
+
2387
+ def minus_with_duration: (untyped other) -> untyped
2388
+
2389
+ alias minus_without_duration -
2390
+
2391
+ # Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
2392
+ # any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
2393
+ def advance: (untyped options) -> untyped
2394
+
2395
+ # Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
2396
+ # The +options+ parameter is a hash with a combination of these keys: <tt>:year</tt>, <tt>:month</tt>, <tt>:day</tt>.
2397
+ #
2398
+ # Date.new(2007, 5, 12).change(day: 1) # => Date.new(2007, 5, 1)
2399
+ # Date.new(2007, 5, 12).change(year: 2005, month: 1) # => Date.new(2005, 1, 12)
2400
+ def change: (untyped options) -> untyped
2401
+
2402
+ # Allow Date to be compared with Time by converting to DateTime and relying on the <=> from there.
2403
+ def compare_with_coercion: (untyped other) -> untyped
2404
+
2405
+ alias compare_without_coercion <=>
2406
+ end
2407
+
2408
+ class Date
2409
+ DATE_FORMATS: ::Hash[untyped, untyped]
2410
+
2411
+ # Convert to a formatted string. See DATE_FORMATS for predefined formats.
2255
2412
  #
2256
- # object.setting # => NoMethodError
2257
- # object.setting? # => NoMethodError
2413
+ # This method is aliased to <tt>to_s</tt>.
2258
2414
  #
2259
- # To opt out of the instance writer method, pass <tt>instance_writer: false</tt>.
2415
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
2260
2416
  #
2261
- # object.setting = false # => NoMethodError
2417
+ # date.to_formatted_s(:db) # => "2007-11-10"
2418
+ # date.to_s(:db) # => "2007-11-10"
2262
2419
  #
2263
- # To opt out of both instance methods, pass <tt>instance_accessor: false</tt>.
2420
+ # date.to_formatted_s(:short) # => "10 Nov"
2421
+ # date.to_formatted_s(:number) # => "20071110"
2422
+ # date.to_formatted_s(:long) # => "November 10, 2007"
2423
+ # date.to_formatted_s(:long_ordinal) # => "November 10th, 2007"
2424
+ # date.to_formatted_s(:rfc822) # => "10 Nov 2007"
2425
+ # date.to_formatted_s(:iso8601) # => "2007-11-10"
2264
2426
  #
2265
- # To set a default value for the attribute, pass <tt>default:</tt>, like so:
2427
+ # == Adding your own date formats to to_formatted_s
2428
+ # You can add your own formats to the Date::DATE_FORMATS hash.
2429
+ # Use the format name as the hash key and either a strftime string
2430
+ # or Proc instance that takes a date argument as the value.
2266
2431
  #
2267
- # class_attribute :settings, default: {}
2268
- def class_attribute: (*untyped attrs, ?default: untyped? default, ?instance_predicate: bool instance_predicate, ?instance_writer: untyped instance_writer, ?instance_reader: untyped instance_reader, ?instance_accessor: bool instance_accessor) -> untyped
2269
- end
2432
+ # # config/initializers/date_formats.rb
2433
+ # Date::DATE_FORMATS[:month_and_year] = '%B %Y'
2434
+ # Date::DATE_FORMATS[:short_ordinal] = ->(date) { date.strftime("%B #{date.day.ordinalize}") }
2435
+ def to_formatted_s: (?::Symbol format) -> untyped
2270
2436
 
2271
- class Class
2272
- # Returns an array with all classes that are < than its receiver.
2437
+ alias to_default_s to_s
2438
+
2439
+ # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005"
2440
+ def readable_inspect: () -> untyped
2441
+
2442
+ # Converts a Date instance to a Time, where the time is set to the beginning of the day.
2443
+ # The timezone can be either :local or :utc (default :local).
2273
2444
  #
2274
- # class C; end
2275
- # C.descendants # => []
2445
+ # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
2276
2446
  #
2277
- # class B < C; end
2278
- # C.descendants # => [B]
2447
+ # date.to_time # => 2007-11-10 00:00:00 0800
2448
+ # date.to_time(:local) # => 2007-11-10 00:00:00 0800
2279
2449
  #
2280
- # class A < B; end
2281
- # C.descendants # => [B, A]
2450
+ # date.to_time(:utc) # => 2007-11-10 00:00:00 UTC
2282
2451
  #
2283
- # class D < C; end
2284
- # C.descendants # => [B, A, D]
2285
- def descendants: () -> untyped
2452
+ # NOTE: The :local timezone is Ruby's *process* timezone, i.e. ENV['TZ'].
2453
+ # If the *application's* timezone is needed, then use +in_time_zone+ instead.
2454
+ def to_time: (?::Symbol form) -> untyped
2286
2455
 
2287
- # Returns an array with the direct children of +self+.
2288
- #
2289
- # class Foo; end
2290
- # class Bar < Foo; end
2291
- # class Baz < Bar; end
2456
+ # Returns a string which represents the time in used time zone as DateTime
2457
+ # defined by XML Schema:
2292
2458
  #
2293
- # Foo.subclasses # => [Bar]
2294
- def subclasses: () -> untyped
2459
+ # date = Date.new(2015, 05, 23) # => Sat, 23 May 2015
2460
+ # date.xmlschema # => "2015-05-23T00:00:00+04:00"
2461
+ def xmlschema: () -> untyped
2295
2462
  end
2296
2463
 
2297
2464
  class Date
2298
- # Duck-types as a Date-like class. See Object#acts_like?.
2299
- def acts_like_date?: () -> ::TrueClass
2465
+ include DateAndTime::Zones
2300
2466
  end
2301
2467
 
2302
2468
  module DateAndTime
@@ -2367,6 +2533,8 @@ module DateAndTime
2367
2533
  # now.beginning_of_month # => Mon, 01 Jun 2015 00:00:00 +0000
2368
2534
  def beginning_of_month: () -> untyped
2369
2535
 
2536
+ alias at_beginning_of_month beginning_of_month
2537
+
2370
2538
  # Returns a new date/time at the start of the quarter.
2371
2539
  #
2372
2540
  # today = Date.today # => Fri, 10 Jul 2015
@@ -2378,6 +2546,8 @@ module DateAndTime
2378
2546
  # now.beginning_of_quarter # => Wed, 01 Jul 2015 00:00:00 +0000
2379
2547
  def beginning_of_quarter: () -> untyped
2380
2548
 
2549
+ alias at_beginning_of_quarter beginning_of_quarter
2550
+
2381
2551
  # Returns a new date/time at the end of the quarter.
2382
2552
  #
2383
2553
  # today = Date.today # => Fri, 10 Jul 2015
@@ -2389,6 +2559,8 @@ module DateAndTime
2389
2559
  # now.end_of_quarter # => Wed, 30 Sep 2015 23:59:59 +0000
2390
2560
  def end_of_quarter: () -> untyped
2391
2561
 
2562
+ alias at_end_of_quarter end_of_quarter
2563
+
2392
2564
  # Returns a new date/time at the beginning of the year.
2393
2565
  #
2394
2566
  # today = Date.today # => Fri, 10 Jul 2015
@@ -2400,6 +2572,8 @@ module DateAndTime
2400
2572
  # now.beginning_of_year # => Thu, 01 Jan 2015 00:00:00 +0000
2401
2573
  def beginning_of_year: () -> untyped
2402
2574
 
2575
+ alias at_beginning_of_year beginning_of_year
2576
+
2403
2577
  # Returns a new date/time representing the given day in the next week.
2404
2578
  #
2405
2579
  # today = Date.today # => Thu, 07 May 2015
@@ -2430,15 +2604,21 @@ module DateAndTime
2430
2604
  # DateTime objects have their time set to 0:00 unless +same_time+ is true.
2431
2605
  def prev_week: (?untyped start_day, ?same_time: bool same_time) -> untyped
2432
2606
 
2607
+ alias last_week prev_week
2608
+
2433
2609
  # Returns a new date/time representing the previous weekday.
2434
2610
  def prev_weekday: () -> untyped
2435
2611
 
2612
+ alias last_weekday prev_weekday
2613
+
2436
2614
  # Short-hand for months_ago(1).
2437
2615
  def last_month: () -> untyped
2438
2616
 
2439
2617
  # Short-hand for months_ago(3).
2440
2618
  def prev_quarter: () -> untyped
2441
2619
 
2620
+ alias last_quarter prev_quarter
2621
+
2442
2622
  # Short-hand for years_ago(1).
2443
2623
  def last_year: () -> untyped
2444
2624
 
@@ -2453,6 +2633,8 @@ module DateAndTime
2453
2633
  # +DateTime+ objects have their time set to 0:00.
2454
2634
  def beginning_of_week: (?untyped start_day) -> untyped
2455
2635
 
2636
+ alias at_beginning_of_week beginning_of_week
2637
+
2456
2638
  # Returns Monday of this week assuming that week starts on Monday.
2457
2639
  # +DateTime+ objects have their time set to 0:00.
2458
2640
  def monday: () -> untyped
@@ -2463,6 +2645,8 @@ module DateAndTime
2463
2645
  # DateTime objects have their time set to 23:59:59.
2464
2646
  def end_of_week: (?untyped start_day) -> untyped
2465
2647
 
2648
+ alias at_end_of_week end_of_week
2649
+
2466
2650
  # Returns Sunday of this week assuming that week starts on Monday.
2467
2651
  # +DateTime+ objects have their time set to 23:59:59.
2468
2652
  def sunday: () -> untyped
@@ -2471,10 +2655,14 @@ module DateAndTime
2471
2655
  # DateTime objects will have a time set to 23:59:59.
2472
2656
  def end_of_month: () -> untyped
2473
2657
 
2658
+ alias at_end_of_month end_of_month
2659
+
2474
2660
  # Returns a new date/time representing the end of the year.
2475
2661
  # DateTime objects will have a time set to 23:59:59.
2476
2662
  def end_of_year: () -> untyped
2477
2663
 
2664
+ alias at_end_of_year end_of_year
2665
+
2478
2666
  # Returns a Range representing the whole day of the current date/time.
2479
2667
  def all_day: () -> ::Range[untyped]
2480
2668
 
@@ -2543,134 +2731,6 @@ module DateAndTime
2543
2731
  end
2544
2732
  end
2545
2733
 
2546
- class Date
2547
- # nodoc:
2548
- # No Date is blank:
2549
- #
2550
- # Date.today.blank? # => false
2551
- #
2552
- # @return [false]
2553
- def blank?: () -> ::FalseClass
2554
- end
2555
-
2556
- class Date
2557
- include DateAndTime::Calculations
2558
-
2559
- attr_accessor beginning_of_week_default: untyped
2560
-
2561
- # Returns the week start (e.g. :monday) for the current request, if this has been set (via Date.beginning_of_week=).
2562
- # If <tt>Date.beginning_of_week</tt> has not been set for the current request, returns the week start specified in <tt>config.beginning_of_week</tt>.
2563
- # If no config.beginning_of_week was specified, returns :monday.
2564
- def self.beginning_of_week: () -> untyped
2565
-
2566
- # Sets <tt>Date.beginning_of_week</tt> to a week start (e.g. :monday) for current request/thread.
2567
- #
2568
- # This method accepts any of the following day symbols:
2569
- # :monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday
2570
- def self.beginning_of_week=: (untyped week_start) -> untyped
2571
-
2572
- # Returns week start day symbol (e.g. :monday), or raises an +ArgumentError+ for invalid day symbol.
2573
- def self.find_beginning_of_week!: (untyped week_start) -> untyped
2574
-
2575
- # Returns a new Date representing the date 1 day ago (i.e. yesterday's date).
2576
- def self.yesterday: () -> untyped
2577
-
2578
- # Returns a new Date representing the date 1 day after today (i.e. tomorrow's date).
2579
- def self.tomorrow: () -> untyped
2580
-
2581
- # Returns Time.zone.today when <tt>Time.zone</tt> or <tt>config.time_zone</tt> are set, otherwise just returns Date.today.
2582
- def self.current: () -> untyped
2583
-
2584
- # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
2585
- # and then subtracts the specified number of seconds.
2586
- def ago: (untyped seconds) -> untyped
2587
-
2588
- # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
2589
- # and then adds the specified number of seconds
2590
- def since: (untyped seconds) -> untyped
2591
-
2592
- # Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
2593
- def beginning_of_day: () -> untyped
2594
-
2595
- # Converts Date to a Time (or DateTime if necessary) with the time portion set to the middle of the day (12:00)
2596
- def middle_of_day: () -> untyped
2597
-
2598
- # Converts Date to a Time (or DateTime if necessary) with the time portion set to the end of the day (23:59:59)
2599
- def end_of_day: () -> untyped
2600
-
2601
- def plus_with_duration: (untyped other) -> untyped
2602
-
2603
- def minus_with_duration: (untyped other) -> untyped
2604
-
2605
- # Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
2606
- # any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
2607
- def advance: (untyped options) -> untyped
2608
-
2609
- # Returns a new Date where one or more of the elements have been changed according to the +options+ parameter.
2610
- # The +options+ parameter is a hash with a combination of these keys: <tt>:year</tt>, <tt>:month</tt>, <tt>:day</tt>.
2611
- #
2612
- # Date.new(2007, 5, 12).change(day: 1) # => Date.new(2007, 5, 1)
2613
- # Date.new(2007, 5, 12).change(year: 2005, month: 1) # => Date.new(2005, 1, 12)
2614
- def change: (untyped options) -> untyped
2615
-
2616
- # Allow Date to be compared with Time by converting to DateTime and relying on the <=> from there.
2617
- def compare_with_coercion: (untyped other) -> untyped
2618
- end
2619
-
2620
- class Date
2621
- DATE_FORMATS: ::Hash[untyped, untyped]
2622
-
2623
- # Convert to a formatted string. See DATE_FORMATS for predefined formats.
2624
- #
2625
- # This method is aliased to <tt>to_s</tt>.
2626
- #
2627
- # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
2628
- #
2629
- # date.to_formatted_s(:db) # => "2007-11-10"
2630
- # date.to_s(:db) # => "2007-11-10"
2631
- #
2632
- # date.to_formatted_s(:short) # => "10 Nov"
2633
- # date.to_formatted_s(:number) # => "20071110"
2634
- # date.to_formatted_s(:long) # => "November 10, 2007"
2635
- # date.to_formatted_s(:long_ordinal) # => "November 10th, 2007"
2636
- # date.to_formatted_s(:rfc822) # => "10 Nov 2007"
2637
- # date.to_formatted_s(:iso8601) # => "2007-11-10"
2638
- #
2639
- # == Adding your own date formats to to_formatted_s
2640
- # You can add your own formats to the Date::DATE_FORMATS hash.
2641
- # Use the format name as the hash key and either a strftime string
2642
- # or Proc instance that takes a date argument as the value.
2643
- #
2644
- # # config/initializers/date_formats.rb
2645
- # Date::DATE_FORMATS[:month_and_year] = '%B %Y'
2646
- # Date::DATE_FORMATS[:short_ordinal] = ->(date) { date.strftime("%B #{date.day.ordinalize}") }
2647
- def to_formatted_s: (?::Symbol format) -> untyped
2648
-
2649
- # Overrides the default inspect method with a human readable one, e.g., "Mon, 21 Feb 2005"
2650
- def readable_inspect: () -> untyped
2651
-
2652
- # Converts a Date instance to a Time, where the time is set to the beginning of the day.
2653
- # The timezone can be either :local or :utc (default :local).
2654
- #
2655
- # date = Date.new(2007, 11, 10) # => Sat, 10 Nov 2007
2656
- #
2657
- # date.to_time # => 2007-11-10 00:00:00 0800
2658
- # date.to_time(:local) # => 2007-11-10 00:00:00 0800
2659
- #
2660
- # date.to_time(:utc) # => 2007-11-10 00:00:00 UTC
2661
- #
2662
- # NOTE: The :local timezone is Ruby's *process* timezone, i.e. ENV['TZ'].
2663
- # If the *application's* timezone is needed, then use +in_time_zone+ instead.
2664
- def to_time: (?::Symbol form) -> untyped
2665
-
2666
- # Returns a string which represents the time in used time zone as DateTime
2667
- # defined by XML Schema:
2668
- #
2669
- # date = Date.new(2015, 05, 23) # => Sat, 23 May 2015
2670
- # date.xmlschema # => "2015-05-23T00:00:00+04:00"
2671
- def xmlschema: () -> untyped
2672
- end
2673
-
2674
2734
  class DateTime
2675
2735
  # Duck-types as a Date-like class. See Object#acts_like?.
2676
2736
  def acts_like_date?: () -> ::TrueClass
@@ -2742,36 +2802,72 @@ class DateTime
2742
2802
  # months_since instead!
2743
2803
  def since: (untyped seconds) -> untyped
2744
2804
 
2805
+ alias in since
2806
+
2745
2807
  # Returns a new DateTime representing the start of the day (0:00).
2746
2808
  def beginning_of_day: () -> untyped
2747
2809
 
2810
+ alias midnight beginning_of_day
2811
+
2812
+ alias at_midnight beginning_of_day
2813
+
2814
+ alias at_beginning_of_day beginning_of_day
2815
+
2748
2816
  # Returns a new DateTime representing the middle of the day (12:00)
2749
2817
  def middle_of_day: () -> untyped
2750
2818
 
2819
+ alias midday middle_of_day
2820
+
2821
+ alias noon middle_of_day
2822
+
2823
+ alias at_midday middle_of_day
2824
+
2825
+ alias at_noon middle_of_day
2826
+
2827
+ alias at_middle_of_day middle_of_day
2828
+
2751
2829
  # Returns a new DateTime representing the end of the day (23:59:59).
2752
2830
  def end_of_day: () -> untyped
2753
2831
 
2832
+ alias at_end_of_day end_of_day
2833
+
2754
2834
  # Returns a new DateTime representing the start of the hour (hh:00:00).
2755
2835
  def beginning_of_hour: () -> untyped
2756
2836
 
2837
+ alias at_beginning_of_hour beginning_of_hour
2838
+
2757
2839
  # Returns a new DateTime representing the end of the hour (hh:59:59).
2758
2840
  def end_of_hour: () -> untyped
2759
2841
 
2842
+ alias at_end_of_hour end_of_hour
2843
+
2760
2844
  # Returns a new DateTime representing the start of the minute (hh:mm:00).
2761
2845
  def beginning_of_minute: () -> untyped
2762
2846
 
2847
+ alias at_beginning_of_minute beginning_of_minute
2848
+
2763
2849
  # Returns a new DateTime representing the end of the minute (hh:mm:59).
2764
2850
  def end_of_minute: () -> untyped
2765
2851
 
2852
+ alias at_end_of_minute end_of_minute
2853
+
2766
2854
  # Returns a <tt>Time</tt> instance of the simultaneous time in the system timezone.
2767
2855
  def localtime: (?untyped? utc_offset) -> untyped
2768
2856
 
2857
+ alias getlocal localtime
2858
+
2769
2859
  # Returns a <tt>Time</tt> instance of the simultaneous time in the UTC timezone.
2770
2860
  #
2771
2861
  # DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)) # => Mon, 21 Feb 2005 10:11:12 -0600
2772
2862
  # DateTime.civil(2005, 2, 21, 10, 11, 12, Rational(-6, 24)).utc # => Mon, 21 Feb 2005 16:11:12 UTC
2773
2863
  def utc: () -> untyped
2774
2864
 
2865
+ alias getgm utc
2866
+
2867
+ alias getutc utc
2868
+
2869
+ alias gmtime utc
2870
+
2775
2871
  # Returns +true+ if <tt>offset == 0</tt>.
2776
2872
  def utc?: () -> untyped
2777
2873
 
@@ -2821,6 +2917,8 @@ class DateTime
2821
2917
  # Time::DATE_FORMATS[:short_ordinal] = lambda { |time| time.strftime("%B #{time.day.ordinalize}") }
2822
2918
  def to_formatted_s: (?::Symbol format) -> untyped
2823
2919
 
2920
+ alias to_default_s to_s
2921
+
2824
2922
  # Returns a formatted string of the offset from UTC, or an alternative
2825
2923
  # string if the time zone is already UTC.
2826
2924
  #
@@ -2858,10 +2956,6 @@ class DateTime
2858
2956
  def seconds_since_unix_epoch: () -> untyped
2859
2957
  end
2860
2958
 
2861
- class Date
2862
- include DateAndTime::Zones
2863
- end
2864
-
2865
2959
  module Digest
2866
2960
  module UUID
2867
2961
  DNS_NAMESPACE: ::String
@@ -2894,6 +2988,30 @@ end
2894
2988
  module Enumerable[unchecked out Elem, out Return]
2895
2989
  INDEX_WITH_DEFAULT: untyped
2896
2990
 
2991
+ # We can't use Refinements here because Refinements with Module which will be prepended
2992
+ # doesn't work well https://bugs.ruby-lang.org/issues/13446
2993
+ alias _original_sum_with_required_identity sum
2994
+
2995
+ # Calculates a sum from the elements.
2996
+ #
2997
+ # payments.sum { |p| p.price * p.tax_rate }
2998
+ # payments.sum(&:price)
2999
+ #
3000
+ # The latter is a shortcut for:
3001
+ #
3002
+ # payments.inject(0) { |sum, p| sum + p.price }
3003
+ #
3004
+ # It can also calculate the sum without the use of a block.
3005
+ #
3006
+ # [5, 15, 10].sum # => 30
3007
+ # ['foo', 'bar'].sum # => "foobar"
3008
+ # [[1, 2], [3, 1, 5]].sum # => [1, 2, 3, 1, 5]
3009
+ #
3010
+ # The default sum of an empty list is zero. You can override this default:
3011
+ #
3012
+ # [].sum(Payment.new(0)) { |i| i.amount } # => Payment.new(0)
3013
+ def sum: (?untyped? identity) { () -> untyped } -> untyped
3014
+
2897
3015
  # Convert an enumerable to a hash keying it by the block return value.
2898
3016
  #
2899
3017
  # people.index_by(&:login)
@@ -2955,6 +3073,19 @@ module Enumerable[unchecked out Elem, out Return]
2955
3073
  def pluck: (*untyped keys) -> untyped
2956
3074
  end
2957
3075
 
3076
+ class Range[out Elem]
3077
+ # nodoc:
3078
+ # Optimize range sum to use arithmetic progression if a block is not given and
3079
+ # we have a range of numeric values.
3080
+ def sum: (?untyped? identity) -> untyped
3081
+ end
3082
+
3083
+ class Array[unchecked out Elem]
3084
+ # nodoc:
3085
+ # Array#sum was added in Ruby 2.4 but it only works with Numeric elements.
3086
+ def sum: (?untyped? init) { () -> untyped } -> untyped
3087
+ end
3088
+
2958
3089
  class File
2959
3090
  # Write to a file atomically. Useful for situations where you don't
2960
3091
  # want other processes or threads to see half-written files.
@@ -3186,6 +3317,18 @@ class Hash[unchecked out K, unchecked out V]
3186
3317
  #
3187
3318
  # { a: 1 }.with_indifferent_access['a'] # => 1
3188
3319
  def with_indifferent_access: () -> ActiveSupport::HashWithIndifferentAccess[K, V]
3320
+
3321
+ # Called when object is nested under an object that receives
3322
+ # #with_indifferent_access. This method will be called on the current object
3323
+ # by the enclosing object and is aliased to #with_indifferent_access by
3324
+ # default. Subclasses of Hash may overwrite this method to return +self+ if
3325
+ # converting to an <tt>ActiveSupport::HashWithIndifferentAccess</tt> would not be
3326
+ # desirable.
3327
+ #
3328
+ # b = { b: 1 }
3329
+ # { a: b }.with_indifferent_access['a'] # calls b.nested_under_indifferent_access
3330
+ # # => {"b"=>1}
3331
+ alias nested_under_indifferent_access with_indifferent_access
3189
3332
  end
3190
3333
 
3191
3334
  class Hash[unchecked out K, unchecked out V]
@@ -3210,10 +3353,14 @@ class Hash[unchecked out K, unchecked out V]
3210
3353
  # # => {:name=>"Rob", :age=>"28"}
3211
3354
  def symbolize_keys: () -> untyped
3212
3355
 
3356
+ alias to_options symbolize_keys
3357
+
3213
3358
  # Destructively converts all keys to symbols, as long as they respond
3214
3359
  # to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
3215
3360
  def symbolize_keys!: () -> untyped
3216
3361
 
3362
+ alias to_options! symbolize_keys!
3363
+
3217
3364
  # Validates all keys in a hash match <tt>*valid_keys</tt>, raising
3218
3365
  # +ArgumentError+ on a mismatch.
3219
3366
  #
@@ -3289,8 +3436,14 @@ class Hash[unchecked out K, unchecked out V]
3289
3436
  # with default values.
3290
3437
  def reverse_merge: (untyped other_hash) -> untyped
3291
3438
 
3439
+ alias with_defaults reverse_merge
3440
+
3292
3441
  # Destructive +reverse_merge+.
3293
3442
  def reverse_merge!: (untyped other_hash) -> untyped
3443
+
3444
+ alias reverse_update reverse_merge!
3445
+
3446
+ alias with_defaults! reverse_merge!
3294
3447
  end
3295
3448
 
3296
3449
  class Hash[unchecked out K, unchecked out V]
@@ -3348,10 +3501,14 @@ class Integer
3348
3501
  # 2.months # => 2 months
3349
3502
  def months: () -> untyped
3350
3503
 
3504
+ alias month months
3505
+
3351
3506
  # Returns a Duration instance matching the number of years provided.
3352
3507
  #
3353
3508
  # 2.years # => 2 years
3354
3509
  def years: () -> untyped
3510
+
3511
+ alias year years
3355
3512
  end
3356
3513
 
3357
3514
  module Kernel
@@ -3457,57 +3614,24 @@ class Module
3457
3614
  def anonymous?: () -> untyped
3458
3615
  end
3459
3616
 
3460
- # Extends the module object with class/module and instance accessors for
3461
- # class/module attributes, just like the native attr* accessors for instance
3462
- # attributes, but does so on a per-thread basis.
3463
- #
3464
- # So the values are scoped within the Thread.current space under the class name
3465
- # of the module.
3466
3617
  class Module
3467
- def thread_mattr_reader: (*untyped syms, ?instance_accessor: bool instance_accessor, ?instance_reader: bool instance_reader) -> untyped
3618
+ # Declares an attribute reader backed by an internally-named instance variable.
3619
+ def attr_internal_reader: (*untyped attrs) -> untyped
3468
3620
 
3469
- def thread_mattr_writer: (*untyped syms, ?instance_accessor: bool instance_accessor, ?instance_writer: bool instance_writer) -> untyped
3621
+ # Declares an attribute writer backed by an internally-named instance variable.
3622
+ def attr_internal_writer: (*untyped attrs) -> untyped
3470
3623
 
3471
- # Defines both class and instance accessors for class attributes.
3472
- #
3473
- # class Account
3474
- # thread_mattr_accessor :user
3475
- # end
3476
- #
3477
- # Account.user = "DHH"
3478
- # Account.user # => "DHH"
3479
- # Account.new.user # => "DHH"
3480
- #
3481
- # If a subclass changes the value, the parent class' value is not changed.
3482
- # Similarly, if the parent class changes the value, the value of subclasses
3483
- # is not changed.
3484
- #
3485
- # class Customer < Account
3486
- # end
3487
- #
3488
- # Customer.user = "Rafael"
3489
- # Customer.user # => "Rafael"
3490
- # Account.user # => "DHH"
3491
- #
3492
- # To omit the instance writer method, pass <tt>instance_writer: false</tt>.
3493
- # To omit the instance reader method, pass <tt>instance_reader: false</tt>.
3494
- #
3495
- # class Current
3496
- # thread_mattr_accessor :user, instance_writer: false, instance_reader: false
3497
- # end
3498
- #
3499
- # Current.new.user = "DHH" # => NoMethodError
3500
- # Current.new.user # => NoMethodError
3501
- #
3502
- # Or pass <tt>instance_accessor: false</tt>, to omit both instance methods.
3503
- #
3504
- # class Current
3505
- # thread_mattr_accessor :user, instance_accessor: false
3506
- # end
3507
- #
3508
- # Current.new.user = "DHH" # => NoMethodError
3509
- # Current.new.user # => NoMethodError
3510
- def thread_mattr_accessor: (*untyped syms, ?instance_accessor: bool instance_accessor, ?instance_writer: bool instance_writer, ?instance_reader: bool instance_reader) -> untyped
3624
+ # Declares an attribute reader and writer backed by an internally-named instance
3625
+ # variable.
3626
+ def attr_internal_accessor: (*untyped attrs) -> untyped
3627
+
3628
+ alias attr_internal attr_internal_accessor
3629
+
3630
+ attr_accessor attr_internal_naming_format: untyped
3631
+
3632
+ def attr_internal_ivar_name: (untyped attr) -> untyped
3633
+
3634
+ def attr_internal_define: (untyped attr_name, untyped `type`) -> untyped
3511
3635
  end
3512
3636
 
3513
3637
  # Extends the module object with class/module and instance accessors for
@@ -3558,7 +3682,9 @@ class Module
3558
3682
  # end
3559
3683
  #
3560
3684
  # Person.new.hair_colors # => [:brown, :black, :blonde, :red]
3561
- def mattr_reader: (*untyped syms, ?default: untyped? default, ?instance_accessor: bool instance_accessor, ?instance_reader: bool instance_reader) { () -> untyped } -> untyped
3685
+ def mattr_reader: (*untyped syms, ?instance_reader: bool instance_reader, ?instance_accessor: bool instance_accessor, ?default: untyped? default) { () -> untyped } -> untyped
3686
+
3687
+ alias cattr_reader mattr_reader
3562
3688
 
3563
3689
  # Defines a class attribute and creates a class and instance writer methods to
3564
3690
  # allow assignment to the attribute. All class and instance methods created
@@ -3602,7 +3728,9 @@ class Module
3602
3728
  # end
3603
3729
  #
3604
3730
  # Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
3605
- def mattr_writer: (*untyped syms, ?default: untyped? default, ?instance_accessor: bool instance_accessor, ?instance_writer: bool instance_writer) { () -> untyped } -> untyped
3731
+ def mattr_writer: (*untyped syms, ?instance_writer: bool instance_writer, ?instance_accessor: bool instance_accessor, ?default: untyped? default) { () -> untyped } -> untyped
3732
+
3733
+ alias cattr_writer mattr_writer
3606
3734
 
3607
3735
  # Defines both class and instance accessors for class attributes.
3608
3736
  # All class and instance methods created will be public, even if
@@ -3668,25 +3796,68 @@ class Module
3668
3796
  # end
3669
3797
  #
3670
3798
  # Person.class_variable_get("@@hair_colors") # => [:brown, :black, :blonde, :red]
3671
- def mattr_accessor: (*untyped syms, ?default: untyped? default, ?instance_accessor: bool instance_accessor, ?instance_writer: bool instance_writer, ?instance_reader: bool instance_reader) { () -> untyped } -> untyped
3799
+ def mattr_accessor: (*untyped syms, ?instance_reader: bool instance_reader, ?instance_writer: bool instance_writer, ?instance_accessor: bool instance_accessor, ?default: untyped? default) { () -> untyped } -> untyped
3800
+
3801
+ alias cattr_accessor mattr_accessor
3672
3802
  end
3673
3803
 
3804
+ # Extends the module object with class/module and instance accessors for
3805
+ # class/module attributes, just like the native attr* accessors for instance
3806
+ # attributes, but does so on a per-thread basis.
3807
+ #
3808
+ # So the values are scoped within the Thread.current space under the class name
3809
+ # of the module.
3674
3810
  class Module
3675
- # Declares an attribute reader backed by an internally-named instance variable.
3676
- def attr_internal_reader: (*untyped attrs) -> untyped
3811
+ def thread_mattr_reader: (*untyped syms, ?instance_reader: bool instance_reader, ?instance_accessor: bool instance_accessor) -> untyped
3677
3812
 
3678
- # Declares an attribute writer backed by an internally-named instance variable.
3679
- def attr_internal_writer: (*untyped attrs) -> untyped
3813
+ alias thread_cattr_reader thread_mattr_reader
3680
3814
 
3681
- # Declares an attribute reader and writer backed by an internally-named instance
3682
- # variable.
3683
- def attr_internal_accessor: (*untyped attrs) -> untyped
3815
+ def thread_mattr_writer: (*untyped syms, ?instance_writer: bool instance_writer, ?instance_accessor: bool instance_accessor) -> untyped
3684
3816
 
3685
- attr_accessor attr_internal_naming_format: untyped
3817
+ alias thread_cattr_writer thread_mattr_writer
3686
3818
 
3687
- def attr_internal_ivar_name: (untyped attr) -> untyped
3819
+ # Defines both class and instance accessors for class attributes.
3820
+ #
3821
+ # class Account
3822
+ # thread_mattr_accessor :user
3823
+ # end
3824
+ #
3825
+ # Account.user = "DHH"
3826
+ # Account.user # => "DHH"
3827
+ # Account.new.user # => "DHH"
3828
+ #
3829
+ # If a subclass changes the value, the parent class' value is not changed.
3830
+ # Similarly, if the parent class changes the value, the value of subclasses
3831
+ # is not changed.
3832
+ #
3833
+ # class Customer < Account
3834
+ # end
3835
+ #
3836
+ # Customer.user = "Rafael"
3837
+ # Customer.user # => "Rafael"
3838
+ # Account.user # => "DHH"
3839
+ #
3840
+ # To omit the instance writer method, pass <tt>instance_writer: false</tt>.
3841
+ # To omit the instance reader method, pass <tt>instance_reader: false</tt>.
3842
+ #
3843
+ # class Current
3844
+ # thread_mattr_accessor :user, instance_writer: false, instance_reader: false
3845
+ # end
3846
+ #
3847
+ # Current.new.user = "DHH" # => NoMethodError
3848
+ # Current.new.user # => NoMethodError
3849
+ #
3850
+ # Or pass <tt>instance_accessor: false</tt>, to omit both instance methods.
3851
+ #
3852
+ # class Current
3853
+ # thread_mattr_accessor :user, instance_accessor: false
3854
+ # end
3855
+ #
3856
+ # Current.new.user = "DHH" # => NoMethodError
3857
+ # Current.new.user # => NoMethodError
3858
+ def thread_mattr_accessor: (*untyped syms, ?instance_reader: bool instance_reader, ?instance_writer: bool instance_writer, ?instance_accessor: bool instance_accessor) -> untyped
3688
3859
 
3689
- def attr_internal_define: (untyped attr_name, untyped `type`) -> untyped
3860
+ alias thread_cattr_accessor thread_mattr_accessor
3690
3861
  end
3691
3862
 
3692
3863
  class Module
@@ -3979,7 +4150,7 @@ class Module
3979
4150
  # Foo.new("Bar").name # raises NoMethodError: undefined method `name'
3980
4151
  #
3981
4152
  # The target method must be public, otherwise it will raise +NoMethodError+.
3982
- def delegate: (*untyped methods, ?private: untyped? `private`, ?allow_nil: untyped? allow_nil, ?prefix: untyped? prefix, ?to: untyped? to) -> untyped
4153
+ def delegate: (*untyped methods, ?to: untyped? to, ?prefix: untyped? prefix, ?allow_nil: untyped? allow_nil, ?private: untyped? `private`) -> untyped
3983
4154
 
3984
4155
  # When building decorators, a common pattern may emerge:
3985
4156
  #
@@ -4160,35 +4331,49 @@ class Numeric
4160
4331
  # 2.bytes # => 2
4161
4332
  def bytes: () -> untyped
4162
4333
 
4334
+ alias byte bytes
4335
+
4163
4336
  # Returns the number of bytes equivalent to the kilobytes provided.
4164
4337
  #
4165
4338
  # 2.kilobytes # => 2048
4166
4339
  def kilobytes: () -> untyped
4167
4340
 
4341
+ alias kilobyte kilobytes
4342
+
4168
4343
  # Returns the number of bytes equivalent to the megabytes provided.
4169
4344
  #
4170
4345
  # 2.megabytes # => 2_097_152
4171
4346
  def megabytes: () -> untyped
4172
4347
 
4348
+ alias megabyte megabytes
4349
+
4173
4350
  # Returns the number of bytes equivalent to the gigabytes provided.
4174
4351
  #
4175
4352
  # 2.gigabytes # => 2_147_483_648
4176
4353
  def gigabytes: () -> untyped
4177
4354
 
4355
+ alias gigabyte gigabytes
4356
+
4178
4357
  # Returns the number of bytes equivalent to the terabytes provided.
4179
4358
  #
4180
4359
  # 2.terabytes # => 2_199_023_255_552
4181
4360
  def terabytes: () -> untyped
4182
4361
 
4362
+ alias terabyte terabytes
4363
+
4183
4364
  # Returns the number of bytes equivalent to the petabytes provided.
4184
4365
  #
4185
4366
  # 2.petabytes # => 2_251_799_813_685_248
4186
4367
  def petabytes: () -> untyped
4187
4368
 
4369
+ alias petabyte petabytes
4370
+
4188
4371
  # Returns the number of bytes equivalent to the exabytes provided.
4189
4372
  #
4190
4373
  # 2.exabytes # => 2_305_843_009_213_693_952
4191
4374
  def exabytes: () -> untyped
4375
+
4376
+ alias exabyte exabytes
4192
4377
  end
4193
4378
 
4194
4379
  module ActiveSupport
@@ -4299,31 +4484,43 @@ class Numeric
4299
4484
  # 2.seconds # => 2 seconds
4300
4485
  def seconds: () -> untyped
4301
4486
 
4487
+ alias second seconds
4488
+
4302
4489
  # Returns a Duration instance matching the number of minutes provided.
4303
4490
  #
4304
4491
  # 2.minutes # => 2 minutes
4305
4492
  def minutes: () -> untyped
4306
4493
 
4494
+ alias minute minutes
4495
+
4307
4496
  # Returns a Duration instance matching the number of hours provided.
4308
4497
  #
4309
4498
  # 2.hours # => 2 hours
4310
4499
  def hours: () -> untyped
4311
4500
 
4501
+ alias hour hours
4502
+
4312
4503
  # Returns a Duration instance matching the number of days provided.
4313
4504
  #
4314
4505
  # 2.days # => 2 days
4315
4506
  def days: () -> untyped
4316
4507
 
4508
+ alias day days
4509
+
4317
4510
  # Returns a Duration instance matching the number of weeks provided.
4318
4511
  #
4319
4512
  # 2.weeks # => 2 weeks
4320
4513
  def weeks: () -> untyped
4321
4514
 
4515
+ alias week weeks
4516
+
4322
4517
  # Returns a Duration instance matching the number of fortnights provided.
4323
4518
  #
4324
4519
  # 2.fortnights # => 4 weeks
4325
4520
  def fortnights: () -> untyped
4326
4521
 
4522
+ alias fortnight fortnights
4523
+
4327
4524
  # Returns the number of milliseconds equivalent to the seconds provided.
4328
4525
  # Used with the standard time durations.
4329
4526
  #
@@ -4408,9 +4605,23 @@ class TrueClass
4408
4605
  end
4409
4606
 
4410
4607
  class Array[unchecked out Elem]
4608
+ # An array is blank if it's empty:
4609
+ #
4610
+ # [].blank? # => true
4611
+ # [1,2,3].blank? # => false
4612
+ #
4613
+ # @return [true, false]
4614
+ alias blank? empty?
4411
4615
  end
4412
4616
 
4413
4617
  class Hash[unchecked out K, unchecked out V]
4618
+ # A hash is blank if it's empty:
4619
+ #
4620
+ # {}.blank? # => true
4621
+ # { key: 'value' }.blank? # => false
4622
+ #
4623
+ # @return [true, false]
4624
+ alias blank? empty?
4414
4625
  end
4415
4626
 
4416
4627
  class String
@@ -4640,7 +4851,7 @@ class IO
4640
4851
  def as_json: (?untyped? options) -> untyped
4641
4852
  end
4642
4853
 
4643
- class Range[Elem]
4854
+ class Range[out Elem]
4644
4855
  def as_json: (?untyped? options) -> untyped
4645
4856
  end
4646
4857
 
@@ -4736,6 +4947,8 @@ class Hash[unchecked out K, unchecked out V]
4736
4947
  #
4737
4948
  # This method is also aliased as +to_param+.
4738
4949
  def to_query: (?untyped? namespace) -> untyped
4950
+
4951
+ alias to_param to_query
4739
4952
  end
4740
4953
 
4741
4954
  module ActiveSupport
@@ -4911,6 +5124,10 @@ module ActiveSupport
4911
5124
  # # config/initializers/range_formats.rb
4912
5125
  # Range::RANGE_FORMATS[:short] = ->(start, stop) { "Between #{start.to_s(:db)} and #{stop.to_s(:db)}" }
4913
5126
  def to_s: (?::Symbol format) -> untyped
5127
+
5128
+ alias to_default_s to_s
5129
+
5130
+ alias to_formatted_s to_s
4914
5131
  end
4915
5132
  end
4916
5133
 
@@ -4936,7 +5153,7 @@ module ActiveSupport
4936
5153
  end
4937
5154
  end
4938
5155
 
4939
- class Range[Elem]
5156
+ class Range[out Elem]
4940
5157
  # Compare two ranges and see if they overlap each other
4941
5158
  # (1..5).overlaps?(4..6) # => true
4942
5159
  # (1..5).overlaps?(7..9) # => false
@@ -5307,6 +5524,8 @@ class String
5307
5524
  # 'active_record/errors'.camelize(:lower) # => "activeRecord::Errors"
5308
5525
  def camelize: (?::Symbol first_letter) -> untyped
5309
5526
 
5527
+ alias camelcase camelize
5528
+
5310
5529
  # Capitalizes all the words and replaces some characters in the string to create
5311
5530
  # a nicer looking title. +titleize+ is meant for creating pretty output. It is not
5312
5531
  # used in the Rails internals.
@@ -5322,6 +5541,8 @@ class String
5322
5541
  # 'string_ending_with_id'.titleize(keep_id_suffix: true) # => "String Ending With Id"
5323
5542
  def titleize: (?keep_id_suffix: bool keep_id_suffix) -> untyped
5324
5543
 
5544
+ alias titlecase titleize
5545
+
5325
5546
  # The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
5326
5547
  #
5327
5548
  # +underscore+ will also change '::' to '/' to convert namespaces to paths.
@@ -5388,7 +5609,7 @@ class String
5388
5609
  #
5389
5610
  # <%= link_to(@person.name, person_path) %>
5390
5611
  # # => <a href="/person/1-Donald-E-Knuth">Donald E. Knuth</a>
5391
- def parameterize: (?locale: untyped? locale, ?preserve_case: bool preserve_case, ?separator: ::String separator) -> untyped
5612
+ def parameterize: (?separator: ::String separator, ?preserve_case: bool preserve_case, ?locale: untyped? locale) -> untyped
5392
5613
 
5393
5614
  # Creates the name of a table like Rails does for models to table names. This method
5394
5615
  # uses the +pluralize+ method on the last word in the string.
@@ -5423,7 +5644,7 @@ class String
5423
5644
  # 'author_id'.humanize(capitalize: false) # => "author"
5424
5645
  # '_id'.humanize # => "Id"
5425
5646
  # 'author_id'.humanize(keep_id_suffix: true) # => "Author Id"
5426
- def humanize: (?keep_id_suffix: bool keep_id_suffix, ?capitalize: bool capitalize) -> untyped
5647
+ def humanize: (?capitalize: bool capitalize, ?keep_id_suffix: bool keep_id_suffix) -> untyped
5427
5648
 
5428
5649
  # Converts just the first character to uppercase.
5429
5650
  #
@@ -5513,6 +5734,8 @@ class ERB
5513
5734
  # # => is a &gt; 0 &amp; a &lt; 10?
5514
5735
  def html_escape: (untyped s) -> untyped
5515
5736
 
5737
+ alias h html_escape
5738
+
5516
5739
  def unwrapped_html_escape: (untyped s) -> untyped
5517
5740
 
5518
5741
  # A utility method for escaping HTML without affecting existing escaped entities.
@@ -5598,6 +5821,8 @@ module ActiveSupport
5598
5821
 
5599
5822
  UNSAFE_STRING_METHODS_WITH_BACKREF: ::Array[untyped]
5600
5823
 
5824
+ alias original_concat concat
5825
+
5601
5826
  # Raised when <tt>ActiveSupport::SafeBuffer#safe_concat</tt> is called on unsafe buffers.
5602
5827
  class SafeConcatError < StandardError
5603
5828
  def initialize: () -> untyped
@@ -5615,6 +5840,8 @@ module ActiveSupport
5615
5840
 
5616
5841
  def concat: (untyped value) -> untyped
5617
5842
 
5843
+ alias << concat
5844
+
5618
5845
  def insert: (untyped index, untyped value) -> untyped
5619
5846
 
5620
5847
  def `prepend`: (untyped value) -> untyped
@@ -5653,6 +5880,9 @@ class String
5653
5880
  end
5654
5881
 
5655
5882
  class String
5883
+ alias starts_with? start_with?
5884
+
5885
+ alias ends_with? end_with?
5656
5886
  end
5657
5887
 
5658
5888
  class String
@@ -5711,6 +5941,8 @@ class Time
5711
5941
  # instances can be used when called with a single argument
5712
5942
  def self.at_with_coercion: (*untyped args) -> untyped
5713
5943
 
5944
+ alias self.at_without_coercion self.at
5945
+
5714
5946
  # Creates a +Time+ instance from an RFC 3339 string.
5715
5947
  #
5716
5948
  # Time.rfc3339('1999-12-31T14:00:00-10:00') # => 2000-01-01 00:00:00 -1000
@@ -5772,44 +6004,82 @@ class Time
5772
6004
  # Returns a new Time representing the time a number of seconds since the instance time
5773
6005
  def since: (untyped seconds) -> untyped
5774
6006
 
6007
+ alias in since
6008
+
5775
6009
  # Returns a new Time representing the start of the day (0:00)
5776
6010
  def beginning_of_day: () -> untyped
5777
6011
 
6012
+ alias midnight beginning_of_day
6013
+
6014
+ alias at_midnight beginning_of_day
6015
+
6016
+ alias at_beginning_of_day beginning_of_day
6017
+
5778
6018
  # Returns a new Time representing the middle of the day (12:00)
5779
6019
  def middle_of_day: () -> untyped
5780
6020
 
6021
+ alias midday middle_of_day
6022
+
6023
+ alias noon middle_of_day
6024
+
6025
+ alias at_midday middle_of_day
6026
+
6027
+ alias at_noon middle_of_day
6028
+
6029
+ alias at_middle_of_day middle_of_day
6030
+
5781
6031
  # Returns a new Time representing the end of the day, 23:59:59.999999
5782
6032
  def end_of_day: () -> untyped
5783
6033
 
6034
+ alias at_end_of_day end_of_day
6035
+
5784
6036
  # Returns a new Time representing the start of the hour (x:00)
5785
6037
  def beginning_of_hour: () -> untyped
5786
6038
 
6039
+ alias at_beginning_of_hour beginning_of_hour
6040
+
5787
6041
  # Returns a new Time representing the end of the hour, x:59:59.999999
5788
6042
  def end_of_hour: () -> untyped
5789
6043
 
6044
+ alias at_end_of_hour end_of_hour
6045
+
5790
6046
  # Returns a new Time representing the start of the minute (x:xx:00)
5791
6047
  def beginning_of_minute: () -> untyped
5792
6048
 
6049
+ alias at_beginning_of_minute beginning_of_minute
6050
+
5793
6051
  # Returns a new Time representing the end of the minute, x:xx:59.999999
5794
6052
  def end_of_minute: () -> untyped
5795
6053
 
6054
+ alias at_end_of_minute end_of_minute
6055
+
5796
6056
  def plus_with_duration: (untyped other) -> untyped
5797
6057
 
6058
+ alias plus_without_duration +
6059
+
5798
6060
  def minus_with_duration: (untyped other) -> untyped
5799
6061
 
6062
+ alias minus_without_duration -
6063
+
5800
6064
  # Time#- can also be used to determine the number of seconds between two Time instances.
5801
6065
  # We're layering on additional behavior so that ActiveSupport::TimeWithZone instances
5802
6066
  # are coerced into values that Time#- will recognize
5803
6067
  def minus_with_coercion: (untyped other) -> untyped
5804
6068
 
6069
+ alias minus_without_coercion -
6070
+
5805
6071
  # Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances
5806
6072
  # can be chronologically compared with a Time
5807
6073
  def compare_with_coercion: (untyped other) -> untyped
5808
6074
 
6075
+ alias compare_without_coercion <=>
6076
+
5809
6077
  # Layers additional behavior on Time#eql? so that ActiveSupport::TimeWithZone instances
5810
6078
  # can be eql? to an equivalent Time
5811
6079
  def eql_with_coercion: (untyped other) -> untyped
5812
6080
 
6081
+ alias eql_without_coercion eql?
6082
+
5813
6083
  # Returns a new time the specified number of days ago.
5814
6084
  def prev_day: (?::Integer days) -> untyped
5815
6085
 
@@ -5867,12 +6137,17 @@ class Time
5867
6137
  # Time::DATE_FORMATS[:short_ordinal] = ->(time) { time.strftime("%B #{time.day.ordinalize}") }
5868
6138
  def to_formatted_s: (?::Symbol format) -> untyped
5869
6139
 
6140
+ alias to_default_s to_s
6141
+
5870
6142
  # Returns a formatted string of the offset from UTC, or an alternative
5871
6143
  # string if the time zone is already UTC.
5872
6144
  #
5873
6145
  # Time.local(2000).formatted_offset # => "-06:00"
5874
6146
  # Time.local(2000).formatted_offset(false) # => "-0600"
5875
6147
  def formatted_offset: (?bool colon, ?untyped? alternate_utc_string) -> untyped
6148
+
6149
+ # Aliased to +xmlschema+ for compatibility with +DateTime+
6150
+ alias rfc3339 xmlschema
5876
6151
  end
5877
6152
 
5878
6153
  class Time
@@ -6052,6 +6327,8 @@ module ActiveSupport
6052
6327
  # Calls this block after #reset is called on the instance. Used for resetting external collaborators, like Time.zone.
6053
6328
  def self.resets: () { () -> untyped } -> untyped
6054
6329
 
6330
+ alias self.after_reset self.resets
6331
+
6055
6332
  def self.reset_all: () -> untyped
6056
6333
 
6057
6334
  def self.clear_all: () -> untyped
@@ -6126,30 +6403,75 @@ module ActiveSupport
6126
6403
  end
6127
6404
  end
6128
6405
 
6129
- module ActiveSupport
6130
- module Dependencies
6131
- # nodoc:
6132
- # nodoc:
6133
- class Interlock
6134
- def initialize: () -> untyped
6406
+ module ActiveSupport
6407
+ module Dependencies
6408
+ # nodoc:
6409
+ # nodoc:
6410
+ class Interlock
6411
+ def initialize: () -> untyped
6412
+
6413
+ def loading: () { () -> untyped } -> untyped
6414
+
6415
+ def unloading: () { () -> untyped } -> untyped
6416
+
6417
+ def start_unloading: () -> untyped
6418
+
6419
+ def done_unloading: () -> untyped
6420
+
6421
+ def start_running: () -> untyped
6422
+
6423
+ def done_running: () -> untyped
6424
+
6425
+ def running: () { () -> untyped } -> untyped
6426
+
6427
+ def permit_concurrent_loads: () { () -> untyped } -> untyped
6428
+
6429
+ def raw_state: () { () -> untyped } -> untyped
6430
+ end
6431
+ end
6432
+ end
6433
+
6434
+ module ActiveSupport
6435
+ module Dependencies
6436
+ module ZeitwerkIntegration
6437
+ # :nodoc: all
6438
+ module Decorations
6439
+ def clear: () -> untyped
6440
+
6441
+ def constantize: (untyped cpath) -> untyped
6442
+
6443
+ def safe_constantize: (untyped cpath) -> untyped
6444
+
6445
+ def autoloaded_constants: () -> untyped
6446
+
6447
+ def autoloaded?: (untyped object) -> untyped
6448
+
6449
+ def verbose=: (untyped verbose) -> untyped
6450
+
6451
+ def unhook!: () -> :no_op
6452
+ end
6135
6453
 
6136
- def loading: () { () -> untyped } -> untyped
6454
+ module RequireDependency
6455
+ def require_dependency: (untyped filename) -> untyped
6456
+ end
6137
6457
 
6138
- def unloading: () { () -> untyped } -> untyped
6458
+ module Inflector
6459
+ def self.camelize: (untyped basename, untyped _abspath) -> untyped
6139
6460
 
6140
- def start_unloading: () -> untyped
6461
+ def self.inflect: (untyped overrides) -> untyped
6462
+ end
6141
6463
 
6142
- def done_unloading: () -> untyped
6464
+ def self.take_over: (enable_reloading: untyped enable_reloading) -> untyped
6143
6465
 
6144
- def start_running: () -> untyped
6466
+ def self.setup_autoloaders: (untyped enable_reloading) -> untyped
6145
6467
 
6146
- def done_running: () -> untyped
6468
+ def self.autoload_once?: (untyped autoload_path) -> untyped
6147
6469
 
6148
- def running: () { () -> untyped } -> untyped
6470
+ def self.eager_load?: (untyped autoload_path) -> untyped
6149
6471
 
6150
- def permit_concurrent_loads: () { () -> untyped } -> untyped
6472
+ def self.freeze_paths: () -> untyped
6151
6473
 
6152
- def raw_state: () { () -> untyped } -> untyped
6474
+ def self.decorate_dependencies: () -> untyped
6153
6475
  end
6154
6476
  end
6155
6477
  end
@@ -6352,6 +6674,8 @@ module ActiveSupport
6352
6674
 
6353
6675
  def get: (untyped key) -> untyped
6354
6676
 
6677
+ alias [] get
6678
+
6355
6679
  def safe_get: (untyped key) -> untyped
6356
6680
 
6357
6681
  def store: (untyped klass) -> untyped
@@ -6404,51 +6728,6 @@ module ActiveSupport
6404
6728
  end
6405
6729
  end
6406
6730
 
6407
- module ActiveSupport
6408
- module Dependencies
6409
- module ZeitwerkIntegration
6410
- # :nodoc: all
6411
- module Decorations
6412
- def clear: () -> untyped
6413
-
6414
- def constantize: (untyped cpath) -> untyped
6415
-
6416
- def safe_constantize: (untyped cpath) -> untyped
6417
-
6418
- def autoloaded_constants: () -> untyped
6419
-
6420
- def autoloaded?: (untyped object) -> untyped
6421
-
6422
- def verbose=: (untyped verbose) -> untyped
6423
-
6424
- def unhook!: () -> :no_op
6425
- end
6426
-
6427
- module RequireDependency
6428
- def require_dependency: (untyped filename) -> untyped
6429
- end
6430
-
6431
- module Inflector
6432
- def self.camelize: (untyped basename, untyped _abspath) -> untyped
6433
-
6434
- def self.inflect: (untyped overrides) -> untyped
6435
- end
6436
-
6437
- def self.take_over: (enable_reloading: untyped enable_reloading) -> untyped
6438
-
6439
- def self.setup_autoloaders: (untyped enable_reloading) -> untyped
6440
-
6441
- def self.autoload_once?: (untyped autoload_path) -> untyped
6442
-
6443
- def self.eager_load?: (untyped autoload_path) -> untyped
6444
-
6445
- def self.freeze_paths: () -> untyped
6446
-
6447
- def self.decorate_dependencies: () -> untyped
6448
- end
6449
- end
6450
- end
6451
-
6452
6731
  module ActiveSupport
6453
6732
  # Raised when <tt>ActiveSupport::Deprecation::Behavior#behavior</tt> is set with <tt>:raise</tt>.
6454
6733
  # You would set <tt>:raise</tt>, as a behavior to raise errors and proactively report exceptions from deprecations.
@@ -6725,31 +7004,6 @@ module ActiveSupport
6725
7004
  end
6726
7005
  end
6727
7006
 
6728
- module ActiveSupport
6729
- # \Deprecation specifies the API used by Rails to deprecate methods, instance
6730
- # variables, objects and constants.
6731
- class Deprecation
6732
- include Singleton
6733
-
6734
- include InstanceDelegator
6735
-
6736
- include Behavior
6737
-
6738
- include Reporting
6739
-
6740
- include MethodWrapper
6741
-
6742
- # The version number in which the deprecated behavior will be removed, by default.
6743
- attr_accessor deprecation_horizon: untyped
6744
-
6745
- # It accepts two parameters on initialization. The first is a version of library
6746
- # and the second is a library name.
6747
- #
6748
- # ActiveSupport::Deprecation.new('2.0', 'MyLibrary')
6749
- def initialize: (?::String deprecation_horizon, ?::String gem_name) -> untyped
6750
- end
6751
- end
6752
-
6753
7007
  module ActiveSupport
6754
7008
  class Deprecation
6755
7009
  module Reporting
@@ -6804,6 +7058,31 @@ module ActiveSupport
6804
7058
  end
6805
7059
  end
6806
7060
 
7061
+ module ActiveSupport
7062
+ # \Deprecation specifies the API used by Rails to deprecate methods, instance
7063
+ # variables, objects and constants.
7064
+ class Deprecation
7065
+ include Singleton
7066
+
7067
+ include InstanceDelegator
7068
+
7069
+ include Behavior
7070
+
7071
+ include Reporting
7072
+
7073
+ include MethodWrapper
7074
+
7075
+ # The version number in which the deprecated behavior will be removed, by default.
7076
+ attr_accessor deprecation_horizon: untyped
7077
+
7078
+ # It accepts two parameters on initialization. The first is a version of library
7079
+ # and the second is a library name.
7080
+ #
7081
+ # ActiveSupport::Deprecation.new('2.0', 'MyLibrary')
7082
+ def initialize: (?::String deprecation_horizon, ?::String gem_name) -> untyped
7083
+ end
7084
+ end
7085
+
6807
7086
  module ActiveSupport
6808
7087
  # This module provides an internal implementation to track descendants
6809
7088
  # which is faster than iterating through ObjectSpace.
@@ -7056,6 +7335,8 @@ module ActiveSupport
7056
7335
 
7057
7336
  def is_a?: (untyped klass) -> untyped
7058
7337
 
7338
+ alias kind_of? is_a?
7339
+
7059
7340
  def instance_of?: (untyped klass) -> untyped
7060
7341
 
7061
7342
  # Returns +true+ if +other+ is also a Duration instance with the
@@ -7100,10 +7381,18 @@ module ActiveSupport
7100
7381
  # as this Duration represents.
7101
7382
  def since: (?untyped time) -> untyped
7102
7383
 
7384
+ alias from_now since
7385
+
7386
+ alias after since
7387
+
7103
7388
  # Calculates a new Time or Date that is as far in the past
7104
7389
  # as this Duration represents.
7105
7390
  def ago: (?untyped time) -> untyped
7106
7391
 
7392
+ alias until ago
7393
+
7394
+ alias before ago
7395
+
7107
7396
  def inspect: () -> (::String | untyped)
7108
7397
 
7109
7398
  def as_json: (?untyped? options) -> untyped
@@ -7128,7 +7417,7 @@ end
7128
7417
 
7129
7418
  module ActiveSupport
7130
7419
  class EncryptedConfiguration < EncryptedFile
7131
- def initialize: (raise_if_missing_key: untyped raise_if_missing_key, env_key: untyped env_key, key_path: untyped key_path, config_path: untyped config_path) -> untyped
7420
+ def initialize: (config_path: untyped config_path, key_path: untyped key_path, env_key: untyped env_key, raise_if_missing_key: untyped raise_if_missing_key) -> untyped
7132
7421
 
7133
7422
  # Allow a config to be started without a file present
7134
7423
  def read: () -> untyped
@@ -7150,7 +7439,7 @@ module ActiveSupport
7150
7439
  end
7151
7440
 
7152
7441
  class MissingKeyError < RuntimeError
7153
- def initialize: (env_key: untyped env_key, key_path: untyped key_path) -> untyped
7442
+ def initialize: (key_path: untyped key_path, env_key: untyped env_key) -> untyped
7154
7443
  end
7155
7444
 
7156
7445
  CIPHER: ::String
@@ -7165,7 +7454,7 @@ module ActiveSupport
7165
7454
 
7166
7455
  attr_reader raise_if_missing_key: untyped
7167
7456
 
7168
- def initialize: (raise_if_missing_key: untyped raise_if_missing_key, env_key: untyped env_key, key_path: untyped key_path, content_path: untyped content_path) -> untyped
7457
+ def initialize: (content_path: untyped content_path, key_path: untyped key_path, env_key: untyped env_key, raise_if_missing_key: untyped raise_if_missing_key) -> untyped
7169
7458
 
7170
7459
  def key: () -> untyped
7171
7460
 
@@ -7275,18 +7564,20 @@ module ActiveSupport
7275
7564
 
7276
7565
  def self.to_complete: (*untyped args) { () -> untyped } -> untyped
7277
7566
 
7278
- class RunHook < ::Struct[untyped]
7567
+ class RunHook[T] < ::Struct[T]
7279
7568
  attr_accessor hook(): untyped
7280
7569
 
7281
7570
  # :nodoc:
7282
7571
  def before: (untyped target) -> untyped
7283
7572
  end
7284
7573
 
7285
- class CompleteHook < ::Struct[untyped]
7574
+ class CompleteHook[T] < ::Struct[T]
7286
7575
  attr_accessor hook(): untyped
7287
7576
 
7288
7577
  # :nodoc:
7289
7578
  def before: (untyped target) -> untyped
7579
+
7580
+ alias after before
7290
7581
  end
7291
7582
 
7292
7583
  # Register an object to be invoked during both the +run+ and
@@ -7505,6 +7796,10 @@ module ActiveSupport
7505
7796
 
7506
7797
  def self.[]: (*untyped args) -> untyped
7507
7798
 
7799
+ alias regular_writer []=
7800
+
7801
+ alias regular_update update
7802
+
7508
7803
  # Assigns a new value to the hash:
7509
7804
  #
7510
7805
  # hash = ActiveSupport::HashWithIndifferentAccess.new
@@ -7513,6 +7808,8 @@ module ActiveSupport
7513
7808
  # This value can be later fetched using either +:key+ or <tt>'key'</tt>.
7514
7809
  def []=: (untyped key, untyped value) -> untyped
7515
7810
 
7811
+ alias store []=
7812
+
7516
7813
  # Updates the receiver in-place, merging in the hash passed as argument:
7517
7814
  #
7518
7815
  # hash_1 = ActiveSupport::HashWithIndifferentAccess.new
@@ -7540,6 +7837,8 @@ module ActiveSupport
7540
7837
  # hash_1.update(hash_2) { |key, old, new| old + new } # => {"key"=>22}
7541
7838
  def update: (untyped other_hash) { (untyped, untyped, untyped) -> untyped } -> untyped
7542
7839
 
7840
+ alias merge! update
7841
+
7543
7842
  # Checks the hash for a key matching the argument passed in:
7544
7843
  #
7545
7844
  # hash = ActiveSupport::HashWithIndifferentAccess.new
@@ -7548,6 +7847,12 @@ module ActiveSupport
7548
7847
  # hash.key?('key') # => true
7549
7848
  def key?: (untyped key) -> untyped
7550
7849
 
7850
+ alias include? key?
7851
+
7852
+ alias has_key? key?
7853
+
7854
+ alias member? key?
7855
+
7551
7856
  # Same as <tt>Hash#[]</tt> where the key passed as argument can be
7552
7857
  # either a string or a symbol:
7553
7858
  #
@@ -7647,9 +7952,13 @@ module ActiveSupport
7647
7952
  # hash.reverse_merge(a: 0, b: 1) # => {"a"=>nil, "b"=>1}
7648
7953
  def reverse_merge: (untyped other_hash) -> untyped
7649
7954
 
7955
+ alias with_defaults reverse_merge
7956
+
7650
7957
  # Same semantics as +reverse_merge+ but modifies the receiver in-place.
7651
7958
  def reverse_merge!: (untyped other_hash) -> untyped
7652
7959
 
7960
+ alias with_defaults! reverse_merge!
7961
+
7653
7962
  # Replaces the contents of this hash with other_hash.
7654
7963
  #
7655
7964
  # h = { "a" => 100, "b" => 200 }
@@ -7661,6 +7970,8 @@ module ActiveSupport
7661
7970
 
7662
7971
  def except: (*untyped keys) -> untyped
7663
7972
 
7973
+ alias without except
7974
+
7664
7975
  def stringify_keys!: () -> untyped
7665
7976
 
7666
7977
  def deep_stringify_keys!: () -> untyped
@@ -7671,6 +7982,8 @@ module ActiveSupport
7671
7982
 
7672
7983
  def symbolize_keys: () -> untyped
7673
7984
 
7985
+ alias to_options symbolize_keys
7986
+
7674
7987
  def deep_symbolize_keys: () -> untyped
7675
7988
 
7676
7989
  def to_options!: () -> untyped
@@ -7702,7 +8015,7 @@ module ActiveSupport
7702
8015
  end
7703
8016
  end
7704
8017
 
7705
- # NOTE: HashWithIndifferentAccess and ActiveSupport::HashWithIndifferentAccess are the same object,
8018
+ # NOTE: HashWithIndifferentAccess and ActiveSupport::HashWithIndifferentAccess are the same object
7706
8019
  # but RBS doesn't have class alias syntax
7707
8020
  class HashWithIndifferentAccess[T, U] < ActiveSupport::HashWithIndifferentAccess[T, U]
7708
8021
  end
@@ -7997,7 +8310,7 @@ module ActiveSupport
7997
8310
  #
7998
8311
  # humanize('ssl_error') # => "SSL error"
7999
8312
  #
8000
- def humanize: (untyped lower_case_and_underscored_word, ?keep_id_suffix: bool keep_id_suffix, ?capitalize: bool capitalize) -> untyped
8313
+ def humanize: (untyped lower_case_and_underscored_word, ?capitalize: bool capitalize, ?keep_id_suffix: bool keep_id_suffix) -> untyped
8001
8314
 
8002
8315
  # Converts just the first character to uppercase.
8003
8316
  #
@@ -8246,7 +8559,7 @@ module ActiveSupport
8246
8559
  # the word will be parameterized as a word of that language.
8247
8560
  # By default, this parameter is set to <tt>nil</tt> and it will use
8248
8561
  # the configured <tt>I18n.locale<tt>.
8249
- def parameterize: (untyped string, ?locale: untyped? locale, ?preserve_case: bool preserve_case, ?separator: ::String separator) -> untyped
8562
+ def parameterize: (untyped string, ?separator: ::String separator, ?preserve_case: bool preserve_case, ?locale: untyped? locale) -> untyped
8250
8563
  end
8251
8564
  end
8252
8565
 
@@ -8425,61 +8738,66 @@ module ActiveSupport
8425
8738
  end
8426
8739
 
8427
8740
  module ActiveSupport
8428
- class Logger < ::Logger
8429
- include LoggerSilence
8430
-
8431
- # Returns true if the logger destination matches one of the sources
8741
+ class LogSubscriber
8742
+ # Provides some helpers to deal with testing log subscribers by setting up
8743
+ # notifications. Take for instance Active Record subscriber tests:
8432
8744
  #
8433
- # logger = Logger.new(STDOUT)
8434
- # ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT)
8435
- # # => true
8436
- def self.logger_outputs_to?: (untyped logger, *untyped sources) -> untyped
8437
-
8438
- def self.broadcast: (untyped logger) -> untyped
8439
-
8440
- def initialize: (*untyped args, **untyped kwargs) -> untyped
8441
-
8442
- # Simple formatter which only displays the message.
8443
- class SimpleFormatter < ::Logger::Formatter
8444
- # This method is invoked when a log event occurs
8445
- def call: (untyped severity, untyped timestamp, untyped progname, untyped msg) -> ::String
8446
- end
8447
- end
8448
- end
8449
-
8450
- module LoggerSilence
8451
- extend ActiveSupport::Concern
8452
-
8453
- include ActiveSupport::LoggerSilence
8454
- end
8745
+ # class SyncLogSubscriberTest < ActiveSupport::TestCase
8746
+ # include ActiveSupport::LogSubscriber::TestHelper
8747
+ #
8748
+ # setup do
8749
+ # ActiveRecord::LogSubscriber.attach_to(:active_record)
8750
+ # end
8751
+ #
8752
+ # def test_basic_query_logging
8753
+ # Developer.all.to_a
8754
+ # wait
8755
+ # assert_equal 1, @logger.logged(:debug).size
8756
+ # assert_match(/Developer Load/, @logger.logged(:debug).last)
8757
+ # assert_match(/SELECT \* FROM "developers"/, @logger.logged(:debug).last)
8758
+ # end
8759
+ # end
8760
+ #
8761
+ # All you need to do is to ensure that your log subscriber is added to
8762
+ # Rails::Subscriber, as in the second line of the code above. The test
8763
+ # helpers are responsible for setting up the queue, subscriptions and
8764
+ # turning colors in logs off.
8765
+ #
8766
+ # The messages are available in the @logger instance, which is a logger with
8767
+ # limited powers (it actually does not send anything to your output), and
8768
+ # you can collect them doing @logger.logged(level), where level is the level
8769
+ # used in logging, like info, debug, warn and so on.
8770
+ module TestHelper
8771
+ def setup: () -> untyped
8455
8772
 
8456
- module ActiveSupport
8457
- module LoggerSilence
8458
- extend ActiveSupport::Concern
8773
+ def teardown: () -> untyped
8459
8774
 
8460
- include ActiveSupport::LoggerThreadSafeLevel
8775
+ class MockLogger
8776
+ include ::Logger::Severity
8461
8777
 
8462
- # Silences the logger for the duration of the block.
8463
- def silence: (?untyped temporary_level) { (untyped) -> untyped } -> untyped
8464
- end
8465
- end
8778
+ attr_reader flush_count: untyped
8466
8779
 
8467
- module ActiveSupport
8468
- module LoggerThreadSafeLevel
8469
- # :nodoc:
8470
- extend ActiveSupport::Concern
8780
+ attr_accessor level: untyped
8471
8781
 
8472
- def after_initialize: () -> untyped
8782
+ def initialize: (?untyped level) -> untyped
8473
8783
 
8474
- def local_log_id: () -> untyped
8784
+ def method_missing: (untyped level, ?untyped? message) { () -> untyped } -> untyped
8475
8785
 
8476
- def local_level: () -> untyped
8786
+ def logged: (untyped level) -> untyped
8477
8787
 
8478
- def local_level=: (untyped level) -> untyped
8788
+ def flush: () -> untyped
8789
+ end
8479
8790
 
8480
- def level: () -> untyped
8791
+ # Wait notifications to be published.
8792
+ def wait: () -> untyped
8481
8793
 
8482
- def add: (untyped severity, ?untyped? message, ?untyped? progname) { () -> untyped } -> (::TrueClass | untyped)
8794
+ # Overwrite if you use another logger in your log subscriber.
8795
+ #
8796
+ # def logger
8797
+ # ActiveRecord::Base.logger = @logger
8798
+ # end
8799
+ def set_logger: (untyped logger) -> untyped
8800
+ end
8483
8801
  end
8484
8802
  end
8485
8803
 
@@ -8572,75 +8890,70 @@ module ActiveSupport
8572
8890
 
8573
8891
  def logger: () -> untyped
8574
8892
 
8575
- def start: (untyped name, untyped id, untyped payload) -> untyped
8893
+ def start: (untyped name, untyped id, untyped payload) -> untyped
8894
+
8895
+ def finish: (untyped name, untyped id, untyped payload) -> untyped
8896
+
8897
+ def color: (untyped text, untyped color, ?bool bold) -> (untyped | ::String)
8898
+ end
8899
+ end
8900
+
8901
+ module ActiveSupport
8902
+ class Logger < ::Logger
8903
+ include LoggerSilence
8904
+
8905
+ # Returns true if the logger destination matches one of the sources
8906
+ #
8907
+ # logger = Logger.new(STDOUT)
8908
+ # ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT)
8909
+ # # => true
8910
+ def self.logger_outputs_to?: (untyped logger, *untyped sources) -> untyped
8911
+
8912
+ def self.broadcast: (untyped logger) -> untyped
8576
8913
 
8577
- def finish: (untyped name, untyped id, untyped payload) -> untyped
8914
+ def initialize: (*untyped args, **untyped kwargs) -> untyped
8578
8915
 
8579
- def color: (untyped text, untyped color, ?bool bold) -> (untyped | ::String)
8916
+ # Simple formatter which only displays the message.
8917
+ class SimpleFormatter < ::Logger::Formatter
8918
+ # This method is invoked when a log event occurs
8919
+ def call: (untyped severity, untyped timestamp, untyped progname, untyped msg) -> ::String
8920
+ end
8580
8921
  end
8581
8922
  end
8582
8923
 
8583
- module ActiveSupport
8584
- class LogSubscriber
8585
- # Provides some helpers to deal with testing log subscribers by setting up
8586
- # notifications. Take for instance Active Record subscriber tests:
8587
- #
8588
- # class SyncLogSubscriberTest < ActiveSupport::TestCase
8589
- # include ActiveSupport::LogSubscriber::TestHelper
8590
- #
8591
- # setup do
8592
- # ActiveRecord::LogSubscriber.attach_to(:active_record)
8593
- # end
8594
- #
8595
- # def test_basic_query_logging
8596
- # Developer.all.to_a
8597
- # wait
8598
- # assert_equal 1, @logger.logged(:debug).size
8599
- # assert_match(/Developer Load/, @logger.logged(:debug).last)
8600
- # assert_match(/SELECT \* FROM "developers"/, @logger.logged(:debug).last)
8601
- # end
8602
- # end
8603
- #
8604
- # All you need to do is to ensure that your log subscriber is added to
8605
- # Rails::Subscriber, as in the second line of the code above. The test
8606
- # helpers are responsible for setting up the queue, subscriptions and
8607
- # turning colors in logs off.
8608
- #
8609
- # The messages are available in the @logger instance, which is a logger with
8610
- # limited powers (it actually does not send anything to your output), and
8611
- # you can collect them doing @logger.logged(level), where level is the level
8612
- # used in logging, like info, debug, warn and so on.
8613
- module TestHelper
8614
- def setup: () -> untyped
8924
+ module LoggerSilence
8925
+ extend ActiveSupport::Concern
8615
8926
 
8616
- def teardown: () -> untyped
8927
+ include ActiveSupport::LoggerSilence
8928
+ end
8617
8929
 
8618
- class MockLogger
8619
- include ::Logger::Severity
8930
+ module ActiveSupport
8931
+ module LoggerSilence
8932
+ extend ActiveSupport::Concern
8620
8933
 
8621
- attr_reader flush_count: untyped
8934
+ include ActiveSupport::LoggerThreadSafeLevel
8622
8935
 
8623
- attr_accessor level: untyped
8936
+ # Silences the logger for the duration of the block.
8937
+ def silence: (?untyped temporary_level) { (untyped) -> untyped } -> untyped
8938
+ end
8939
+ end
8624
8940
 
8625
- def initialize: (?untyped level) -> untyped
8941
+ module ActiveSupport
8942
+ module LoggerThreadSafeLevel
8943
+ # :nodoc:
8944
+ extend ActiveSupport::Concern
8626
8945
 
8627
- def method_missing: (untyped level, ?untyped? message) { () -> untyped } -> untyped
8946
+ def after_initialize: () -> untyped
8628
8947
 
8629
- def logged: (untyped level) -> untyped
8948
+ def local_log_id: () -> untyped
8630
8949
 
8631
- def flush: () -> untyped
8632
- end
8950
+ def local_level: () -> untyped
8633
8951
 
8634
- # Wait notifications to be published.
8635
- def wait: () -> untyped
8952
+ def local_level=: (untyped level) -> untyped
8636
8953
 
8637
- # Overwrite if you use another logger in your log subscriber.
8638
- #
8639
- # def logger
8640
- # ActiveRecord::Base.logger = @logger
8641
- # end
8642
- def set_logger: (untyped logger) -> untyped
8643
- end
8954
+ def level: () -> untyped
8955
+
8956
+ def add: (untyped severity, ?untyped? message, ?untyped? progname) { () -> untyped } -> (::TrueClass | untyped)
8644
8957
  end
8645
8958
  end
8646
8959
 
@@ -8759,7 +9072,7 @@ module ActiveSupport
8759
9072
 
8760
9073
  # Encrypt and sign a message. We need to sign the message in order to avoid
8761
9074
  # padding attacks. Reference: https://www.limited-entropy.com/padding-oracle-attacks/.
8762
- def encrypt_and_sign: (untyped value, ?purpose: untyped? purpose, ?expires_in: untyped? expires_in, ?expires_at: untyped? expires_at) -> untyped
9075
+ def encrypt_and_sign: (untyped value, ?expires_at: untyped? expires_at, ?expires_in: untyped? expires_in, ?purpose: untyped? purpose) -> untyped
8763
9076
 
8764
9077
  # Decrypt and verify a message. We need to verify the message in order to
8765
9078
  # avoid padding attacks. Reference: https://www.limited-entropy.com/padding-oracle-attacks/.
@@ -8782,81 +9095,6 @@ module ActiveSupport
8782
9095
  end
8783
9096
  end
8784
9097
 
8785
- module ActiveSupport
8786
- module Messages
8787
- class Metadata
8788
- # nodoc:
8789
- # nodoc:
8790
- def initialize: (untyped message, ?untyped? expires_at, ?untyped? purpose) -> untyped
8791
-
8792
- def as_json: (?::Hash[untyped, untyped] options) -> { _rails: { message: untyped, exp: untyped, pur: untyped } }
8793
-
8794
- def self.wrap: (untyped message, ?purpose: untyped? purpose, ?expires_in: untyped? expires_in, ?expires_at: untyped? expires_at) -> untyped
8795
-
8796
- def self.verify: (untyped message, untyped purpose) -> untyped
8797
-
8798
- def self.pick_expiry: (untyped expires_at, untyped expires_in) -> untyped
8799
-
8800
- def self.extract_metadata: (untyped message) -> untyped
8801
-
8802
- def self.encode: (untyped message) -> untyped
8803
-
8804
- def self.decode: (untyped message) -> untyped
8805
-
8806
- def verify: (untyped purpose) -> untyped
8807
-
8808
- def match?: (untyped purpose) -> untyped
8809
-
8810
- def fresh?: () -> untyped
8811
- end
8812
- end
8813
- end
8814
-
8815
- module ActiveSupport
8816
- module Messages
8817
- class RotationConfiguration
8818
- # :nodoc:
8819
- attr_reader signed: untyped
8820
-
8821
- # :nodoc:
8822
- attr_reader encrypted: untyped
8823
-
8824
- def initialize: () -> untyped
8825
-
8826
- def rotate: (untyped kind, *untyped args) -> untyped
8827
- end
8828
- end
8829
- end
8830
-
8831
- module ActiveSupport
8832
- module Messages
8833
- module Rotator
8834
- # :nodoc:
8835
- def initialize: (**untyped options) -> untyped
8836
-
8837
- def rotate: (*untyped secrets, **untyped options) -> untyped
8838
-
8839
- module Encryptor
8840
- include Rotator
8841
-
8842
- def decrypt_and_verify: (*untyped args, ?on_rotation: untyped? on_rotation, **untyped options) -> untyped
8843
-
8844
- def build_rotation: (?untyped secret, ?untyped sign_secret, untyped options) -> untyped
8845
- end
8846
-
8847
- module Verifier
8848
- include Rotator
8849
-
8850
- def verified: (*untyped args, ?on_rotation: untyped? on_rotation, **untyped options) -> untyped
8851
-
8852
- def build_rotation: (?untyped secret, untyped options) -> untyped
8853
- end
8854
-
8855
- def run_rotations: (untyped on_rotation) { (untyped) -> untyped } -> untyped
8856
- end
8857
- end
8858
- end
8859
-
8860
9098
  module ActiveSupport
8861
9099
  # +MessageVerifier+ makes it easy to generate and verify messages which are
8862
9100
  # signed to prevent tampering.
@@ -9010,7 +9248,7 @@ module ActiveSupport
9010
9248
  #
9011
9249
  # verifier = ActiveSupport::MessageVerifier.new 's3Krit'
9012
9250
  # verifier.generate 'a private message' # => "BAhJIhRwcml2YXRlLW1lc3NhZ2UGOgZFVA==--e2d724331ebdee96a10fb99b089508d1c72bd772"
9013
- def generate: (untyped value, ?purpose: untyped? purpose, ?expires_in: untyped? expires_in, ?expires_at: untyped? expires_at) -> ::String
9251
+ def generate: (untyped value, ?expires_at: untyped? expires_at, ?expires_in: untyped? expires_in, ?purpose: untyped? purpose) -> ::String
9014
9252
 
9015
9253
  def encode: (untyped data) -> untyped
9016
9254
 
@@ -9020,6 +9258,81 @@ module ActiveSupport
9020
9258
  end
9021
9259
  end
9022
9260
 
9261
+ module ActiveSupport
9262
+ module Messages
9263
+ class Metadata
9264
+ # nodoc:
9265
+ # nodoc:
9266
+ def initialize: (untyped message, ?untyped? expires_at, ?untyped? purpose) -> untyped
9267
+
9268
+ def as_json: (?::Hash[untyped, untyped] options) -> { _rails: { message: untyped, exp: untyped, pur: untyped } }
9269
+
9270
+ def self.wrap: (untyped message, ?expires_at: untyped? expires_at, ?expires_in: untyped? expires_in, ?purpose: untyped? purpose) -> untyped
9271
+
9272
+ def self.verify: (untyped message, untyped purpose) -> untyped
9273
+
9274
+ def self.pick_expiry: (untyped expires_at, untyped expires_in) -> untyped
9275
+
9276
+ def self.extract_metadata: (untyped message) -> untyped
9277
+
9278
+ def self.encode: (untyped message) -> untyped
9279
+
9280
+ def self.decode: (untyped message) -> untyped
9281
+
9282
+ def verify: (untyped purpose) -> untyped
9283
+
9284
+ def match?: (untyped purpose) -> untyped
9285
+
9286
+ def fresh?: () -> untyped
9287
+ end
9288
+ end
9289
+ end
9290
+
9291
+ module ActiveSupport
9292
+ module Messages
9293
+ class RotationConfiguration
9294
+ # :nodoc:
9295
+ attr_reader signed: untyped
9296
+
9297
+ # :nodoc:
9298
+ attr_reader encrypted: untyped
9299
+
9300
+ def initialize: () -> untyped
9301
+
9302
+ def rotate: (untyped kind, *untyped args) -> untyped
9303
+ end
9304
+ end
9305
+ end
9306
+
9307
+ module ActiveSupport
9308
+ module Messages
9309
+ module Rotator
9310
+ # :nodoc:
9311
+ def initialize: (**untyped options) -> untyped
9312
+
9313
+ def rotate: (*untyped secrets, **untyped options) -> untyped
9314
+
9315
+ module Encryptor
9316
+ include Rotator
9317
+
9318
+ def decrypt_and_verify: (*untyped args, ?on_rotation: untyped? on_rotation, **untyped options) -> untyped
9319
+
9320
+ def build_rotation: (?untyped secret, ?untyped sign_secret, untyped options) -> untyped
9321
+ end
9322
+
9323
+ module Verifier
9324
+ include Rotator
9325
+
9326
+ def verified: (*untyped args, ?on_rotation: untyped? on_rotation, **untyped options) -> untyped
9327
+
9328
+ def build_rotation: (?untyped secret, untyped options) -> untyped
9329
+ end
9330
+
9331
+ def run_rotations: (untyped on_rotation) { (untyped) -> untyped } -> untyped
9332
+ end
9333
+ end
9334
+ end
9335
+
9023
9336
  module ActiveSupport
9024
9337
  module Multibyte
9025
9338
  # nodoc:
@@ -9064,6 +9377,10 @@ module ActiveSupport
9064
9377
 
9065
9378
  attr_reader wrapped_string: untyped
9066
9379
 
9380
+ alias to_s wrapped_string
9381
+
9382
+ alias to_str wrapped_string
9383
+
9067
9384
  # Creates a new Chars instance by wrapping _string_.
9068
9385
  def initialize: (untyped string) -> untyped
9069
9386
 
@@ -9115,6 +9432,8 @@ module ActiveSupport
9115
9432
  # "(trim non-ascii characters)".mb_chars.titleize.to_s # => "(trim non-ascii characters)"
9116
9433
  def titleize: () -> untyped
9117
9434
 
9435
+ alias titlecase titleize
9436
+
9118
9437
  # Returns the KC normalization of the string by default. NFKC is
9119
9438
  # considered the best normalization form for passing strings to databases
9120
9439
  # and validations.
@@ -9145,30 +9464,14 @@ module ActiveSupport
9145
9464
  # Replaces all ISO-8859-1 or CP1252 characters by their UTF-8 equivalent
9146
9465
  # resulting in a valid UTF-8 string.
9147
9466
  #
9148
- # Passing +true+ will forcibly tidy all bytes, assuming that the string's
9149
- # encoding is entirely CP1252 or ISO-8859-1.
9150
- def tidy_bytes: (?bool force) -> untyped
9151
-
9152
- def as_json: (?untyped? options) -> untyped
9153
-
9154
- def chars: (untyped string) -> untyped
9155
- end
9156
- end
9157
- end
9158
-
9159
- module ActiveSupport
9160
- # nodoc:
9161
- module Multibyte
9162
- # The proxy class returned when calling mb_chars. You can use this accessor
9163
- # to configure your own proxy class so you can support other encodings. See
9164
- # the ActiveSupport::Multibyte::Chars implementation for an example how to
9165
- # do this.
9166
- #
9167
- # ActiveSupport::Multibyte.proxy_class = CharsForUTF32
9168
- def self.proxy_class=: (untyped klass) -> untyped
9467
+ # Passing +true+ will forcibly tidy all bytes, assuming that the string's
9468
+ # encoding is entirely CP1252 or ISO-8859-1.
9469
+ def tidy_bytes: (?bool force) -> untyped
9169
9470
 
9170
- # Returns the current proxy class.
9171
- def self.proxy_class: () -> untyped
9471
+ def as_json: (?untyped? options) -> untyped
9472
+
9473
+ def chars: (untyped string) -> untyped
9474
+ end
9172
9475
  end
9173
9476
  end
9174
9477
 
@@ -9232,6 +9535,22 @@ module ActiveSupport
9232
9535
  end
9233
9536
  end
9234
9537
 
9538
+ module ActiveSupport
9539
+ # nodoc:
9540
+ module Multibyte
9541
+ # The proxy class returned when calling mb_chars. You can use this accessor
9542
+ # to configure your own proxy class so you can support other encodings. See
9543
+ # the ActiveSupport::Multibyte::Chars implementation for an example how to
9544
+ # do this.
9545
+ #
9546
+ # ActiveSupport::Multibyte.proxy_class = CharsForUTF32
9547
+ def self.proxy_class=: (untyped klass) -> untyped
9548
+
9549
+ # Returns the current proxy class.
9550
+ def self.proxy_class: () -> untyped
9551
+ end
9552
+ end
9553
+
9235
9554
  module ActiveSupport
9236
9555
  module Notifications
9237
9556
  # This is a default queue implementation that ships with Notifications.
@@ -9333,6 +9652,8 @@ module ActiveSupport
9333
9652
  def subscribed_to?: (untyped name) -> ::TrueClass
9334
9653
 
9335
9654
  def unsubscribe!: () -> ::FalseClass
9655
+
9656
+ alias matches? ===
9336
9657
  end
9337
9658
  end
9338
9659
  end
@@ -9421,9 +9742,13 @@ module ActiveSupport
9421
9742
 
9422
9743
  def now: () -> untyped
9423
9744
 
9424
- def now_cpu: () -> (untyped | 0)
9745
+ def now_cpu: () -> untyped
9746
+
9747
+ def now_cpu: () -> 0
9748
+
9749
+ def now_allocations: () -> 0
9425
9750
 
9426
- def now_allocations: () -> (untyped | 0)
9751
+ def now_allocations: () -> untyped
9427
9752
  end
9428
9753
  end
9429
9754
  end
@@ -9799,6 +10124,33 @@ module ActiveSupport
9799
10124
  end
9800
10125
  end
9801
10126
 
10127
+ module ActiveSupport
10128
+ module NumberHelper
10129
+ class RoundingHelper
10130
+ # :nodoc:
10131
+ attr_reader options: untyped
10132
+
10133
+ def initialize: (untyped options) -> untyped
10134
+
10135
+ def round: (untyped number) -> untyped
10136
+
10137
+ def digit_count: (untyped number) -> (1 | untyped)
10138
+
10139
+ def round_without_significant: (untyped number) -> untyped
10140
+
10141
+ def round_significant: (untyped number) -> (0 | untyped)
10142
+
10143
+ def convert_to_decimal: (untyped number) -> untyped
10144
+
10145
+ def precision: () -> untyped
10146
+
10147
+ def significant: () -> untyped
10148
+
10149
+ def absolute_number: (untyped number) -> untyped
10150
+ end
10151
+ end
10152
+ end
10153
+
9802
10154
  module ActiveSupport
9803
10155
  module NumberHelper
9804
10156
  extend ActiveSupport::Autoload
@@ -10150,33 +10502,6 @@ module ActiveSupport
10150
10502
  end
10151
10503
  end
10152
10504
 
10153
- module ActiveSupport
10154
- module NumberHelper
10155
- class RoundingHelper
10156
- # :nodoc:
10157
- attr_reader options: untyped
10158
-
10159
- def initialize: (untyped options) -> untyped
10160
-
10161
- def round: (untyped number) -> untyped
10162
-
10163
- def digit_count: (untyped number) -> (1 | untyped)
10164
-
10165
- def round_without_significant: (untyped number) -> untyped
10166
-
10167
- def round_significant: (untyped number) -> (0 | untyped)
10168
-
10169
- def convert_to_decimal: (untyped number) -> untyped
10170
-
10171
- def precision: () -> untyped
10172
-
10173
- def significant: () -> untyped
10174
-
10175
- def absolute_number: (untyped number) -> untyped
10176
- end
10177
- end
10178
- end
10179
-
10180
10505
  module ActiveSupport
10181
10506
  class OptionMerger
10182
10507
  def initialize: (untyped context, untyped options) -> untyped
@@ -10243,6 +10568,8 @@ module ActiveSupport
10243
10568
  # h.dog! # => raises KeyError: :dog is blank
10244
10569
  #
10245
10570
  class OrderedOptions[T, U] < Hash[T, U]
10571
+ alias _get []
10572
+
10246
10573
  def []=: (untyped key, untyped value) -> untyped
10247
10574
 
10248
10575
  def []: (untyped key) -> untyped
@@ -10389,16 +10716,6 @@ module ActiveSupport
10389
10716
  end
10390
10717
  end
10391
10718
 
10392
- module ActiveSupport
10393
- extend ActiveSupport::Autoload
10394
-
10395
- def self.eager_load!: () -> untyped
10396
-
10397
- def self.to_time_preserves_timezone: () -> untyped
10398
-
10399
- def self.to_time_preserves_timezone=: (untyped value) -> untyped
10400
- end
10401
-
10402
10719
  module ActiveSupport
10403
10720
  # -
10404
10721
  # This class defines several callbacks:
@@ -10517,7 +10834,7 @@ module ActiveSupport
10517
10834
  # end
10518
10835
  #
10519
10836
  # Returns the exception if it was handled and +nil+ if it was not.
10520
- def rescue_with_handler: (untyped exception, ?visited_exceptions: untyped visited_exceptions, ?object: untyped object) -> untyped
10837
+ def rescue_with_handler: (untyped exception, ?object: untyped object, ?visited_exceptions: untyped visited_exceptions) -> untyped
10521
10838
 
10522
10839
  def handler_for_rescue: (untyped exception, ?object: untyped object) -> untyped
10523
10840
 
@@ -10743,7 +11060,7 @@ module ActiveSupport
10743
11060
  #
10744
11061
  # The threaded parallelization uses minitest's parallel executor directly.
10745
11062
  # The processes parallelization uses a Ruby DRb server.
10746
- def self.parallelize: (?with: ::Symbol with, ?workers: ::Symbol workers) -> (nil | untyped)
11063
+ def self.parallelize: (?workers: ::Symbol workers, ?with: ::Symbol with) -> (nil | untyped)
10747
11064
 
10748
11065
  # Set up hook for parallel testing. This can be used if you have multiple
10749
11066
  # databases or any behavior that needs to be run after the process is forked
@@ -10775,6 +11092,8 @@ module ActiveSupport
10775
11092
  # end
10776
11093
  def self.parallelize_teardown: () { (untyped) -> untyped } -> untyped
10777
11094
 
11095
+ alias method_name name
11096
+
10778
11097
  include ActiveSupport::Testing::TaggedLogging
10779
11098
 
10780
11099
  include ActiveSupport::Testing::Assertions
@@ -10786,6 +11105,35 @@ module ActiveSupport
10786
11105
  include ActiveSupport::Testing::FileFixtures
10787
11106
 
10788
11107
  extend ActiveSupport::Testing::Declarative
11108
+
11109
+ # test/unit backwards compatibility methods
11110
+ alias assert_raise assert_raises
11111
+
11112
+ alias assert_not_empty refute_empty
11113
+
11114
+ alias assert_not_equal refute_equal
11115
+
11116
+ alias assert_not_in_delta refute_in_delta
11117
+
11118
+ alias assert_not_in_epsilon refute_in_epsilon
11119
+
11120
+ alias assert_not_includes refute_includes
11121
+
11122
+ alias assert_not_instance_of refute_instance_of
11123
+
11124
+ alias assert_not_kind_of refute_kind_of
11125
+
11126
+ alias assert_no_match refute_match
11127
+
11128
+ alias assert_not_nil refute_nil
11129
+
11130
+ alias assert_not_operator refute_operator
11131
+
11132
+ alias assert_not_predicate refute_predicate
11133
+
11134
+ alias assert_not_respond_to refute_respond_to
11135
+
11136
+ alias assert_not_same refute_same
10789
11137
  end
10790
11138
  end
10791
11139
 
@@ -10925,7 +11273,7 @@ module ActiveSupport
10925
11273
  # assert_changes -> { Status.all_good? }, 'Expected the status to be bad' do
10926
11274
  # post :create, params: { status: { incident: true } }
10927
11275
  # end
10928
- def assert_changes: (untyped expression, ?untyped? message, ?to: untyped to, ?from: untyped from) { () -> untyped } -> untyped
11276
+ def assert_changes: (untyped expression, ?untyped? message, ?from: untyped from, ?to: untyped to) { () -> untyped } -> untyped
10929
11277
 
10930
11278
  # Assertion that the result of evaluating an expression is not changed before
10931
11279
  # and after invoking the passed in block.
@@ -11057,13 +11405,13 @@ end
11057
11405
  module ActiveSupport
11058
11406
  module Testing
11059
11407
  module MethodCallAssertions
11060
- def assert_called: (untyped object, untyped method_name, ?untyped? message, ?returns: untyped? returns, ?times: ::Integer times) { () -> untyped } -> untyped
11408
+ def assert_called: (untyped object, untyped method_name, ?untyped? message, ?times: ::Integer times, ?returns: untyped? returns) { () -> untyped } -> untyped
11061
11409
 
11062
11410
  def assert_called_with: (untyped object, untyped method_name, untyped args, ?returns: untyped? returns) { () -> untyped } -> untyped
11063
11411
 
11064
11412
  def assert_not_called: (untyped object, untyped method_name, ?untyped? message) { () -> untyped } -> untyped
11065
11413
 
11066
- def assert_called_on_instance_of: (untyped klass, untyped method_name, ?untyped? message, ?returns: untyped? returns, ?times: ::Integer times) { () -> untyped } -> untyped
11414
+ def assert_called_on_instance_of: (untyped klass, untyped method_name, ?untyped? message, ?times: ::Integer times, ?returns: untyped? returns) { () -> untyped } -> untyped
11067
11415
 
11068
11416
  def assert_not_called_on_instance_of: (untyped klass, untyped method_name, ?untyped? message) { () -> untyped } -> untyped
11069
11417
 
@@ -11175,7 +11523,7 @@ module ActiveSupport
11175
11523
  module Testing
11176
11524
  class SimpleStubs
11177
11525
  # :nodoc:
11178
- class Stub < ::Struct[untyped]
11526
+ class Stub[T] < ::Struct[T]
11179
11527
  attr_accessor object(): untyped
11180
11528
 
11181
11529
  attr_accessor method_name(): untyped
@@ -11261,6 +11609,8 @@ module ActiveSupport
11261
11609
  # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
11262
11610
  def travel_back: () -> untyped
11263
11611
 
11612
+ alias unfreeze_time travel_back
11613
+
11264
11614
  # Calls +travel_to+ with +Time.now+.
11265
11615
  #
11266
11616
  # Time.current # => Sun, 09 Jul 2017 15:34:49 EST -05:00
@@ -11339,6 +11689,14 @@ module ActiveSupport
11339
11689
  # Returns a <tt>Time</tt> instance of the simultaneous time in the UTC timezone.
11340
11690
  def utc: () -> untyped
11341
11691
 
11692
+ alias comparable_time utc
11693
+
11694
+ alias getgm utc
11695
+
11696
+ alias getutc utc
11697
+
11698
+ alias gmtime utc
11699
+
11342
11700
  # Returns the underlying TZInfo::TimezonePeriod.
11343
11701
  def period: () -> untyped
11344
11702
 
@@ -11348,6 +11706,8 @@ module ActiveSupport
11348
11706
  # Returns a <tt>Time</tt> instance of the simultaneous time in the system timezone.
11349
11707
  def localtime: (?untyped? utc_offset) -> untyped
11350
11708
 
11709
+ alias getlocal localtime
11710
+
11351
11711
  # Returns true if the current time is within Daylight Savings Time for the
11352
11712
  # specified time zone.
11353
11713
  #
@@ -11356,6 +11716,8 @@ module ActiveSupport
11356
11716
  # Time.zone.parse("2012-11-30").dst? # => false
11357
11717
  def dst?: () -> untyped
11358
11718
 
11719
+ alias isdst dst?
11720
+
11359
11721
  # Returns true if the current time zone is set to UTC.
11360
11722
  #
11361
11723
  # Time.zone = 'UTC' # => 'UTC'
@@ -11364,9 +11726,15 @@ module ActiveSupport
11364
11726
  # Time.zone.now.utc? # => false
11365
11727
  def utc?: () -> untyped
11366
11728
 
11729
+ alias gmt? utc?
11730
+
11367
11731
  # Returns the offset from current time to UTC time in seconds.
11368
11732
  def utc_offset: () -> untyped
11369
11733
 
11734
+ alias gmt_offset utc_offset
11735
+
11736
+ alias gmtoff utc_offset
11737
+
11370
11738
  # Returns a formatted string of the offset from UTC, or an alternative
11371
11739
  # string if the time zone is already UTC.
11372
11740
  #
@@ -11394,6 +11762,10 @@ module ActiveSupport
11394
11762
  # Time.zone.now.xmlschema # => "2014-12-04T11:02:37-05:00"
11395
11763
  def xmlschema: (?::Integer fraction_digits) -> ::String
11396
11764
 
11765
+ alias iso8601 xmlschema
11766
+
11767
+ alias rfc3339 xmlschema
11768
+
11397
11769
  # Coerces time to a string for JSON encoding. The default format is ISO 8601.
11398
11770
  # You can get %Y/%m/%d %H:%M:%S +offset style by setting
11399
11771
  # <tt>ActiveSupport::JSON::Encoding.use_standard_json_time_format</tt>
@@ -11424,6 +11796,8 @@ module ActiveSupport
11424
11796
  # Time.zone.now.rfc2822 # => "Tue, 01 Jan 2013 04:51:39 +0000"
11425
11797
  def rfc2822: () -> untyped
11426
11798
 
11799
+ alias rfc822 rfc2822
11800
+
11427
11801
  # Returns a string of the object's date and time.
11428
11802
  # Accepts an optional <tt>format</tt>:
11429
11803
  # * <tt>:default</tt> - default value, mimics Ruby Time#to_s format.
@@ -11431,6 +11805,8 @@ module ActiveSupport
11431
11805
  # * Any key in <tt>Time::DATE_FORMATS</tt> can be used. See active_support/core_ext/time/conversions.rb.
11432
11806
  def to_s: (?::Symbol format) -> untyped
11433
11807
 
11808
+ alias to_formatted_s to_s
11809
+
11434
11810
  # Replaces <tt>%Z</tt> directive with +zone before passing to Time#strftime,
11435
11811
  # so that zone information is correct.
11436
11812
  def strftime: (untyped format) -> untyped
@@ -11438,6 +11814,10 @@ module ActiveSupport
11438
11814
  # Use the time in UTC for comparisons.
11439
11815
  def <=>: (untyped other) -> untyped
11440
11816
 
11817
+ alias before? <
11818
+
11819
+ alias after? >
11820
+
11441
11821
  # Returns true if the current object's time is within the specified
11442
11822
  # +min+ and +max+ time.
11443
11823
  def between?: (untyped min, untyped max) -> untyped
@@ -11475,6 +11855,10 @@ module ActiveSupport
11475
11855
  # now + 1.day # => Mon, 03 Nov 2014 01:26:28 EST -05:00
11476
11856
  def +: (untyped other) -> untyped
11477
11857
 
11858
+ alias since +
11859
+
11860
+ alias in +
11861
+
11478
11862
  # Subtracts an interval of time and returns a new TimeWithZone object unless
11479
11863
  # the other value `acts_like?` time. Then it will return a Float of the difference
11480
11864
  # between the two times that represents the difference between the current
@@ -11581,6 +11965,8 @@ module ActiveSupport
11581
11965
  # Time.zone.now.to_i # => 1417709320
11582
11966
  def to_i: () -> untyped
11583
11967
 
11968
+ alias tv_sec to_i
11969
+
11584
11970
  # Returns the object's date and time as a rational number of seconds
11585
11971
  # since the Epoch (January 1, 1970 00:00 UTC).
11586
11972
  #
@@ -11604,6 +11990,8 @@ module ActiveSupport
11604
11990
  # Say we're a Time to thwart type checking.
11605
11991
  def is_a?: (untyped klass) -> untyped
11606
11992
 
11993
+ alias kind_of? is_a?
11994
+
11607
11995
  # An instance of ActiveSupport::TimeWithZone is never blank
11608
11996
  def blank?: () -> ::FalseClass
11609
11997
 
@@ -11674,6 +12062,8 @@ module ActiveSupport
11674
12062
 
11675
12063
  def self.find_tzinfo: (untyped name) -> TZInfo::Timezone
11676
12064
 
12065
+ alias self.create self.new
12066
+
11677
12067
  # Returns a TimeZone instance with the given name, or +nil+ if no
11678
12068
  # such TimeZone instance exists. (This exists to support the use of
11679
12069
  # this class with the +composed_of+ macro.)
@@ -12004,6 +12394,8 @@ module ActiveSupport
12004
12394
  def on_end_element: (untyped name) -> untyped
12005
12395
 
12006
12396
  def on_characters: (untyped string) -> untyped
12397
+
12398
+ alias on_cdata_block on_characters
12007
12399
  end
12008
12400
 
12009
12401
  attr_accessor document_class: untyped
@@ -12064,6 +12456,8 @@ module ActiveSupport
12064
12456
  def end_element: (untyped name) -> untyped
12065
12457
 
12066
12458
  def characters: (untyped string) -> untyped
12459
+
12460
+ alias cdata_block characters
12067
12461
  end
12068
12462
 
12069
12463
  attr_accessor document_class: untyped
@@ -12072,6 +12466,69 @@ module ActiveSupport
12072
12466
  end
12073
12467
  end
12074
12468
 
12469
+ module ActiveSupport
12470
+ module XmlMini_REXML
12471
+ CONTENT_KEY: ::String
12472
+
12473
+ # Parse an XML Document string or IO into a simple hash.
12474
+ #
12475
+ # Same as XmlSimple::xml_in but doesn't shoot itself in the foot,
12476
+ # and uses the defaults from Active Support.
12477
+ #
12478
+ # data::
12479
+ # XML Document string or IO to parse
12480
+ def parse: (untyped data) -> untyped
12481
+
12482
+ # Convert an XML element and merge into the hash
12483
+ #
12484
+ # hash::
12485
+ # Hash to merge the converted element into.
12486
+ # element::
12487
+ # XML element to merge into hash
12488
+ def merge_element!: (untyped hash, untyped element, untyped depth) -> untyped
12489
+
12490
+ # Actually converts an XML document element into a data structure.
12491
+ #
12492
+ # element::
12493
+ # The document element to be collapsed.
12494
+ def collapse: (untyped element, untyped depth) -> untyped
12495
+
12496
+ # Merge all the texts of an element into the hash
12497
+ #
12498
+ # hash::
12499
+ # Hash to add the converted element to.
12500
+ # element::
12501
+ # XML element whose texts are to me merged into the hash
12502
+ def merge_texts!: (untyped hash, untyped element) -> untyped
12503
+
12504
+ # Adds a new key/value pair to an existing Hash. If the key to be added
12505
+ # already exists and the existing value associated with key is not
12506
+ # an Array, it will be wrapped in an Array. Then the new value is
12507
+ # appended to that Array.
12508
+ #
12509
+ # hash::
12510
+ # Hash to add key/value pair to.
12511
+ # key::
12512
+ # Key to be added.
12513
+ # value::
12514
+ # Value to be associated with key.
12515
+ def merge!: (untyped hash, untyped key, untyped value) -> untyped
12516
+
12517
+ # Converts the attributes array of an XML element into a hash.
12518
+ # Returns an empty Hash if node has no attributes.
12519
+ #
12520
+ # element::
12521
+ # XML element to extract attributes from.
12522
+ def get_attributes: (untyped element) -> untyped
12523
+
12524
+ # Determines if a document element has text content
12525
+ #
12526
+ # element::
12527
+ # XML element to be checked.
12528
+ def empty_content?: (untyped element) -> untyped
12529
+ end
12530
+ end
12531
+
12075
12532
  module ActiveSupport
12076
12533
  # = XmlMini
12077
12534
  #
@@ -12131,66 +12588,13 @@ module ActiveSupport
12131
12588
  end
12132
12589
 
12133
12590
  module ActiveSupport
12134
- module XmlMini_REXML
12135
- CONTENT_KEY: ::String
12136
-
12137
- # Parse an XML Document string or IO into a simple hash.
12138
- #
12139
- # Same as XmlSimple::xml_in but doesn't shoot itself in the foot,
12140
- # and uses the defaults from Active Support.
12141
- #
12142
- # data::
12143
- # XML Document string or IO to parse
12144
- def parse: (untyped data) -> untyped
12145
-
12146
- # Convert an XML element and merge into the hash
12147
- #
12148
- # hash::
12149
- # Hash to merge the converted element into.
12150
- # element::
12151
- # XML element to merge into hash
12152
- def merge_element!: (untyped hash, untyped element, untyped depth) -> untyped
12153
-
12154
- # Actually converts an XML document element into a data structure.
12155
- #
12156
- # element::
12157
- # The document element to be collapsed.
12158
- def collapse: (untyped element, untyped depth) -> untyped
12159
-
12160
- # Merge all the texts of an element into the hash
12161
- #
12162
- # hash::
12163
- # Hash to add the converted element to.
12164
- # element::
12165
- # XML element whose texts are to me merged into the hash
12166
- def merge_texts!: (untyped hash, untyped element) -> untyped
12591
+ extend ActiveSupport::Autoload
12167
12592
 
12168
- # Adds a new key/value pair to an existing Hash. If the key to be added
12169
- # already exists and the existing value associated with key is not
12170
- # an Array, it will be wrapped in an Array. Then the new value is
12171
- # appended to that Array.
12172
- #
12173
- # hash::
12174
- # Hash to add key/value pair to.
12175
- # key::
12176
- # Key to be added.
12177
- # value::
12178
- # Value to be associated with key.
12179
- def merge!: (untyped hash, untyped key, untyped value) -> untyped
12593
+ def self.eager_load!: () -> untyped
12180
12594
 
12181
- # Converts the attributes array of an XML element into a hash.
12182
- # Returns an empty Hash if node has no attributes.
12183
- #
12184
- # element::
12185
- # XML element to extract attributes from.
12186
- def get_attributes: (untyped element) -> untyped
12595
+ def self.to_time_preserves_timezone: () -> untyped
12187
12596
 
12188
- # Determines if a document element has text content
12189
- #
12190
- # element::
12191
- # XML element to be checked.
12192
- def empty_content?: (untyped element) -> untyped
12193
- end
12597
+ def self.to_time_preserves_timezone=: (untyped value) -> untyped
12194
12598
  end
12195
12599
 
12196
12600
  class Object
@@ -12203,5 +12607,7 @@ class Object
12203
12607
  # # => 0.074
12204
12608
  def self.ms: () { () -> untyped } -> untyped
12205
12609
 
12610
+ alias orig_sum sum
12611
+
12206
12612
  def unescape: (untyped str, ?untyped escaped) -> untyped
12207
12613
  end