uuvula 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/uuvula.rb +84 -0
- metadata +77 -0
data/lib/uuvula.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'activerecord'
|
2
|
+
# This module adds support for reading and writing UUIDs from
|
3
|
+
# the database, assuming a BINARY(16) or VARBINARY(16) column UUID.
|
4
|
+
#
|
5
|
+
# Ideally, we could add a new attribute typecast to Rails, but this is
|
6
|
+
# non-trivial in Rails 2
|
7
|
+
#
|
8
|
+
# TODO: Add support for configurable UUID column name.
|
9
|
+
# TODO: Refactor into a gem.
|
10
|
+
module Uuvula
|
11
|
+
def self.included(mod)
|
12
|
+
mod.extend(ClassMethods)
|
13
|
+
class << mod
|
14
|
+
alias_method_chain :sanitize_sql_hash_for_conditions, :uuid_support
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.convert_uuid_to_raw(value)
|
19
|
+
case value
|
20
|
+
when UUIDTools::UUID
|
21
|
+
value.raw
|
22
|
+
when String
|
23
|
+
case value.size
|
24
|
+
when 36, 32
|
25
|
+
value = value.gsub('-','')
|
26
|
+
UUIDTools::UUID.parse_hexdigest(value).raw
|
27
|
+
when 16
|
28
|
+
value
|
29
|
+
end
|
30
|
+
else
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.define_uuid_reader(mod, column_name)
|
36
|
+
method_body = <<-EOF
|
37
|
+
def #{column_name}
|
38
|
+
value = read_attribute_before_type_cast('#{column_name}')
|
39
|
+
UUIDTools::UUID.parse_raw(value).hexdigest if value
|
40
|
+
end
|
41
|
+
EOF
|
42
|
+
mod.send(:class_eval, method_body, __FILE__, __LINE__)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.define_uuid_writer(mod, column_name)
|
46
|
+
method_body = <<-EOF
|
47
|
+
def #{column_name}=(value)
|
48
|
+
write_attribute('#{column_name}', Uuvula.convert_uuid_to_raw(value))
|
49
|
+
end
|
50
|
+
EOF
|
51
|
+
mod.send(:class_eval, method_body, __FILE__, __LINE__)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.define_callbacks(mod, column_name)
|
55
|
+
method_body = <<-EOF
|
56
|
+
def _generate_uuid
|
57
|
+
if self.#{column_name}.blank?
|
58
|
+
self.#{column_name} = UUIDTools::UUID.timestamp_create
|
59
|
+
end
|
60
|
+
end
|
61
|
+
EOF
|
62
|
+
mod.send(:class_eval, method_body, __FILE__, __LINE__)
|
63
|
+
mod.send(:before_save, :_generate_uuid)
|
64
|
+
end
|
65
|
+
|
66
|
+
module ClassMethods
|
67
|
+
def uuid_column(column_name = :uuid)
|
68
|
+
@uuid_column_name = column_name.to_sym
|
69
|
+
Uuvula.define_uuid_reader(self, @uuid_column_name)
|
70
|
+
Uuvula.define_uuid_writer(self, @uuid_column_name)
|
71
|
+
Uuvula.define_callbacks(self, @uuid_column_name)
|
72
|
+
end
|
73
|
+
|
74
|
+
def sanitize_sql_hash_for_conditions_with_uuid_support(attrs, table_name = quoted_table_name)
|
75
|
+
if @uuid_column_name && attrs.has_key?(@uuid_column_name)
|
76
|
+
attrs[@uuid_column_name] = Uuvula.convert_uuid_to_raw(attrs[@uuid_column_name])
|
77
|
+
end
|
78
|
+
sanitize_sql_hash_for_conditions_without_uuid_support(attrs, table_name)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# TODO: leftover from before porting to a gem. Clean up.
|
84
|
+
ActiveRecord::Base.send(:include, Uuvula)
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: uuvula
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Alexander Rakoczy
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-17 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: uuidtools
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.1.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.1.2
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rails
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.3.2
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.3.2
|
46
|
+
description: A better way to do UUID in Rails 2/3
|
47
|
+
email: arakoczy@gmail.com
|
48
|
+
executables: []
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files: []
|
51
|
+
files:
|
52
|
+
- lib/uuvula.rb
|
53
|
+
homepage: http://rubygems.org/gems/hola
|
54
|
+
licenses: []
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 1.8.24
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: Hola!
|
77
|
+
test_files: []
|