libuuidrb 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/Manifest +12 -0
- data/README +36 -0
- data/Rakefile +26 -0
- data/ext/extconf.rb +10 -0
- data/ext/lib_uuid.c +236 -0
- data/ext/lib_uuid.h +11 -0
- data/ext/uuid_base64.c +52 -0
- data/ext/uuid_base64.h +20 -0
- data/libuuidrb.gemspec +32 -0
- data/test/test_compatibility.rb +36 -0
- data/test/test_functionality.rb +109 -0
- metadata +87 -0
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2010 Sebastian Ohm. All rights reserved.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to
|
5
|
+
deal in the Software without restriction, including without limitation the
|
6
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
7
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
18
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
19
|
+
IN THE SOFTWARE.
|
data/Manifest
ADDED
data/README
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
libuuidrb uses e2fsprogs'[1] libuuid (<uuid/uuid.h>) to generate DCE
|
2
|
+
compatible universally unique identifiers.
|
3
|
+
|
4
|
+
0. prerequesites
|
5
|
+
|
6
|
+
$ irb
|
7
|
+
>> require 'lib_uuid'
|
8
|
+
|
9
|
+
1. generating
|
10
|
+
|
11
|
+
>> u = LibUUID::UUID.new
|
12
|
+
=> #<LibUUID::UUID:0x969decc>
|
13
|
+
>> u.to_guid # => "965555c1-2860-47f5-a3f5-a9c83a3b0b5e"
|
14
|
+
>> u.to_short_guid # => "llVVwShgR_Wj9anIOjsLXg"
|
15
|
+
|
16
|
+
or
|
17
|
+
|
18
|
+
>> LibUUID::UUID.guid # => "ca220b11-a974-4c1d-99d1-78c32d997848"
|
19
|
+
>> LibUUID::UUID.short_guid # => "8fPommPCQ7y1BSh55d7kFw"
|
20
|
+
|
21
|
+
2. parsing
|
22
|
+
|
23
|
+
>> v = LibUUID::UUID.new(u.to_guid) # => #<LibUUID::UUID:0x9696b2c>
|
24
|
+
>> w = LibUUID::UUID.new(u.to_short_guid) # => #<LibUUID::UUID:0x9693684>
|
25
|
+
>> u == v # => true
|
26
|
+
>> u == w # => true
|
27
|
+
|
28
|
+
3. validating
|
29
|
+
|
30
|
+
>> LibUUID::UUID.valid? u.to_guid # => true
|
31
|
+
>> LibUUID::UUID.valid? v.to_short_guid # => true
|
32
|
+
>> LibUUID::UUID.valid? u.to_guid, v.to_guid, w.to_short_guid # => true
|
33
|
+
>> LibUUID::UUID.valid? 'foo' # => false
|
34
|
+
|
35
|
+
|
36
|
+
[1] http://e2fsprogs.sourceforge.net/
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
begin
|
2
|
+
require 'rubygems'
|
3
|
+
require 'rake'
|
4
|
+
require 'echoe'
|
5
|
+
|
6
|
+
Echoe.new('libuuidrb', '0.1.0') do |p|
|
7
|
+
p.author = 'Sebastian Ohm'
|
8
|
+
p.url = 'http://github.com/ohm/libuuidrb'
|
9
|
+
p.description = 'libuuidrb uses libuuid to generate DCE compatible universally unique identifiers'
|
10
|
+
p.ignore_pattern = ['tmp/*', 'script/*', 'benchmark/*']
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'valgrind functional tests'
|
15
|
+
task :valgrind do
|
16
|
+
opts = %W(
|
17
|
+
--partial-loads-ok=yes
|
18
|
+
--undef-value-errors=no
|
19
|
+
--leak-check=full
|
20
|
+
)
|
21
|
+
|
22
|
+
sh "valgrind #{opts.join(' ')} ruby test/test_functionality.rb"
|
23
|
+
end
|
24
|
+
rescue LoadError => le
|
25
|
+
puts "#{le.message}"
|
26
|
+
end
|
data/ext/extconf.rb
ADDED
data/ext/lib_uuid.c
ADDED
@@ -0,0 +1,236 @@
|
|
1
|
+
#include <ruby.h>
|
2
|
+
#include <uuid/uuid.h>
|
3
|
+
|
4
|
+
#include "uuid_base64.h"
|
5
|
+
#include "lib_uuid.h"
|
6
|
+
|
7
|
+
void
|
8
|
+
lib_uuid_free(lib_uuid_t *s)
|
9
|
+
{
|
10
|
+
free(s);
|
11
|
+
}
|
12
|
+
|
13
|
+
int
|
14
|
+
uuid_from_obj(VALUE obj, uuid_t uu)
|
15
|
+
{
|
16
|
+
long len;
|
17
|
+
char *ptr;
|
18
|
+
|
19
|
+
if( TYPE(obj) != T_STRING )
|
20
|
+
return -1;
|
21
|
+
|
22
|
+
len = RSTRING_LEN(obj);
|
23
|
+
ptr = RSTRING_PTR(obj);
|
24
|
+
|
25
|
+
if( len == GUID_STRLEN-1 )
|
26
|
+
return uuid_parse(ptr, uu);
|
27
|
+
|
28
|
+
if( len == SHORT_GUID_STRLEN-1)
|
29
|
+
return uuid_decode64(ptr, uu);
|
30
|
+
|
31
|
+
return -1;
|
32
|
+
}
|
33
|
+
|
34
|
+
int
|
35
|
+
uuid_validity_check(const uuid_t uu)
|
36
|
+
{
|
37
|
+
int type, variant;
|
38
|
+
|
39
|
+
type = uuid_type(uu);
|
40
|
+
if( type != UUID_TYPE_DCE_TIME && type != UUID_TYPE_DCE_RANDOM )
|
41
|
+
return -1;
|
42
|
+
|
43
|
+
variant = uuid_variant(uu);
|
44
|
+
if( variant < UUID_VARIANT_NCS || variant > UUID_VARIANT_OTHER )
|
45
|
+
return -1;
|
46
|
+
|
47
|
+
return 0;
|
48
|
+
}
|
49
|
+
|
50
|
+
VALUE
|
51
|
+
lib_uuid_new(unsigned int argc, VALUE *argv, VALUE class)
|
52
|
+
{
|
53
|
+
lib_uuid_t *s;
|
54
|
+
uuid_t parsed_uu;
|
55
|
+
VALUE ret;
|
56
|
+
|
57
|
+
if( argc > 1 )
|
58
|
+
rb_raise(rb_eArgError, "too many arguments");
|
59
|
+
|
60
|
+
if( argc == 0 )
|
61
|
+
uuid_generate(parsed_uu);
|
62
|
+
|
63
|
+
if( argc == 1 )
|
64
|
+
{
|
65
|
+
if( uuid_from_obj(argv[0], parsed_uu) == -1 )
|
66
|
+
return Qnil;
|
67
|
+
|
68
|
+
if( uuid_validity_check(parsed_uu) == -1 )
|
69
|
+
return Qnil;
|
70
|
+
}
|
71
|
+
|
72
|
+
s = ALLOC_N(lib_uuid_t, 1);
|
73
|
+
uuid_copy(s->uu, parsed_uu);
|
74
|
+
ret = Data_Wrap_Struct(class, NULL, lib_uuid_free, s);
|
75
|
+
rb_obj_call_init(ret, 0, 0);
|
76
|
+
|
77
|
+
return ret;
|
78
|
+
}
|
79
|
+
|
80
|
+
VALUE
|
81
|
+
lib_uuid_valid(unsigned int argc, VALUE *argv, VALUE class)
|
82
|
+
{
|
83
|
+
int i;
|
84
|
+
VALUE test[1];
|
85
|
+
|
86
|
+
if( argc == 0 )
|
87
|
+
rb_raise(rb_eArgError, "too few arguments");
|
88
|
+
|
89
|
+
for( i=0 ; i<argc ; i++ )
|
90
|
+
{
|
91
|
+
test[0] = argv[i];
|
92
|
+
if( lib_uuid_new(1, test, class) == Qnil )
|
93
|
+
return Qfalse;
|
94
|
+
}
|
95
|
+
|
96
|
+
return Qtrue;
|
97
|
+
}
|
98
|
+
|
99
|
+
VALUE
|
100
|
+
lib_uuid_generate_guid(VALUE class)
|
101
|
+
{
|
102
|
+
char uu_str[GUID_STRLEN];
|
103
|
+
uuid_t uu;
|
104
|
+
|
105
|
+
uuid_generate(uu);
|
106
|
+
uuid_unparse(uu, uu_str);
|
107
|
+
|
108
|
+
return rb_str_new(uu_str, GUID_STRLEN-1);
|
109
|
+
}
|
110
|
+
|
111
|
+
VALUE
|
112
|
+
lib_uuid_generate_short_guid(VALUE class)
|
113
|
+
{
|
114
|
+
char uu_str[SHORT_GUID_STRLEN];
|
115
|
+
uuid_t uu;
|
116
|
+
|
117
|
+
uuid_generate(uu);
|
118
|
+
uuid_encode64(uu, uu_str);
|
119
|
+
|
120
|
+
return rb_str_new(uu_str, SHORT_GUID_STRLEN-1);
|
121
|
+
}
|
122
|
+
|
123
|
+
VALUE
|
124
|
+
lib_uuid_initialize(VALUE self)
|
125
|
+
{
|
126
|
+
lib_uuid_t *s;
|
127
|
+
|
128
|
+
Data_Get_Struct(self, lib_uuid_t, s);
|
129
|
+
s->guid = s->short_guid = s->type = s->variant = 0;
|
130
|
+
rb_iv_set(self, "@bytes", rb_str_new((char *) s->uu, 16));
|
131
|
+
|
132
|
+
return self;
|
133
|
+
}
|
134
|
+
|
135
|
+
VALUE
|
136
|
+
lib_uuid_bytes(VALUE self)
|
137
|
+
{
|
138
|
+
return rb_iv_get(self, "@bytes");
|
139
|
+
}
|
140
|
+
|
141
|
+
VALUE
|
142
|
+
lib_uuid_type(VALUE self)
|
143
|
+
{
|
144
|
+
lib_uuid_t *s;
|
145
|
+
|
146
|
+
Data_Get_Struct(self, lib_uuid_t, s);
|
147
|
+
|
148
|
+
if( s->type == 0 )
|
149
|
+
s->type = INT2NUM(uuid_type(s->uu));
|
150
|
+
|
151
|
+
return s->type;
|
152
|
+
}
|
153
|
+
|
154
|
+
VALUE
|
155
|
+
lib_uuid_variant(VALUE self)
|
156
|
+
{
|
157
|
+
lib_uuid_t *s;
|
158
|
+
|
159
|
+
Data_Get_Struct(self, lib_uuid_t, s);
|
160
|
+
|
161
|
+
if( s->variant == 0 )
|
162
|
+
s->variant = INT2NUM(uuid_variant(s->uu));
|
163
|
+
|
164
|
+
return s->variant;
|
165
|
+
}
|
166
|
+
|
167
|
+
VALUE
|
168
|
+
lib_uuid_to_guid(VALUE self)
|
169
|
+
{
|
170
|
+
lib_uuid_t *s;
|
171
|
+
char uu_str[GUID_STRLEN];
|
172
|
+
|
173
|
+
Data_Get_Struct(self, lib_uuid_t, s);
|
174
|
+
|
175
|
+
if( s->guid == 0 )
|
176
|
+
{
|
177
|
+
uuid_unparse(s->uu, uu_str);
|
178
|
+
s->guid = rb_str_new(uu_str, GUID_STRLEN-1);
|
179
|
+
}
|
180
|
+
|
181
|
+
return s->guid;
|
182
|
+
}
|
183
|
+
|
184
|
+
VALUE
|
185
|
+
lib_uuid_to_short_guid(VALUE self)
|
186
|
+
{
|
187
|
+
lib_uuid_t *s;
|
188
|
+
char uu_str[SHORT_GUID_STRLEN];
|
189
|
+
|
190
|
+
Data_Get_Struct(self, lib_uuid_t, s);
|
191
|
+
|
192
|
+
if( s->short_guid == 0 )
|
193
|
+
{
|
194
|
+
uuid_encode64(s->uu, uu_str);
|
195
|
+
s->short_guid = rb_str_new(uu_str, SHORT_GUID_STRLEN-1);
|
196
|
+
}
|
197
|
+
|
198
|
+
return s->short_guid;
|
199
|
+
}
|
200
|
+
|
201
|
+
VALUE
|
202
|
+
lib_uuid_equality(VALUE self, VALUE other)
|
203
|
+
{
|
204
|
+
lib_uuid_t *s, *o;
|
205
|
+
|
206
|
+
if( TYPE(self) != T_DATA || TYPE(other) != T_DATA )
|
207
|
+
return Qfalse;
|
208
|
+
|
209
|
+
Data_Get_Struct(self, lib_uuid_t, s);
|
210
|
+
Data_Get_Struct(other, lib_uuid_t, o);
|
211
|
+
|
212
|
+
if( uuid_compare(s->uu, o->uu) != 0 )
|
213
|
+
return Qfalse;
|
214
|
+
|
215
|
+
return Qtrue;
|
216
|
+
}
|
217
|
+
|
218
|
+
void
|
219
|
+
Init_lib_uuid()
|
220
|
+
{
|
221
|
+
VALUE m_lib_uuid, c_lib_uuid;
|
222
|
+
|
223
|
+
m_lib_uuid = rb_define_module("LibUUID");
|
224
|
+
c_lib_uuid = rb_define_class_under(m_lib_uuid, "UUID", rb_cObject);
|
225
|
+
rb_define_singleton_method(c_lib_uuid, "new", lib_uuid_new, -1);
|
226
|
+
rb_define_singleton_method(c_lib_uuid, "valid?", lib_uuid_valid, -1);
|
227
|
+
rb_define_singleton_method(c_lib_uuid, "guid", lib_uuid_generate_guid, 0);
|
228
|
+
rb_define_singleton_method(c_lib_uuid, "short_guid", lib_uuid_generate_short_guid, 0);
|
229
|
+
rb_define_method(c_lib_uuid, "initialize", lib_uuid_initialize, 0);
|
230
|
+
rb_define_method(c_lib_uuid, "bytes", lib_uuid_bytes, 0);
|
231
|
+
rb_define_method(c_lib_uuid, "type", lib_uuid_type, 0);
|
232
|
+
rb_define_method(c_lib_uuid, "variant", lib_uuid_variant, 0);
|
233
|
+
rb_define_method(c_lib_uuid, "to_guid", lib_uuid_to_guid, 0);
|
234
|
+
rb_define_method(c_lib_uuid, "to_short_guid", lib_uuid_to_short_guid, 0);
|
235
|
+
rb_define_method(c_lib_uuid, "==", lib_uuid_equality, 1);
|
236
|
+
}
|
data/ext/lib_uuid.h
ADDED
data/ext/uuid_base64.c
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#include <uuid/uuid.h>
|
2
|
+
|
3
|
+
#include "uuid_base64.h"
|
4
|
+
|
5
|
+
void
|
6
|
+
uuid_encode64(const uuid_t uu, char *str)
|
7
|
+
{
|
8
|
+
int i;
|
9
|
+
|
10
|
+
for( i=0; i<5; i++ )
|
11
|
+
{
|
12
|
+
*str++ = e64[ uu[0] >> 2];
|
13
|
+
*str++ = e64[((uu[0] << 4) & 0x30) | (uu[1] >> 4)];
|
14
|
+
*str++ = e64[((uu[1] << 2) & 0x3c) | (uu[2] >> 6)];
|
15
|
+
*str++ = e64[ uu[2] & 0x3f];
|
16
|
+
uu += 3;
|
17
|
+
}
|
18
|
+
|
19
|
+
*str++ = e64[ uu[0] >> 2];
|
20
|
+
*str++ = e64[(uu[0] << 4) & 0x30];
|
21
|
+
*str++ = '\0';
|
22
|
+
}
|
23
|
+
|
24
|
+
int
|
25
|
+
uuid_decode64(const char *str, uuid_t uu)
|
26
|
+
{
|
27
|
+
int i, j;
|
28
|
+
unsigned char buf[3];
|
29
|
+
|
30
|
+
for( i=0; i<5; i++ )
|
31
|
+
{
|
32
|
+
buf[0] = (unsigned char) d64[str[0]] << 2 | d64[str[1]] >> 4;
|
33
|
+
buf[1] = (unsigned char) d64[str[1]] << 4 | d64[str[2]] >> 2;
|
34
|
+
buf[2] = (unsigned char) (d64[str[2]] << 6) & 0xc0 | d64[str[3]];
|
35
|
+
|
36
|
+
for( j=0; j<3; j++ )
|
37
|
+
if( buf[j] != -1 )
|
38
|
+
*uu++ = buf[j];
|
39
|
+
else
|
40
|
+
return buf[j];
|
41
|
+
|
42
|
+
str += 4;
|
43
|
+
}
|
44
|
+
|
45
|
+
buf[0] = (unsigned char) d64[str[0]] << 2 | d64[str[1]] >> 4;
|
46
|
+
if( buf[0] != -1 )
|
47
|
+
*uu++ = buf[0];
|
48
|
+
else
|
49
|
+
return buf[0];
|
50
|
+
|
51
|
+
return 0;
|
52
|
+
}
|
data/ext/uuid_base64.h
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
static const char e64[] =
|
2
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
3
|
+
|
4
|
+
static const char d64[] = {
|
5
|
+
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
6
|
+
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
7
|
+
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1,
|
8
|
+
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
|
9
|
+
-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
10
|
+
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63,
|
11
|
+
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
12
|
+
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
|
13
|
+
};
|
14
|
+
|
15
|
+
void
|
16
|
+
uuid_encode64(const uuid_t uu, char *str);
|
17
|
+
|
18
|
+
int
|
19
|
+
uuid_decode64(const char *str, uuid_t uu);
|
20
|
+
|
data/libuuidrb.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{libuuidrb}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Sebastian Ohm"]
|
9
|
+
s.date = %q{2010-03-07}
|
10
|
+
s.description = %q{libuuidrb uses libuuid to generate DCE compatible universally unique identifiers}
|
11
|
+
s.email = %q{}
|
12
|
+
s.extensions = ["ext/extconf.rb"]
|
13
|
+
s.extra_rdoc_files = ["LICENSE", "README", "ext/extconf.rb", "ext/lib_uuid.c", "ext/lib_uuid.h", "ext/uuid_base64.c", "ext/uuid_base64.h", "libuuidrb.gemspec"]
|
14
|
+
s.files = ["LICENSE", "Manifest", "README", "Rakefile", "ext/extconf.rb", "ext/lib_uuid.c", "ext/lib_uuid.h", "ext/uuid_base64.c", "ext/uuid_base64.h", "libuuidrb.gemspec", "test/test_compatibility.rb", "test/test_functionality.rb"]
|
15
|
+
s.homepage = %q{http://github.com/ohm/libuuidrb}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Libuuidrb", "--main", "README"]
|
17
|
+
s.require_paths = ["ext"]
|
18
|
+
s.rubyforge_project = %q{libuuidrb}
|
19
|
+
s.rubygems_version = %q{1.3.6}
|
20
|
+
s.summary = %q{libuuidrb uses libuuid to generate DCE compatible universally unique identifiers}
|
21
|
+
s.test_files = ["test/test_compatibility.rb", "test/test_functionality.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../ext/lib_uuid')
|
6
|
+
require 'simple_uuid'
|
7
|
+
require 'uuidtools'
|
8
|
+
|
9
|
+
class TestCompatibility < Test::Unit::TestCase
|
10
|
+
def test_parsing_uuidtools_timestamp_guids
|
11
|
+
u = UUIDTools::UUID.timestamp_create
|
12
|
+
l = LibUUID::UUID.new(u.to_s)
|
13
|
+
assert_equal u.to_s, l.to_guid
|
14
|
+
assert_equal 1, l.type
|
15
|
+
assert_equal 1, l.variant
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_parsing_uuidtools_random_guids
|
19
|
+
u = UUIDTools::UUID.random_create
|
20
|
+
l = LibUUID::UUID.new(u.to_s)
|
21
|
+
assert_equal u.to_s, l.to_guid
|
22
|
+
assert_equal 4, l.type
|
23
|
+
assert_equal 1, l.variant
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_parsing_simple_uuid_guids
|
27
|
+
f = SimpleUUID::UUID.new
|
28
|
+
g = LibUUID::UUID.new(f.to_guid)
|
29
|
+
assert_equal f.to_guid, g.to_guid
|
30
|
+
assert_equal 1, g.type
|
31
|
+
assert_equal 1, g.variant
|
32
|
+
end
|
33
|
+
end
|
34
|
+
rescue LoadError => le
|
35
|
+
puts "Skipping compatibility tests: #{le.message}"
|
36
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../ext/lib_uuid')
|
3
|
+
|
4
|
+
class TestLibUUUID < Test::Unit::TestCase
|
5
|
+
|
6
|
+
EXPR = {
|
7
|
+
:rfc => /\A[a-z0-9]{8}\-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}\Z/,
|
8
|
+
:b64 => /\A[A-Za-z0-9\-\_]{22}\Z/
|
9
|
+
}
|
10
|
+
|
11
|
+
def test_guid_generation
|
12
|
+
guids = []
|
13
|
+
1.upto(100) { guids << LibUUID::UUID.guid }
|
14
|
+
assert_equal guids.size, guids.uniq.size
|
15
|
+
assert_equal guids.size, guids.reject {|g| (g =~ EXPR[:rfc]) != 0}.size
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_short_guid_generation
|
19
|
+
short_guids = []
|
20
|
+
1.upto(100) { short_guids << LibUUID::UUID.short_guid }
|
21
|
+
assert_equal short_guids.size, short_guids.uniq.size
|
22
|
+
assert_equal short_guids.size, short_guids.reject { |sg| (sg =~ EXPR[:b64]) != 0 }.size
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_initialization
|
26
|
+
u = LibUUID::UUID.new
|
27
|
+
assert LibUUID::UUID == u.class
|
28
|
+
assert 4 == u.type
|
29
|
+
assert 1 == u.variant
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_positive_equality
|
33
|
+
u = LibUUID::UUID.new
|
34
|
+
assert u == u
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_negative_equality
|
38
|
+
u = LibUUID::UUID.new
|
39
|
+
v = LibUUID::UUID.new
|
40
|
+
assert u != v
|
41
|
+
assert u != 1
|
42
|
+
assert u != nil
|
43
|
+
assert u != 'foo'
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_transformation_to_guid
|
47
|
+
u = LibUUID::UUID.new
|
48
|
+
assert_match EXPR[:rfc], u.to_guid
|
49
|
+
assert u.to_guid == u.to_guid
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_transformation_to_short_guid
|
53
|
+
u = LibUUID::UUID.new
|
54
|
+
assert_match EXPR[:b64], u.to_short_guid
|
55
|
+
assert u.to_short_guid == u.to_short_guid
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_parsing_guids
|
59
|
+
assert_nil LibUUID::UUID.new(nil)
|
60
|
+
assert_nil LibUUID::UUID.new(123)
|
61
|
+
assert_nil LibUUID::UUID.new('foo')
|
62
|
+
|
63
|
+
u = LibUUID::UUID.new
|
64
|
+
assert u == LibUUID::UUID.new(u.to_guid)
|
65
|
+
assert u == LibUUID::UUID.new(u.to_short_guid)
|
66
|
+
|
67
|
+
assert_raise ArgumentError do
|
68
|
+
LibUUID::UUID.new(u.to_guid, u.to_guid)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_positive_validating_guids_and_short_guids
|
73
|
+
assert LibUUID::UUID.valid?(LibUUID::UUID.guid)
|
74
|
+
assert LibUUID::UUID.valid?(LibUUID::UUID.short_guid)
|
75
|
+
assert LibUUID::UUID.valid?(LibUUID::UUID.guid, LibUUID::UUID.guid)
|
76
|
+
assert LibUUID::UUID.valid?(LibUUID::UUID.guid, LibUUID::UUID.short_guid)
|
77
|
+
assert LibUUID::UUID.valid?(LibUUID::UUID.short_guid, LibUUID::UUID.short_guid)
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_negative_validating_guids_and_short_guids
|
81
|
+
assert false == LibUUID::UUID.valid?(1)
|
82
|
+
assert false == LibUUID::UUID.valid?('foo', LibUUID::UUID.short_guid)
|
83
|
+
assert false == LibUUID::UUID.valid?(nil, 'foo', LibUUID::UUID.guid)
|
84
|
+
|
85
|
+
assert_raise ArgumentError do
|
86
|
+
LibUUID::UUID.valid?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_accessing_raw_bytes
|
91
|
+
examples = {
|
92
|
+
"99744ce4-22ef-11df-9985-b2d60a1a84bd" =>
|
93
|
+
"\x99tL\xE4\"\xEF\x11\xDF\x99\x85\xB2\xD6\n\x1A\x84\xBD",
|
94
|
+
"9974502c-22ef-11df-9ef4-56b2ae6e82ba" =>
|
95
|
+
"\x99tP,\"\xEF\x11\xDF\x9E\xF4V\xB2\xAEn\x82\xBA",
|
96
|
+
"9974525c-22ef-11df-83d0-49d493d646c4" =>
|
97
|
+
"\x99tR\\\"\xEF\x11\xDF\x83\xD0I\xD4\x93\xD6F\xC4",
|
98
|
+
"9974546e-22ef-11df-9f68-0d1a49a6205e" =>
|
99
|
+
"\x99tTn\"\xEF\x11\xDF\x9Fh\r\x1AI\xA6 ^",
|
100
|
+
"99745680-22ef-11df-94f8-8f1188b64943" =>
|
101
|
+
"\x99tV\x80\"\xEF\x11\xDF\x94\xF8\x8F\x11\x88\xB6IC"
|
102
|
+
}
|
103
|
+
|
104
|
+
examples.each do |guid, bytes|
|
105
|
+
l = LibUUID::UUID.new(guid)
|
106
|
+
assert_equal bytes, l.bytes
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: libuuidrb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Sebastian Ohm
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-07 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: libuuidrb uses libuuid to generate DCE compatible universally unique identifiers
|
22
|
+
email: ""
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions:
|
26
|
+
- ext/extconf.rb
|
27
|
+
extra_rdoc_files:
|
28
|
+
- LICENSE
|
29
|
+
- README
|
30
|
+
- ext/extconf.rb
|
31
|
+
- ext/lib_uuid.c
|
32
|
+
- ext/lib_uuid.h
|
33
|
+
- ext/uuid_base64.c
|
34
|
+
- ext/uuid_base64.h
|
35
|
+
- libuuidrb.gemspec
|
36
|
+
files:
|
37
|
+
- LICENSE
|
38
|
+
- Manifest
|
39
|
+
- README
|
40
|
+
- Rakefile
|
41
|
+
- ext/extconf.rb
|
42
|
+
- ext/lib_uuid.c
|
43
|
+
- ext/lib_uuid.h
|
44
|
+
- ext/uuid_base64.c
|
45
|
+
- ext/uuid_base64.h
|
46
|
+
- libuuidrb.gemspec
|
47
|
+
- test/test_compatibility.rb
|
48
|
+
- test/test_functionality.rb
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: http://github.com/ohm/libuuidrb
|
51
|
+
licenses: []
|
52
|
+
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options:
|
55
|
+
- --line-numbers
|
56
|
+
- --inline-source
|
57
|
+
- --title
|
58
|
+
- Libuuidrb
|
59
|
+
- --main
|
60
|
+
- README
|
61
|
+
require_paths:
|
62
|
+
- ext
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
segments:
|
75
|
+
- 1
|
76
|
+
- 2
|
77
|
+
version: "1.2"
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project: libuuidrb
|
81
|
+
rubygems_version: 1.3.6
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: libuuidrb uses libuuid to generate DCE compatible universally unique identifiers
|
85
|
+
test_files:
|
86
|
+
- test/test_compatibility.rb
|
87
|
+
- test/test_functionality.rb
|