Created
July 15, 2014 22:46
-
-
Save rafaelfranca/6d5ff1c74f6f6e8efbe5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb | |
index 4cd5f92..4306b36 100644 | |
--- a/activerecord/lib/active_record/fixtures.rb | |
+++ b/activerecord/lib/active_record/fixtures.rb | |
@@ -2,7 +2,7 @@ require 'erb' | |
require 'yaml' | |
require 'zlib' | |
require 'active_support/dependencies' | |
-require 'active_support/core_ext/securerandom' | |
+require 'active_support/core_ext/digest/uuid' | |
require 'active_record/fixture_set/file' | |
require 'active_record/errors' | |
@@ -551,7 +551,7 @@ module ActiveRecord | |
# 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) | |
+ Digest::UUID.uuid_v5(Digest::UUID::OID_NAMESPACE, label.to_s) | |
else | |
Zlib.crc32(label.to_s) % MAX_ID | |
end | |
diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md | |
index a667332..214722a 100644 | |
--- a/activesupport/CHANGELOG.md | |
+++ b/activesupport/CHANGELOG.md | |
@@ -160,7 +160,7 @@ | |
*Bogdan Gusiev* | |
-* Add `SecureRandom::uuid_v3` and `SecureRandom::uuid_v5` to support stable | |
+* Add `Digest::UUID::uuid_v3` and `Digest::UUID::uuid_v5` to support stable | |
UUID fixtures on PostgreSQL. | |
*Roderick van Domburg* | |
diff --git a/activesupport/lib/active_support/core_ext/digest/uuid.rb b/activesupport/lib/active_support/core_ext/digest/uuid.rb | |
new file mode 100644 | |
index 0000000..593c51b | |
--- /dev/null | |
+++ b/activesupport/lib/active_support/core_ext/digest/uuid.rb | |
@@ -0,0 +1,51 @@ | |
+require 'securerandom' | |
+ | |
+module Digest | |
+ module UUID | |
+ DNS_NAMESPACE = "k\xA7\xB8\x10\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: | |
+ URL_NAMESPACE = "k\xA7\xB8\x11\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: | |
+ OID_NAMESPACE = "k\xA7\xB8\x12\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: | |
+ X500_NAMESPACE = "k\xA7\xB8\x14\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\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 | |
+ | |
+ # Convenience method for SecureRandom.uuid. | |
+ def self.uuid_v4 | |
+ SecureRandom.uuid | |
+ end | |
+ end | |
+end | |
diff --git a/activesupport/lib/active_support/core_ext/securerandom.rb b/activesupport/lib/active_support/core_ext/securerandom.rb | |
deleted file mode 100644 | |
index ff1eb52..0000000 | |
--- a/activesupport/lib/active_support/core_ext/securerandom.rb | |
+++ /dev/null | |
@@ -1,47 +0,0 @@ | |
-module SecureRandom #:nodoc: | |
- UUID_DNS_NAMESPACE = "k\xA7\xB8\x10\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: | |
- UUID_URL_NAMESPACE = "k\xA7\xB8\x11\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: | |
- UUID_OID_NAMESPACE = "k\xA7\xB8\x12\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\xC8" #:nodoc: | |
- UUID_X500_NAMESPACE = "k\xA7\xB8\x14\x9D\xAD\x11\xD1\x80\xB4\x00\xC0O\xD40\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) #:nodoc: | |
- 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) #:nodoc: | |
- 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) #:nodoc: | |
- self.uuid_from_hash(Digest::SHA1, uuid_namespace, name) | |
- end | |
- | |
- class << self | |
- # Alias for ::uuid. | |
- alias_method :uuid_v4, :uuid | |
- end | |
-end | |
diff --git a/activesupport/test/core_ext/digest/uuid_test.rb b/activesupport/test/core_ext/digest/uuid_test.rb | |
new file mode 100644 | |
index 0000000..08e0a1d | |
--- /dev/null | |
+++ b/activesupport/test/core_ext/digest/uuid_test.rb | |
@@ -0,0 +1,24 @@ | |
+require 'abstract_unit' | |
+require 'active_support/core_ext/digest/uuid' | |
+ | |
+class DigestUUIDExt < ActiveSupport::TestCase | |
+ def test_v3_uuids | |
+ assert_equal "3d813cbb-47fb-32ba-91df-831e1593ac29", Digest::UUID.uuid_v3(Digest::UUID::DNS_NAMESPACE, "www.widgets.com") | |
+ assert_equal "86df55fb-428e-3843-8583-ba3c05f290bc", Digest::UUID.uuid_v3(Digest::UUID::URL_NAMESPACE, "http://www.widgets.com") | |
+ assert_equal "8c29ab0e-a2dc-3482-b5eb-20cb2e2387a1", Digest::UUID.uuid_v3(Digest::UUID::OID_NAMESPACE, "1.2.3") | |
+ assert_equal "ee49149d-53a4-304a-890b-468229f6afc3", Digest::UUID.uuid_v3(Digest::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", Digest::UUID.uuid_v5(Digest::UUID::DNS_NAMESPACE, "www.widgets.com") | |
+ assert_equal "4e570fd8-186d-5a74-90f0-4d28e34673a1", Digest::UUID.uuid_v5(Digest::UUID::URL_NAMESPACE, "http://www.widgets.com") | |
+ assert_equal "42d5e23b-3a02-5135-85c6-52d1102f1f00", Digest::UUID.uuid_v5(Digest::UUID::OID_NAMESPACE, "1.2.3") | |
+ assert_equal "fd5b2ddf-bcfe-58b6-90d6-db50f74db527", Digest::UUID.uuid_v5(Digest::UUID::X500_NAMESPACE, "cn=John Doe, ou=People, o=Acme, Inc., c=US") | |
+ end | |
+ | |
+ def test_invalid_hash_class | |
+ assert_raise ArgumentError do | |
+ Digest::UUID.uuid_from_hash(Digest::SHA2, Digest::UUID::OID_NAMESPACE, '1.2.3') | |
+ end | |
+ end | |
+end | |
diff --git a/activesupport/test/core_ext/securerandom_test.rb b/activesupport/test/core_ext/securerandom_test.rb | |
deleted file mode 100644 | |
index 71980f6..0000000 | |
--- a/activesupport/test/core_ext/securerandom_test.rb | |
+++ /dev/null | |
@@ -1,28 +0,0 @@ | |
-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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment