Skip to content

Commit

Permalink
Merge pull request #31423 from bogdanvlviv/fix-protected_environments…
Browse files Browse the repository at this point in the history
…-with-symbols

Fix protected environments with symbols
  • Loading branch information
kamipo committed Jan 3, 2018
1 parent b5300d9 commit 4cc2ea7
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 18 deletions.
32 changes: 16 additions & 16 deletions activerecord/lib/active_record/model_schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,6 @@ module ModelSchema
#
# Sets the name of the internal metadata table.

##
# :singleton-method: protected_environments
# :call-seq: protected_environments
#
# The array of names of environments where destructive actions should be prohibited. By default,
# the value is <tt>["production"]</tt>.

##
# :singleton-method: protected_environments=
# :call-seq: protected_environments=(environments)
#
# Sets an array of names of environments where destructive actions should be prohibited.

##
# :singleton-method: pluralize_table_names
# :call-seq: pluralize_table_names
Expand Down Expand Up @@ -128,12 +115,10 @@ module ModelSchema
class_attribute :internal_metadata_table_name, instance_accessor: false
self.internal_metadata_table_name = "ar_internal_metadata"

class_attribute :protected_environments, instance_accessor: false
self.protected_environments = ["production"]

class_attribute :pluralize_table_names, instance_writer: false
self.pluralize_table_names = true

self.protected_environments = ["production"]
self.inheritance_column = "type"
self.ignored_columns = [].freeze

Expand Down Expand Up @@ -247,6 +232,21 @@ def full_table_name_suffix #:nodoc:
(parents.detect { |p| p.respond_to?(:table_name_suffix) } || self).table_name_suffix
end

# The array of names of environments where destructive actions should be prohibited. By default,
# the value is <tt>["production"]</tt>.
def protected_environments
if defined?(@protected_environments)
@protected_environments
else
superclass.protected_environments
end
end

# Sets an array of names of environments where destructive actions should be prohibited.
def protected_environments=(environments)
@protected_environments = environments.map(&:to_s)
end

# Defines the name of the table column which will store the class name on single-table
# inheritance situations.
#
Expand Down
12 changes: 12 additions & 0 deletions activerecord/test/cases/base_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1577,4 +1577,16 @@ def test_default_values_are_deeply_dupped
test "using table name qualified column names unless having SELECT list explicitly" do
assert_equal developers(:david), Developer.from("developers").joins(:shared_computers).take
end

test "protected environments by default is an array with production" do
assert_equal ["production"], ActiveRecord::Base.protected_environments
end

def test_protected_environments_are_stored_as_an_array_of_string
previous_protected_environments = ActiveRecord::Base.protected_environments
ActiveRecord::Base.protected_environments = [:staging, "production"]
assert_equal ["staging", "production"], ActiveRecord::Base.protected_environments
ensure
ActiveRecord::Base.protected_environments = previous_protected_environments
end
end
21 changes: 19 additions & 2 deletions activerecord/test/cases/tasks/database_tasks_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,30 @@ class DatabaseTasksUtilsTask < ActiveRecord::TestCase
def test_raises_an_error_when_called_with_protected_environment
ActiveRecord::Migrator.stubs(:current_version).returns(1)

protected_environments = ActiveRecord::Base.protected_environments.dup
protected_environments = ActiveRecord::Base.protected_environments
current_env = ActiveRecord::Migrator.current_environment
assert_not_includes protected_environments, current_env
# Assert no error
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!

ActiveRecord::Base.protected_environments << current_env
ActiveRecord::Base.protected_environments = [current_env]
assert_raise(ActiveRecord::ProtectedEnvironmentError) do
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
end
ensure
ActiveRecord::Base.protected_environments = protected_environments
end

def test_raises_an_error_when_called_with_protected_environment_which_name_is_a_symbol
ActiveRecord::Migrator.stubs(:current_version).returns(1)

protected_environments = ActiveRecord::Base.protected_environments
current_env = ActiveRecord::Migrator.current_environment
assert_not_includes protected_environments, current_env
# Assert no error
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!

ActiveRecord::Base.protected_environments = [current_env.to_sym]
assert_raise(ActiveRecord::ProtectedEnvironmentError) do
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
end
Expand Down
4 changes: 4 additions & 0 deletions guides/source/configuring.md
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,10 @@ All these configuration options are delegated to the `I18n` library.

* `config.active_record.schema_migrations_table_name` lets you set a string to be used as the name of the schema migrations table.

* `config.active_record.internal_metadata_table_name` lets you set a string to be used as the name of the internal metadata table.

* `config.active_record.protected_environments` lets you set an array of names of environments where destructive actions should be prohibited.

* `config.active_record.pluralize_table_names` specifies whether Rails will look for singular or plural table names in the database. If set to `true` (the default), then the Customer class will use the `customers` table. If set to false, then the Customer class will use the `customer` table.

* `config.active_record.default_timezone` determines whether to use `Time.local` (if set to `:local`) or `Time.utc` (if set to `:utc`) when pulling dates and times from the database. The default is `:utc`.
Expand Down

0 comments on commit 4cc2ea7

Please sign in to comment.