Commit Graph

14466 Commits

Author SHA1 Message Date
Jonathan Hefner 2d97136e38
Merge pull request #46580 from jonathanhefner/deprecated_constant_accessor-vs-deprecated_constant_proxy
Prefer `deprecate_constant` over constant proxy
2022-11-26 11:05:29 -06:00
sampatbadhe b161c7ca50 update load_defaults 7.1 to config.load_defaults 7.1 2022-11-26 13:55:08 +05:30
Jonathan Hefner 1e68400930 Prefer deprecate_constant over constant proxy
`deprecate_constant` will warn whenever the constant is referenced
instead of when the constant is a method receiver, which increases the
likelihood that the warning will be seen.  Additionally,
`DeprecatedConstantProxy` prevents using the constant as a superclass,
such as in `class MyClass < SomeDeprecatedConstant`.
2022-11-25 11:25:03 -06:00
Jonathan Hefner e5693c56c6 Add AS::ParameterFilter.precompile_filters
`ActiveSupport::ParameterFilter.precompile_filters` precompiles filters
that otherwise would be passed directly to `ParameterFilter.new`.
Depending on the quantity and types of filters, precompilation can
improve filtering performance, especially in the case where the
`ParameterFilter` instance cannot be retained, such as with per-request
instances in `ActionDispatch::Http::FilterParameters`.

**Benchmark script**

  ```ruby
  # frozen_string_literal: true
  require "benchmark/ips"
  require "benchmark/memory"
  require "active_support"
  require "active_support/parameter_filter"

  ootb = [:passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn]
  mixed = [:passw, "secret", /token/, :crypt, "salt", /certificate/, "user.otp", /user\.ssn/, proc {}]
  precompiled_ootb = ActiveSupport::ParameterFilter.precompile_filters(ootb)
  precompiled_mixed = ActiveSupport::ParameterFilter.precompile_filters(mixed)

  params = {
    "user" => {
      "name" => :name,
      "email" => :email,
      "password" => :password,
      "ssn" => :ssn,
      "locations" => [
        { "city" => :city, "country" => :country },
        { "city" => :city, "country" => :country },
      ],
    }
  }

  Benchmark.ips do |x|
    x.report("ootb") do
      ActiveSupport::ParameterFilter.new(ootb).filter(params)
    end
    x.report("precompiled ootb") do
      ActiveSupport::ParameterFilter.new(precompiled_ootb).filter(params)
    end
    x.compare!
  end

  Benchmark.ips do |x|
    x.report("mixed") do
      ActiveSupport::ParameterFilter.new(mixed).filter(params)
    end
    x.report("precompiled mixed") do
      ActiveSupport::ParameterFilter.new(precompiled_mixed).filter(params)
    end
    x.compare!
  end

  Benchmark.memory do |x|
    x.report("ootb") do
      ActiveSupport::ParameterFilter.new(ootb).filter(params)
    end
    x.report("precompiled ootb") do
      ActiveSupport::ParameterFilter.new(precompiled_ootb).filter(params)
    end
  end

  Benchmark.memory do |x|
    x.report("mixed") do
      ActiveSupport::ParameterFilter.new(mixed).filter(params)
    end
    x.report("precompiled mixed") do
      ActiveSupport::ParameterFilter.new(precompiled_mixed).filter(params)
    end
  end
  ```

