Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
ea2c31e2
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ea2c31e2
编写于
4月 10, 2014
作者:
R
Rafael Mendonça França
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'rm-uuid-fixtures'
上级
53610e51
7edb2045
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
149 addition
and
10 deletion
+149
-10
activerecord/CHANGELOG.md
activerecord/CHANGELOG.md
+6
-0
activerecord/lib/active_record/fixtures.rb
activerecord/lib/active_record/fixtures.rb
+24
-9
activerecord/test/cases/fixtures_test.rb
activerecord/test/cases/fixtures_test.rb
+9
-0
activerecord/test/cases/helper.rb
activerecord/test/cases/helper.rb
+9
-0
activerecord/test/cases/schema_dumper_test.rb
activerecord/test/cases/schema_dumper_test.rb
+1
-1
activerecord/test/fixtures/uuid_children.yml
activerecord/test/fixtures/uuid_children.yml
+3
-0
activerecord/test/fixtures/uuid_parents.yml
activerecord/test/fixtures/uuid_parents.yml
+2
-0
activerecord/test/models/uuid_child.rb
activerecord/test/models/uuid_child.rb
+3
-0
activerecord/test/models/uuid_parent.rb
activerecord/test/models/uuid_parent.rb
+3
-0
activerecord/test/schema/schema.rb
activerecord/test/schema/schema.rb
+9
-0
activesupport/CHANGELOG.md
activesupport/CHANGELOG.md
+5
-0
activesupport/lib/active_support/core_ext/securerandom.rb
activesupport/lib/active_support/core_ext/securerandom.rb
+47
-0
activesupport/test/core_ext/securerandom_test.rb
activesupport/test/core_ext/securerandom_test.rb
+28
-0
未找到文件。
activerecord/CHANGELOG.md
浏览文件 @
ea2c31e2
*
Auto-generate stable fixture UUIDs on PostgreSQL.
Fixes: #11524
*Roderick van Domburg*
*
Fixed a problem where an enum would overwrite values of another enum
with the same name in an unrelated class.
...
...
activerecord/lib/active_record/fixtures.rb
浏览文件 @
ea2c31e2
...
...
@@ -2,6 +2,7 @@
require
'yaml'
require
'zlib'
require
'active_support/dependencies'
require
'active_support/core_ext/securerandom'
require
'active_record/fixture_set/file'
require
'active_record/errors'
...
...
@@ -550,9 +551,13 @@ def self.create_fixtures(fixtures_directory, fixture_set_names, class_names = {}
end
# Returns a consistent, platform-independent identifier for +label+.
# Identifiers are positive integers less than 2^30.
def
self
.
identify
(
label
)
Zlib
.
crc32
(
label
.
to_s
)
%
MAX_ID
# Integer identifiers are values less than 2^30. UUIDs are RFC 4122 version 5 SHA-1 hashes.
def
self
.
identify
(
label
,
column_type
=
:integer
)
if
column_type
==
:uuid
SecureRandom
.
uuid_v5
(
SecureRandom
::
UUID_OID_NAMESPACE
,
label
.
to_s
)
else
Zlib
.
crc32
(
label
.
to_s
)
%
MAX_ID
end
end
# Superclass for the evaluation contexts used by ERB fixtures.
...
...
@@ -633,7 +638,7 @@ def table_rows
# generate a primary key if necessary
if
has_primary_key_column?
&&
!
row
.
include?
(
primary_key_name
)
row
[
primary_key_name
]
=
ActiveRecord
::
FixtureSet
.
identify
(
label
)
row
[
primary_key_name
]
=
ActiveRecord
::
FixtureSet
.
identify
(
label
,
primary_key_type
)
end
# If STI is used, find the correct subclass for association reflection
...
...
@@ -656,7 +661,8 @@ def table_rows
row
[
association
.
foreign_type
]
=
$1
end
row
[
fk_name
]
=
ActiveRecord
::
FixtureSet
.
identify
(
value
)
fk_type
=
association
.
active_record
.
columns_hash
[
association
.
foreign_key
].
type
row
[
fk_name
]
=
ActiveRecord
::
FixtureSet
.
identify
(
value
,
fk_type
)
end
when
:has_many
if
association
.
options
[
:through
]
...
...
@@ -683,6 +689,10 @@ def join_table
def
name
@association
.
name
end
def
primary_key_type
@association
.
klass
.
column_types
[
@association
.
klass
.
primary_key
].
type
end
end
class
HasManyThroughProxy
<
ReflectionProxy
# :nodoc:
...
...
@@ -700,17 +710,22 @@ def primary_key_name
@primary_key_name
||=
model_class
&&
model_class
.
primary_key
end
def
primary_key_type
@primary_key_type
||=
model_class
&&
model_class
.
column_types
[
model_class
.
primary_key
].
type
end
def
add_join_records
(
rows
,
row
,
association
)
# This is the case when the join table has no fixtures file
if
(
targets
=
row
.
delete
(
association
.
name
.
to_s
))
table_name
=
association
.
join_table
lhs_key
=
association
.
lhs_key
rhs_key
=
association
.
rhs_key
table_name
=
association
.
join_table
column_type
=
association
.
primary_key_type
lhs_key
=
association
.
lhs_key
rhs_key
=
association
.
rhs_key
targets
=
targets
.
is_a?
(
Array
)
?
targets
:
targets
.
split
(
/\s*,\s*/
)
rows
[
table_name
].
concat
targets
.
map
{
|
target
|
{
lhs_key
=>
row
[
primary_key_name
],
rhs_key
=>
ActiveRecord
::
FixtureSet
.
identify
(
target
)
}
rhs_key
=>
ActiveRecord
::
FixtureSet
.
identify
(
target
,
column_type
)
}
}
end
end
...
...
activerecord/test/cases/fixtures_test.rb
浏览文件 @
ea2c31e2
...
...
@@ -677,6 +677,12 @@ def test_cache
class
FoxyFixturesTest
<
ActiveRecord
::
TestCase
fixtures
:parrots
,
:parrots_pirates
,
:pirates
,
:treasures
,
:mateys
,
:ships
,
:computers
,
:developers
,
:"admin/accounts"
,
:"admin/users"
if
ActiveRecord
::
Base
.
connection
.
adapter_name
==
'PostgreSQL'
require
'models/uuid_parent'
require
'models/uuid_child'
fixtures
:uuid_parents
,
:uuid_children
end
def
test_identifies_strings
assert_equal
(
ActiveRecord
::
FixtureSet
.
identify
(
"foo"
),
ActiveRecord
::
FixtureSet
.
identify
(
"foo"
))
assert_not_equal
(
ActiveRecord
::
FixtureSet
.
identify
(
"foo"
),
ActiveRecord
::
FixtureSet
.
identify
(
"FOO"
))
...
...
@@ -689,6 +695,9 @@ def test_identifies_symbols
def
test_identifies_consistently
assert_equal
207281424
,
ActiveRecord
::
FixtureSet
.
identify
(
:ruby
)
assert_equal
1066363776
,
ActiveRecord
::
FixtureSet
.
identify
(
:sapphire_2
)
assert_equal
'f92b6bda-0d0d-5fe1-9124-502b18badded'
,
ActiveRecord
::
FixtureSet
.
identify
(
:daddy
,
:uuid
)
assert_equal
'b4b10018-ad47-595d-b42f-d8bdaa6d01bf'
,
ActiveRecord
::
FixtureSet
.
identify
(
:sonny
,
:uuid
)
end
TIMESTAMP_COLUMNS
=
%w(created_at created_on updated_at updated_on)
...
...
activerecord/test/cases/helper.rb
浏览文件 @
ea2c31e2
...
...
@@ -111,6 +111,15 @@ def verify_default_timezone_config
end
end
def
enable_uuid_ossp!
(
connection
)
return
false
unless
connection
.
supports_extensions?
return
true
if
connection
.
extension_enabled?
(
'uuid-ossp'
)
connection
.
enable_extension
'uuid-ossp'
connection
.
commit_db_transaction
connection
.
reconnect!
end
unless
ENV
[
'FIXTURE_DEBUG'
]
module
ActiveRecord::TestFixtures::ClassMethods
def
try_to_load_dependency_with_silence
(
*
args
)
...
...
activerecord/test/cases/schema_dumper_test.rb
浏览文件 @
ea2c31e2
...
...
@@ -63,7 +63,7 @@ def test_types_line_up
next
if
column_set
.
empty?
lengths
=
column_set
.
map
do
|
column
|
if
match
=
column
.
match
(
/t\.(?:integer|decimal|float|datetime|timestamp|time|date|text|binary|string|boolean)\s+"/
)
if
match
=
column
.
match
(
/t\.(?:integer|decimal|float|datetime|timestamp|time|date|text|binary|string|boolean
|uuid
)\s+"/
)
match
[
0
].
length
end
end
...
...
activerecord/test/fixtures/uuid_children.yml
0 → 100644
浏览文件 @
ea2c31e2
sonny
:
uuid_parent
:
daddy
name
:
Sonny
activerecord/test/fixtures/uuid_parents.yml
0 → 100644
浏览文件 @
ea2c31e2
daddy
:
name
:
Daddy
activerecord/test/models/uuid_child.rb
0 → 100644
浏览文件 @
ea2c31e2
class
UuidChild
<
ActiveRecord
::
Base
belongs_to
:uuid_parent
end
activerecord/test/models/uuid_parent.rb
0 → 100644
浏览文件 @
ea2c31e2
class
UuidParent
<
ActiveRecord
::
Base
has_many
:uuid_children
end
activerecord/test/schema/schema.rb
浏览文件 @
ea2c31e2
...
...
@@ -17,6 +17,15 @@ def create_table(*args, &block)
ActiveRecord
::
Base
.
connection
.
create_table
(
*
args
,
&
block
)
ActiveRecord
::
Base
.
connection
.
execute
"SET GENERATOR
#{
args
.
first
}
_seq TO 10000"
end
when
"PostgreSQL"
enable_uuid_ossp!
(
ActiveRecord
::
Base
.
connection
)
create_table
:uuid_parents
,
id: :uuid
,
force:
true
do
|
t
|
t
.
string
:name
end
create_table
:uuid_children
,
id: :uuid
,
force:
true
do
|
t
|
t
.
string
:name
t
.
uuid
:uuid_parent_id
end
end
...
...
activesupport/CHANGELOG.md
浏览文件 @
ea2c31e2
*
Add
`SecureRandom::uuid_v3`
and
`SecureRandom::uuid_v5`
to support stable
UUID fixtures on PostgreSQL.
*Roderick van Domburg*
*
Fixed
`ActiveSupport::Duration#eql?`
so that
`1.second.eql?(1.second)`
is
true.
...
...
activesupport/lib/active_support/core_ext/securerandom.rb
0 → 100644
浏览文件 @
ea2c31e2
module
SecureRandom
UUID_DNS_NAMESPACE
=
"k
\xA7\xB8\x10\x9D\xAD\x11\xD1\x80\xB4\x00\xC0
O
\xD4
0
\xC8
"
#:nodoc:
UUID_URL_NAMESPACE
=
"k
\xA7\xB8\x11\x9D\xAD\x11\xD1\x80\xB4\x00\xC0
O
\xD4
0
\xC8
"
#:nodoc:
UUID_OID_NAMESPACE
=
"k
\xA7\xB8\x12\x9D\xAD\x11\xD1\x80\xB4\x00\xC0
O
\xD4
0
\xC8
"
#:nodoc:
UUID_X500_NAMESPACE
=
"k
\xA7\xB8\x14\x9D\xAD\x11\xD1\x80\xB4\x00\xC0
O
\xD4
0
\xC8
"
#:nodoc:
# Generates a v5 non-random UUID (Universally Unique IDentifier).
#
# Using Digest::MD5 generates version 3 UUIDs; Digest::SHA1 generates version 5 UUIDs.
# ::uuid_from_hash always generates the same UUID for a given name and namespace combination.
#
# See RFC 4122 for details of UUID at: http://www.ietf.org/rfc/rfc4122.txt
def
self
.
uuid_from_hash
(
hash_class
,
uuid_namespace
,
name
)
if
hash_class
==
Digest
::
MD5
version
=
3
elsif
hash_class
==
Digest
::
SHA1
version
=
5
else
raise
ArgumentError
,
"Expected Digest::SHA1 or Digest::MD5, got
#{
hash_class
.
name
}
."
end
hash
=
hash_class
.
new
hash
.
update
(
uuid_namespace
)
hash
.
update
(
name
)
ary
=
hash
.
digest
.
unpack
(
'NnnnnN'
)
ary
[
2
]
=
(
ary
[
2
]
&
0x0FFF
)
|
(
version
<<
12
)
ary
[
3
]
=
(
ary
[
3
]
&
0x3FFF
)
|
0x8000
"%08x-%04x-%04x-%04x-%04x%08x"
%
ary
end
# Convenience method for ::uuid_from_hash using Digest::MD5.
def
self
.
uuid_v3
(
uuid_namespace
,
name
)
self
.
uuid_from_hash
(
Digest
::
MD5
,
uuid_namespace
,
name
)
end
# Convenience method for ::uuid_from_hash using Digest::SHA1.
def
self
.
uuid_v5
(
uuid_namespace
,
name
)
self
.
uuid_from_hash
(
Digest
::
SHA1
,
uuid_namespace
,
name
)
end
class
<<
self
# Alias for ::uuid.
alias_method
:uuid_v4
,
:uuid
end
end
activesupport/test/core_ext/securerandom_test.rb
0 → 100644
浏览文件 @
ea2c31e2
require
'abstract_unit'
require
'active_support/core_ext/securerandom'
class
SecureRandomExt
<
ActiveSupport
::
TestCase
def
test_v3_uuids
assert_equal
"3d813cbb-47fb-32ba-91df-831e1593ac29"
,
SecureRandom
.
uuid_v3
(
SecureRandom
::
UUID_DNS_NAMESPACE
,
"www.widgets.com"
)
assert_equal
"86df55fb-428e-3843-8583-ba3c05f290bc"
,
SecureRandom
.
uuid_v3
(
SecureRandom
::
UUID_URL_NAMESPACE
,
"http://www.widgets.com"
)
assert_equal
"8c29ab0e-a2dc-3482-b5eb-20cb2e2387a1"
,
SecureRandom
.
uuid_v3
(
SecureRandom
::
UUID_OID_NAMESPACE
,
"1.2.3"
)
assert_equal
"ee49149d-53a4-304a-890b-468229f6afc3"
,
SecureRandom
.
uuid_v3
(
SecureRandom
::
UUID_X500_NAMESPACE
,
"cn=John Doe, ou=People, o=Acme, Inc., c=US"
)
end
def
test_v5_uuids
assert_equal
"21f7f8de-8051-5b89-8680-0195ef798b6a"
,
SecureRandom
.
uuid_v5
(
SecureRandom
::
UUID_DNS_NAMESPACE
,
"www.widgets.com"
)
assert_equal
"4e570fd8-186d-5a74-90f0-4d28e34673a1"
,
SecureRandom
.
uuid_v5
(
SecureRandom
::
UUID_URL_NAMESPACE
,
"http://www.widgets.com"
)
assert_equal
"42d5e23b-3a02-5135-85c6-52d1102f1f00"
,
SecureRandom
.
uuid_v5
(
SecureRandom
::
UUID_OID_NAMESPACE
,
"1.2.3"
)
assert_equal
"fd5b2ddf-bcfe-58b6-90d6-db50f74db527"
,
SecureRandom
.
uuid_v5
(
SecureRandom
::
UUID_X500_NAMESPACE
,
"cn=John Doe, ou=People, o=Acme, Inc., c=US"
)
end
def
test_uuid_v4_alias
assert_equal
SecureRandom
.
method
(
:uuid_v4
),
SecureRandom
.
method
(
:uuid
)
end
def
test_invalid_hash_class
assert_raise
ArgumentError
do
SecureRandom
.
uuid_from_hash
(
Digest
::
SHA2
,
SecureRandom
::
UUID_OID_NAMESPACE
,
'1.2.3'
)
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录