has_uuid 0.0.2
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.markdown +60 -0
- data/Rakefile +23 -0
- data/has_uuid.gemspec +24 -0
- data/lib/has_uuid/version.rb +3 -0
- data/lib/has_uuid.rb +71 -0
- data/rails/init.rb +1 -0
- data/test/has_uuid_test.rb +83 -0
- data/test/test_helper.rb +18 -0
- metadata +133 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 Norbert Crombach
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
has_uuid
|
2
|
+
========
|
3
|
+
|
4
|
+
[has_uuid](http://github.com/troessner/has_uuid) provides basic [UUID](http://en.wikipedia.org/wiki/Universally_Unique_Identifier) assignment methods for ActiveRecord objects.
|
5
|
+
|
6
|
+
It depends on the [uuidtools](http://uuidtools.rubyforge.org/) gem.
|
7
|
+
|
8
|
+
This is a fork - full credits for the source code go to [has_uuid](http://github.com/norbert/has_uuid).
|
9
|
+
What I changed:
|
10
|
+
a) Made it rails 3.1 compatible.
|
11
|
+
b) Bundler'ized it - you can now use and manage it as a gem, not as a rails plugin.
|
12
|
+
|
13
|
+
Installation
|
14
|
+
------------
|
15
|
+
|
16
|
+
Add
|
17
|
+
|
18
|
+
>> gem 'has_uuid'
|
19
|
+
|
20
|
+
to your Gemfile and run
|
21
|
+
|
22
|
+
>> bundle install
|
23
|
+
|
24
|
+
Usage
|
25
|
+
-----
|
26
|
+
|
27
|
+
class Post < ActiveRecord::Base
|
28
|
+
# automatically assign a UUID to the "uuid" column on create
|
29
|
+
has_uuid
|
30
|
+
end
|
31
|
+
|
32
|
+
class Comment < ActiveRecord::Base
|
33
|
+
# skip assignment on create
|
34
|
+
has_uuid :auto => false
|
35
|
+
end
|
36
|
+
|
37
|
+
class User < ActiveRecord::Base
|
38
|
+
# store the UUID in the "token" column, generate version 1 UUIDs
|
39
|
+
has_uuid :column => :token, :generator => :timestamp
|
40
|
+
end
|
41
|
+
|
42
|
+
# assign a UUID if a valid one is not already present
|
43
|
+
@post.assign_uuid
|
44
|
+
|
45
|
+
# assign a UUID, replacing whatever is already there
|
46
|
+
@post.assign_uuid(:force => true)
|
47
|
+
|
48
|
+
# assign a UUID and save, replacing whatever is there
|
49
|
+
@post.assign_uuid!
|
50
|
+
|
51
|
+
# check if the current UUID is valid
|
52
|
+
@post.uuid_valid?
|
53
|
+
|
54
|
+
|
55
|
+
Credits
|
56
|
+
-------
|
57
|
+
|
58
|
+
* Norbert Crombach
|
59
|
+
* Todd Eichel
|
60
|
+
* Joerg Batterman
|
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
|
4
|
+
desc 'Default: run unit tests.'
|
5
|
+
task :default => :test
|
6
|
+
|
7
|
+
desc 'Test the has_uuid plugin.'
|
8
|
+
Rake::TestTask.new(:test) do |t|
|
9
|
+
t.libs << 'lib'
|
10
|
+
t.pattern = 'test/**/*_test.rb'
|
11
|
+
t.verbose = true
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'Generate documentation for the has_uuid plugin.'
|
15
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'has_uuid'
|
18
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
19
|
+
rdoc.rdoc_files.include('README')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'bundler/gem_tasks'
|
data/has_uuid.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "has_uuid/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "has_uuid"
|
7
|
+
s.version = HasUuid::VERSION
|
8
|
+
s.authors = ["Timo Rößner"]
|
9
|
+
s.email = ["timo.roessner@googlemail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{The has_uuid gem adds a UUID to your AR models.}
|
12
|
+
s.description = %q{The has_uuid gem adds a UUID to your AR models. See the README for details.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "has_uuid"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
s.add_dependency 'activerecord'
|
21
|
+
s.add_dependency 'uuidtools'
|
22
|
+
s.add_development_dependency 'rake'
|
23
|
+
s.add_development_dependency 'sqlite3'
|
24
|
+
end
|
data/lib/has_uuid.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'uuidtools'
|
2
|
+
|
3
|
+
module ActiveRecord #:nodoc:
|
4
|
+
module Acts #:nodoc:
|
5
|
+
# Use this extension to assign a UUID to your models.
|
6
|
+
#
|
7
|
+
# Example:
|
8
|
+
#
|
9
|
+
# class Post < ActiveRecord::Base
|
10
|
+
# has_uuid
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# That is all.
|
14
|
+
module HasUuid
|
15
|
+
GENERATORS = [:random, :timestamp] #:nodoc:
|
16
|
+
|
17
|
+
# Configuration options are:
|
18
|
+
#
|
19
|
+
# * <tt>:column</tt> - specifies the column in which to store the UUID (default: +uuid+).
|
20
|
+
# * <tt>:auto</tt> - specifies whether the plugin should assign a UUID on create (default: true).
|
21
|
+
# * <tt>:generator</tt> - sets the UUID generator. Possible values are <tt>:random</tt> for version 4 (default) and <tt>:timestamp</tt> for version 1.
|
22
|
+
def has_uuid(options = {})
|
23
|
+
options.reverse_merge!(:auto => true, :generator => :random, :column => :uuid)
|
24
|
+
raise ArgumentError, "invalid UUID generator" unless GENERATORS.include?(options[:generator])
|
25
|
+
|
26
|
+
class_eval do
|
27
|
+
send :include, InstanceMethods # hide include from RDoc
|
28
|
+
|
29
|
+
if options[:auto]
|
30
|
+
# always applies to subclasses
|
31
|
+
before_validation(:on => :create) { assign_uuid }
|
32
|
+
end
|
33
|
+
|
34
|
+
class_inheritable_reader :uuid_column
|
35
|
+
write_inheritable_attribute :uuid_column, options[:column]
|
36
|
+
|
37
|
+
class_inheritable_reader :uuid_generator
|
38
|
+
write_inheritable_attribute :uuid_generator, options[:generator]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
module InstanceMethods #:nodoc:
|
43
|
+
def assign_uuid(options = {})
|
44
|
+
return if uuid_valid? unless options[:force]
|
45
|
+
|
46
|
+
uuid = UUIDTools::UUID.send("#{uuid_generator}_create").to_s
|
47
|
+
send("#{uuid_column}=", uuid)
|
48
|
+
end
|
49
|
+
|
50
|
+
def assign_uuid!
|
51
|
+
assign_uuid(:force => true)
|
52
|
+
save!
|
53
|
+
end
|
54
|
+
|
55
|
+
def uuid_valid?
|
56
|
+
uuid = send(uuid_column)
|
57
|
+
return false if uuid.blank?
|
58
|
+
begin
|
59
|
+
UUIDTools::UUID.parse(uuid).kind_of?(UUIDTools::UUID)
|
60
|
+
rescue ArgumentError, TypeError
|
61
|
+
false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
ActiveRecord::Base.class_eval do
|
70
|
+
extend ActiveRecord::Acts::HasUuid
|
71
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'has_uuid'
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class Widget < ActiveRecord::Base
|
4
|
+
has_uuid
|
5
|
+
end
|
6
|
+
|
7
|
+
class Thingy < ActiveRecord::Base
|
8
|
+
has_uuid :auto => false
|
9
|
+
end
|
10
|
+
|
11
|
+
class HasUuidTest < Test::Unit::TestCase
|
12
|
+
def test_should_assign_uuid
|
13
|
+
@widget = Widget.new
|
14
|
+
@widget.assign_uuid
|
15
|
+
assert @widget.new_record?
|
16
|
+
assert @widget.uuid_valid?
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_force_assign_uuid
|
20
|
+
original_uuid = UUIDTools::UUID.random_create.to_s
|
21
|
+
@widget = Widget.new(:uuid => original_uuid)
|
22
|
+
@widget.assign_uuid(:force => true)
|
23
|
+
assert_not_equal original_uuid, @widget.uuid
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_force_assign_uuid_and_save
|
27
|
+
@widget = Widget.new
|
28
|
+
@widget.assign_uuid!
|
29
|
+
assert !@widget.new_record?
|
30
|
+
assert @widget.uuid_valid?
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_assign_uuid_on_create
|
34
|
+
@widget = Widget.new
|
35
|
+
assert_nil @widget.uuid
|
36
|
+
@widget.save
|
37
|
+
@widget.reload
|
38
|
+
assert @widget.uuid_valid?
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_check_uuid_validity
|
42
|
+
@widget = Widget.new
|
43
|
+
assert !@widget.uuid_valid?
|
44
|
+
@widget.uuid = "test"
|
45
|
+
assert !@widget.uuid_valid?
|
46
|
+
@widget.uuid = UUIDTools::UUID.random_create.to_s
|
47
|
+
assert @widget.uuid_valid?
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_should_not_overwrite_valid_uuid
|
51
|
+
manual_uuid = UUIDTools::UUID.random_create.to_s
|
52
|
+
@widget = Widget.new(:uuid => manual_uuid)
|
53
|
+
@widget.save
|
54
|
+
assert_equal manual_uuid, @widget.uuid
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_should_assign_uuid_when_nil
|
58
|
+
@widget = Widget.new
|
59
|
+
@widget.save
|
60
|
+
assert @widget.uuid_valid?
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_should_assign_uuid_when_blank
|
64
|
+
@widget = Widget.new(:uuid => "")
|
65
|
+
@widget.save
|
66
|
+
assert @widget.uuid_valid?
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_should_assign_uuid_when_invalid
|
70
|
+
@widget = Widget.new(:uuid => "test")
|
71
|
+
assert !@widget.uuid_valid?
|
72
|
+
@widget.save
|
73
|
+
assert @widget.uuid_valid?
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_should_not_assign_uuid_on_create_for_thingies
|
77
|
+
# such a weird name for a class
|
78
|
+
@thingy = Thingy.new
|
79
|
+
@thingy.save
|
80
|
+
@thingy.reload
|
81
|
+
assert_nil @thingy.uuid
|
82
|
+
end
|
83
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
require 'active_record'
|
4
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
5
|
+
|
6
|
+
require File.dirname(__FILE__) + '/../lib/has_uuid'
|
7
|
+
|
8
|
+
silence_stream(STDOUT) do
|
9
|
+
ActiveRecord::Schema.define do
|
10
|
+
create_table :widgets do |t|
|
11
|
+
t.string :uuid
|
12
|
+
end
|
13
|
+
|
14
|
+
create_table :thingies do |t|
|
15
|
+
t.string :uuid
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: has_uuid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- !binary |
|
14
|
+
VGltbyBSw7bDn25lcg==
|
15
|
+
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
|
20
|
+
date: 2011-07-31 00:00:00 Z
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
name: activerecord
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
name: uuidtools
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
name: rake
|
61
|
+
type: :development
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: *id003
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
name: sqlite3
|
75
|
+
type: :development
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: *id004
|
78
|
+
description: The has_uuid gem adds a UUID to your AR models. See the README for details.
|
79
|
+
email:
|
80
|
+
- timo.roessner@googlemail.com
|
81
|
+
executables: []
|
82
|
+
|
83
|
+
extensions: []
|
84
|
+
|
85
|
+
extra_rdoc_files: []
|
86
|
+
|
87
|
+
files:
|
88
|
+
- .gitignore
|
89
|
+
- Gemfile
|
90
|
+
- LICENSE
|
91
|
+
- README.markdown
|
92
|
+
- Rakefile
|
93
|
+
- has_uuid.gemspec
|
94
|
+
- lib/has_uuid.rb
|
95
|
+
- lib/has_uuid/version.rb
|
96
|
+
- rails/init.rb
|
97
|
+
- test/has_uuid_test.rb
|
98
|
+
- test/test_helper.rb
|
99
|
+
homepage: ""
|
100
|
+
licenses: []
|
101
|
+
|
102
|
+
post_install_message:
|
103
|
+
rdoc_options: []
|
104
|
+
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 3
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
version: "0"
|
116
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 3
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
requirements: []
|
126
|
+
|
127
|
+
rubyforge_project: has_uuid
|
128
|
+
rubygems_version: 1.7.2
|
129
|
+
signing_key:
|
130
|
+
specification_version: 3
|
131
|
+
summary: The has_uuid gem adds a UUID to your AR models.
|
132
|
+
test_files: []
|
133
|
+
|