file_tree_profiler 0.0.1 → 0.0.2

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.
@@ -4,10 +4,29 @@ require 'file_tree_profiler/file'
4
4
  require 'file_tree_profiler/data_file'
5
5
  require 'file_tree_profiler/dir_file'
6
6
  require 'file_tree_profiler/profile'
7
+ require 'file_tree_profiler/merge/pairing'
8
+ require 'file_tree_profiler/merge'
7
9
  require 'file_tree_profiler/export/csv'
8
10
  require 'file_tree_profiler/export/sql'
9
11
 
10
12
  module FileTreeProfiler
13
+ def self.monitor_report(*args)
14
+ @@monitor.report(*args) if monitoring?
15
+ end
16
+
17
+ def self.monitoring?
18
+ defined?(@@monitoring) && @@monitoring == true
19
+ end
20
+
21
+ def self.with_monitoring(monitor)
22
+ @@monitor = monitor
23
+ @@monitoring = true
24
+ yield
25
+ ensure
26
+ @@monitor = false
27
+ @@monitoring = false
28
+ end
29
+
11
30
  def self.profile path
12
31
  Profile.new path
13
32
  end
@@ -12,6 +12,9 @@ module FileTreeProfiler
12
12
  end.to_s
13
13
  rescue Errno::ELOOP => e
14
14
  puts "path=#{path} is a circular ref"
15
+ rescue Errno::ENOENT => e
16
+ puts "got deleted while profiling!!!"
17
+ @checksum = EMPTY_CHECKSUM
15
18
  end
16
19
 
17
20
  def size
@@ -11,10 +11,11 @@ module FileTreeProfiler
11
11
  # collects all children as DirFile or DataFile objects
12
12
  # and is invoked on each collected DirFile object
13
13
  def walk
14
+ FileTreeProfiler.monitor_report(:profile, :dir, path)
14
15
  @children = []
15
- Dir.foreach(self.path) do |entry|
16
+ Dir.foreach(path) do |entry|
16
17
  next if (entry == '..' || entry == '.')
17
- full_path = ::File.join(self.path, entry)
18
+ full_path = ::File.join(path, entry)
18
19
  if ::File.directory?(full_path)
19
20
  children.push DirFile.new(self, entry)
20
21
  else
@@ -0,0 +1,48 @@
1
+ module FileTreeProfiler
2
+ class Merge
3
+ attr_reader :source_profile, :target_profile, :pairings
4
+
5
+ def initialize source_profile, target_profile
6
+ @source_profile = source_profile
7
+ @target_profile = target_profile
8
+ @pairings = {}
9
+ merge :source, source_profile.root
10
+ merge :target, target_profile.root
11
+
12
+ pairings.each do |relative_path, f|
13
+ FileTreeProfiler.monitor_report :merge_finalize, relative_path
14
+ if parent_relative_path = f.parent_relative_path
15
+ if parent = self[parent_relative_path]
16
+ f.status_leaf = parent.status != f.status
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ def add scope, file
23
+ key = file.relative_path
24
+ pairings[key] ||= Pairing.new
25
+ pairings[key].add scope, file
26
+ end
27
+
28
+ def merge scope, dir_file
29
+ FileTreeProfiler.monitor_report :merge_map, :dir, dir_file.path
30
+ add scope, dir_file
31
+ dir_file.children.each do |child|
32
+ if child.class == DirFile
33
+ merge scope, child
34
+ else
35
+ add scope, child
36
+ end
37
+ end
38
+ end
39
+
40
+ def [](relative_path)
41
+ pairings[relative_path]
42
+ end
43
+
44
+ def size
45
+ pairings.size
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,66 @@
1
+ module FileTreeProfiler
2
+ class Merge
3
+ class Pairing
4
+ EQUAL = 1
5
+ DIFFERENT = 2
6
+ ONLY_SOURCE = 3
7
+ ONLY_TARGET = 4
8
+
9
+ attr_accessor :status_leaf
10
+
11
+ def initialize
12
+ @status_leaf = false
13
+ end
14
+
15
+ def add scope, file
16
+ @files ||= {}
17
+ @files[scope] = file
18
+ end
19
+
20
+ def source
21
+ @files[:source]
22
+ end
23
+
24
+ def target
25
+ @files[:target]
26
+ end
27
+
28
+ def name
29
+ any.name
30
+ end
31
+
32
+ def relative_path
33
+ any.relative_path
34
+ end
35
+
36
+ def parent_relative_path
37
+ if relative_path == '/'
38
+ nil
39
+ else
40
+ ::File.dirname(relative_path)
41
+ end
42
+ end
43
+
44
+ def any
45
+ (source || target)
46
+ end
47
+
48
+ def status
49
+ @status ||= begin
50
+ if source && target
51
+ if source.checksum == target.checksum
52
+ EQUAL
53
+ else
54
+ DIFFERENT
55
+ end
56
+ elsif source
57
+ ONLY_SOURCE
58
+ else
59
+ ONLY_TARGET
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -1,3 +1,3 @@
1
1
  module FileTreeProfiler
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe FileTreeProfiler::Merge::Pairing do
4
+ let(:source) do
5
+ mock(:source).tap do |source|
6
+ source.stub(:checksum).and_return('a1')
7
+ source.stub(:name).and_return('foo')
8
+ end
9
+ end
10
+
11
+ let(:target) do
12
+ mock(:target).tap do |source|
13
+ source.stub(:checksum).and_return('a1')
14
+ source.stub(:name).and_return('foo')
15
+ end
16
+ end
17
+
18
+ context :equal do
19
+ before do
20
+ subject.add :source, source
21
+ subject.add :target, target
22
+ end
23
+
24
+ its(:name) { should == 'foo' }
25
+ its(:status) { should == described_class::EQUAL }
26
+ end
27
+
28
+ context :different do
29
+ before do
30
+ source.stub(:checksum).and_return('b2')
31
+ subject.add :source, source
32
+ subject.add :target, target
33
+ end
34
+
35
+ its(:name) { should == 'foo' }
36
+ its(:status) { should == described_class::DIFFERENT }
37
+ end
38
+
39
+ context :only_target do
40
+ before do
41
+ subject.add :target, target
42
+ end
43
+
44
+ its(:name) { should == 'foo' }
45
+ its(:status) { should == described_class::ONLY_TARGET }
46
+ end
47
+
48
+ context :only_source do
49
+ before do
50
+ subject.add :source, source
51
+ end
52
+
53
+ its(:name) { should == 'foo' }
54
+ its(:status) { should == described_class::ONLY_SOURCE }
55
+ end
56
+ end
@@ -35,6 +35,45 @@ describe FileTreeProfiler::Profile do
35
35
  context :partially do
