Commit Graph

69957 Commits

Author SHA1 Message Date
Yumin Wong
3f5bd11ed6 SafeBuffer should maintain safety upon getting a slice via a range if original buffer was safe.
Co-Authored-By: no-itsbackpack <no-itsbackpack@github.com>
2018-08-31 11:46:09 -05:00
schneems
daa3565a49 Faster permitted_scalar_filter
When running with code triage and derailed benchmarks and focusing on this file:

Before

     16199  /Users/rschneeman/Documents/projects/rails/actionpack/lib/action_controller/metal/strong_parameters.r

After

      2280  /Users/rschneeman/Documents/projects/rails/actionpack/lib/action_controller/metal/strong_parameters.rb
2018-08-31 11:17:00 -05:00
Eileen Uchitelle
8737dffce7 Add replica? check to DatabaseConfig
Checks if the config has a "replica" key, if so the configuration is for
a replica database. This is useful for excluding replicas from the
configurations list when creating the rake tasks or running rake tasks.
For example, we don't want to create the primary and primary_readonly.
They're the same database.
2018-08-31 10:53:20 -04:00
Eileen Uchitelle
2fd997c111 Add config option for replica.
This allows the user to add `replica: true` to the database config to
signify the connection should be treated as readonly. This will be
useful so we can ignore structure dumps or migrations (or creating /
deleting etc) the readonly connection for the databases. These are
paired with a write database which is where the create/drop/migrate
should be run. This allows us to ask the connection if it's for a
replica readonly db or a primary write db.
2018-08-31 10:52:32 -04:00
yuuji.yaginuma
12fadea8ae Remove redundant travel_back
Since #29860, `travel_back` automatically called at the end of the test.
2018-08-31 16:19:58 +09:00
Yoshiyuki Kinjo
ae6adf98cc Emit warning for unknown inflection rule when generating model.
For words like "abuse", Rails cannot derive its singular form from
plural form "abuses" without defining custom inflection rule.
`rails generate model` and its families now emit warning for this case.
2018-08-31 15:47:35 +09:00
Barry Allard
20e3cacbaa
add github to template actions, light DSL refactor 2018-08-30 16:22:32 -07:00
Ryuta Kamizono
d48f4ddfc8
Merge pull request #33762 from nicolasmlv/typo
Typo in form_helpers.md guide

[ci skip]
2018-08-31 05:38:42 +09:00
Nicolas Maloeuvre
e7a3df190c [ci skip] Typo in form helpers guide 2018-08-30 22:23:54 +02:00
Rafael França
5bbaae0d20
Merge pull request #33751 from steves/add_retry_notifications_to_aj
Add hooks to ActiveJob around retries and discards
2018-08-30 13:39:51 -05:00
Ryuta Kamizono
5c656889a6 Just delegate update with ids on a relation to klass.update
This restores an ability that `update` with ids on a relation which is
described at https://github.com/rails/rails/issues/33470#issuecomment-411203013.

I personally think that the `update` with two arguments on a relation is
not a designed feature, since that is totally not using a relation
state, and also is not documented.

But removing any feature should not be suddenly happened in a stable
version even if that is not documented.
2018-08-31 02:56:32 +09:00
Steve S
3bf33d7c2c
Move ActiveJob retry and discard logging into log subscriber 2018-08-30 13:07:37 -04:00
Eileen M. Uchitelle
8f2caec401
Merge pull request #33637 from eileencodes/ar-connection-management-refactoring
Refactor Active Record configurations
2018-08-30 13:07:02 -04:00
Richard Schneeman
616afba436
Merge pull request #33759 from schneems/schneems/move-variable-out-of-loop
Do not recompute length
2018-08-30 09:21:56 -07:00
Eileen M. Uchitelle
9f1d8f9e3d
Merge pull request #33760 from eileencodes/add-migrations_paths_option-to-migration-generator
Add migrations_paths option to migration generator
2018-08-30 12:15:26 -04:00
Richard Schneeman
ed06a638cd
Merge pull request #33761 from schneems/schneems/strong_params_doc
[ci skip] Document permitted_scalar_filter
2018-08-30 09:03:59 -07:00
schneems
11bcf95287 [ci skip] Document permitted_scalar_filter 2018-08-30 11:03:22 -05:00
Eileen Uchitelle
b551a70755 Add migrations_paths option to migration generator
Adds an option to the migration generator to allow setting the
migrations paths for that migration. This is useful for applications
that use multiple databases and put migrations per database in their own
directories.

