Dicom_UID 0.0.7 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dicom_uid.rb +76 -29
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: adc24bf89d5304fe5b569c6265b828b2942eaa8e60c5d5e1a560ff58534828c9
|
4
|
+
data.tar.gz: 640b2f0d0f42a2f4a4419790c609c640dafc6e40cab158686ed3fe944ee3eaae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c010e4bcea0c9d193732fccbe3770605f72aa34611bd0b5586ffc5cc2b846b6c8998853d67bcece7e8ac1f0e9c693d0ca94a7fa3f0109e93c39f03e212be1b56
|
7
|
+
data.tar.gz: fce7c3a9ffc3d6dd3d525307f6466eae2ae3c07ac50b6137fb966060ecca2613a26a8ccc9cd0a70eeafdfc08265d8df3c970eee446679dca388fc1227c4214f0
|
data/lib/dicom_uid.rb
CHANGED
@@ -4,24 +4,38 @@
|
|
4
4
|
# The UID looks like the following <org>.<suffix>
|
5
5
|
# UID is composed of two main components, org and suffix. Components are separated by a dot and are only composed of decimals.
|
6
6
|
# The UID must not be more than 64 characters, dots included.
|
7
|
-
module DicomUID
|
7
|
+
module DicomUID#:nodoc:
|
8
8
|
|
9
|
+
# Maximum size of an UID
|
10
|
+
MAXIMUM_SIZE = 64
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
|
13
|
+
# Generates random component with defined, maximum length
|
14
|
+
# The maximum length is 62. Why ? Because an UID has at least an org_root
|
15
|
+
# and a suffix, and they are separated by a dot, which makes
|
16
|
+
# 1 character minimum and 62 characters maximum
|
17
|
+
def self.random_component length = 62, odd_byte_boundary = true
|
18
|
+
|
19
|
+
# exceptions
|
20
|
+
raise TypeError unless length.is_a? Integer and odd_byte_boundary == !!odd_byte_boundary
|
21
|
+
raise RangeError, "Length of a component cannot be negative or null" if length <= 0
|
22
|
+
raise OversizedUIDError if length > 62
|
12
23
|
|
13
24
|
# randing length of number
|
14
|
-
length_component =
|
15
|
-
|
25
|
+
length_component = 0
|
26
|
+
while (length_component == length - 1) or length_component == 0
|
16
27
|
srand
|
17
|
-
length_component = rand
|
18
|
-
break if length_component != length - 1 and length_component != 0
|
28
|
+
length_component = rand 0..length
|
19
29
|
end
|
20
30
|
|
21
31
|
# randing the component
|
22
|
-
component =
|
32
|
+
component = '9' * (length - 1)
|
33
|
+
while component.length == length - 1
|
34
|
+
component = (rand ('9' * length_component).to_i).to_s
|
35
|
+
end
|
23
36
|
|
24
|
-
|
37
|
+
|
38
|
+
if odd_byte_boundary and !odd_byte_rule component# if odd number
|
25
39
|
component << 'O'
|
26
40
|
component = component[1..-1]# removing first int
|
27
41
|
end
|
@@ -30,31 +44,26 @@ module DicomUID
|
|
30
44
|
end
|
31
45
|
|
32
46
|
|
33
|
-
# Generates recursively a random dicom uid
|
34
|
-
def self.rand_duid uid, remain, obb
|
35
|
-
comp = self.random_component remain, obb
|
36
|
-
remain -= comp.length
|
37
|
-
uid << comp
|
38
|
-
|
39
|
-
return uid if remain <= 0
|
40
|
-
|
41
|
-
uid << '.'
|
42
|
-
self.rand_duid uid, remain - 1, obb
|
43
|
-
end
|
44
47
|
|
45
48
|
|
46
49
|
# set default values, with org_root if needed
|
47
50
|
# the size of the UID is randomized
|
51
|
+
# fixed_size is the size ogf the whole UID, with the org taken into account
|
48
52
|
def self.random_dicom_uid org_root, fixed_size, odd_byte_boundary = true
|
49
53
|
|
54
|
+
raise TypeError, 'Org root must be a string or an Integer' unless org_root.is_a? String or org_root.is_a? Integer
|
55
|
+
org_root = org_root.to_s if org_root.is_a? Integer
|
56
|
+
raise TypeError unless fixed_size.is_a? Integer and odd_byte_boundary == !!odd_byte_boundary
|
57
|
+
|
50
58
|
# building the org root
|
51
|
-
org_root = self.random_component(
|
59
|
+
org_root = self.random_component(62, odd_byte_boundary) if org_root.empty?# UID needs at least an org root
|
52
60
|
raise LeadingZeroError if org_root[0] == '0' and org_root.length != 1
|
53
|
-
raise OddByteError if org_root
|
54
|
-
org_root << '.' if org_root[-1] != '.'
|
61
|
+
raise OddByteError if !odd_byte_rule(org_root) and odd_byte_boundary
|
55
62
|
|
56
|
-
|
57
|
-
|
63
|
+
# if the fixed size doesn't exist, a random one is created, but
|
64
|
+
# it must be generated so that the UID musn't be above 64 chars
|
65
|
+
fixed_size ||= rand(0..(64 - org_root.length - 1))
|
66
|
+
fixed_size -= 1 if add_missing_dot org_root
|
58
67
|
|
59
68
|
raise OversizedUIDError if fixed_size > 64
|
60
69
|
raise RangeError("Size of UID can't be negative") if fixed_size < 0
|
@@ -65,14 +74,11 @@ module DicomUID
|
|
65
74
|
|
66
75
|
|
67
76
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
77
|
def self.random_uids org_root, fixed_size, array_size, odd_byte_boundary = true
|
72
78
|
uids = Array.new
|
73
79
|
|
74
80
|
array_size.times do
|
75
|
-
uids << random_dicom_uid org_root, fixed_size, odd_byte_boundary
|
81
|
+
uids << (self.random_dicom_uid org_root, fixed_size, odd_byte_boundary)
|
76
82
|
end
|
77
83
|
|
78
84
|
uids
|
@@ -80,9 +86,50 @@ module DicomUID
|
|
80
86
|
|
81
87
|
|
82
88
|
|
89
|
+
private
|
83
90
|
|
91
|
+
# Generates recursively a random dicom uid
|
92
|
+
def self.rand_duid uid, remain, obb = true
|
93
|
+
|
94
|
+
# Exceptions
|
95
|
+
raise OversizedUIDError if uid.length > 64 or (uid.length + remain > 64)
|
96
|
+
raise RangeError, "Remaining characters can't be negative or null" if remain <= 0
|
97
|
+
|
98
|
+
comp = self.random_component remain, obb
|
99
|
+
remain -= comp.length
|
100
|
+
uid << comp
|
101
|
+
|
102
|
+
return uid if remain <= 0
|
103
|
+
|
104
|
+
uid << '.'
|
105
|
+
self.rand_duid uid, remain - 1, obb
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
def add_missing_dot comp
|
117
|
+
raise TypeError unless comp.is_a? String
|
118
|
+
if comp[-1] != '.'
|
119
|
+
comp << '.'
|
120
|
+
return true
|
121
|
+
end
|
122
|
+
false
|
84
123
|
end
|
85
124
|
|
125
|
+
|
126
|
+
def odd_byte_rule comp
|
127
|
+
return comp[-1].to_i % 2 == 0 || (comp[-2].to_i % 2 == 1 && comp[-1].to_i == 0) if comp.length != 1
|
128
|
+
comp[-1].to_i % 2 == 0
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
|
86
133
|
# EXCEPTIONS
|
87
134
|
|
88
135
|
class LeadingZeroError < StandardError
|