content_data 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/content_data/content_data.rb +441 -0
- data/lib/content_data.rb +9 -0
- data/test/content_data/content_data_test.rb +146 -0
- metadata +49 -0
@@ -0,0 +1,441 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
3
|
+
module BBFS
|
4
|
+
module ContentData
|
5
|
+
|
6
|
+
class Content
|
7
|
+
attr_reader :checksum, :size, :first_appearance_time
|
8
|
+
|
9
|
+
def initialize(checksum, size, first_appearance_time, content_serializer = nil)
|
10
|
+
if content_serializer != nil
|
11
|
+
if (content_serializer.checksum == nil)
|
12
|
+
raise ArgumentError.new("checksum have to be defined")
|
13
|
+
else
|
14
|
+
@checksum = content_serializer.checksum
|
15
|
+
end
|
16
|
+
if (content_serializer.size == nil)
|
17
|
+
raise ArgumentError.new("size have to be defined")
|
18
|
+
else
|
19
|
+
@size = content_serializer.size
|
20
|
+
end
|
21
|
+
if (content_serializer.first_appearance_time == nil)
|
22
|
+
raise ArgumentError.new("first_appearance_time have to be defined")
|
23
|
+
else
|
24
|
+
@first_appearance_time = ContentData.parse_time(content_serializer.first_appearance_time)
|
25
|
+
end
|
26
|
+
|
27
|
+
else
|
28
|
+
@checksum = checksum
|
29
|
+
@size = size
|
30
|
+
@first_appearance_time = first_appearance_time
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
"%s,%d,%s" % [@checksum, @size, ContentData.format_time(@first_appearance_time)]
|
38
|
+
end
|
39
|
+
|
40
|
+
def ==(other)
|
41
|
+
return (self.checksum.eql? other.checksum and
|
42
|
+
self.size.eql? other.size and
|
43
|
+
self.first_appearance_time.to_i.eql? other.first_appearance_time.to_i)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Support for protocol buffers
|
47
|
+
#def serialize
|
48
|
+
# serializer = ContentMessage.new
|
49
|
+
# serializer.checksum = checksum
|
50
|
+
# serializer.size = size
|
51
|
+
# serializer.first_appearance_time = ContentData.format_time(first_appearance_time)
|
52
|
+
#
|
53
|
+
# serializer
|
54
|
+
#end
|
55
|
+
end
|
56
|
+
|
57
|
+
class ContentInstance
|
58
|
+
attr_reader :checksum, :size, :server_name, :device, :full_path, :modification_time
|
59
|
+
|
60
|
+
def initialize(checksum, size, server_name, device, full_path, modification_time, content_instance_serializer = nil)
|
61
|
+
if content_instance_serializer != nil
|
62
|
+
if (content_instance_serializer.checksum == nil)
|
63
|
+
raise ArgumentError.new("checksum have to be defined")
|
64
|
+
else
|
65
|
+
@checksum = content_instance_serializer.checksum
|
66
|
+
end
|
67
|
+
if (content_instance_serializer.size == nil)
|
68
|
+
raise ArgumentError.new("size have to be defined")
|
69
|
+
else
|
70
|
+
@size = content_instance_serializer.size
|
71
|
+
end
|
72
|
+
if (content_instance_serializer.modification_time == nil)
|
73
|
+
raise ArgumentError.new("modification_time have to be defined")
|
74
|
+
else
|
75
|
+
@modification_time = ContentData.parse_time(content_instance_serializer.modification_time)
|
76
|
+
end
|
77
|
+
if (content_instance_serializer.server_name == nil)
|
78
|
+
raise ArgumentError.new("server_name have to be defined")
|
79
|
+
else
|
80
|
+
@server_name = content_instance_serializer.server_name
|
81
|
+
end
|
82
|
+
if (content_instance_serializer.device == nil)
|
83
|
+
raise ArgumentError.new("device have to be defined")
|
84
|
+
else
|
85
|
+
@device = content_instance_serializer.device
|
86
|
+
end
|
87
|
+
if (content_instance_serializer.full_path == nil)
|
88
|
+
raise ArgumentError.new("full_path have to be defined")
|
89
|
+
else
|
90
|
+
@full_path = content_instance_serializer.full_path
|
91
|
+
end
|
92
|
+
else
|
93
|
+
@checksum = checksum
|
94
|
+
@size = size
|
95
|
+
@server_name = server_name
|
96
|
+
@device = device
|
97
|
+
@full_path = full_path
|
98
|
+
@modification_time = modification_time
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def global_path
|
103
|
+
"%s:%s:%s" % [@server_name, @device, @full_path]
|
104
|
+
end
|
105
|
+
|
106
|
+
def to_s
|
107
|
+
"%s,%d,%s,%s,%s,%s" % [@checksum, @size, @server_name,
|
108
|
+
@device, @full_path, ContentData.format_time(@modification_time)]
|
109
|
+
end
|
110
|
+
|
111
|
+
def ==(other)
|
112
|
+
return (self.checksum.eql? other.checksum and
|
113
|
+
self.size.eql? other.size and
|
114
|
+
self.server_name.eql? other.server_name and
|
115
|
+
self.device.eql? other.device and
|
116
|
+
self.full_path.eql? other.full_path and
|
117
|
+
self.modification_time.to_i.eql? other.modification_time.to_i)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Support for protocol buffers
|
121
|
+
# #def serialize
|
122
|
+
# serializer = ContentInstanceMessage.new
|
123
|
+
# serializer.checksum = checksum
|
124
|
+
# serializer.size = size
|
125
|
+
# serializer.modification_time = ContentData.format_time(modification_time)
|
126
|
+
# serializer.server_name = server_name
|
127
|
+
# serializer.device = device.to_s
|
128
|
+
# serializer.full_path = full_path
|
129
|
+
#
|
130
|
+
# serializer
|
131
|
+
#end
|
132
|
+
|
133
|
+
#@checksum
|
134
|
+
#@size
|
135
|
+
#@server_name
|
136
|
+
#@device
|
137
|
+
#@full_path
|
138
|
+
#@modification_time
|
139
|
+
end
|
140
|
+
|
141
|
+
class ContentData
|
142
|
+
attr_reader :contents, :instances
|
143
|
+
|
144
|
+
# @param content_data_serializer_str [String]
|
145
|
+
def initialize(content_data_serializer = nil)
|
146
|
+
@contents = Hash.new # key is a checksum , value is a refernce to the Content object
|
147
|
+
@instances = Hash.new # key is an instance global path , value is a reference to the ContentInstance object
|
148
|
+
if (content_data_serializer != nil)
|
149
|
+
content_data_serializer.contents.each do |entry|
|
150
|
+
key = entry.key
|
151
|
+
value = entry.value
|
152
|
+
content_serializer = value.content
|
153
|
+
raise ArgumentError.new("content have to be defined") if content_serializer.nil?
|
154
|
+
content = Content.new(nil, nil, nil, content_serializer)
|
155
|
+
@contents[key] = content
|
156
|
+
end
|
157
|
+
content_data_serializer.instances.each do |entry|
|
158
|
+
key = entry.key
|
159
|
+
value = entry.value
|
160
|
+
content_instance_serializer = value.instance
|
161
|
+
raise ArgumentError.new("instance have to be defined") if content_instance_serializer.nil?
|
162
|
+
content_instance = ContentInstance.new(nil, nil, nil, nil, nil, nil, content_instance_serializer)
|
163
|
+
@instances[key] = content_instance
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Support for protocol buffers
|
169
|
+
#def serialize (serializer = nil)
|
170
|
+
# serializer = ContentDataMessage.new if (serializer == nil)
|
171
|
+
# contents.each do |key, value|
|
172
|
+
# hash_value = ContentDataMessage::HashEntry::HashValue.new
|
173
|
+
# content_serializer = value.serialize
|
174
|
+
# #content_serializer = ContentMessage.new
|
175
|
+
# #content_serializer.parse_from_string(content_serializer_str)
|
176
|
+
# hash_value.content = content_serializer
|
177
|
+
# hash_entry = ContentDataMessage::HashEntry.new
|
178
|
+
# hash_entry.key = key
|
179
|
+
# hash_entry.value = hash_value
|
180
|
+
# serializer.contents << hash_entry
|
181
|
+
# end
|
182
|
+
# instances.each do |key, value|
|
183
|
+
# hash_value = ContentDataMessage::HashEntry::HashValue.new
|
184
|
+
# instance_serializer = value.serialize
|
185
|
+
# #instance_serializer = ContentInstanceMessage.new
|
186
|
+
# #instance_serializer.parse_from_string(instance_serializer_str)
|
187
|
+
# hash_value.instance = instance_serializer
|
188
|
+
# hash_entry = ContentDataMessage::HashEntry.new
|
189
|
+
# hash_entry.key = key
|
190
|
+
# hash_entry.value = hash_value
|
191
|
+
# serializer.instances << hash_entry
|
192
|
+
# end
|
193
|
+
# serializer
|
194
|
+
#end
|
195
|
+
|
196
|
+
def add_content(content)
|
197
|
+
@contents[content.checksum] = content
|
198
|
+
end
|
199
|
+
|
200
|
+
def add_instance(instance)
|
201
|
+
if (not @contents.key?(instance.checksum))
|
202
|
+
printf("Warning: Adding instance while it's" +
|
203
|
+
" checksum %s does not exists.\n", instance.checksum)
|
204
|
+
printf("%s\n", instance.to_s)
|
205
|
+
return false
|
206
|
+
elsif (@contents[instance.checksum].size != instance.size)
|
207
|
+
print("Warning: File size different from content size while same checksum.\n")
|
208
|
+
printf("%s\n", instance.to_s)
|
209
|
+
return false
|
210
|
+
end
|
211
|
+
|
212
|
+
key = instance.global_path
|
213
|
+
|
214
|
+
#override file if needed
|
215
|
+
@instances[key] = instance
|
216
|
+
end
|
217
|
+
|
218
|
+
def empty?
|
219
|
+
@contents.empty?
|
220
|
+
end
|
221
|
+
|
222
|
+
def content_exists(checksum)
|
223
|
+
@contents.key? checksum
|
224
|
+
end
|
225
|
+
|
226
|
+
def merge(content_data)
|
227
|
+
content_data.contents.values.each { |content|
|
228
|
+
add_content(content)
|
229
|
+
}
|
230
|
+
content_data.instances.values.each { |instance|
|
231
|
+
add_instance(instance)
|
232
|
+
}
|
233
|
+
end
|
234
|
+
|
235
|
+
def ==(other)
|
236
|
+
|
237
|
+
#print "size:%s\n" % @contents.size
|
238
|
+
#print "other size:%s\n" % other.contents.size
|
239
|
+
return false if other == nil
|
240
|
+
return false unless @contents.size == other.contents.size
|
241
|
+
return false unless @instances.size == other.instances.size
|
242
|
+
|
243
|
+
@contents.keys.each { |key|
|
244
|
+
if (@contents[key] != other.contents[key])
|
245
|
+
#print "%s-" % @contents[key].to_s
|
246
|
+
#print other.contents[key].to_s
|
247
|
+
#puts " compare - false"
|
248
|
+
puts @contents[key].first_appearance_time.to_i
|
249
|
+
puts other.contents[key].first_appearance_time.to_i
|
250
|
+
return false
|
251
|
+
end
|
252
|
+
}
|
253
|
+
|
254
|
+
@instances.keys.each { |key|
|
255
|
+
if (@instances[key] != other.instances[key])
|
256
|
+
#print "%s-" % @instances[key].to_s
|
257
|
+
#print other.instances[key].to_s
|
258
|
+
#puts " compare - false"
|
259
|
+
return false
|
260
|
+
end
|
261
|
+
}
|
262
|
+
#puts "compare - true"
|
263
|
+
return true
|
264
|
+
end
|
265
|
+
|
266
|
+
def to_s
|
267
|
+
ret = ""
|
268
|
+
ret << @contents.length.to_s << "\n"
|
269
|
+
@contents.each_value { |content|
|
270
|
+
ret << content.to_s << "\n"
|
271
|
+
}
|
272
|
+
ret << @instances.length.to_s << "\n"
|
273
|
+
@instances.each_value { |instance|
|
274
|
+
ret << instance.to_s << "\n"
|
275
|
+
}
|
276
|
+
return ret
|
277
|
+
end
|
278
|
+
|
279
|
+
def to_file(filename)
|
280
|
+
File.open(filename, 'w') {|f| f.write(to_s) }
|
281
|
+
end
|
282
|
+
|
283
|
+
def from_file(filename)
|
284
|
+
lines = IO.readlines(filename)
|
285
|
+
i = 0
|
286
|
+
number_of_contents = lines[i].to_i
|
287
|
+
i += 1
|
288
|
+
number_of_contents.times {
|
289
|
+
parameters = lines[i].split(",")
|
290
|
+
add_content(Content.new(parameters[0],
|
291
|
+
parameters[1].to_i,
|
292
|
+
ContentData.parse_time(parameters[2])))
|
293
|
+
i += 1
|
294
|
+
}
|
295
|
+
|
296
|
+
number_of_instances = lines[i].to_i
|
297
|
+
i += 1
|
298
|
+
number_of_instances.times {
|
299
|
+
parameters = lines[i].split(",")
|
300
|
+
# bugfix: if file name consist a comma then parsing based on comma separating fails
|
301
|
+
if (parameters.size > 6)
|
302
|
+
(5..parameters.size-2).each do |i|
|
303
|
+
parameters[4] = [parameters[4], parameters[i]].join(",")
|
304
|
+
end
|
305
|
+
(5..parameters.size-2).each do |i|
|
306
|
+
parameters.delete_at(5)
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
add_instance(ContentInstance.new(parameters[0],
|
311
|
+
parameters[1].to_i,
|
312
|
+
parameters[2],
|
313
|
+
parameters[3],
|
314
|
+
parameters[4],
|
315
|
+
ContentData.parse_time(parameters[5])))
|
316
|
+
i += 1
|
317
|
+
}
|
318
|
+
end
|
319
|
+
|
320
|
+
def self.parse_time(time_str)
|
321
|
+
return Nil unless time_str.instance_of?String
|
322
|
+
time = Time.strptime( time_str, '%Y/%m/%d %H:%M:%S.%L' )
|
323
|
+
# another option to parse a time
|
324
|
+
#require 'scanf.rb'
|
325
|
+
#time_arr = time_str.scanf("%d/%d/%d %d:%d:%d.%d")
|
326
|
+
#time = Time.utc(time_arr[0], time_arr[1],time_arr[2],time_arr[3],time_arr[4],time_arr[5],time_arr[6])
|
327
|
+
end
|
328
|
+
|
329
|
+
def self.format_time(time)
|
330
|
+
return Nil unless time.instance_of?Time
|
331
|
+
#puts time.class
|
332
|
+
str = time.strftime( '%Y/%m/%d %H:%M:%S.%L' )
|
333
|
+
#puts str
|
334
|
+
return str
|
335
|
+
end
|
336
|
+
|
337
|
+
# merges content data a and content data b to a new content data and returns it.
|
338
|
+
def self.merge(a, b)
|
339
|
+
return b unless not a.nil?
|
340
|
+
return a unless not b.nil?
|
341
|
+
|
342
|
+
return Nil unless a.instance_of?ContentData
|
343
|
+
return Nil unless b.instance_of?ContentData
|
344
|
+
|
345
|
+
ret = ContentData.new
|
346
|
+
ret.merge(a)
|
347
|
+
ret.merge(b)
|
348
|
+
|
349
|
+
return ret
|
350
|
+
end
|
351
|
+
|
352
|
+
# removed content data a from content data b and returns the new content data.
|
353
|
+
def self.remove(a, b)
|
354
|
+
return Nil unless a.instance_of?ContentData
|
355
|
+
return Nil unless b.instance_of?ContentData
|
356
|
+
|
357
|
+
ret = ContentData.new
|
358
|
+
|
359
|
+
b.contents.values.each { |content|
|
360
|
+
#print "%s - %s\n" % [content.checksum, a.content_exists(content.checksum).to_s]
|
361
|
+
ret.add_content(content) unless a.content_exists(content.checksum)
|
362
|
+
}
|
363
|
+
|
364
|
+
#puts "kaka"
|
365
|
+
|
366
|
+
b.instances.values.each { |instance|
|
367
|
+
#print "%s - %s\n" % [instance.checksum, a.content_exists(instance.checksum).to_s]
|
368
|
+
ret.add_instance(instance) unless a.content_exists(instance.checksum)
|
369
|
+
}
|
370
|
+
|
371
|
+
#print "kuku %s" % ret.contents.size.to_s
|
372
|
+
#print "kuku %s" % ret.instances.size.to_s
|
373
|
+
return ret
|
374
|
+
end
|
375
|
+
|
376
|
+
# returns the common content in both a and b
|
377
|
+
def self.intersect(a, b)
|
378
|
+
b_minus_a = ContentData.remove(a, b)
|
379
|
+
return ContentData.remove(b_minus_a, b)
|
380
|
+
end
|
381
|
+
|
382
|
+
# unify time for all entries with same content to minimal time
|
383
|
+
def self.unify_time(db)
|
384
|
+
mod_db = ContentData.new # resulting ContentData that will consists objects with unified time
|
385
|
+
checksum2time = Hash.new # key=checksum value=min_time_for_this_checksum
|
386
|
+
checksum2instances = Hash.new # key=checksum value=array_of_instances_with_this_checksum (Will be replaced with ContentData method)
|
387
|
+
|
388
|
+
# populate tables with given ContentData entries
|
389
|
+
db.instances.each_value do |instance|
|
390
|
+
checksum = instance.checksum
|
391
|
+
time = instance.modification_time
|
392
|
+
|
393
|
+
unless (checksum2instances.has_key?checksum)
|
394
|
+
checksum2instances[checksum] = []
|
395
|
+
end
|
396
|
+
checksum2instances[checksum] << instance
|
397
|
+
|
398
|
+
if (not checksum2time.has_key?checksum)
|
399
|
+
checksum2time[checksum] = time
|
400
|
+
elsif ((checksum2time[checksum] <=> time) > 0)
|
401
|
+
checksum2time[checksum] = time
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
# update min time table with time information from contents
|
406
|
+
db.contents.each do |checksum, content|
|
407
|
+
time = content.first_appearance_time
|
408
|
+
if (not checksum2time.has_key?checksum)
|
409
|
+
checksum2time[checksum] = time
|
410
|
+
elsif ((checksum2time[checksum] <=> time) > 0)
|
411
|
+
checksum2time[checksum] = time
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
# add content entries to the output table. in need of case update time field with found min time
|
416
|
+
db.contents.each do |checksum, content|
|
417
|
+
time = checksum2time[checksum]
|
418
|
+
if ((content.first_appearance_time <=> time) == 0)
|
419
|
+
mod_db.add_content(content)
|
420
|
+
else
|
421
|
+
mod_db.add_content(Content.new(checksum, content.size, time))
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
# add instance entries to the output table. in need of case update time field with found min time
|
426
|
+
checksum2instances.each do |checksum, instances|
|
427
|
+
time = checksum2time[checksum]
|
428
|
+
instances.each do |instance|
|
429
|
+
if ((instance.modification_time <=> time) == 0)
|
430
|
+
mod_db.add_instance(instance)
|
431
|
+
else # must be bigger then found min time
|
432
|
+
mod_instance = ContentInstance.new(instance.checksum, instance.size, instance.server_name, instance.device, instance.full_path, time)
|
433
|
+
mod_db.add_instance(mod_instance)
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
mod_db
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
441
|
+
end
|
data/lib/content_data.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'time.rb'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
require_relative '../../lib/content_data/content_data.rb'
|
5
|
+
|
6
|
+
module BBFS
|
7
|
+
module ContentData
|
8
|
+
|
9
|
+
class TestContentData < Test::Unit::TestCase
|
10
|
+
def test_content
|
11
|
+
content_data = ContentData.new
|
12
|
+
content_data.add_content(Content.new("D12A1C98A3", 765, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
13
|
+
content_data.add_content(Content.new("B12A1C98A3", 123123, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
14
|
+
content_data.add_content(Content.new("D1234C98A3", 12444, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
15
|
+
content_data.add_content(Content.new("DB12A1C233", 2, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
16
|
+
content_data.add_content(Content.new("DB12A4338A", 12412, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
17
|
+
content_data.add_content(Content.new("232A1C98A3", 124424, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
18
|
+
content_data.add_content(Content.new("AC12A1C983", 1242, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
19
|
+
content_data.add_content(Content.new("AAC12A1C983", 1242,ContentData.parse_time("2011/02/01 02:23:59.000")))
|
20
|
+
|
21
|
+
content_data.add_instance(ContentInstance.new("DB12A1C233", 765, "large_server_1", "dev1",
|
22
|
+
"/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
23
|
+
content_data.add_instance(ContentInstance.new("DB12A4338A", 765, "large_server_1", "dev2",
|
24
|
+
"/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
25
|
+
content_data.add_instance(ContentInstance.new("232A1C98A3", 765, "large_server_1", "dev3",
|
26
|
+
"/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
27
|
+
content_data.add_instance(ContentInstance.new("DB12A4338A", 765, "large_server_2", "dev2",
|
28
|
+
"/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
29
|
+
content_data.add_instance(ContentInstance.new("D1234C98A3", 765, "large_server_2", "dev1",
|
30
|
+
"/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
31
|
+
content_data.add_instance(ContentInstance.new("D12A1C98A3", 765, "large_server_2", "dev1",
|
32
|
+
"/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
33
|
+
content_data.add_instance(ContentInstance.new("AC12A1C983", 765, "large_server_2", "dev2",
|
34
|
+
"/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
35
|
+
content_data.add_instance(ContentInstance.new("232A1C98A3", 765, "large_server_2", "dev3",
|
36
|
+
"/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
37
|
+
content_data.add_instance(ContentInstance.new("D12A1C98A3", 765, "large_server_2", "dev2",
|
38
|
+
"/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
39
|
+
content_data.add_instance(ContentInstance.new("D1234C98A3", 12412, "large_server_2", "dev1",
|
40
|
+
"/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
41
|
+
content_data.add_instance(ContentInstance.new("DB12A4338A", 12412, "large_server_2", "dev1",
|
42
|
+
"/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
43
|
+
content_data.add_instance(ContentInstance.new("AC12A1C983", 12412, "large_server_2", "dev2",
|
44
|
+
"/home/kuku/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
45
|
+
content_data.add_instance(ContentInstance.new("232A1C98A3", 12412, "large_server_2", "dev3",
|
46
|
+
"/home/kuku/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
47
|
+
content_data.add_instance(ContentInstance.new("DB12A4338A", 12412, "large_server_1", "dev2",
|
48
|
+
"/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
49
|
+
content_data.add_instance(ContentInstance.new("D1234C98A3", 12412, "large_server_1", "dev1",
|
50
|
+
"/home/kuku/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
51
|
+
|
52
|
+
#print content_data.to_s
|
53
|
+
|
54
|
+
assert_equal("8\nD12A1C98A3,765,2011/02/01 02:23:59.000\nB12A1C98A3,123123,2011/02/01 02:23:59.000\nD1234C98A3,12444,2011/02/01 02:23:59.000\nDB12A1C233,2,2011/02/01 02:23:59.000\nDB12A4338A,12412,2011/02/01 02:23:59.000\n232A1C98A3,124424,2011/02/01 02:23:59.000\nAC12A1C983,1242,2011/02/01 02:23:59.000\nAAC12A1C983,1242,2011/02/01 02:23:59.000\n3\nDB12A4338A,12412,large_server_2,dev1,/home/kuku/dev/lala/k.txt,2011/02/01 02:23:59.000\nD12A1C98A3,765,large_server_2,dev2,/home/lala/k.txt,2011/02/01 02:23:59.000\nDB12A4338A,12412,large_server_1,dev2,/home/kuku/lala/k.txt,2011/02/01 02:23:59.000\n",
|
55
|
+
content_data.to_s)
|
56
|
+
content_data.to_file("content_data_test.data")
|
57
|
+
new_content_data = ContentData.new()
|
58
|
+
new_content_data.from_file("content_data_test.data")
|
59
|
+
assert_equal(new_content_data, content_data)
|
60
|
+
|
61
|
+
content_data2 = ContentData.new
|
62
|
+
content_data2.add_content(Content.new("AD12A1C98A3", 765, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
63
|
+
content_data2.add_content(Content.new("AB12A1C98A3", 123123, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
64
|
+
content_data2.add_content(Content.new("AD1234C98A3", 12444, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
65
|
+
content_data2.add_content(Content.new("ADB12A1C233", 2, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
66
|
+
content_data2.add_content(Content.new("ADB12A4338A", 12412, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
67
|
+
content_data2.add_content(Content.new("A232A1C98A3", 124424, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
68
|
+
content_data2.add_content(Content.new("AAC12A1C983", 1242, ContentData.parse_time("2011/02/01 02:23:59.000")))
|
69
|
+
|
70
|
+
content_data2.add_instance(ContentInstance.new("ADB12A1C233", 765, "large_server_11", "dev1",
|
71
|
+
"/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
72
|
+
content_data2.add_instance(ContentInstance.new("ADB12A4338A", 765, "large_server_11", "dev2",
|
73
|
+
"/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
74
|
+
content_data2.add_instance(ContentInstance.new("A232A1C98A3", 765, "large_server_11", "dev3",
|
75
|
+
"/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
76
|
+
content_data2.add_instance(ContentInstance.new("ADB12A4338A", 765, "large_server_12", "dev2",
|
77
|
+
"/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
78
|
+
content_data2.add_instance(ContentInstance.new("AD1234C98A3", 765, "large_server_12", "dev1",
|
79
|
+
"/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
80
|
+
content_data2.add_instance(ContentInstance.new("AD12A1C98A3", 765, "large_server_12", "dev1",
|
81
|
+
"/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
82
|
+
content_data2.add_instance(ContentInstance.new("AAC12A1C983", 765, "large_server_12", "dev2",
|
83
|
+
"/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
84
|
+
content_data2.add_instance(ContentInstance.new("A232A1C98A3", 765, "large_server_12", "dev3",
|
85
|
+
"/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
86
|
+
content_data2.add_instance(ContentInstance.new("AD12A1C98A3", 765, "large_server_12", "dev2",
|
87
|
+
"/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
88
|
+
content_data2.add_instance(ContentInstance.new("AD1234C98A3", 12412, "large_server_12", "dev1",
|
89
|
+
"/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
90
|
+
content_data2.add_instance(ContentInstance.new("ADB12A4338A", 12412, "large_server_12", "dev1",
|
91
|
+
"/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
92
|
+
content_data2.add_instance(ContentInstance.new("AAC12A1C983", 12412, "large_server_12", "dev2",
|
93
|
+
"/home/kuku/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
94
|
+
content_data2.add_instance(ContentInstance.new("A232A1C98A3", 12412, "large_server_12", "dev3",
|
95
|
+
"/home/kuku/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
96
|
+
content_data2.add_instance(ContentInstance.new("ADB12A4338A", 12412, "large_server_11", "dev2",
|
97
|
+
"/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
98
|
+
content_data2.add_instance(ContentInstance.new("AD1234C98A3", 12412, "large_server_11", "dev1",
|
99
|
+
"/home/kuku/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
|
100
|
+
|
101
|
+
old_content_data = ContentData.new
|
102
|
+
old_content_data.merge(content_data)
|
103
|
+
assert_equal(true, old_content_data == content_data)
|
104
|
+
content_data.merge(content_data2)
|
105
|
+
content_data.to_file("content_data_test2.data")
|
106
|
+
new_content_data2 = ContentData.new()
|
107
|
+
new_content_data2.from_file("content_data_test2.data")
|
108
|
+
assert_equal(true, new_content_data2 == content_data)
|
109
|
+
assert_equal(false, new_content_data2 == old_content_data)
|
110
|
+
|
111
|
+
cd3 = ContentData.remove(content_data2, content_data)
|
112
|
+
assert_equal(false, old_content_data == cd3)
|
113
|
+
cd4 = ContentData.remove(cd3, content_data)
|
114
|
+
#assert_equal(content_data.to_s, "")
|
115
|
+
assert_equal(cd3.to_s, "7\nD12A1C98A3,765,2011/02/01 02:23:59.000\nB12A1C98A3,123123,2011/02/01 02:23:59.000\nD1234C98A3,12444,2011/02/01 02:23:59.000\nDB12A1C233,2,2011/02/01 02:23:59.000\nDB12A4338A,12412,2011/02/01 02:23:59.000\n232A1C98A3,124424,2011/02/01 02:23:59.000\nAC12A1C983,1242,2011/02/01 02:23:59.000\n3\nDB12A4338A,12412,large_server_2,dev1,/home/kuku/dev/lala/k.txt,2011/02/01 02:23:59.000\nD12A1C98A3,765,large_server_2,dev2,/home/lala/k.txt,2011/02/01 02:23:59.000\nDB12A4338A,12412,large_server_1,dev2,/home/kuku/lala/k.txt,2011/02/01 02:23:59.000\n")
|
116
|
+
assert_equal(cd4.to_s, "7\nAAC12A1C983,1242,2011/02/01 02:23:59.000\nAD12A1C98A3,765,2011/02/01 02:23:59.000\nAB12A1C98A3,123123,2011/02/01 02:23:59.000\nAD1234C98A3,12444,2011/02/01 02:23:59.000\nADB12A1C233,2,2011/02/01 02:23:59.000\nADB12A4338A,12412,2011/02/01 02:23:59.000\nA232A1C98A3,124424,2011/02/01 02:23:59.000\n3\nADB12A4338A,12412,large_server_12,dev1,/home/kuku/dev/lala/k.txt,2011/02/01 02:23:59.000\nAD12A1C98A3,765,large_server_12,dev2,/home/lala/k.txt,2011/02/01 02:23:59.000\nADB12A4338A,12412,large_server_11,dev2,/home/kuku/lala/k.txt,2011/02/01 02:23:59.000\n")
|
117
|
+
cd5 = ContentData.merge(cd3, cd4)
|
118
|
+
assert_equal(cd5, content_data)
|
119
|
+
|
120
|
+
intersect = ContentData.intersect(cd3, cd4)
|
121
|
+
assert_equal(intersect, ContentData.new)
|
122
|
+
intersect = ContentData.intersect(cd5, cd4)
|
123
|
+
assert_equal(cd4, intersect)
|
124
|
+
|
125
|
+
# Content serialization test
|
126
|
+
#content = Content.new("D12A1C98A3", 765, ContentData.parse_time("2011/02/01 02:23:59.000"))
|
127
|
+
#content_serializer = content.serialize()
|
128
|
+
#content_copy = Content.new(nil, nil, nil, content_serializer)
|
129
|
+
#assert_equal(content, content_copy)
|
130
|
+
|
131
|
+
# ContentInstance serialization test
|
132
|
+
#instance = ContentInstance.new("DB12A1C233", 765, "large_server_1", "dev1",
|
133
|
+
# "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000"))
|
134
|
+
#instance_serializer = instance.serialize()
|
135
|
+
#instance_copy = ContentInstance.new(nil, nil, nil, nil, nil, nil, instance_serializer)
|
136
|
+
#assert_equal(instance, instance_copy)
|
137
|
+
|
138
|
+
# ContentData serialization test
|
139
|
+
#content_data_serializer = content_data.serialize
|
140
|
+
#content_data_copy = ContentData.new(content_data_serializer)
|
141
|
+
#assert_equal(content_data, content_data_copy)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: content_data
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Gena Petelko, Kolman Vornovitsky
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-08 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: ! 'Data structure for an abstract layer over files. Each binary sequence
|
15
|
+
is a content, '
|
16
|
+
email: kolmanv@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/content_data.rb
|
22
|
+
- lib/content_data/content_data.rb
|
23
|
+
- test/content_data/content_data_test.rb
|
24
|
+
homepage: http://github.com/kolmanv/bbfs
|
25
|
+
licenses: []
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ! '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ! '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubyforge_project:
|
44
|
+
rubygems_version: 1.8.15
|
45
|
+
signing_key:
|
46
|
+
specification_version: 3
|
47
|
+
summary: Data structure for an abstract layer over files.
|
48
|
+
test_files:
|
49
|
+
- test/content_data/content_data_test.rb
|