**Results**

  ```
  Warming up --------------------------------------
                  ootb     2.151k i/100ms
      precompiled ootb     4.251k i/100ms
  Calculating -------------------------------------
                  ootb     21.567k (± 1.1%) i/s -    109.701k in   5.086983s
      precompiled ootb     42.840k (± 0.8%) i/s -    216.801k in   5.061022s

  Comparison:
      precompiled ootb:    42840.4 i/s
                  ootb:    21567.5 i/s - 1.99x  (± 0.00) slower
  ```

  ```
  Warming up --------------------------------------
                 mixed     1.622k i/100ms
     precompiled mixed     2.455k i/100ms
  Calculating -------------------------------------
                 mixed     16.085k (± 1.3%) i/s -     81.100k in   5.042764s
     precompiled mixed     24.640k (± 1.0%) i/s -    125.205k in   5.081988s

  Comparison:
     precompiled mixed:    24639.6 i/s
                 mixed:    16085.0 i/s - 1.53x  (± 0.00) slower
  ```

  ```
  Calculating -------------------------------------
                  ootb     2.684k memsize (     0.000  retained)
                          30.000  objects (     0.000  retained)
                          10.000  strings (     0.000  retained)
      precompiled ootb     1.104k memsize (     0.000  retained)
                           9.000  objects (     0.000  retained)
                           1.000  strings (     0.000  retained)
  ```

  ```
  Calculating -------------------------------------
                 mixed     3.541k memsize (     0.000  retained)
                          46.000  objects (     0.000  retained)
                          20.000  strings (     0.000  retained)
     precompiled mixed     1.856k memsize (     0.000  retained)
                          29.000  objects (     0.000  retained)
                          13.000  strings (     0.000  retained)
  ```

