build-files 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3809d8bed57d7862f74c35cda9b396784537f26e
4
- data.tar.gz: 1a0551a1f94d10ef77f3daf7ef23c71ed7640a74
3
+ metadata.gz: 219675f752dc63697b9075f9b14c5e528ad8571e
4
+ data.tar.gz: 632cd210ac7a90160607bb02ab03d70d33583a74
5
5
  SHA512:
6
- metadata.gz: d2cf244dd15dddc8d0f9649efb3cbf82ff6b1b10687d593d3dbe6656c549c802934139906895c6f508f36cd29095157984c0eb70837fa8a58218866ce7fb756c
7
- data.tar.gz: ade83990959c59d889dc1e77489b115536e262499036d36be0db7dd3479f7260df3e8a3d6f9029086e4319612a738a9f2d0d871b5d226e54716158fab4729565
6
+ metadata.gz: 88cfce577e99a4c3bba47890ce126675649e8880b8bc447d706a7c06bb45c663b3f5951824b2865cbe7f45d0040e29bd7b28a48a3925f08aeb582a05aa5ff5c1
7
+ data.tar.gz: 92471caf1ea8d0cd24713cacd34a92f04d5c02a37327489447cdc7b2fb5f7c267092e3fd9c565ea1dc88525c65fc73e7405ff9e1b2a44bb008c762a17c85f4ab
@@ -19,6 +19,7 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require 'set'
22
+ require 'logger'
22
23
 
23
24
  require 'build/files/state'
24
25
 
@@ -51,23 +52,29 @@ module Build
51
52
  end
52
53
 
53
54
  class Monitor
54
- def initialize
55
+ def initialize(logger: nil)
55
56
  @directories = Hash.new { |hash, key| hash[key] = Set.new }
56
57
 
57
58
  @updated = false
58
59
 
59
60
  @deletions = nil
61
+
62
+ @logger = logger || Logger.new(nil)
60
63
  end
61
64
 
62
65
  attr :updated
63
66
 
64
67
  # Notify the monitor that files in these directories have changed.
65
68
  def update(directories, *args)
69
+ @logger.debug{"Update: #{directories} #{args.inspect}"}
70
+
66
71
  delay_deletions do
67
72
  directories.each do |directory|
68
- # directory = File.realpath(directory)
73
+ @logger.debug{"Directory: #{directory}"}
69
74
 
70
75
  @directories[directory].each do |handle|
76
+ @logger.debug{"Handle changed: #{handle.inspect}"}
77
+
71
78
  handle.changed!(*args)
72
79
  end
73
80
  end
@@ -80,6 +87,7 @@ module Build
80
87
 
81
88
  def delete(handle)
82
89
  if @deletions
90
+ @logger.debug{"Delayed delete handle: #{handle}"}
83
91
  @deletions << handle
84
92
  else
85
93
  purge(handle)
@@ -93,6 +101,8 @@ module Build
93
101
  end
94
102
 
95
103
  def add(handle)
104
+ @logger.debug{"Adding handle: #{handle}"}
105
+
96
106
  handle.directories.each do |directory|
97
107
  @directories[directory] << handle
98
108
 
@@ -113,7 +123,7 @@ module Build
113
123
  else; :polling
114
124
  end
115
125
 
116
- if driver = options.fetch(:driver, default_driver)
126
+ if driver = (options[:driver] || default_driver)
117
127
  method_name = "run_with_#{driver}"
118
128
  Files.send(method_name, self, options, &block)
119
129
  end
@@ -134,6 +144,8 @@ module Build
134
144
  end
135
145
 
136
146
  def purge(handle)
147
+ @logger.debug{"Purge handle: #{handle}"}
148
+
137
149
  handle.directories.each do |directory|
138
150
  @directories[directory].delete(handle)
139
151
 
@@ -88,15 +88,6 @@ module Build
88
88
  self.components.last
89
89
  end
90
90
 
91
- # Ensure the path has an absolute root if it doesn't already:
92
- def to_absolute(root)
93
- if @root == "."
94
- self.rebase(root)
95
- else
96
- self
97
- end
98
- end
99
-
100
91
  attr :root
101
92
  attr :full_path
102
93
 
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Build
22
22
  module Files
23
- VERSION = "0.3.3"
23
+ VERSION = "0.3.4"
24
24
  end
25
25
  end
