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.
@@ -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
@@ -0,0 +1,9 @@
1
+ require_relative 'content_data/content_data'
2
+
3
+ # Data structure for an abstract layer over files.
4
+ # Each binary sequence is a content, each file is content instance.
5
+ module BBFS
6
+ module ContentData
7
+ VERSION = "0.0.1"
8
+ end
9
+ end
@@ -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