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.
Files changed (2) hide show
  1. data/lib/uuvula.rb +84 -0
  2. 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: []