@@ -0,0 +1,56 @@
1
+ # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require 'build/files'
22
+ require 'build/files/path'
23
+ require 'build/files/path/filesystem'
24
+
25
+ require 'pathname'
26
+
27
+ module Build::Files::FilesystemSpec
28
+ include Build::Files
29
+
30
+ describe Build::Files::Path do
31
+ let(:root) {Path.new(__dir__)}
32
+ let(:path) {root + "filesystem_spec"}
33
+
34
+ after(:each) do
35
+ path.delete
36
+ end
37
+
38
+ it "should open file for writing" do
39
+ path.write("Hello World")
40
+
41
+ expect(File).to be_exist(path)
42
+ expect(path.read).to be == "Hello World"
43
+
44
+ expect(path).to be_exist
45
+ expect(path.directory?).to be == false
46
+
47
+ expect(path.modified_time.to_f).to be_within(5.0).of(Time.now.to_f)
48
+ end
49
+
50
+ it "should make a directory" do
51
+ path.create
52
+
53
+ expect(path.directory?).to be == true
54
+ end
55
+ end
56
+ end
@@ -28,6 +28,50 @@ module Build::Files::ListSpec
28
28
  describe Build::Files::Paths do
29
29
  let(:path) {Path.new("/foo/bar/baz", "/foo")}
30
30
 
31
+ it "should be inspectable" do
32
+ paths = Paths.new(path)
33
+
34
+ expect(paths.inspect).to be_include path.inspect
35
+ end
36
+
37
+ it "should be possible to convert to paths" do
38
+ paths = Paths.new(path)
39
+
40
+ expect(paths.to_paths).to be paths
41
+ end
42
+
43
+ it "should be count number of paths" do
44
+ paths = Paths.new(path)
45
+
46
+ expect(paths.count).to be == 1
47
+ end
48
+
49
+ it "should coerce array to paths" do
50
+ paths = Paths.coerce([path])
51
+
52
+ expect(paths).to be_kind_of Paths
53
+ expect(paths.count).to be == 1
54
+ expect(paths).to be_include path
55
+
56
+ same_paths = Paths.coerce(paths)
57
+ expect(same_paths).to be paths
58
+ end
59
+
60
+ it "can add two lists of paths together" do
61
+ paths_a = Paths.new(path)
62
+ paths_b = Paths.new(Path.join('/foo/bar', 'alice'))
63
+
64
+ paths = paths_a + paths_b
65
+
66
+ expect(paths.count).to be 2
67
+ expect(paths).to be_include path
68
+ expect(paths).to be_kind_of Composite
69
+
70
+ # Composite equality
71
+ expect(paths).to be_eql paths
72
+ expect(paths).to_not be_eql paths_a
73
+ end
74
+
31
75
  it "maps paths with a new extension" do
