Hello community,
here is the log from the commit of package rubygem-activerecord-5_0 for openSUSE:Factory checked in at 2017-06-08 14:59:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-activerecord-5_0 (Old)
and /work/SRC/openSUSE:Factory/.rubygem-activerecord-5_0.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-activerecord-5_0"
Thu Jun 8 14:59:55 2017 rev:5 rq:497672 version:5.0.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-activerecord-5_0/rubygem-activerecord-5_0.changes 2017-03-21 22:49:36.118334321 +0100
+++ /work/SRC/openSUSE:Factory/.rubygem-activerecord-5_0.new/rubygem-activerecord-5_0.changes 2017-06-08 14:59:59.156572315 +0200
@@ -1,0 +2,44 @@
+Tue May 23 09:36:46 UTC 2017 - coolo@suse.com
+
+- updated to version 5.0.3
+ see installed CHANGELOG.md
+
+ * Check whether `Rails.application` defined before calling it
+
+ In #27674 we changed the migration generator to generate migrations at the
+ path defined in `Rails.application.config.paths` however the code checked
+ for the presence of the `Rails` constant but not the `Rails.application`
+ method which caused problems when using Active Record and generators outside
+ of the context of a Rails application.
+
+ Fixes #28325.
+
+ * Fix `deserialize` with JSON array.
+
+ Fixes #28285.
+
+ *Ryuta Kamizono*
+
+ * Fix `rake db:schema:load` with subdirectories.
+
+ *Ryuta Kamizono*
+
+ * Fix `rake db:migrate:status` with subdirectories.
+
+ *Ryuta Kamizono*
+
+ * Don't share options between reference id and type columns
+
+ When using a polymorphic reference column in a migration, sharing options
+ between the two columns doesn't make sense since they are different types.
+ The `reference_id` column is usually an integer and the `reference_type`
+ column a string so options like `unsigned: true` will result in an invalid
+ table definition.
+
+ *Ryuta Kamizono*
+
+ * Fix regression of #1969 with SELECT aliases in HAVING clause.
+
+ *Eugene Kenny*
+
+-------------------------------------------------------------------
Old:
----
activerecord-5.0.2.gem
New:
----
activerecord-5.0.3.gem
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rubygem-activerecord-5_0.spec ++++++
--- /var/tmp/diff_new_pack.TIvdXD/_old 2017-06-08 15:00:01.364260740 +0200
+++ /var/tmp/diff_new_pack.TIvdXD/_new 2017-06-08 15:00:01.368260175 +0200
@@ -24,7 +24,7 @@
#
Name: rubygem-activerecord-5_0
-Version: 5.0.2
+Version: 5.0.3
Release: 0
%define mod_name activerecord
%define mod_full_name %{mod_name}-%{version}
++++++ activerecord-5.0.2.gem -> activerecord-5.0.3.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CHANGELOG.md new/CHANGELOG.md
--- old/CHANGELOG.md 2017-03-02 00:11:59.000000000 +0100
+++ new/CHANGELOG.md 2017-05-12 22:03:36.000000000 +0200
@@ -1,3 +1,42 @@
+* Check whether `Rails.application` defined before calling it
+
+ In #27674 we changed the migration generator to generate migrations at the
+ path defined in `Rails.application.config.paths` however the code checked
+ for the presence of the `Rails` constant but not the `Rails.application`
+ method which caused problems when using Active Record and generators outside
+ of the context of a Rails application.
+
+ Fixes #28325.
+
+* Fix `deserialize` with JSON array.
+
+ Fixes #28285.
+
+ *Ryuta Kamizono*
+
+* Fix `rake db:schema:load` with subdirectories.
+
+ *Ryuta Kamizono*
+
+* Fix `rake db:migrate:status` with subdirectories.
+
+ *Ryuta Kamizono*
+
+* Don't share options between reference id and type columns
+
+ When using a polymorphic reference column in a migration, sharing options
+ between the two columns doesn't make sense since they are different types.
+ The `reference_id` column is usually an integer and the `reference_type`
+ column a string so options like `unsigned: true` will result in an invalid
+ table definition.
+
+ *Ryuta Kamizono*
+
+* Fix regression of #1969 with SELECT aliases in HAVING clause.
+
+ *Eugene Kenny*
+
+
## Rails 5.0.2 (March 01, 2017) ##
* Fix `wait_timeout` to configurable for mysql2 adapter.
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/associations/association.rb new/lib/active_record/associations/association.rb
--- old/lib/active_record/associations/association.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/associations/association.rb 2017-05-12 22:03:36.000000000 +0200
@@ -83,7 +83,7 @@
end
def scope
- target_scope.merge(association_scope)
+ target_scope.merge!(association_scope)
end
# The scope for this association.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/associations/collection_association.rb new/lib/active_record/associations/collection_association.rb
--- old/lib/active_record/associations/collection_association.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/associations/collection_association.rb 2017-05-12 22:03:36.000000000 +0200
@@ -39,13 +39,7 @@
reload
end
- if null_scope?
- # Cache the proxy separately before the owner has an id
- # or else a post-save proxy will still lack the id
- @null_proxy ||= CollectionProxy.create(klass, self)
- else
- @proxy ||= CollectionProxy.create(klass, self)
- end
+ CollectionProxy.create(klass, self)
end
# Implements the writer method, e.g. foo.items= for Foo.has_many :items
@@ -427,37 +421,9 @@
replace_on_target(record, index, skip_callbacks, &block)
end
- def replace_on_target(record, index, skip_callbacks)
- callback(:before_add, record) unless skip_callbacks
-
- begin
- if index
- record_was = target[index]
- target[index] = record
- else
- target << record
- end
-
- yield(record) if block_given?
- rescue
- if index
- target[index] = record_was
- else
- target.delete(record)
- end
-
- raise
- end
-
- callback(:after_add, record) unless skip_callbacks
- set_inverse_instance(record)
-
- record
- end
-
- def scope(opts = {})
- scope = super()
- scope.none! if opts.fetch(:nullify, true) && null_scope?
+ def scope
+ scope = super
+ scope.none! if null_scope?
scope
end
@@ -528,15 +494,19 @@
transaction do
add_to_target(build_record(attributes)) do |record|
yield(record) if block_given?
- insert_record(record, true, raise)
+ insert_record(record, true, raise) { @_was_loaded = loaded? }
end
end
end
end
# Do the relevant stuff to insert the given record into the association collection.
- def insert_record(record, validate = true, raise = false)
- raise NotImplementedError
+ def insert_record(record, validate = true, raise = false, &block)
+ if raise
+ record.save!(validate: validate, &block)
+ else
+ record.save(validate: validate, &block)
+ end
end
def create_scope
@@ -590,19 +560,41 @@
end
end
- def concat_records(records, should_raise = false)
+ def concat_records(records, raise = false)
result = true
records.each do |record|
raise_on_type_mismatch!(record)
- add_to_target(record) do |rec|
- result &&= insert_record(rec, true, should_raise) unless owner.new_record?
+ add_to_target(record) do
+ result &&= insert_record(record, true, raise) { @_was_loaded = loaded? } unless owner.new_record?
end
end
result && records
end
+ def replace_on_target(record, index, skip_callbacks)
+ callback(:before_add, record) unless skip_callbacks
+
+ set_inverse_instance(record)
+
+ @_was_loaded = true
+
+ yield(record) if block_given?
+
+ if index
+ target[index] = record
+ elsif @_was_loaded || !loaded?
+ target << record
+ end
+
+ callback(:after_add, record) unless skip_callbacks
+
+ record
+ ensure
+ @_was_loaded = nil
+ end
+
def callback(method, record)
callbacks_for(method).each do |callback|
callback.call(method, owner, record)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/associations/collection_proxy.rb new/lib/active_record/associations/collection_proxy.rb
--- old/lib/active_record/associations/collection_proxy.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/associations/collection_proxy.rb 2017-05-12 22:03:36.000000000 +0200
@@ -28,12 +28,9 @@
# is computed directly through SQL and does not trigger by itself the
# instantiation of the actual post records.
class CollectionProxy < Relation
- delegate :exists?, :update_all, :arel, to: :scope
-
def initialize(klass, association) #:nodoc:
@association = association
super klass, klass.arel_table, klass.predicate_builder
- merge! association.scope(nullify: false)
end
def target
@@ -902,19 +899,10 @@
@association
end
- # We don't want this object to be put on the scoping stack, because
- # that could create an infinite loop where we call an @association
- # method, which gets the current scope, which is this object, which
- # delegates to @association, and so on.
- def scoping
- @association.scope.scoping { yield }
- end
-
# Returns a <tt>Relation</tt> object for the records in this association
def scope
- @association.scope
+ @scope ||= @association.scope
end
- alias spawn scope
# Equivalent to <tt>Array#==</tt>. Returns +true+ if the two arrays
# contain the same number of elements and if each element is equal
@@ -1046,6 +1034,7 @@
# person.pets(true) # fetches pets from the database
# # => [#]
def reload
+ @scope = nil
proxy_association.reload
self
end
@@ -1067,20 +1056,51 @@
# person.pets # fetches pets from the database
# # => [#]
def reset
+ @scope = nil
proxy_association.reset
proxy_association.reset_scope
self
end
+ delegate_methods = [
+ QueryMethods,
+ SpawnMethods,
+ ].flat_map { |klass|
+ klass.public_instance_methods(false)
+ } - self.public_instance_methods(false) + [:scoping]
+
+ delegate(*delegate_methods, to: :scope)
+
+ module DelegateExtending # :nodoc:
+ private
+ def method_missing(method, *args, &block)
+ extending_values = association_scope.extending_values
+ if extending_values.any? && (extending_values - self.class.included_modules).any?
+ self.class.include(*extending_values)
+ public_send(method, *args, &block)
+ else
+ super
+ end
+ end
+ end
+
private
def null_scope?
@association.null_scope?
end
+ def association_scope
+ @association.association_scope
+ end
+
def exec_queries
load_target
end
+
+ def respond_to_missing?(method, _)
+ association_scope.respond_to?(method) || super
+ end
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/associations/has_many_association.rb new/lib/active_record/associations/has_many_association.rb
--- old/lib/active_record/associations/has_many_association.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/associations/has_many_association.rb 2017-05-12 22:03:36.000000000 +0200
@@ -40,13 +40,7 @@
def insert_record(record, validate = true, raise = false)
set_owner_attributes(record)
- set_inverse_instance(record)
-
- if raise
- record.save!(:validate => validate)
- else
- record.save(:validate => validate)
- end
+ super
end
def empty?
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/associations/has_many_through_association.rb new/lib/active_record/associations/has_many_through_association.rb
--- old/lib/active_record/associations/has_many_through_association.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/associations/has_many_through_association.rb 2017-05-12 22:03:36.000000000 +0200
@@ -39,11 +39,7 @@
ensure_not_nested
if record.new_record? || record.changed?
- if raise
- record.save!(validate: validate)
- else
- return unless record.save(validate: validate)
- end
+ return unless super
end
save_through_record(record)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/collection_cache_key.rb new/lib/active_record/collection_cache_key.rb
--- old/lib/active_record/collection_cache_key.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/collection_cache_key.rb 2017-05-12 22:03:36.000000000 +0200
@@ -8,17 +8,27 @@
if collection.loaded?
size = collection.size
if size > 0
- timestamp = collection.max_by(×tamp_column).public_send(timestamp_column)
+ timestamp = collection.max_by(×tamp_column)._read_attribute(timestamp_column)
end
else
column_type = type_for_attribute(timestamp_column.to_s)
column = "#{connection.quote_table_name(collection.table_name)}.#{connection.quote_column_name(timestamp_column)}"
+ select_values = "COUNT(*) AS #{connection.quote_column_name("size")}, MAX(%s) AS timestamp"
- query = collection
- .unscope(:select)
- .select("COUNT(*) AS #{connection.quote_column_name("size")}", "MAX(#{column}) AS timestamp")
- .unscope(:order)
- result = connection.select_one(query)
+ if collection.limit_value || collection.offset_value
+ query = collection.spawn
+ query.select_values = [column]
+ subquery_alias = "subquery_for_cache_key"
+ subquery_column = "#{subquery_alias}.#{timestamp_column}"
+ subquery = query.arel.as(subquery_alias)
+ arel = Arel::SelectManager.new(query.engine).project(select_values % subquery_column).from(subquery)
+ else
+ query = collection.unscope(:order)
+ query.select_values = [select_values % column]
+ arel = query.arel
+ end
+
+ result = connection.select_one(arel, nil, query.bound_attributes)
if result.blank?
size = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/abstract/quoting.rb new/lib/active_record/connection_adapters/abstract/quoting.rb
--- old/lib/active_record/connection_adapters/abstract/quoting.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/abstract/quoting.rb 2017-05-12 22:03:36.000000000 +0200
@@ -155,6 +155,14 @@
binds.map(&:value_for_database)
end
+ def type_casted_binds(binds) # :nodoc:
+ if binds.first.is_a?(Array)
+ binds.map { |column, value| type_cast(value, column) }
+ else
+ binds.map { |attr| type_cast(attr.value_for_database) }
+ end
+ end
+
private
def types_which_need_no_typecasting
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/abstract/schema_definitions.rb new/lib/active_record/connection_adapters/abstract/schema_definitions.rb
--- old/lib/active_record/connection_adapters/abstract/schema_definitions.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/abstract/schema_definitions.rb 2017-05-12 22:03:36.000000000 +0200
@@ -107,16 +107,12 @@
private
- def as_options(value, default = {})
- if value.is_a?(Hash)
- value
- else
- default
- end
+ def as_options(value)
+ value.is_a?(Hash) ? value : {}
end
def polymorphic_options
- as_options(polymorphic, options)
+ as_options(polymorphic)
end
def index_options
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/abstract/schema_statements.rb new/lib/active_record/connection_adapters/abstract/schema_statements.rb
--- old/lib/active_record/connection_adapters/abstract/schema_statements.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/abstract/schema_statements.rb 2017-05-12 22:03:36.000000000 +0200
@@ -1022,9 +1022,8 @@
sm_table = quote_table_name(ActiveRecord::Migrator.schema_migrations_table_name)
migrated = select_values("SELECT version FROM #{sm_table}").map(&:to_i)
- paths = migrations_paths.map {|p| "#{p}/[0-9]*_*.rb" }
- versions = Dir[*paths].map do |filename|
- filename.split('/').last.split('_').first.to_i
+ versions = ActiveRecord::Migrator.migration_files(migrations_paths).map do |file|
+ ActiveRecord::Migrator.parse_migration_filename(file).first.to_i
end
unless migrated.include?(version)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/abstract_adapter.rb new/lib/active_record/connection_adapters/abstract_adapter.rb
--- old/lib/active_record/connection_adapters/abstract_adapter.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/abstract_adapter.rb 2017-05-12 22:03:36.000000000 +0200
@@ -425,7 +425,7 @@
# Provides access to the underlying database driver for this adapter. For
# example, this method returns a Mysql2::Client object in case of Mysql2Adapter,
- # and a PGconn object in case of PostgreSQLAdapter.
+ # and a PG::Connection object in case of PostgreSQLAdapter.
#
# This is useful for when you need to call a proprietary method such as
# PostgreSQL's lo_* methods.
@@ -579,14 +579,15 @@
exception
end
- def log(sql, name = "SQL", binds = [], statement_name = nil)
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil)
@instrumenter.instrument(
"sql.active_record",
- :sql => sql,
- :name => name,
- :connection_id => object_id,
- :statement_name => statement_name,
- :binds => binds) { yield }
+ sql: sql,
+ name: name,
+ binds: binds,
+ type_casted_binds: type_casted_binds,
+ statement_name: statement_name,
+ connection_id: object_id) { yield }
rescue => e
raise translate_exception_class(e, sql)
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/abstract_mysql_adapter.rb new/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
--- old/lib/active_record/connection_adapters/abstract_mysql_adapter.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/abstract_mysql_adapter.rb 2017-05-12 22:03:36.000000000 +0200
@@ -324,7 +324,7 @@
def data_sources
sql = "SELECT table_name FROM information_schema.tables "
- sql << "WHERE table_schema = #{quote(@config[:database])}"
+ sql << "WHERE table_schema = DATABASE()"
select_values(sql, 'SCHEMA')
end
@@ -350,7 +350,7 @@
schema, name = extract_schema_qualified_name(table_name)
sql = "SELECT table_name FROM information_schema.tables "
- sql << "WHERE table_schema = #{quote(schema)} AND table_name = #{quote(name)}"
+ sql << "WHERE table_schema = #{schema} AND table_name = #{name}"
select_values(sql, 'SCHEMA').any?
end
@@ -365,7 +365,7 @@
schema, name = extract_schema_qualified_name(view_name)
sql = "SELECT table_name FROM information_schema.tables WHERE table_type = 'VIEW'"
- sql << " AND table_schema = #{quote(schema)} AND table_name = #{quote(name)}"
+ sql << " AND table_schema = #{schema} AND table_name = #{name}"
select_values(sql, 'SCHEMA').any?
end
@@ -414,8 +414,8 @@
select_value(<<-SQL.strip_heredoc, 'SCHEMA')
SELECT table_comment
FROM information_schema.tables
- WHERE table_schema = #{quote(schema)}
- AND table_name = #{quote(name)}
+ WHERE table_schema = #{schema}
+ AND table_name = #{name}
SQL
end
@@ -528,9 +528,9 @@
JOIN information_schema.referential_constraints rc
USING (constraint_schema, constraint_name)
WHERE fk.referenced_column_name IS NOT NULL
- AND fk.table_schema = #{quote(schema)}
- AND fk.table_name = #{quote(name)}
- AND rc.table_name = #{quote(name)}
+ AND fk.table_schema = #{schema}
+ AND fk.table_name = #{name}
+ AND rc.table_name = #{name}
SQL
fk_info.map do |row|
@@ -607,8 +607,8 @@
SELECT column_name
FROM information_schema.key_column_usage
WHERE constraint_name = 'PRIMARY'
- AND table_schema = #{quote(schema)}
- AND table_name = #{quote(name)}
+ AND table_schema = #{schema}
+ AND table_name = #{name}
ORDER BY ordinal_position
SQL
end
@@ -904,8 +904,8 @@
end
def extract_schema_qualified_name(string) # :nodoc:
- schema, name = string.to_s.scan(/[^`.\s]+|`[^`]*`/)
- schema, name = @config[:database], schema unless name
+ schema, name = string.to_s.scan(/[^`.\s]+|`[^`]*`/).map { |s| quote(s) }
+ schema, name = "DATABASE()", schema unless name
[schema, name]
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/mysql/database_statements.rb new/lib/active_record/connection_adapters/mysql/database_statements.rb
--- old/lib/active_record/connection_adapters/mysql/database_statements.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/mysql/database_statements.rb 2017-05-12 22:03:36.000000000 +0200
@@ -73,9 +73,9 @@
# made since we established the connection
@connection.query_options[:database_timezone] = ActiveRecord::Base.default_timezone
- type_casted_binds = binds.map { |attr| type_cast(attr.value_for_database) }
+ type_casted_binds = type_casted_binds(binds)
- log(sql, name, binds) do
+ log(sql, name, binds, type_casted_binds) do
if cache_stmt
cache = @statements[sql] ||= {
stmt: @connection.prepare(sql)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/postgresql/oid/array.rb new/lib/active_record/connection_adapters/postgresql/oid/array.rb
--- old/lib/active_record/connection_adapters/postgresql/oid/array.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/postgresql/oid/array.rb 2017-05-12 22:03:36.000000000 +0200
@@ -23,7 +23,7 @@
when ::String
type_cast_array(@pg_decoder.decode(value), :deserialize)
when Data
- deserialize(value.values)
+ type_cast_array(value.values, :deserialize)
else
super
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/postgresql/oid/bytea.rb new/lib/active_record/connection_adapters/postgresql/oid/bytea.rb
--- old/lib/active_record/connection_adapters/postgresql/oid/bytea.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/postgresql/oid/bytea.rb 2017-05-12 22:03:36.000000000 +0200
@@ -6,7 +6,7 @@
def deserialize(value)
return if value.nil?
return value.to_s if value.is_a?(Type::Binary::Data)
- PGconn.unescape_bytea(super)
+ PG::Connection.unescape_bytea(super)
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/postgresql/quoting.rb new/lib/active_record/connection_adapters/postgresql/quoting.rb
--- old/lib/active_record/connection_adapters/postgresql/quoting.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/postgresql/quoting.rb 2017-05-12 22:03:36.000000000 +0200
@@ -33,7 +33,7 @@
# Quotes schema names for use in SQL queries.
def quote_schema_name(name)
- PGconn.quote_ident(name)
+ PG::Connection.quote_ident(name)
end
def quote_table_name_for_assignment(table, attr)
@@ -42,7 +42,7 @@
# Quotes column names for use in SQL queries.
def quote_column_name(name) # :nodoc:
- @quoted_column_names[name] ||= PGconn.quote_ident(super)
+ @quoted_column_names[name] ||= PG::Connection.quote_ident(super)
end
# Quote date/time values for use in SQL input.
@@ -103,7 +103,7 @@
case value
when Type::Binary::Data
# Return a bind param hash with format as binary.
- # See http://deveiate.org/code/pg/PGconn.html#method-i-exec_prepared-doc
+ # See https://deveiate.org/code/pg/PG/Connection.html#method-i-exec_prepared-doc
# for more information
{ value: value.to_s, format: 1 }
when OID::Xml::Data, OID::Bit::Data
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/postgresql/utils.rb new/lib/active_record/connection_adapters/postgresql/utils.rb
--- old/lib/active_record/connection_adapters/postgresql/utils.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/postgresql/utils.rb 2017-05-12 22:03:36.000000000 +0200
@@ -19,9 +19,9 @@
def quoted
if schema
- PGconn.quote_ident(schema) << SEPARATOR << PGconn.quote_ident(identifier)
+ PG::Connection.quote_ident(schema) << SEPARATOR << PG::Connection.quote_ident(identifier)
else
- PGconn.quote_ident(identifier)
+ PG::Connection.quote_ident(identifier)
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/postgresql_adapter.rb new/lib/active_record/connection_adapters/postgresql_adapter.rb
--- old/lib/active_record/connection_adapters/postgresql_adapter.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/postgresql_adapter.rb 2017-05-12 22:03:36.000000000 +0200
@@ -28,11 +28,11 @@
conn_params[:user] = conn_params.delete(:username) if conn_params[:username]
conn_params[:dbname] = conn_params.delete(:database) if conn_params[:database]
- # Forward only valid config params to PGconn.connect.
- valid_conn_param_keys = PGconn.conndefaults_hash.keys + [:requiressl]
+ # Forward only valid config params to PG::Connection.connect.
+ valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:requiressl]
conn_params.slice!(*valid_conn_param_keys)
- # The postgres drivers don't allow the creation of an unconnected PGconn object,
+ # The postgres drivers don't allow the creation of an unconnected PG::Connection object,
# so just pass a nil connection object for the time being.
ConnectionAdapters::PostgreSQLAdapter.new(nil, logger, conn_params, config)
end
@@ -198,8 +198,8 @@
end
def connection_active?
- @connection.status == PGconn::CONNECTION_OK
- rescue PGError
+ @connection.status == PG::CONNECTION_OK
+ rescue PG::Error
false
end
end
@@ -244,7 +244,7 @@
def active?
@connection.query 'SELECT 1'
true
- rescue PGError
+ rescue PG::Error
false
end
@@ -410,7 +410,7 @@
def translate_exception(exception, message)
return exception unless exception.respond_to?(:result)
- case exception.result.try(:error_field, PGresult::PG_DIAG_SQLSTATE)
+ case exception.result.try(:error_field, PG::PG_DIAG_SQLSTATE)
when UNIQUE_VIOLATION
RecordNotUnique.new(message)
when FOREIGN_KEY_VIOLATION
@@ -594,15 +594,15 @@
end
def exec_no_cache(sql, name, binds)
- type_casted_binds = binds.map { |attr| type_cast(attr.value_for_database) }
- log(sql, name, binds) { @connection.async_exec(sql, type_casted_binds) }
+ type_casted_binds = type_casted_binds(binds)
+ log(sql, name, binds, type_casted_binds) { @connection.async_exec(sql, type_casted_binds) }
end
def exec_cache(sql, name, binds)
stmt_key = prepare_statement(sql)
- type_casted_binds = binds.map { |attr| type_cast(attr.value_for_database) }
+ type_casted_binds = type_casted_binds(binds)
- log(sql, name, binds, stmt_key) do
+ log(sql, name, binds, type_casted_binds, stmt_key) do
@connection.exec_prepared(stmt_key, type_casted_binds)
end
rescue ActiveRecord::StatementInvalid => e
@@ -631,7 +631,7 @@
CACHED_PLAN_HEURISTIC = 'cached plan must not change result type'.freeze
def is_cached_plan_failure?(e)
pgerror = e.cause
- code = pgerror.result.result_error_field(PGresult::PG_DIAG_SQLSTATE)
+ code = pgerror.result.result_error_field(PG::PG_DIAG_SQLSTATE)
code == FEATURE_NOT_SUPPORTED && pgerror.message.include?(CACHED_PLAN_HEURISTIC)
rescue
false
@@ -668,7 +668,7 @@
# Connects to a PostgreSQL server and sets up the adapter depending on the
# connected server's characteristics.
def connect
- @connection = PGconn.connect(@connection_parameters)
+ @connection = PG.connect(@connection_parameters)
configure_connection
rescue ::PG::Error => error
if error.message.include?("does not exist")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/connection_adapters/sqlite3_adapter.rb new/lib/active_record/connection_adapters/sqlite3_adapter.rb
--- old/lib/active_record/connection_adapters/sqlite3_adapter.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/connection_adapters/sqlite3_adapter.rb 2017-05-12 22:03:36.000000000 +0200
@@ -188,9 +188,9 @@
end
def exec_query(sql, name = nil, binds = [], prepare: false)
- type_casted_binds = binds.map { |attr| type_cast(attr.value_for_database) }
+ type_casted_binds = type_casted_binds(binds)
- log(sql, name, binds) do
+ log(sql, name, binds, type_casted_binds) do
# Don't cache statements if they are not prepared
unless prepare
stmt = @connection.prepare(sql)
@@ -203,7 +203,6 @@
ensure
stmt.close
end
- stmt = records
else
cache = @statements[sql] ||= {
:stmt => @connection.prepare(sql)
@@ -212,9 +211,10 @@
cols = cache[:cols] ||= stmt.columns
stmt.reset!
stmt.bind_params(type_casted_binds)
+ records = stmt.to_a
end
- ActiveRecord::Result.new(cols, stmt.to_a)
+ ActiveRecord::Result.new(cols, records)
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/explain.rb new/lib/active_record/explain.rb
--- old/lib/active_record/explain.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/explain.rb 2017-05-12 22:03:36.000000000 +0200
@@ -16,15 +16,14 @@
# Makes the adapter execute EXPLAIN for the tuples of queries and bindings.
# Returns a formatted string ready to be logged.
def exec_explain(queries) # :nodoc:
- str = queries.map do |sql, bind|
- [].tap do |msg|
- msg << "EXPLAIN for: #{sql}"
- unless bind.empty?
- bind_msg = bind.map {|col, val| [col.name, val]}.inspect
- msg.last << " #{bind_msg}"
- end
- msg << connection.explain(sql, bind)
- end.join("\n")
+ str = queries.map do |sql, binds|
+ msg = "EXPLAIN for: #{sql}"
+ unless binds.empty?
+ msg << " "
+ msg << binds.map { |attr| render_bind(attr) }.inspect
+ end
+ msg << "\n"
+ msg << connection.explain(sql, binds)
end.join("\n")
# Overriding inspect to be more human readable, especially in the console.
@@ -34,5 +33,17 @@
str
end
+
+ private
+
+ def render_bind(attr)
+ value = if attr.type.binary? && attr.value
+ "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
+ else
+ connection.type_cast(attr.value_for_database)
+ end
+
+ [attr.name, value]
+ end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/gem_version.rb new/lib/active_record/gem_version.rb
--- old/lib/active_record/gem_version.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/gem_version.rb 2017-05-12 22:03:36.000000000 +0200
@@ -7,7 +7,7 @@
module VERSION
MAJOR = 5
MINOR = 0
- TINY = 2
+ TINY = 3
PRE = nil
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/log_subscriber.rb new/lib/active_record/log_subscriber.rb
--- old/lib/active_record/log_subscriber.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/log_subscriber.rb 2017-05-12 22:03:36.000000000 +0200
@@ -20,20 +20,6 @@
@odd = false
end
- def render_bind(attribute)
- value = if attribute.type.binary? && attribute.value
- if attribute.value.is_a?(Hash)
- "<#{attribute.value_for_database.to_s.bytesize} bytes of binary data>"
- else
- "<#{attribute.value.bytesize} bytes of binary data>"
- end
- else
- attribute.value_for_database
- end
-
- [attribute.name, value]
- end
-
def sql(event)
self.class.runtime += event.duration
return unless logger.debug?
@@ -47,7 +33,10 @@
binds = nil
unless (payload[:binds] || []).empty?
- binds = " " + payload[:binds].map { |attr| render_bind(attr) }.inspect
+ casted_params = type_casted_binds(payload[:binds], payload[:type_casted_binds])
+ binds = " " + payload[:binds].zip(casted_params).map { |attr, value|
+ render_bind(attr, value)
+ }.inspect
end
name = colorize_payload_name(name, payload[:name])
@@ -58,6 +47,20 @@
private
+ def type_casted_binds(binds, casted_binds)
+ casted_binds || ActiveRecord::Base.connection.type_casted_binds(binds)
+ end
+
+ def render_bind(attr, value)
+ if attr.is_a?(Array)
+ attr = attr.first
+ elsif attr.type.binary? && attr.value
+ value = "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
+ end
+
+ [attr && attr.name, value]
+ end
+
def colorize_payload_name(name, payload_name)
if payload_name.blank? || payload_name == "SQL" # SQL vs Model Load/Exists
color(name, MAGENTA, true)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/migration.rb new/lib/active_record/migration.rb
--- old/lib/active_record/migration.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/migration.rb 2017-05-12 22:03:36.000000000 +0200
@@ -1057,10 +1057,6 @@
Array(@migrations_paths)
end
- def match_to_migration_filename?(filename) # :nodoc:
- File.basename(filename) =~ Migration::MigrationFilenameRegexp
- end
-
def parse_migration_filename(filename) # :nodoc:
File.basename(filename).scan(Migration::MigrationFilenameRegexp).first
end
@@ -1068,9 +1064,7 @@
def migrations(paths)
paths = Array(paths)
- files = Dir[*paths.map { |p| "#{p}/**/[0-9]*_*.rb" }]
-
- migrations = files.map do |file|
+ migrations = migration_files(paths).map do |file|
version, name, scope = parse_migration_filename(file)
raise IllegalMigrationNameError.new(file) unless version
version = version.to_i
@@ -1082,6 +1076,30 @@
migrations.sort_by(&:version)
end
+ def migrations_status(paths)
+ paths = Array(paths)
+
+ db_list = ActiveRecord::SchemaMigration.normalized_versions
+
+ file_list = migration_files(paths).map do |file|
+ version, name, scope = parse_migration_filename(file)
+ raise IllegalMigrationNameError.new(file) unless version
+ version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
+ status = db_list.delete(version) ? "up" : "down"
+ [status, version, (name + scope).humanize]
+ end.compact
+
+ db_list.map! do |version|
+ ["up", version, "********** NO FILE **********"]
+ end
+
+ (db_list + file_list).sort_by { |_, version, _| version }
+ end
+
+ def migration_files(paths)
+ Dir[*paths.flat_map { |path| "#{path}/**/[0-9]*_*.rb" }]
+ end
+
private
def move(direction, migrations_paths, steps)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/persistence.rb new/lib/active_record/persistence.rb
--- old/lib/active_record/persistence.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/persistence.rb 2017-05-12 22:03:36.000000000 +0200
@@ -100,6 +100,10 @@
!(@new_record || @destroyed)
end
+ ##
+ # :call-seq:
+ # save(*args)
+ #
# Saves the model.
#
# If the model is new, a record gets created in the database, otherwise
@@ -121,12 +125,16 @@
#
# Attributes marked as readonly are silently ignored if the record is
# being updated.
- def save(*args)
- create_or_update(*args)
+ def save(*args, &block)
+ create_or_update(*args, &block)
rescue ActiveRecord::RecordInvalid
false
end
+ ##
+ # :call-seq:
+ # save!(*args)
+ #
# Saves the model.
#
# If the model is new, a record gets created in the database, otherwise
@@ -148,8 +156,8 @@
#
# Attributes marked as readonly are silently ignored if the record is
# being updated.
- def save!(*args)
- create_or_update(*args) || raise(RecordNotSaved.new("Failed to save the record", self))
+ def save!(*args, &block)
+ create_or_update(*args, &block) || raise(RecordNotSaved.new("Failed to save the record", self))
end
# Deletes the record in the database and freezes this instance to
@@ -535,9 +543,9 @@
self.class.unscoped.where(self.class.primary_key => id)
end
- def create_or_update(*args)
+ def create_or_update(*args, &block)
raise ReadOnlyRecord, "#{self.class} is marked as readonly" if readonly?
- result = new_record? ? _create_record : _update_record(*args)
+ result = new_record? ? _create_record(&block) : _update_record(*args, &block)
result != false
end
@@ -546,10 +554,14 @@
def _update_record(attribute_names = self.attribute_names)
attributes_values = arel_attributes_with_values_for_update(attribute_names)
if attributes_values.empty?
- 0
+ rows_affected = 0
else
- self.class.unscoped._update_record attributes_values, id, id_was
+ rows_affected = self.class.unscoped._update_record attributes_values, id, id_was
end
+
+ yield(self) if block_given?
+
+ rows_affected
end
# Creates a record with values matching those of the instance attributes
@@ -561,6 +573,9 @@
self.id ||= new_id if self.class.primary_key
@new_record = false
+
+ yield(self) if block_given?
+
id
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/railties/databases.rake new/lib/active_record/railties/databases.rake
--- old/lib/active_record/railties/databases.rake 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/railties/databases.rake 2017-05-12 22:03:36.000000000 +0200
@@ -77,6 +77,8 @@
namespace :migrate do
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
task :redo => [:environment, :load_config] do
+ raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
+
if ENV['VERSION']
db_namespace['migrate:down'].invoke
db_namespace['migrate:up'].invoke
@@ -91,16 +93,17 @@
# desc 'Runs the "up" for a given migration VERSION.'
task :up => [:environment, :load_config] do
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
+
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
- raise 'VERSION is required' unless version
ActiveRecord::Migrator.run(:up, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
db_namespace['_dump'].invoke
end
# desc 'Runs the "down" for a given migration VERSION.'
task :down => [:environment, :load_config] do
+ raise "VERSION is required - To go down one migration, use db:rollback" if !ENV["VERSION"] || ENV["VERSION"].empty?
version = ENV['VERSION'] ? ENV['VERSION'].to_i : nil
- raise 'VERSION is required - To go down one migration, run db:rollback' unless version
ActiveRecord::Migrator.run(:down, ActiveRecord::Tasks::DatabaseTasks.migrations_paths, version)
db_namespace['_dump'].invoke
end
@@ -110,28 +113,13 @@
unless ActiveRecord::SchemaMigration.table_exists?
abort 'Schema migrations table does not exist yet.'
end
- db_list = ActiveRecord::SchemaMigration.normalized_versions
- file_list =
- ActiveRecord::Tasks::DatabaseTasks.migrations_paths.flat_map do |path|
- Dir.foreach(path).map do |file|
- next unless ActiveRecord::Migrator.match_to_migration_filename?(file)
-
- version, name, scope = ActiveRecord::Migrator.parse_migration_filename(file)
- version = ActiveRecord::SchemaMigration.normalize_migration_number(version)
- status = db_list.delete(version) ? 'up' : 'down'
- [status, version, (name + scope).humanize]
- end.compact
- end
-
- db_list.map! do |version|
- ['up', version, '********** NO FILE **********']
- end
# output
puts "\ndatabase: #{ActiveRecord::Base.connection_config[:database]}\n\n"
puts "#{'Status'.center(8)} #{'Migration ID'.ljust(14)} Migration Name"
puts "-" * 50
- (db_list + file_list).sort_by { |_, version, _| version }.each do |status, version, name|
+ paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
+ ActiveRecord::Migrator.migrations_status(paths).each do |status, version, name|
puts "#{status.center(8)} #{version.ljust(14)} #{name}"
end
puts
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/relation/calculations.rb new/lib/active_record/relation/calculations.rb
--- old/lib/active_record/relation/calculations.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/relation/calculations.rb 2017-05-12 22:03:36.000000000 +0200
@@ -282,7 +282,7 @@
operation,
distinct).as(aggregate_alias)
]
- select_values += select_values unless having_clause.empty?
+ select_values += self.select_values unless having_clause.empty?
select_values.concat group_columns.map { |aliaz, field|
if field.respond_to?(:as)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/relation/delegation.rb new/lib/active_record/relation/delegation.rb
--- old/lib/active_record/relation/delegation.rb 2017-03-02 00:11:59.000000000 +0100
+++ new/lib/active_record/relation/delegation.rb 2017-05-12 22:03:36.000000000 +0200
@@ -24,6 +24,8 @@
def inherited(child_class)
child_class.initialize_relation_delegate_cache
+ delegate = child_class.relation_delegate_class(ActiveRecord::Associations::CollectionProxy)
+ delegate.include ActiveRecord::Associations::CollectionProxy::DelegateExtending
super
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/tasks/database_tasks.rb new/lib/active_record/tasks/database_tasks.rb
--- old/lib/active_record/tasks/database_tasks.rb 2017-03-02 00:12:00.000000000 +0100
+++ new/lib/active_record/tasks/database_tasks.rb 2017-05-12 22:03:36.000000000 +0200
@@ -154,6 +154,8 @@
end
def migrate
+ raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
+
verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
scope = ENV['SCOPE']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_record/transactions.rb new/lib/active_record/transactions.rb
--- old/lib/active_record/transactions.rb 2017-03-02 00:12:00.000000000 +0100
+++ new/lib/active_record/transactions.rb 2017-05-12 22:03:36.000000000 +0200
@@ -124,7 +124,7 @@
# # statement will cause a PostgreSQL error, even though the unique
# # constraint is no longer violated:
# Number.create(i: 1)
- # # => "PGError: ERROR: current transaction is aborted, commands
+ # # => "PG::Error: ERROR: current transaction is aborted, commands
# # ignored until end of transaction block"
# end
#
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/rails/generators/active_record/migration/migration_generator.rb new/lib/rails/generators/active_record/migration/migration_generator.rb
--- old/lib/rails/generators/active_record/migration/migration_generator.rb 2017-03-02 00:12:00.000000000 +0100
+++ new/lib/rails/generators/active_record/migration/migration_generator.rb 2017-05-12 22:03:36.000000000 +0200
@@ -68,14 +68,6 @@
def normalize_table_name(_table_name)
pluralize_table_names? ? _table_name.pluralize : _table_name.singularize
end
-
- def db_migrate_path
- if defined?(Rails) && Rails.application
- Rails.application.config.paths["db/migrate"].to_ary.first
- else
- "db/migrate"
- end
- end
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/rails/generators/active_record/migration.rb new/lib/rails/generators/active_record/migration.rb
--- old/lib/rails/generators/active_record/migration.rb 2017-03-02 00:12:00.000000000 +0100
+++ new/lib/rails/generators/active_record/migration.rb 2017-05-12 22:03:36.000000000 +0200
@@ -20,6 +20,14 @@
key_type = options[:primary_key_type]
", id: :#{key_type}" if key_type
end
+
+ def db_migrate_path
+ if defined?(Rails.application) && Rails.application
+ Rails.application.config.paths["db/migrate"].to_ary.first
+ else
+ "db/migrate"
+ end
+ end
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/rails/generators/active_record/model/model_generator.rb new/lib/rails/generators/active_record/model/model_generator.rb
--- old/lib/rails/generators/active_record/model/model_generator.rb 2017-03-02 00:12:00.000000000 +0100
+++ new/lib/rails/generators/active_record/model/model_generator.rb 2017-05-12 22:03:36.000000000 +0200
@@ -64,14 +64,6 @@
'app/models/application_record.rb'
end
end
-
- def db_migrate_path
- if defined?(Rails) && Rails.application
- Rails.application.config.paths["db/migrate"].to_ary.first
- else
- "db/migrate"
- end
- end
end
end
end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata
--- old/metadata 2017-03-02 00:11:59.000000000 +0100
+++ new/metadata 2017-05-12 22:03:36.000000000 +0200
@@ -1,14 +1,14 @@
--- !ruby/object:Gem::Specification
name: activerecord
version: !ruby/object:Gem::Version
- version: 5.0.2
+ version: 5.0.3
platform: ruby
authors:
- David Heinemeier Hansson
autorequire:
bindir: bin
cert_chain: []
-date: 2017-03-01 00:00:00.000000000 Z
+date: 2017-05-12 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
name: activesupport
@@ -16,28 +16,28 @@
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 5.0.2
+ version: 5.0.3
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 5.0.2
+ version: 5.0.3
- !ruby/object:Gem::Dependency
name: activemodel
requirement: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 5.0.2
+ version: 5.0.3
type: :runtime
prerelease: false
version_requirements: !ruby/object:Gem::Requirement
requirements:
- - '='
- !ruby/object:Gem::Version
- version: 5.0.2
+ version: 5.0.3
- !ruby/object:Gem::Dependency
name: arel
requirement: !ruby/object:Gem::Requirement
@@ -333,3 +333,4 @@
specification_version: 4
summary: Object-relational mapper framework (part of Rails).
test_files: []
+has_rdoc: