content_data 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|