```
bin/rails g migration CreateHouses address:string --migrations-paths=db/kingston_migrate
      invoke  active_record
      create    db/kingston_migrate/20180830151055_create_houses.rb
```
2018-08-30 11:18:40 -04:00
Ryuta Kamizono
5e86ee1195 Refactor attributes_for_{create,update} to avoid an extra allocation
Use `delete_if` instead of `reject` to avoid an extra allocation.
2018-08-31 00:06:12 +09:00
schneems
897c377bad Do not recompute length
We can get a speed gain by moving the length calculation and assignment out of the loop.
2018-08-30 09:57:58 -05:00
Ryuta Kamizono
56ca81a911 Remove attributes_with_values_for_{create,update} for internal use
`attributes_with_values_for_update` is no longer used since ae2d36c, and
`attributes_with_values_for_create` is internally used only one place.
2018-08-30 23:42:33 +09:00
Eileen Uchitelle
fdf3f0b930 Refactors Active Record connection management
While the three-tier config makes it easier to define databases for
multiple database applications, it quickly became clear to offer full
support for multiple databases we need to change the way the connections
hash was handled.

A three-tier config means that when Rails needed to choose a default
configuration (in the case a user doesn't ask for a specific
configuration) it wasn't clear to Rails which the default was. I
[bandaid fixed this so the rake tasks could work](#32271) but that fix
wasn't correct because it actually doubled up the configuration hashes.

Instead of attemping to manipulate the hashes @tenderlove and I decided
that it made more sense if we converted the hashes to objects so we can
easily ask those object questions. In a three tier config like this:

```
development:
  primary:
    database: "my_primary_db"
  animals:
    database; "my_animals_db"
```

We end up with an object like this:

```
  @configurations=[
    #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10
      @env_name="development",@spec_name="primary",
      @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>,
    #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbdea90
      @env_name="development",@spec_name="animals",
      @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
]>
```

The configurations setter takes the database configuration set by your
application and turns them into an
`ActiveRecord::DatabaseConfigurations` object that has one getter -
`@configurations` which is an array of all the database objects.

The configurations getter returns this object by default since it acts
like a hash in most of the cases we need. For example if you need to
access the default `development` database we can simply request it as we
did before:

```
ActiveRecord::Base.configurations["development"]
```

This will return primary development database configuration hash:

```
{ "database" => "my_primary_db" }
```

Internally all of Active Record has been converted to use the new
objects. I've built this to be backwards compatible but allow for
accessing the hash if needed for a deprecation period. To get the
original hash instead of the object you can either add `to_h` on the
configurations call or pass `legacy: true` to `configurations.

```
ActiveRecord::Base.configurations.to_h
=> { "development => { "database" => "my_primary_db" } }

ActiveRecord::Base.configurations(legacy: true)
=> { "development => { "database" => "my_primary_db" } }
```

The new configurations object allows us to iterate over the Active
Record configurations without losing the known environment or
specification name for that configuration. You can also select all the
configs for an env or env and spec. With this we can always ask
any object what environment it belongs to:

```
db_configs = ActiveRecord::Base.configurations.configurations_for("development")
=> #<ActiveRecord::DatabaseConfigurations:0x00007fd1acbdf800
  @configurations=[
    #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbded10
      @env_name="development",@spec_name="primary",
      @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>,
    #<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fd1acbdea90
      @env_name="development",@spec_name="animals",
      @config={"adapter"=>"sqlite3", "database"=>"db/development.sqlite3"}>
]>

db_config.env_name
=> "development"

db_config.spec_name
=> "primary"

db_config.config
=> { "adapter"=>"sqlite3", "database"=>"db/development.sqlite3" }
```

The configurations object is more flexible than the configurations hash
and will allow us to build on top of the connection management in order
to add support for primary/replica connections, sharding, and
constructing queries for associations that live in multiple databases.
2018-08-30 10:06:45 -04:00
Ryuta Kamizono
a72ac3cfec Remove extra & self.class.column_names in keys_for_partial_write
It should be done only once in `Persistence` module.

c83e30da27/activerecord/lib/active_record/persistence.rb (L721)
c83e30da27/activerecord/lib/active_record/persistence.rb (L740)
2018-08-30 22:43:26 +09:00
Ryuta Kamizono
9297af5daf
Merge pull request #33757 from bogdanvlviv/follow-up-32937
Follow up #32937 [ci skip]
2018-08-30 20:25:00 +09:00
bogdanvlviv
03ba74c8f0
Add info about purpose in cookies to "Upgrading Ruby on Rails" guide [ci skip]
Context https://github.com/rails/rails/pull/33605#discussion_r210354278

Related to #32937, #33605
2018-08-30 11:50:03 +03:00
bogdanvlviv
35740ab2da
Add info about config.action_dispatch.use_cookies_with_metadata to "Configuring Rails Applications" guide [ci skip]
Related to #32937, #33605.
2018-08-30 11:49:52 +03:00
bogdanvlviv
3175d3d549
Fix actionpack/CHANGELOG.md [ci skip]
Remove the reference to the PR.
Usually, we write reference to solved issues in the changelog files.
Related to #33605.

Add missing dots.

Improve formatting.
2018-08-30 10:04:28 +03:00
yuuji.yaginuma
fa132efe82 Add missing require
Without this, `inverse_associations_test.rb` breaks when running in isolation.
https://travis-ci.org/rails/rails/jobs/422266840#L1894-L1899
2018-08-30 08:14:35 +09:00
Rafael França
ed1eda271c
Merge pull request #33729 from kddeisz/plural-automatic-inverse
Find inverse associations with plural names
2018-08-29 16:00:41 -05:00
Richard Schneeman
3d2caab7dc
Merge pull request #33752 from sgrif/sg-faster-try
20% faster `try`
2018-08-29 12:22:20 -07:00
Rafael França
aab0c25f58
Merge pull request #33737 from bogdanvlviv/add-6_0_release_notes-guide
Add "Ruby on Rails 6.0 Release Notes" guide [ci skip]
2018-08-29 13:51:31 -05:00
Sean Griffin
0f462da85d 20% faster try
Following up on #33747, this takes things a step further by pulling out
the method name from the arguments array, letting us skip an allocation
in the case where there are no arguments -- notably, this also no longer
*requires* the splat to be an array, allowing us to benefit from
optimizations in Jruby (and maybe MRI in the future) of skipping the
array allocation entirely.

Benchmark results:

```
Warming up --------------------------------------
                 old   179.987k i/100ms
                 new   199.201k i/100ms
Calculating -------------------------------------
                 old      3.029M (± 1.6%) i/s -     15.299M in   5.052417s
                 new      3.657M (± 1.2%) i/s -     18.326M in   5.012648s

Comparison:
                 new:  3656620.7 i/s
                 old:  3028848.3 i/s - 1.21x  slower
```
2018-08-29 12:42:01 -06:00
Ryuta Kamizono
cc81cd359c
Merge pull request #33744 from bogdanvlviv/fixes-27852
Prevent leaking of user's DB credentials on `rails db:create` failure
2018-08-30 02:44:58 +09:00
Richard Schneeman
0d63712fdf
Merge pull request #33749 from schneems/schneems/faster-fragment
Fewer allocations in caching/fragments.rb
2018-08-29 10:44:33 -07:00
Richard Schneeman
0d0f48a20a
Merge pull request #33750 from schneems/schneems/time_value
Faster time_value.rb
2018-08-29 10:43:29 -07:00
Steve S
26dc9bc8ee
Add hooks to ActiveJob around retries and discards 2018-08-29 13:28:55 -04:00
schneems
e81b0ddd7a Faster time_value.rb
The multiplication of the value takes a long time when we can instead mutate and use the string value directly.

The `microsec` perf increases speed by 27% in the ideal case (which is the most common).

```
original_string = ".443959"

require 'benchmark/ips'

Benchmark.ips do |x|
  x.report("multiply") { 
    string = original_string.dup
    (string.to_r * 1_000_000).to_i 
  }
  x.report("new     ") { 
    string = original_string.dup
    if string && string.start_with?(".".freeze) && string.length == 7
      string[0] = ''.freeze
      string.to_i
    end
  }
  x.compare!
end

# Warming up --------------------------------------
#             multiply   125.783k i/100ms
#             new        146.543k i/100ms
# Calculating -------------------------------------
#             multiply      1.751M (± 3.3%) i/s -      8.805M in   5.033779s
#             new           2.225M (± 2.1%) i/s -     11.137M in   5.007110s

# Comparison:
#             new     :  2225289.7 i/s
#             multiply:  1751254.2 i/s - 1.27x  slower
```
2018-08-29 11:45:47 -05:00
Richard Schneeman
96d7504da9
Merge pull request #33747 from schneems/schneems/faster-try
32% Faster Object#try
2018-08-29 09:10:49 -07:00
Eileen Uchitelle
a64dba1dc5 Remove this conditional
I removed the argument so I should remove the conditional too.
2018-08-29 12:08:23 -04:00
Eileen Uchitelle
c91f1482a1 Remove unused argument
The test that used this was updated and it's no longer needed.
2018-08-29 11:08:10 -04:00
Eileen M. Uchitelle
55133a0e8e
Merge pull request #33748 from eileencodes/fix-erb-loading-issue-with-db-yaml
Drop load_database_yaml and fix test
2018-08-29 11:07:01 -04:00
schneems
ba7d1265e3 32% Faster Object#try
Here’s the micro benchmark:

```ruby
module ActiveSupport
  module NewTryable #:nodoc:
    def try(*a, &b)
      return unless a.empty? || respond_to?(a.first)
      return public_send(*a, &b) unless a.empty?

      return nil unless block_given?
      return instance_eval(&b) if b.arity == 0
      yield self
    end

    def try!(*a, &b)
      return public_send(*a, &b) if !a.empty?
      return nil unless block_given?
      return instance_eval(&b) if b.arity == 0
      yield self
    end
  end
end


module ActiveSupport
  module OldTryable #:nodoc:
    def try(*a, &b)
      try!(*a, &b) if a.empty? || respond_to?(a.first)
    end

    def try!(*a, &b)
      if a.empty? && block_given?
        if b.arity == 0
          instance_eval(&b)
        else
          yield self
        end
      else
        public_send(*a, &b)
      end
    end
  end
end

class FooNew
  include ActiveSupport::NewTryable

  def foo
  end
end

class FooOld
  include ActiveSupport::OldTryable

  def foo
  end
end 


foo_new = FooNew.new
foo_old = FooOld.new

require 'benchmark/ips'

Benchmark.ips do |x|
  x.report("old") { foo_old.try(:foo) }
  x.report("new") { foo_new.try(:foo) }
  x.compare!
end

# Warming up --------------------------------------
#                  old   144.178k i/100ms
#                  new   172.371k i/100ms
# Calculating -------------------------------------
#                  old      2.181M (± 8.0%) i/s -     10.813M in   5.001419s
#                  new      2.889M (± 7.7%) i/s -     14.479M in   5.051760s

# Comparison:
#                  new:  2888691.7 i/s
#                  old:  2180740.7 i/s - 1.32x  slower
```

Also reduces memory. On https://www.codetriage.com i’m seeing 1.5% fewer object allocations per request (in object count).

Before:

Total allocated: 1014475 bytes (8525 objects)

After:

Total allocated: 1015499 bytes (8389 objects)
2018-08-29 10:03:48 -05:00
schneems
e92adb3da6 Fewer allocations in caching/fragments.rb
Instead of using a splat on the head and tail we can mutate the array by flattening 1 level. We get further savings by not allocating another via `compact` but instead by using `compact!`
2018-08-29 09:49:24 -05:00
Eileen Uchitelle
6b5df90fb5 Drop load_database_yaml and fix test
We originally did the whole `load_database_yaml` thing because this test
wasn't cooperating and we needed to finish the namespaced rake tasks for
multiple databases.

However, it turns out that YAML can't eval ERB if you don't tell it it's
ERB so you get Pysch parse errors if you're using multi-line ERB or
ERB with conditionals. It's a hot mess.

After trying a few things and thinking it over we decided that it wasn't
worth bandaiding over, the test needed to be improved. The test was
added in #31135 to test that the env is loaded in these tasks. But it
was blowing up because we were trying to read a database name out of the
configuration - however that's not the purpose of this change. We want
to read environment files in the rake tasks, but not in the config
file.

In this PR we changed the test to test what the PR was actually fixing.
We've also deleted the `load_database_yaml` because it caused more
problems than it was worth. This should fix the issues described in
https://github.com/rails/rails/pull/32274#issuecomment-384161057. We
also had these problems at GitHub.

Co-authored-by: alimi <aibrahim2k2@gmail.com>
2018-08-29 10:26:44 -04:00
bogdanvlviv
9b455fe6f0
Prevent leaking of user's DB credentials on rails db:create failure
Issue #27852 reports that when `rails db:create` fails, it causes
leaking of user's DB credentials to $stderr.
We print a DB's configuration hash in order to help users more quickly
to figure out what could be wrong with his configuration.

This commit changes message from
"Couldn't create database for #{configuration.inspect}" to
"Couldn't create '#{configuration['database']}' database. Please check your configuration.".

There are two PRs that fixing it #27878, #27879, but they need a bit more work.
I decided help to finish this and added Author of those PRs credit in this commit.

Since it is a security issue, I think we should backport it to
`5-2-stable`, and `5-1-stable`.
Guided by https://edgeguides.rubyonrails.org/maintenance_policy.html#security-issues

Fixes #27852
Closes #27879
Related to #27878

[Alexander Marrs & bogdanvlviv]
2018-08-29 12:40:30 +03:00
bogdanvlviv
02fa55ac29
Add "Ruby on Rails 6.0 Release Notes" guide [ci skip]
This commit adds a skeleton of "Ruby on Rails 6.0 Release Notes".
It isn't a good time to add changelogs' entries to this guide since we can
redo/revert some things till the final release 6.0.
It would be better to do it close to the release.
But we already can add mentions about major features
that have been added to 6.0. I added mention about "Parallel Testing".
2018-08-29 12:09:43 +03:00
Matthew Draper
068fe7dc90
Merge pull request #33718 from kddeisz/permit-list
Finish converting whitelist and blacklist references
2018-08-29 14:07:37 +09:30
yuuji.yaginuma
28e5085070 Generate the same value as a label of view in system test template
In the system test template, enter a value based on label.
However, since `label` method does not use `titleize` by default.
If generate a value including underscore, cannot find a label and the test
will fail.

```
$ ./bin/rails g scaffold user name:string phone_number:string
$ ./bin/rails t test/system/users_test.rb

E

Error:
UsersTest#test_creating_a_User:
Capybara::ElementNotFound: Unable to find field "Phone Number"
    test/system/users_test.rb:18:in `block in <class:UsersTest>'
```

This removes unnecessary `titleize` so that the generated file will pass
even if the attribute contains an underscore.
2018-08-29 09:58:21 +09:00
Rafael Mendonça França
a8fff60814
Add test to make sure the custom object key can't be serialized 2018-08-28 16:31:15 -04:00
James Brooks
538f42900f Focus search input after page load on /rails/info/routes (#33683) 2018-08-28 14:42:30 -05:00