36
36
  specify { profile_a.root.children.first.name.should == profile_c.root.children.first.name }
37
37
  specify { profile_a.root.children.first.checksum.should == profile_c.root.children.first.checksum }
38
+
39
+ context :merge do
40
+ let(:merge) { FileTreeProfiler::Merge.new(profile_a, profile_c) }
41
+ subject { merge }
42
+ its(:size) { should == 11 }
43
+
44
+ specify do
45
+ subject.pairings.map{|k,v| k}.should == \
46
+ ["/", "/foo", "/foo/bar.txt", "/foo/foo.txt", "/foo2", "/foo2/bar.txt", "/foo2/baz", "/foo2/baz/foo.txt", "/foo2/foo.txt", "/foo2/baz.txt", "/partially_different.txt"]
47
+ end
48
+
49
+ shared_examples_for :pairing do |relative_path, expected_status, expected_status_leaf|
50
+ expected_status = {
51
+ :equal => FileTreeProfiler::Merge::Pairing::EQUAL,
52
+ :different => FileTreeProfiler::Merge::Pairing::DIFFERENT,
53
+ :only_target => FileTreeProfiler::Merge::Pairing::ONLY_TARGET,
54
+ :only_source => FileTreeProfiler::Merge::Pairing::ONLY_SOURCE
55
+ }[expected_status] || raise("unknown status = '#{expected_status}'")
56
+ context relative_path do
57
+ subject { merge[relative_path] }
58
+ its(:relative_path) { should == relative_path }
59
+ its(:parent_relative_path) { should == ::File.dirname(relative_path) }
60
+ its(:name) { should == ::File.basename(relative_path) }
61
+ its(:class) { should == FileTreeProfiler::Merge::Pairing }
62
+ its(:status) { should == expected_status }
63
+ its(:status_leaf) { should == expected_status_leaf }
64
+ end
65
+ end
66
+
67
+ include_examples :pairing, '/foo', :equal, true
68
+ include_examples :pairing, '/foo/bar.txt', :equal, false
69
+ include_examples :pairing, '/foo/foo.txt', :equal, false
70
+ include_examples :pairing, '/partially_different.txt', :only_target, true
71
+ include_examples :pairing, '/foo2/baz', :equal, true
72
+ include_examples :pairing, '/foo2/baz/foo.txt', :equal, false
73
+ include_examples :pairing, '/foo2/bar.txt', :only_source, true
74
+ include_examples :pairing, '/foo2/baz.txt', :only_target, true
75
+ include_examples :pairing, '/foo2/foo.txt', :different, false
76
+ end
38
77
  end