This commit also adds `config.precompile_filter_parameters`, which
enables precompilation of `config.filter_parameters`.  It defaults to
`true` for `config.load_defaults 7.1` and above.
2022-11-24 10:26:54 -06:00
fatkodima e5d15140d2 Avoid validating `belongs_to` association if it has not changed 2022-11-24 13:04:10 +02:00
Rafael Mendonça França 75a7486f3b
Merge pull request #46533 from fatkodima/fix-file_fixture_path
Ensure `file_fixture_path` is set even when Active Record is not present
2022-11-22 18:38:35 -05:00
Chris Salzberg 64962266e3
Add `after_routes_loaded` hook for Engines to trigger code after application routes have been loaded (#46539)
* Add after_routes_loaded hook

This hook can be used to trigger engine behavior that should only happen
after application routes have been loaded (or reloaded).

* Add changelog entry

* Add note about new after_routes_loaded railtie config to guides

[Rafael Mendonça França + Chris Salzberg]
2022-11-22 15:23:00 -05:00
Yasuo Honda 9da6dd1c45
Merge pull request #46501 from evaniainbrooks/fix-mailer-template
Update meta tag in mailer template layout.html.erb.tt
2022-11-22 22:22:34 +09:00
fatkodima 34be51714c Ensure `file_fixture_path` is set even when Active Record is not present 2022-11-20 21:20:26 +02:00
Petrik 93c51f92fd Rename AJAX to Ajax for consistency [ci-skip]
Currently we use both `AJAX` (11 times) and `Ajax` (22 times).
Wikipedia uses `Ajax`: https://en.wikipedia.org/wiki/Ajax_(programming)
Mozilla uses `Ajax`: https://developer.mozilla.org/en-US/docs/Web/Guide/AJAX

As `Ajax` is currently used the most and it's preferred by Wikipedia and
Mozilla, we can change all it's occurences to `Ajax`.
2022-11-20 11:17:44 +01:00
Rafael Mendonça França f2bbe6eb28
Merge PR #46105 2022-11-17 19:28:35 +00:00
Hartley McGuire 7b6720dfc8
Raise on assignment to readonly attributes
Previously, assignment would succeed but silently not write to the
database.

The changes to counter_cache are necessary because incrementing the
counter cache for a column calls []=. I investigated an approach to use
_write_attribute instead, however counter caches are expected to resolve
attribute aliases so write_attribute/[]= seems more correct.

Similarly, []= was replaced with _write_attribute in merge_target_lists
to skip the overriden []= and the primary key check. attribute_names
will already return custom primary keys so the primary_key check in
write_attribute is not needed.

Co-authored-by: Alex Ghiculescu <alex@tanda.co>
2022-11-16 17:14:54 -05:00
Jonathan Hefner 4518ec4c7f
Merge pull request #46478 from jonathanhefner/app_generator_test-run_generator_and_bundler
Add Bundler helper for `AppGeneratorTest`
2022-11-15 13:56:42 -06:00
Evan Brooks 8d3408e41a Update mailer templates meta tag mailer.html.erb 2022-11-14 21:38:07 -04:00
Jonathan Hefner 90cba59ddd
Merge pull request #46453 from skipkayhil/feat-filter-encrypted-attributes-inspect
Add filtering of encrypted attributes in #inspect
2022-11-12 15:57:04 -06:00
Hartley McGuire 9b7ae2b24a
Add filtering of encrypted attributes in #inspect
Previously, encrypted attributes could be added to an application's
filter_parameters which would filter the attribute values from logs.

This commit makes the add_to_filter_parameters additionally add
encrypted attributes to records' filter_attributes, which allows them
to be filtered when models are inspected (such as in the console).
2022-11-12 16:31:24 -05:00
Jonathan Hefner c63a13fa0b Add Bundler helper for AppGeneratorTest
A few `AppGeneratorTest` tests require running Bundler.  When Bundler
tries to resolve `gem "rails"`, it searches for an invalid version
number (for a version that hasn't been released yet).  Doing so is slow
and prints many lines of error output.  Furthermore, the same tests
print additional output via the commands that the generator runs after
Bundler.

This commit adds a `run_generator_and_bundler` helper which points
`gem "rails"` to the current repository, and silences any additional
output from the generator.

**Before**

  ```
  $ cd railties
  $ bin/test test/generators/app_generator_test.rb --verbose --seed 520 -n '/test_hotwire|test_css_option_with_asset_pipeline_tailwind|test_css_option_with_cssbundling_gem/'

  # Running:

  Could not find gem 'rails (~> 7.1.0.alpha)' in rubygems repository https://rubygems.org/ or installed locally.

  The source contains the following gems matching 'rails':
    * rails-0.8.0
    * rails-0.8.5
    * rails-0.9.0
  ...431 MORE LINES...
    * rails-7.0.3
    * rails-7.0.3.1
    * rails-7.0.4
  Could not find gem 'rails (~> 7.1.0.alpha)' in locally installed gems.

  The source contains the following gems matching 'rails':
  ...MORE LINES...
  AppGeneratorTest#test_hotwire = 26.30 s = .
  Could not find gem 'rails (~> 7.1.0.alpha)' in rubygems repository https://rubygems.org/ or installed locally.

  The source contains the following gems matching 'rails':
    * rails-0.8.0
    * rails-0.8.5
    * rails-0.9.0
  ...431 MORE LINES...
    * rails-7.0.3
    * rails-7.0.3.1
    * rails-7.0.4
  Could not find gem 'rails (~> 7.1.0.alpha)' in locally installed gems.

  The source contains the following gems matching 'rails':
  ...MORE LINES...
  Browserslist: caniuse-lite is outdated. Please run:
    npx browserslist@latest --update-db
    Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating

  Done in 645ms.
  AppGeneratorTest#test_css_option_with_asset_pipeline_tailwind = 45.64 s = .
  Could not find gem 'rails (~> 7.1.0.alpha)' in rubygems repository https://rubygems.org/ or installed locally.

  The source contains the following gems matching 'rails':
    * rails-0.8.0
    * rails-0.8.5
    * rails-0.9.0
  ...431 MORE LINES...
    * rails-7.0.3
    * rails-7.0.3.1
    * rails-7.0.4
  Could not find gem 'rails (~> 7.1.0.alpha)' in locally installed gems.

  The source contains the following gems matching 'rails':
  ...MORE LINES...
  npm WARN set-script set-script is deprecated, use `npm pkg set scripts.scriptname="cmd" instead.

    app/assets/builds/application.js      55b
    app/assets/builds/application.js.map  93b

  npm WARN set-script set-script is deprecated, use `npm pkg set scripts.scriptname="cmd" instead.
  AppGeneratorTest#test_css_option_with_cssbundling_gem = 51.93 s = .

  Finished in 123.877633s, 0.0242 runs/s, 0.2180 assertions/s.
  3 runs, 27 assertions, 0 failures, 0 errors, 0 skips
  ```

**After**

  ```
  $ cd railties
  $ bin/test test/generators/app_generator_test.rb --verbose --seed 520 -n '/test_hotwire|test_css_option_with_asset_pipeline_tailwind|test_css_option_with_cssbundling_gem/'

  # Running:

  AppGeneratorTest#test_hotwire = 10.00 s = .
  AppGeneratorTest#test_css_option_with_asset_pipeline_tailwind = 22.61 s = .
  AppGeneratorTest#test_css_option_with_cssbundling_gem = 30.77 s = .

  Finished in 63.386282s, 0.0473 runs/s, 0.4260 assertions/s.
  3 runs, 27 assertions, 0 failures, 0 errors, 0 skips
  ```
2022-11-11 16:29:59 -06:00
Rafael Mendonça França 83138ce2dd
Previews paths should not be eager loaded
Right now they are being eager loaded that means they are being loaded
in the production environment unnecessarily.

All we need is for those paths to be autoloaded in development, so
code reload works.
2022-11-11 18:03:55 +00:00
fatkodima 81fb7a2e04 Add missing require to `railties/lib/rails/generators/testing/behavior.rb` 2022-11-10 21:42:04 +02:00
Jonathan Hefner 9caf1d77ee
Merge pull request #46424 from jonathanhefner/railties-deprecator
Add `Rails.deprecator`
2022-11-09 15:58:26 -06:00
Caleb Buxton e68ff5fff6 Fixes flakey race condition in server_test
Run in parallel, both tests in railties/test/application/server_test.rb attempt to bind to the same port. This changes the two tests to run serially.
2022-11-05 18:45:30 -07:00
eileencodes 845ba3013e
Fix schema_up_to_date connection
This method was failing to return the connection to the correct state
which would break tests when eager loading the application. What's
happening is that when we check `schema_up_to_date` when the application
is eager loaded all the models are eager loaded as well so it sees that
ApplicationRecord has a connection already but that connection is set to
the wrong one. It doesn't get replaced with the right one so we see
errors about looking for tables in the wrong database. This doesn't
happen when eager loading is off because ApplicationRecord isn't set and
gets initialized with the correct connection (from it's
`connects_to/establish_connection` call).

I also refactored this to pull `needs_update` into a method and make the
loop easier to read.
2022-11-04 15:54:06 -04:00
Jonathan Hefner 7a26f26255 Add Rails.deprecator
This commit adds `Rails.deprecator`, which currently returns
`ActiveSupport::Deprecation.instance`.  This commit also replaces all
usages of `ActiveSupport::Deprecation.warn` in `railties/lib` with
`Rails.deprecator.warn`.
2022-11-04 14:29:57 -05:00
Jonathan Hefner 74794858c9 Add ActiveModel.deprecator
This commit adds `ActiveModel.deprecator`, and adds it to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.
2022-11-01 17:39:39 -05:00
Jonathan Hefner b2bc006815 Add ActionText.deprecator
This commit adds `ActionText.deprecator`, and adds it to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.
2022-11-01 17:39:39 -05:00
Jonathan Hefner f434310b3b Add ActionMailbox.deprecator
This commit adds `ActionMailbox.deprecator`, and adds it to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.
2022-11-01 17:39:39 -05:00
Jonathan Hefner 5a4eadd51c Add ActionCable.deprecator
This commit adds `ActionCable.deprecator`, and adds it to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.
2022-11-01 17:39:39 -05:00
Jonathan Hefner b75fc7b994
Merge pull request #46396 from jonathanhefner/active_storage-deprecator
Add `ActiveStorage.deprecator`
2022-11-01 16:46:48 -05:00
Jonathan Hefner 07cd0322bd Add ActiveStorage.deprecator
This commit adds `ActiveStorage.deprecator` and replaces all usages of
`ActiveSupport::Deprecation.warn` in `activestorage/lib` and
`activestorage/app` with `ActiveStorage.deprecator`.

Additionally, this commit adds `ActiveStorage.deprecator` to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.
2022-10-31 17:04:48 -05:00
Jonathan Hefner 77db302aa0 Add ActiveJob.deprecator
This commit adds `ActiveJob.deprecator` and replaces all usages of
`ActiveSupport::Deprecation.warn` in `activejob/lib` with
`ActiveJob.deprecator`.

Additionally, this commit adds `ActiveJob.deprecator` to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.

This commit also removes a defunct `ActiveSupport::Deprecation.silence`
call that was added in 9eb4b4ed01 but not
removed when the deprecation was completed in
10bd5e59c3.
2022-10-31 17:04:26 -05:00
Jonathan Hefner b5248aca16 Add ActionView.deprecator
This commit adds `ActionView.deprecator` and replaces all usages of
`ActiveSupport::Deprecation.warn` in `actionview/lib` with
`ActionView.deprecator`.  This commit also replaces a call to Ruby's
`Module#deprecate_constant` with Rails' `DeprecatedConstantProxy`, so
that its deprecation behavior can be configured using
`ActionView.deprecator`.

Additionally, this commit adds `ActionView.deprecator` to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.

This commit also removes a few defunct `assert_deprecated` calls that
were not failing because they were nested in `assert_raises`, and the
raised error prevented checking the deprecation.  (One was mistakenly
kept in d52d773946 when converting
`test_render_file_with_errors` to `test_render_template_with_errors`;
the other two were added in dd9991bac5 but
not removed when the deprecation was completed in
85ecf6e4098601222b604f7c1cbdcb4e49a6d1f0.)
2022-10-30 16:01:39 -05:00
Jonathan Hefner 2612b88abf
Merge pull request #46381 from jonathanhefner/action_mailer-deprecator
Add `ActionMailer.deprecator`
2022-10-30 16:00:30 -05:00
Jonathan Hefner 633091c263 Fix "possibly useless use of a constant" warnings
This fixes two warnings like the following when running
`rails/railties/test/application/initializers/frameworks_test.rb`:

  ```
  warning: possibly useless use of a constant in void context
  ```
2022-10-29 16:22:08 -05:00
Jonathan Hefner b3a2bb326c Add ActionMailer.deprecator
This commit adds `ActionMailer.deprecator` and replaces all usages of
`ActiveSupport::Deprecation.warn` in `actionmailer/lib` with
`ActionMailer.deprecator`.

Additionally, this commit adds `ActionMailer.deprecator` to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.
2022-10-29 16:01:02 -05:00
Jonathan Hefner bb96ea70cb
Merge pull request #46366 from jonathanhefner/action_dispatch-deprecator
Add `ActionDispatch.deprecator`
2022-10-29 15:55:20 -05:00
Yasuo Honda 36704bfbf8
Merge pull request #46346 from SHinGo-Koba/adjust_redis_version_in_template
Adjusted redis version in Gemfile Entry
2022-10-28 08:58:09 +09:00
Jonathan Hefner c3ea9d0d35
Merge pull request #46369 from jonathanhefner/railties-plugin_generator_test-warning-character-class
Fix "character class has duplicated range" warning
2022-10-27 18:52:43 -05:00
Jonathan Hefner 4ad1b021cc Fix "possibly useless use of ::" warning
This fixes a few warnings like the following when running
`railties/test/application/configuration_test.rb`:

  ```
  warning: possibly useless use of :: in void context
  ```

These `ActiveJob::Base` references were added in
b4fffc3c68.  However, that same commit
makes these references unnecessary by setting configuration in an
`after_initialize` block (in addition to an `on_load(:active_job)`
block).
2022-10-27 17:39:23 -05:00
Jonathan Hefner 2b3b3c6c87 Fix "character class has duplicated range" warning
This fixes the following warning when running
`railties/test/generators/plugin_generator_test.rb`:

  ```
  warning: character class has duplicated range
  ```
2022-10-27 17:29:18 -05:00
Jonathan Hefner 48d4e6e02b Add ActionDispatch.deprecator
This commit adds `ActionDispatch.deprecator` and replaces all usages of
`ActiveSupport::Deprecation.warn` in `actionpack/lib/action_dispatch`
with `ActionDispatch.deprecator`.

Additionally, this commit adds `ActionDispatch.deprecator` to
`Rails.application.deprecators` so that it can be configured via
settings such as `config.active_support.report_deprecations`.
2022-10-27 17:11:02 -05:00
Jonathan Hefner b287779499 Add {Abstract,Action}Controller.deprecator
This commit adds `AbstractController.deprecator` and
`ActionController.deprecator`, and replaces all usages of
`ActiveSupport::Deprecation.warn` in `actionpack/lib/action_controller`
with the latter.

Additionally, this commit adds `ActionController.deprecator` to
`Rails.application.deprecators`.  Because `AbstractController` does not
have its own railtie to do the same, `AbstractController` and
`ActionController` use the same deprecator instance.  Thus, both can be
configured via `Rails.application.deprecators[:action_controller]` or
via config settings such as `config.active_support.report_deprecations`.
2022-10-27 16:20:53 -05:00
Hartley McGuire f822fc6db1
Add missing defaults to new_framework_defaults
These were added in cdce275, 5d0c2b0, and 5256c90

For the new MessageVerifier and MessageEncryptor defaults, I modeled the
documentation after cb76ede. The goal is to warn users that they should
pay attention to the config and not just uncomment it without doing
additional work.

I also added an extra note to log_file_size since it is the first
load_default I'm aware of that is environment dependent.

Co-authored-by: Jonathan Hefner <jonathan@hefner.pro>
2022-10-26 21:55:47 -04:00
Jonathan Hefner c097635fa3
Merge pull request #46337 from jonathanhefner/active_support-deprecator
Add `ActiveSupport.deprecator`
2022-10-26 15:44:52 -05:00
Brent Wheeldon 1eb20036a5
Don't remove duplicates from args array
The [pipe operator](https://ruby-doc.org/core-3.1.2/Array.html#method-i-7C) will return the union of the two sets, with duplicates removed. That causes problems if there are two values in the arguments that are the same.

This change still avoids adding a duplicate `--skip-bootsnap` option, but doesn't remove duplicates which allows for args like ["--option1", "value", "--option2", "value"] to work as expected.

Fixes #46347
2022-10-26 18:00:20 +00:00
SHinGo-Koba ceebf2ec1b adjusted redis version in Gemfile Entry 2022-10-27 00:41:05 +09:00
Eileen M. Uchitelle 577274d57d
Merge pull request #46336 from Shopify/multi-db-version-check-support
Add multi-database support for the `db:version` task
2022-10-25 16:08:27 -04:00
Jonathan Hefner 587c3406af Add ActiveSupport.deprecator
This commit adds `ActiveSupport.deprecator` and replaces all usages of
`ActiveSupport::Deprecation.warn` in `activesupport/lib` with
`ActiveSupport.deprecator`.

Additionally, this commit adds `ActiveSupport.deprecator` to
`Rails.application.deprecators` so that it can be configured using e.g.
`config.active_support.report_deprecations`.
2022-10-25 15:06:39 -05:00
Jonathan Hefner 682353e3de Add ActiveRecord.deprecator
This commit adds `ActiveRecord.deprecator` and replaces all usages of
`ActiveSupport::Deprecation.warn` in `activerecord/lib` with
`ActiveRecord.deprecator`.

Additionally, this commit adds `ActiveRecord.deprecator` to
`Rails.application.deprecators` so that it can be configured using e.g.
`config.active_support.report_deprecations`.
2022-10-25 14:23:08 -05:00
Hormoz Kheradmand a48fdffccf
Add multi-db support for db:version tasks
The `rails db:version` task makes no effort today to display information for multi-database applications.

This brings up this simplistic tasks up to parity with the rest of the DB tasks that support multi-database applications.

This is accomplished by following the pattern of making the non-namespaced task (i.e. `db:version`) to output a multi-line string, iterating through all defined databases for the current environment in `database.yml`

It also adds a namespaced instance of the task for each database defined (e.g. `db:version:animals`).

**A hidden change, but critical (for the purposes that I'm working on), that is happening here** is that database configurations with `database_tasks: false` will be excluded from the logic in this task – due to the usage of the `ActiveRecord::Base.configurations.configs_for` method, which by default has `include_hidden: false`!
2022-10-25 12:23:02 -07:00
Jonathan Hefner a23c9e38d3 Apply config to Rails.application.deprecators
This applies the following configs to `Rails.application.deprecators`,
which then applies them to `ActiveSupport::Deprecation.instance`:

* `config.active_support.report_deprecations`
* `config.active_support.deprecation`
* `config.active_support.disallowed_deprecation`
* `config.active_support.disallowed_deprecation_warnings`
2022-10-24 15:40:13 -05:00