32
76
  paths = Paths.new([
33
77
  Path.join('/foo/bar', 'alice'),
@@ -31,48 +31,70 @@ module Build::Files::MonitorSpec
31
31
  ROOT = File.expand_path('../tmp', __FILE__)
32
32
 
33
33
  describe Build::Files::Monitor do
34
- let(:path) {Path.new(ROOT) + "test.txt"}
35
-
36
- before(:all) do
37
- Path.new(ROOT).mkpath
38
- end
39
-
40
- after(:all) do
41
- Path.new(ROOT).rmpath
42
- end
43
-
44
- it 'should detect additions' do
45
- directory = Build::Files::Directory.new(ROOT)
46
- monitor = Build::Files::Monitor.new
47
-
48
- changed = false
34
+ shared_examples_for Monitor do |driver|
35
+ let(:path) {Path.new(ROOT) + "test.txt"}
49
36
 
50
- monitor.track_changes(directory) do |state|
51
- changed = state.added.include? path
37
+ before(:all) do
38
+ Path.new(ROOT).create
52
39
  end
53
40
 
54
- touched = false
41
+ after(:all) do
42
+ Path.new(ROOT).delete
43
+ end
55
44
 
56
- thread = Thread.new do
57
- sleep 0.1
45
+ it 'should detect additions' do
46
+ directory = Build::Files::Directory.new(ROOT)
47
+ monitor = Build::Files::Monitor.new
48
+
49
+ changed = false
50
+
51
+ monitor.track_changes(directory) do |state|
52
+ changed = state.added.include? path
53
+ end
54
+
55
+ touched = false
58
56
 
59
- path.touch
57
+ thread = Thread.new do
58
+ sleep 0.1
59
+
60
+ path.touch
61
+
62
+ touched = true
63
+ end
60
64
 
61
- touched = true
65
+ triggered = 0
66
+
67
+ monitor.run(driver: driver) do
68
+ triggered += 1
69
+
70
+ throw :interrupt if touched
71
+ end
72
+
73
+ thread.join
74
+
75
+ expect(changed).to be true
76
+ expect(triggered).to be >= 1
62
77
  end
78
+ end
79
+
80
+ # Use the cross-platform driver, :polling
81
+ it_behaves_like Monitor, :polling
82
+
83
+ # Use the native platform driver, e.g. fsevent or inotify.
84
+ it_behaves_like Monitor
85
+
86
+ it "should add and remove monitored paths" do
87
+ directory = Build::Files::Directory.new(ROOT)
88
+ monitor = Build::Files::Monitor.new
63
89
 
64
- triggered = 0
65
-
66
- monitor.run do
67
- triggered += 1
68
-
69
- throw :interrupt if touched
90
+ handler = monitor.track_changes(directory) do |state|
70
91
  end
71
92
 
72
- thread.join
93
+ expect(monitor.roots).to be_include ROOT
94
+
95
+ handler.remove!
73
96
 
74
- expect(changed).to be true
75
- expect(triggered).to be >= 1
97
+ expect(monitor.roots).to be_empty
76
98
  end
77
99
  end
78
100
  end
@@ -29,6 +29,11 @@ module Build::Files::PathSpec
29
29
  describe Build::Files::Path do
30
30
  let(:path) {Path.new("/foo/bar/baz", "/foo")}
31
31
 
32
+ it "should be inspectable" do
33
+ expect(path.inspect).to be_include path.root.to_s
34
+ expect(path.inspect).to be_include path.relative_path.to_s
35
+ end
36
+
32
37
  it "should convert to path" do
33
38
  pathname = Pathname("/foo/bar/baz")
34
39
 
@@ -123,11 +128,32 @@ module Build::Files::PathSpec
123
128
  expect(path + "d/e/f").to be == "/a/b/c/d/e/f"
124
129
  end
125
130
 
131
+ it "should give a list of components" do
132
+ expect(Path.components(path)).to be == ["", "foo", "bar", "baz"]
133
+ expect(Path.components(path.to_s)).to be == ["", "foo", "bar", "baz"]
134
+ end
135
+
136
+ it "should give a basename" do
137
+ expect(path.basename).to be == "baz"
138
+ end
139
+
126
140
  it "should have a new root" do
127
141
  rerooted_path = path / "cat"
128
142
 
129
143
  expect(rerooted_path.root).to be == "/foo/bar/baz"
130
144
  expect(rerooted_path.relative_path).to be == "cat"
131
145
  end
146
+
147
+ it "should give correct modes for reading" do
148
+ expect(path.for_reading).to be == [path.to_s, File::RDONLY]
149
+ end
150
+
151
+ it "should give correct modes for writing" do
152
+ expect(path.for_writing).to be == [path.to_s, File::CREAT|File::TRUNC|File::WRONLY]
153
+ end
154
+
155
+ it "should give correct modes for appending" do
156
+ expect(path.for_appending).to be == [path.to_s, File::CREAT|File::APPEND|File::WRONLY]
157
+ end
132
158
  end
133
159
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: build-files
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-21 00:00:00.000000000 Z
11
+ date: 2015-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -75,6 +75,7 @@ files:
75
75
  - lib/build/files/state.rb
76
76
  - lib/build/files/version.rb
77
77
  - spec/build/files/directory_spec.rb
78
+ - spec/build/files/filesystem_spec.rb
78
79
  - spec/build/files/glob_spec.rb
79
80
  - spec/build/files/list_spec.rb
80
81
  - spec/build/files/monitor_spec.rb
@@ -107,6 +108,7 @@ summary: Build::Files is a set of idiomatic classes for dealing with paths and m
107
108
  directories.
108
109
  test_files:
109
110
  - spec/build/files/directory_spec.rb
111
+ - spec/build/files/filesystem_spec.rb
110
112
  - spec/build/files/glob_spec.rb
111
113
  - spec/build/files/list_spec.rb
112
114
  - spec/build/files/monitor_spec.rb