39
78
  end
40
79
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: file_tree_profiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-05 00:00:00.000000000 Z
12
+ date: 2013-01-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sequel
@@ -82,6 +82,8 @@ files:
82
82
  - lib/file_tree_profiler/export/csv.rb
83
83
  - lib/file_tree_profiler/export/sql.rb
84
84
  - lib/file_tree_profiler/file.rb
85
+ - lib/file_tree_profiler/merge.rb
86
+ - lib/file_tree_profiler/merge/pairing.rb
85
87
  - lib/file_tree_profiler/profile.rb
86
88
  - lib/file_tree_profiler/version.rb
87
89
  - spec/example_folders/a/a.txt
@@ -91,9 +93,15 @@ files:
91
93
  - spec/example_folders/b/bb.txt
92
94
  - spec/example_folders/differents/profile_a/foo/bar.txt
93
95
  - spec/example_folders/differents/profile_a/foo/foo.txt
96
+ - spec/example_folders/differents/profile_a/foo2/bar.txt
97
+ - spec/example_folders/differents/profile_a/foo2/baz/foo.txt
98
+ - spec/example_folders/differents/profile_a/foo2/foo.txt
94
99
  - spec/example_folders/differents/profile_b/foo/bar.txt
95
100
  - spec/example_folders/differents/profile_c/foo/bar.txt
96
101
  - spec/example_folders/differents/profile_c/foo/foo.txt
102
+ - spec/example_folders/differents/profile_c/foo2/baz.txt
103
+ - spec/example_folders/differents/profile_c/foo2/baz/foo.txt
104
+ - spec/example_folders/differents/profile_c/foo2/foo.txt
97
105
  - spec/example_folders/differents/profile_c/partially_different.txt
98
106
  - spec/example_folders/equals/profile_a/bar.txt
99
107
  - spec/example_folders/equals/profile_a/foo/foo.txt
@@ -106,6 +114,7 @@ files:
106
114
  - spec/lib/file_tree_profiler/data_file_spec.rb
107
115
  - spec/lib/file_tree_profiler/dir_file_spec.rb
108
116
  - spec/lib/file_tree_profiler/export/sql_export_spec.rb
117
+ - spec/lib/file_tree_profiler/merge/files_spec.rb
109
118
  - spec/lib/file_tree_profiler/profile_spec.rb
110
119
  - spec/lib/file_tree_profiler_spec.rb
111
120
  - spec/spec_helper.rb
@@ -143,9 +152,15 @@ test_files:
143
152
  - spec/example_folders/b/bb.txt
144
153
  - spec/example_folders/differents/profile_a/foo/bar.txt
145
154
  - spec/example_folders/differents/profile_a/foo/foo.txt
155
+ - spec/example_folders/differents/profile_a/foo2/bar.txt
156
+ - spec/example_folders/differents/profile_a/foo2/baz/foo.txt
157
+ - spec/example_folders/differents/profile_a/foo2/foo.txt
146
158
  - spec/example_folders/differents/profile_b/foo/bar.txt
147
159
  - spec/example_folders/differents/profile_c/foo/bar.txt
148
160
  - spec/example_folders/differents/profile_c/foo/foo.txt
161
+ - spec/example_folders/differents/profile_c/foo2/baz.txt
162
+ - spec/example_folders/differents/profile_c/foo2/baz/foo.txt
163
+ - spec/example_folders/differents/profile_c/foo2/foo.txt
149
164
  - spec/example_folders/differents/profile_c/partially_different.txt
150
165
  - spec/example_folders/equals/profile_a/bar.txt
151
166
  - spec/example_folders/equals/profile_a/foo/foo.txt
@@ -158,6 +173,7 @@ test_files:
158
173
  - spec/lib/file_tree_profiler/data_file_spec.rb
159
174
  - spec/lib/file_tree_profiler/dir_file_spec.rb
160
175
  - spec/lib/file_tree_profiler/export/sql_export_spec.rb
176
+ - spec/lib/file_tree_profiler/merge/files_spec.rb
161
177
  - spec/lib/file_tree_profiler/profile_spec.rb
162
178
  - spec/lib/file_tree_profiler_spec.rb
163
179
  - spec/spec_helper.rb