build-files 1.7.0 → 1.8.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/build/files/path.rb +6 -0
- data/lib/build/files/state.rb +172 -0
- data/lib/build/files/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +40 -50
- metadata.gz.sig +0 -0
- data/.gitignore +0 -24
- data/.rspec +0 -4
- data/.travis.yml +0 -14
- data/Gemfile +0 -9
- data/README.md +0 -69
- data/build-files.gemspec +0 -25
- data/spec/build/files/directory_spec/.dot_file.yaml +0 -0
- data/spec/build/files/directory_spec/normal_file.txt +0 -0
- data/spec/build/files/directory_spec.rb +0 -80
- data/spec/build/files/glob_spec/dotfiles/.file +0 -0
- data/spec/build/files/glob_spec.rb +0 -53
- data/spec/build/files/list_spec.rb +0 -182
- data/spec/build/files/path_spec.rb +0 -223
- data/spec/build/files/system_spec.rb +0 -56
- data/spec/spec_helper.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13546b8a7c748816d55902380e09b9406074ea0983dc487de2afac9cef4a7000
|
4
|
+
data.tar.gz: 731d2f9b19bfcc42356db6c2c0bd8ae93025118c3c57e04fd2fb68ef93e3ab5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f378f74224fe53b757e3425ba2b540fdb34ab63570ac865288804a9d9abbafeea0245c6edb9b788409f4246fca88fb893c50ce471ab99cf6daf7ceac908f727
|
7
|
+
data.tar.gz: 52dbba181571f9bb1e7c84bdca6a18e2938c89f5260a826d7753214bd8ffe4634c7019e20c9dc1a71bbd7c08aa0a11dfb407a74686bea34118902a2dea366bef
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data/lib/build/files/path.rb
CHANGED
@@ -110,6 +110,8 @@ module Build
|
|
110
110
|
@full_path.length
|
111
111
|
end
|
112
112
|
|
113
|
+
alias size length
|
114
|
+
|
113
115
|
def components
|
114
116
|
@components ||= @full_path.split(File::SEPARATOR).freeze
|
115
117
|
end
|
@@ -126,6 +128,10 @@ module Build
|
|
126
128
|
root = Path.root(root)
|
127
129
|
end
|
128
130
|
|
131
|
+
if root.size == full_path.size
|
132
|
+
root = Path.root(root)
|
133
|
+
end
|
134
|
+
|
129
135
|
self.class.new(full_path, root)
|
130
136
|
end
|
131
137
|
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# Copyright, 2014, 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_relative 'list'
|
22
|
+
|
23
|
+
require 'forwardable'
|
24
|
+
|
25
|
+
module Build
|
26
|
+
module Files
|
27
|
+
# A stateful list of files captured at a specific time, which can then be checked for changes.
|
28
|
+
class State < List
|
29
|
+
extend Forwardable
|
30
|
+
|
31
|
+
# Represents a specific file on disk with a specific mtime.
|
32
|
+
class FileTime
|
33
|
+
include Comparable
|
34
|
+
|
35
|
+
def initialize(path, time)
|
36
|
+
@path = path
|
37
|
+
@time = time
|
38
|
+
end
|
39
|
+
|
40
|
+
attr :path
|
41
|
+
attr :time
|
42
|
+
|
43
|
+
def <=> other
|
44
|
+
@time <=> other.time
|
45
|
+
end
|
46
|
+
|
47
|
+
def inspect
|
48
|
+
"<FileTime #{@path.inspect} #{@time.inspect}>"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize(files)
|
53
|
+
raise ArgumentError.new("Invalid files list: #{files}") unless Files::List === files
|
54
|
+
|
55
|
+
@files = files
|
56
|
+
|
57
|
+
@times = {}
|
58
|
+
|
59
|
+
update!
|
60
|
+
end
|
61
|
+
|
62
|
+
attr :files
|
63
|
+
|
64
|
+
attr :added
|
65
|
+
attr :removed
|
66
|
+
attr :changed
|
67
|
+
attr :missing
|
68
|
+
|
69
|
+
attr :times
|
70
|
+
|
71
|
+
def_delegators :@files, :each, :roots, :count
|
72
|
+
|
73
|
+
def update!
|
74
|
+
last_times = @times
|
75
|
+
@times = {}
|
76
|
+
|
77
|
+
@added = []
|
78
|
+
@removed = []
|
79
|
+
@changed = []
|
80
|
+
@missing = []
|
81
|
+
|
82
|
+
file_times = []
|
83
|
+
|
84
|
+
@files.each do |path|
|
85
|
+
# When processing the same path twice (perhaps by accident), we should skip it otherwise it might cause issues when being deleted from last_times multuple times.
|
86
|
+
next if @times.include? path
|
87
|
+
|
88
|
+
if File.exist?(path)
|
89
|
+
modified_time = File.mtime(path)
|
90
|
+
|
91
|
+
if last_time = last_times.delete(path)
|
92
|
+
# Path was valid last update:
|
93
|
+
if modified_time != last_time
|
94
|
+
@changed << path
|
95
|
+
|
96
|
+
# puts "Changed: #{path}"
|
97
|
+
end
|
98
|
+
else
|
99
|
+
# Path didn't exist before:
|
100
|
+
@added << path
|
101
|
+
|
102
|
+
# puts "Added: #{path}"
|
103
|
+
end
|
104
|
+
|
105
|
+
@times[path] = modified_time
|
106
|
+
|
107
|
+
unless File.directory?(path)
|
108
|
+
file_times << FileTime.new(path, modified_time)
|
109
|
+
end
|
110
|
+
else
|
111
|
+
@missing << path
|
112
|
+
|
113
|
+
# puts "Missing: #{path}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
@removed = last_times.keys
|
118
|
+
# puts "Removed: #{@removed.inspect}" if @removed.size > 0
|
119
|
+
|
120
|
+
@oldest_time = file_times.min
|
121
|
+
@newest_time = file_times.max
|
122
|
+
|
123
|
+
return @added.size > 0 || @changed.size > 0 || @removed.size > 0 || @missing.size > 0
|
124
|
+
end
|
125
|
+
|
126
|
+
attr :oldest_time
|
127
|
+
attr :newest_time
|
128
|
+
|
129
|
+
def missing?
|
130
|
+
!@missing.empty?
|
131
|
+
end
|
132
|
+
|
133
|
+
def empty?
|
134
|
+
@times.empty?
|
135
|
+
end
|
136
|
+
|
137
|
+
def inspect
|
138
|
+
"<State Added:#{@added} Removed:#{@removed} Changed:#{@changed} Missing:#{@missing}>"
|
139
|
+
end
|
140
|
+
|
141
|
+
# Are these (output) files dirty with respect to the given inputs?
|
142
|
+
def dirty?(inputs)
|
143
|
+
if self.missing?
|
144
|
+
return true
|
145
|
+
end
|
146
|
+
|
147
|
+
# If there are no inputs or no outputs, we are always clean:
|
148
|
+
if inputs.empty? or self.empty?
|
149
|
+
return false
|
150
|
+
end
|
151
|
+
|
152
|
+
oldest_output_time = self.oldest_time
|
153
|
+
newest_input_time = inputs.newest_time
|
154
|
+
|
155
|
+
if newest_input_time and oldest_output_time
|
156
|
+
# We are dirty if any inputs are newer (bigger) than any outputs:
|
157
|
+
if newest_input_time > oldest_output_time
|
158
|
+
return true
|
159
|
+
else
|
160
|
+
return false
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
return true
|
165
|
+
end
|
166
|
+
|
167
|
+
def self.dirty?(inputs, outputs)
|
168
|
+
outputs.dirty?(inputs)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
data/lib/build/files/version.rb
CHANGED
data.tar.gz.sig
ADDED
Binary file
|
metadata
CHANGED
@@ -1,17 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: build-files
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIEhDCCAuygAwIBAgIBATANBgkqhkiG9w0BAQsFADA3MTUwMwYDVQQDDCxzYW11
|
14
|
+
ZWwud2lsbGlhbXMvREM9b3Jpb250cmFuc2Zlci9EQz1jby9EQz1uejAeFw0yMTA4
|
15
|
+
MTYwNjMzNDRaFw0yMjA4MTYwNjMzNDRaMDcxNTAzBgNVBAMMLHNhbXVlbC53aWxs
|
16
|
+
aWFtcy9EQz1vcmlvbnRyYW5zZmVyL0RDPWNvL0RDPW56MIIBojANBgkqhkiG9w0B
|
17
|
+
AQEFAAOCAY8AMIIBigKCAYEAyXLSS/cw+fXJ5e7hi+U/TeChPWeYdwJojDsFY1xr
|
18
|
+
xvtqbTTL8gbLHz5LW3QD2nfwCv3qTlw0qI3Ie7a9VMJMbSvgVEGEfQirqIgJXWMj
|
19
|
+
eNMDgKsMJtC7u/43abRKx7TCURW3iWyR19NRngsJJmaR51yGGGm2Kfsr+JtKKLtL
|
20
|
+
L188Wm3f13KAx7QJU8qyuBnj1/gWem076hzdA7xi1DbrZrch9GCRz62xymJlrJHn
|
21
|
+
9iZEZ7AxrS7vokhMlzSr/XMUihx/8aFKtk+tMLClqxZSmBWIErWdicCGTULXCBNb
|
22
|
+
E/mljo4zEVKhlTWpJklMIhr55ZRrSarKFuW7en0+tpJrfsYiAmXMJNi4XAYJH7uL
|
23
|
+
rgJuJwSaa/dMz+VmUoo7VKtSfCoOI+6v5/z0sK3oT6sG6ZwyI47DBq2XqNC6tnAj
|
24
|
+
w+XmCywiTQrFzMMAvcA7rPI4F0nU1rZId51rOvvfxaONp+wgTi4P8owZLw0/j0m4
|
25
|
+
8C20DYi6EYx4AHDXiLpElWh3AgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8E
|
26
|
+
BAMCBLAwHQYDVR0OBBYEFB6ZaeWKxQjGTI+pmz7cKRmMIywwMC4GA1UdEQQnMCWB
|
27
|
+
I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWB
|
28
|
+
I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEB
|
29
|
+
CwUAA4IBgQBVoM+pu3dpdUhZM1w051iw5GfiqclAr1Psypf16Tiod/ho//4oAu6T
|
30
|
+
9fj3DPX/acWV9P/FScvqo4Qgv6g4VWO5ZU7z2JmPoTXZtYMunRAmQPFL/gSUc6aK
|
31
|
+
vszMHIyhtyzRc6DnfW2AiVOjMBjaYv8xXZc9bduniRVPrLR4J7ozmGLh4o4uJp7w
|
32
|
+
x9KCFaR8Lvn/r0oJWJOqb/DMAYI83YeN2Dlt3jpwrsmsONrtC5S3gOUle5afSGos
|
33
|
+
bYt5ocnEpKSomR9ZtnCGljds/aeO1Xgpn2r9HHcjwnH346iNrnHmMlC7BtHUFPDg
|
34
|
+
Ts92S47PTOXzwPBDsrFiq3VLbRjHSwf8rpqybQBH9MfzxGGxTaETQYOd6b4e4Ag6
|
35
|
+
y92abGna0bmIEb4+Tx9rQ10Uijh1POzvr/VTH4bbIPy9FbKrRsIQ24qDbNJRtOpE
|
36
|
+
RAOsIl+HOBTb252nx1kIRN5hqQx272AJCbCjKx8egcUQKffFVVCI0nye09v5CK+a
|
37
|
+
HiLJ8VOFx6w=
|
38
|
+
-----END CERTIFICATE-----
|
39
|
+
date: 2022-05-22 00:00:00.000000000 Z
|
12
40
|
dependencies:
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
42
|
+
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
16
44
|
requirements:
|
17
45
|
- - ">="
|
@@ -25,7 +53,7 @@ dependencies:
|
|
25
53
|
- !ruby/object:Gem::Version
|
26
54
|
version: '0'
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
56
|
+
name: covered
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
30
58
|
requirements:
|
31
59
|
- - ">="
|
@@ -52,33 +80,12 @@ dependencies:
|
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '3.4'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bake-bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
83
|
description:
|
70
84
|
email:
|
71
|
-
- samuel.williams@oriontransfer.co.nz
|
72
85
|
executables: []
|
73
86
|
extensions: []
|
74
87
|
extra_rdoc_files: []
|
75
88
|
files:
|
76
|
-
- ".gitignore"
|
77
|
-
- ".rspec"
|
78
|
-
- ".travis.yml"
|
79
|
-
- Gemfile
|
80
|
-
- README.md
|
81
|
-
- build-files.gemspec
|
82
89
|
- lib/build/files.rb
|
83
90
|
- lib/build/files/composite.rb
|
84
91
|
- lib/build/files/difference.rb
|
@@ -87,21 +94,14 @@ files:
|
|
87
94
|
- lib/build/files/list.rb
|
88
95
|
- lib/build/files/path.rb
|
89
96
|
- lib/build/files/paths.rb
|
97
|
+
- lib/build/files/state.rb
|
90
98
|
- lib/build/files/system.rb
|
91
99
|
- lib/build/files/version.rb
|
92
|
-
|
93
|
-
- spec/build/files/directory_spec/.dot_file.yaml
|
94
|
-
- spec/build/files/directory_spec/normal_file.txt
|
95
|
-
- spec/build/files/glob_spec.rb
|
96
|
-
- spec/build/files/glob_spec/dotfiles/.file
|
97
|
-
- spec/build/files/list_spec.rb
|
98
|
-
- spec/build/files/path_spec.rb
|
99
|
-
- spec/build/files/system_spec.rb
|
100
|
-
- spec/spec_helper.rb
|
101
|
-
homepage: ''
|
100
|
+
homepage: https://github.com/ioquatix/build-files
|
102
101
|
licenses:
|
103
102
|
- MIT
|
104
|
-
metadata:
|
103
|
+
metadata:
|
104
|
+
funding_uri: https://github.com/sponsors/ioquatix/
|
105
105
|
post_install_message:
|
106
106
|
rdoc_options: []
|
107
107
|
require_paths:
|
@@ -117,18 +117,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: '0'
|
119
119
|
requirements: []
|
120
|
-
rubygems_version: 3.
|
120
|
+
rubygems_version: 3.1.6
|
121
121
|
signing_key:
|
122
122
|
specification_version: 4
|
123
|
-
summary:
|
124
|
-
|
125
|
-
test_files:
|
126
|
-
- spec/build/files/directory_spec.rb
|
127
|
-
- spec/build/files/directory_spec/.dot_file.yaml
|
128
|
-
- spec/build/files/directory_spec/normal_file.txt
|
129
|
-
- spec/build/files/glob_spec.rb
|
130
|
-
- spec/build/files/glob_spec/dotfiles/.file
|
131
|
-
- spec/build/files/list_spec.rb
|
132
|
-
- spec/build/files/path_spec.rb
|
133
|
-
- spec/build/files/system_spec.rb
|
134
|
-
- spec/spec_helper.rb
|
123
|
+
summary: Abstractions for handling and mapping paths.
|
124
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|
data/.gitignore
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
*.gem
|
2
|
-
*.rbc
|
3
|
-
.bundle
|
4
|
-
.config
|
5
|
-
.yardoc
|
6
|
-
Gemfile.lock
|
7
|
-
InstalledFiles
|
8
|
-
_yardoc
|
9
|
-
coverage
|
10
|
-
doc/
|
11
|
-
lib/bundler/man
|
12
|
-
pkg
|
13
|
-
rdoc
|
14
|
-
spec/reports
|
15
|
-
test/tmp
|
16
|
-
test/version_tmp
|
17
|
-
tmp
|
18
|
-
*.bundle
|
19
|
-
*.so
|
20
|
-
*.o
|
21
|
-
*.a
|
22
|
-
mkmf.log
|
23
|
-
.rspec_status
|
24
|
-
|
data/.rspec
DELETED
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/README.md
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
# Build::Files
|
2
|
-
|
3
|
-
Build::Files is a set of idiomatic classes for dealing with paths and monitoring directories. File paths are represented with both root and relative parts which makes copying directory structures intuitive.
|
4
|
-
|
5
|
-
[](http://travis-ci.org/ioquatix/build-files)
|
6
|
-
[](https://codeclimate.com/github/ioquatix/build-files)
|
7
|
-
[](https://coveralls.io/r/ioquatix/build-files)
|
8
|
-
|
9
|
-
## Installation
|
10
|
-
|
11
|
-
Add this line to your application's Gemfile:
|
12
|
-
|
13
|
-
gem 'build-files'
|
14
|
-
|
15
|
-
And then execute:
|
16
|
-
|
17
|
-
$ bundle
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
$ gem install build-files
|
22
|
-
|
23
|
-
## Usage
|
24
|
-
|
25
|
-
The basic structure is the `Path`. Paths are stored with a root and relative part. By default, if no root is specified, it is the `dirname` part.
|
26
|
-
|
27
|
-
require 'build/files'
|
28
|
-
|
29
|
-
path = Build::Files::Path("/foo/bar/baz")
|
30
|
-
=> "/foo/bar"/"baz"
|
31
|
-
|
32
|
-
> path.root
|
33
|
-
=> "/foo/bar"
|
34
|
-
> path.relative_path
|
35
|
-
=> "baz"
|
36
|
-
|
37
|
-
Paths can be coerced to strings and thus are suitable arguments to `exec`/`system` functions.
|
38
|
-
|
39
|
-
## Contributing
|
40
|
-
|
41
|
-
1. Fork it
|
42
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
43
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
44
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
45
|
-
5. Create new Pull Request
|
46
|
-
|
47
|
-
## License
|
48
|
-
|
49
|
-
Released under the MIT license.
|
50
|
-
|
51
|
-
Copyright, 2014, by [Samuel G. D. Williams](http://www.codeotaku.com/samuel-williams).
|
52
|
-
|
53
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
54
|
-
of this software and associated documentation files (the "Software"), to deal
|
55
|
-
in the Software without restriction, including without limitation the rights
|
56
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
57
|
-
copies of the Software, and to permit persons to whom the Software is
|
58
|
-
furnished to do so, subject to the following conditions:
|
59
|
-
|
60
|
-
The above copyright notice and this permission notice shall be included in
|
61
|
-
all copies or substantial portions of the Software.
|
62
|
-
|
63
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
64
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
65
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
66
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
67
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
68
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
69
|
-
THE SOFTWARE.
|
data/build-files.gemspec
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
|
2
|
-
require_relative 'lib/build/files/version'
|
3
|
-
|
4
|
-
Gem::Specification.new do |spec|
|
5
|
-
spec.name = "build-files"
|
6
|
-
spec.version = Build::Files::VERSION
|
7
|
-
spec.authors = ["Samuel Williams"]
|
8
|
-
spec.email = ["samuel.williams@oriontransfer.co.nz"]
|
9
|
-
# spec.description = %q{}
|
10
|
-
spec.summary = %q{Build::Files is a set of idiomatic classes for dealing with paths and monitoring directories.}
|
11
|
-
spec.homepage = ""
|
12
|
-
spec.license = "MIT"
|
13
|
-
|
14
|
-
spec.files = `git ls-files`.split($/)
|
15
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
-
spec.require_paths = ["lib"]
|
18
|
-
|
19
|
-
spec.required_ruby_version = '>= 2.0'
|
20
|
-
|
21
|
-
spec.add_development_dependency "covered"
|
22
|
-
spec.add_development_dependency "bundler"
|
23
|
-
spec.add_development_dependency "rspec", "~> 3.4"
|
24
|
-
spec.add_development_dependency "bake-bundler"
|
25
|
-
end
|
File without changes
|
File without changes
|
@@ -1,80 +0,0 @@
|
|
1
|
-
# Copyright, 2014, 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/directory'
|
22
|
-
|
23
|
-
module Build::Files::DirectorySpec
|
24
|
-
include Build::Files
|
25
|
-
|
26
|
-
describe Build::Files::Directory do
|
27
|
-
let(:path) {Path.new("/foo/bar/baz", "/foo")}
|
28
|
-
let(:directory) {Directory.new(path)}
|
29
|
-
|
30
|
-
it "can be constructed using join" do
|
31
|
-
joined_directory = Directory.join('/foo', 'bar/baz')
|
32
|
-
|
33
|
-
expect(joined_directory).to be == directory
|
34
|
-
end
|
35
|
-
|
36
|
-
it "has a root and path component" do
|
37
|
-
expect(directory.root).to be == path
|
38
|
-
expect(directory.to_path).to be == path
|
39
|
-
|
40
|
-
expect(directory.roots).to be_include(path)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "can be converted into a string" do
|
44
|
-
expect(directory.to_str).to be == path.to_str
|
45
|
-
end
|
46
|
-
|
47
|
-
it "can be used as a key" do
|
48
|
-
hash = {directory => true}
|
49
|
-
|
50
|
-
expect(hash).to be_include directory
|
51
|
-
end
|
52
|
-
|
53
|
-
it "includes subpaths" do
|
54
|
-
expect(directory).to be_include "/foo/bar/baz/bob/dole"
|
55
|
-
end
|
56
|
-
|
57
|
-
it "can be compared" do
|
58
|
-
other_directory = Directory.new(path + 'dole')
|
59
|
-
|
60
|
-
expect(directory).to be_eql directory
|
61
|
-
expect(directory).to_not be_eql other_directory
|
62
|
-
end
|
63
|
-
|
64
|
-
it "can be rebased" do
|
65
|
-
rebased_directory = directory.rebase("/fu")
|
66
|
-
|
67
|
-
expect(rebased_directory.root).to be == '/fu/bar/baz'
|
68
|
-
end
|
69
|
-
|
70
|
-
context Directory.join(__dir__, "directory_spec") do
|
71
|
-
it "can list dot files" do
|
72
|
-
expect(subject).to include(subject.root + '.dot_file.yaml')
|
73
|
-
end
|
74
|
-
|
75
|
-
it "can list normal files" do
|
76
|
-
expect(subject).to include(subject.root + 'normal_file.txt')
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
File without changes
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# Copyright, 2014, 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/glob'
|
22
|
-
|
23
|
-
RSpec.describe Build::Files::Glob do
|
24
|
-
let(:path) {Build::Files::Path.new(__dir__)}
|
25
|
-
|
26
|
-
it "can glob paths" do
|
27
|
-
paths = path.glob("*.rb")
|
28
|
-
|
29
|
-
expect(paths.count).to be >= 1
|
30
|
-
end
|
31
|
-
|
32
|
-
it "can be used as key in hash" do
|
33
|
-
cache = {}
|
34
|
-
|
35
|
-
cache[path.glob("*.rb")] = true
|
36
|
-
|
37
|
-
expect(cache).to be_include(path.glob("*.rb"))
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should print nice string represenation" do
|
41
|
-
glob = Build::Files::Glob.new(".", "*.rb")
|
42
|
-
|
43
|
-
expect("#{glob}").to be == '<Glob "."/"*.rb">'
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'with dotfiles' do
|
47
|
-
it "should list files starting with dot" do
|
48
|
-
paths = path.glob("glob_spec/dotfiles/**/*")
|
49
|
-
|
50
|
-
expect(paths.count).to be == 1
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,182 +0,0 @@
|
|
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/list'
|
23
|
-
require 'build/files/glob'
|
24
|
-
|
25
|
-
module Build::Files::ListSpec
|
26
|
-
include Build::Files
|
27
|
-
|
28
|
-
describe Build::Files::Paths do
|
29
|
-
let(:path) {Path.new("/foo/bar/baz", "/foo")}
|
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
|
-
|
75
|
-
it "maps paths with a new extension" do
|
76
|
-
paths = Paths.new([
|
77
|
-
Path.join('/foo/bar', 'alice'),
|
78
|
-
Path.join('/foo/bar', 'bob'),
|
79
|
-
Path.join('/foo/bar', 'charles'),
|
80
|
-
path
|
81
|
-
])
|
82
|
-
|
83
|
-
expect(paths).to include(path)
|
84
|
-
|
85
|
-
expect(paths).to be_intersects(paths)
|
86
|
-
expect(paths).to_not be_intersects(Paths::NONE)
|
87
|
-
|
88
|
-
mapped_paths = paths.map {|path| path + ".o"}
|
89
|
-
|
90
|
-
expect(mapped_paths).to be_kind_of(Paths)
|
91
|
-
expect(mapped_paths.roots).to be == paths.roots
|
92
|
-
end
|
93
|
-
|
94
|
-
it "globs multiple files" do
|
95
|
-
glob = Glob.new(__dir__, '*.rb')
|
96
|
-
|
97
|
-
expect(glob.count).to be > 1
|
98
|
-
|
99
|
-
mapped_paths = glob.map {|path| path + ".txt"}
|
100
|
-
|
101
|
-
expect(glob.roots).to be == mapped_paths.roots
|
102
|
-
end
|
103
|
-
|
104
|
-
it "should intersect one file in the glob" do
|
105
|
-
# Glob all test files:
|
106
|
-
glob = Glob.new(__dir__, "*.rb")
|
107
|
-
|
108
|
-
expect(glob.count).to be > 0
|
109
|
-
|
110
|
-
# Should include this file:
|
111
|
-
expect(glob).to include(__FILE__)
|
112
|
-
|
113
|
-
# Glob should intersect self:
|
114
|
-
expect(glob).to be_intersects(glob)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should include composites" do
|
118
|
-
lib = File.join(__dir__, "../lib")
|
119
|
-
|
120
|
-
test_glob = Glob.new(__dir__, "*.rb")
|
121
|
-
lib_glob = Glob.new(lib, "*.rb")
|
122
|
-
|
123
|
-
both = test_glob + lib_glob
|
124
|
-
|
125
|
-
# List#roots is the generic accessor for Lists
|
126
|
-
expect(both.roots).to include test_glob.root
|
127
|
-
|
128
|
-
# The composite should include both:
|
129
|
-
expect(both).to include(__FILE__)
|
130
|
-
end
|
131
|
-
|
132
|
-
it "should have path with correct root" do
|
133
|
-
test_glob = Glob.new(__dir__, "*.rb")
|
134
|
-
|
135
|
-
expect(test_glob.first).to be_kind_of Path
|
136
|
-
|
137
|
-
expect(test_glob.first.root).to be == __dir__
|
138
|
-
end
|
139
|
-
|
140
|
-
it "maps paths with new extension" do
|
141
|
-
glob = Glob.new(__dir__, "*.rb")
|
142
|
-
|
143
|
-
paths = glob.map {|path| path.append ".txt"}
|
144
|
-
|
145
|
-
expect(paths.first).to be == (glob.first.append ".txt")
|
146
|
-
expect(paths.first.to_s).to be_end_with ".rb.txt"
|
147
|
-
end
|
148
|
-
|
149
|
-
it "should map paths using with" do
|
150
|
-
glob = Glob.new(__dir__, "*.rb")
|
151
|
-
|
152
|
-
paths = glob.with extension: ".txt"
|
153
|
-
path = paths.first
|
154
|
-
|
155
|
-
expect(path).to be_kind_of Array
|
156
|
-
|
157
|
-
expect(path[0]).to be == glob.first
|
158
|
-
expect(path[1]).to be == glob.first.append(".txt")
|
159
|
-
end
|
160
|
-
|
161
|
-
it "should define an empty set of files" do
|
162
|
-
expect(Paths::NONE).to be_kind_of List
|
163
|
-
|
164
|
-
expect(Paths::NONE.count).to be 0
|
165
|
-
end
|
166
|
-
|
167
|
-
it "can be used as key in hash" do
|
168
|
-
cache = {}
|
169
|
-
|
170
|
-
cache[Paths.new(path)] = true
|
171
|
-
|
172
|
-
expect(cache).to be_include(Paths.new(path))
|
173
|
-
end
|
174
|
-
|
175
|
-
it "can be constructed from a list of relative paths" do
|
176
|
-
paths = Paths.directory('/foo', ['bar', 'baz', 'bob'])
|
177
|
-
|
178
|
-
expect(paths.count).to be 3
|
179
|
-
expect(paths).to be_include Path.new('/foo/bar')
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
@@ -1,223 +0,0 @@
|
|
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
|
-
|
24
|
-
require 'pathname'
|
25
|
-
|
26
|
-
RSpec.describe Build::Files::Path do
|
27
|
-
it "can get current path" do
|
28
|
-
expect(Build::Files::Path.current.full_path).to be == Dir.pwd
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should expand the path" do
|
32
|
-
expect(Build::Files::Path.expand("foo", "/bar")).to be == "/bar/foo"
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should give current path" do
|
36
|
-
path = Build::Files::Path.new("/a/b/c/file.cpp")
|
37
|
-
|
38
|
-
expect(path.shortest_path(path)).to be == "."
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should give the shortest path for outer paths" do
|
42
|
-
input = Build::Files::Path.new("/a/b/c/file.cpp")
|
43
|
-
output = Build::Files::Path.new("/a/b/c/d/e/")
|
44
|
-
|
45
|
-
expect(input.root).to be == "/a/b/c"
|
46
|
-
expect(output.root).to be == "/a/b/c/d/e"
|
47
|
-
|
48
|
-
short = input.shortest_path(output)
|
49
|
-
|
50
|
-
expect(short).to be == "../../file.cpp"
|
51
|
-
|
52
|
-
expect(File.expand_path(short, output)).to be == input
|
53
|
-
end
|
54
|
-
|
55
|
-
it "should give the shortest path for inner paths" do
|
56
|
-
input = Build::Files::Path.new("/a/b/c/file.cpp")
|
57
|
-
output = Build::Files::Path.new("/a/")
|
58
|
-
|
59
|
-
expect(input.root).to be == "/a/b/c"
|
60
|
-
expect(output.root).to be == "/a"
|
61
|
-
|
62
|
-
short = input.shortest_path(output)
|
63
|
-
|
64
|
-
expect(short).to be == "b/c/file.cpp"
|
65
|
-
|
66
|
-
expect(File.expand_path(short, output)).to be == input
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
RSpec.describe Build::Files::Path.new("/test") do
|
71
|
-
it "should start_with? full path" do
|
72
|
-
expect(subject).to be_start_with '/test'
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should start_with? partial pattern" do
|
76
|
-
expect(subject).to be_start_with '/te'
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
RSpec.describe Build::Files::Path.new("/foo/bar.txt") do
|
81
|
-
it "should replace existing file extension" do
|
82
|
-
expect(subject.with(extension: '.jpeg', basename: true)).to be == "/foo/bar.jpeg"
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should append file extension" do
|
86
|
-
expect(subject.with(extension: '.jpeg')).to be == "/foo/bar.txt.jpeg"
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should change basename" do
|
90
|
-
expect(subject.with(basename: 'baz', extension: '.txt')).to be == "/foo/baz.txt"
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
RSpec.describe Build::Files::Path.new("/foo/bar/baz", "/foo") do
|
95
|
-
it "can compute parent path" do
|
96
|
-
parent = subject.parent
|
97
|
-
|
98
|
-
expect(parent.root).to be == subject.root
|
99
|
-
expect(parent.relative_path).to be == "bar"
|
100
|
-
expect(parent.full_path).to be == "/foo/bar"
|
101
|
-
end
|
102
|
-
|
103
|
-
it "can add nil path" do
|
104
|
-
expect(subject + nil).to be == subject
|
105
|
-
end
|
106
|
-
|
107
|
-
it "can inspect path with nil root" do
|
108
|
-
expect do
|
109
|
-
(subject / nil).inspect
|
110
|
-
end.to_not raise_error
|
111
|
-
end
|
112
|
-
|
113
|
-
it "can add nil root" do
|
114
|
-
expect(subject / nil).to be == subject
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should be inspectable" do
|
118
|
-
expect(subject.inspect).to be_include subject.root.to_s
|
119
|
-
expect(subject.inspect).to be_include subject.relative_path.to_s
|
120
|
-
end
|
121
|
-
|
122
|
-
it "should convert to path" do
|
123
|
-
pathname = Pathname("/foo/bar/baz")
|
124
|
-
|
125
|
-
expect(Build::Files::Path[pathname]).to be == subject
|
126
|
-
expect(Build::Files::Path["/foo/bar/baz"]).to be == subject
|
127
|
-
end
|
128
|
-
|
129
|
-
it "should be equal" do
|
130
|
-
expect(subject).to be_eql subject
|
131
|
-
expect(subject).to be == subject
|
132
|
-
|
133
|
-
different_root_path = Build::Files::Path.join("/foo/bar", "baz")
|
134
|
-
expect(subject).to_not be_eql different_root_path
|
135
|
-
expect(subject).to be == different_root_path
|
136
|
-
end
|
137
|
-
|
138
|
-
it "should convert to string" do
|
139
|
-
expect(subject.to_s).to be == "/foo/bar/baz"
|
140
|
-
|
141
|
-
# The to_str method should return the full path (i.e. the same as to_s):
|
142
|
-
expect(subject.to_s).to be == subject.to_str
|
143
|
-
|
144
|
-
# Check the equality operator:
|
145
|
-
expect(subject).to be == subject.dup
|
146
|
-
|
147
|
-
# The length should be reported correctly:
|
148
|
-
expect(subject.length).to be == subject.to_s.length
|
149
|
-
|
150
|
-
# Check the return types:
|
151
|
-
expect(subject).to be_kind_of Build::Files::Path
|
152
|
-
expect(subject.root).to be_kind_of String
|
153
|
-
expect(subject.relative_path).to be_kind_of String
|
154
|
-
end
|
155
|
-
|
156
|
-
it "should consist of parts" do
|
157
|
-
expect(subject.parts).to be == ["", "foo", "bar", "baz"]
|
158
|
-
|
159
|
-
expect(subject.root).to be == "/foo"
|
160
|
-
|
161
|
-
expect(subject.relative_path).to be == "bar/baz"
|
162
|
-
|
163
|
-
expect(subject.relative_parts).to be == ["bar", "baz"]
|
164
|
-
end
|
165
|
-
|
166
|
-
it "should have a new extension" do
|
167
|
-
renamed_path = subject.with(root: '/tmp', extension: '.txt')
|
168
|
-
|
169
|
-
expect(renamed_path.root).to be == '/tmp'
|
170
|
-
|
171
|
-
expect(renamed_path.relative_path).to be == 'bar/baz.txt'
|
172
|
-
|
173
|
-
object_path = subject.append(".o")
|
174
|
-
|
175
|
-
expect(object_path.root).to be == "/foo"
|
176
|
-
expect(object_path.relative_path).to be == "bar/baz.o"
|
177
|
-
end
|
178
|
-
|
179
|
-
it "should append a path" do
|
180
|
-
subject = Build::Files::Path.new("/a/b/c")
|
181
|
-
|
182
|
-
expect(subject + "d/e/f").to be == "/a/b/c/d/e/f"
|
183
|
-
end
|
184
|
-
|
185
|
-
it "should give a list of components" do
|
186
|
-
expect(Build::Files::Path.components(subject)).to be == ["", "foo", "bar", "baz"]
|
187
|
-
expect(Build::Files::Path.components(subject.to_s)).to be == ["", "foo", "bar", "baz"]
|
188
|
-
end
|
189
|
-
|
190
|
-
it "should give a basename" do
|
191
|
-
expect(subject.basename).to be == "baz"
|
192
|
-
end
|
193
|
-
|
194
|
-
it "should have a new root" do
|
195
|
-
rerooted_path = subject / "cat"
|
196
|
-
|
197
|
-
expect(rerooted_path.root).to be == "/foo/bar/baz"
|
198
|
-
expect(rerooted_path.relative_path).to be == "cat"
|
199
|
-
end
|
200
|
-
|
201
|
-
it "should give correct modes for reading" do
|
202
|
-
expect(subject.for_reading).to be == [subject.to_s, File::RDONLY]
|
203
|
-
end
|
204
|
-
|
205
|
-
it "should give correct modes for writing" do
|
206
|
-
expect(subject.for_writing).to be == [subject.to_s, File::CREAT|File::TRUNC|File::WRONLY]
|
207
|
-
end
|
208
|
-
|
209
|
-
it "should give correct modes for appending" do
|
210
|
-
expect(subject.for_appending).to be == [subject.to_s, File::CREAT|File::APPEND|File::WRONLY]
|
211
|
-
end
|
212
|
-
|
213
|
-
it "should match against relative path" do
|
214
|
-
expect(subject.match(subject.relative_path)).to be_truthy
|
215
|
-
expect(subject.match("*/baz")).to be_truthy
|
216
|
-
expect(subject.match("/baz")).to be_falsey
|
217
|
-
end
|
218
|
-
|
219
|
-
it "should match against absolute path" do
|
220
|
-
expect(subject.match(subject.to_s)).to be_truthy
|
221
|
-
expect(subject.match("/foo/**")).to be_truthy
|
222
|
-
end
|
223
|
-
end
|
@@ -1,56 +0,0 @@
|
|
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/system'
|
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
|
data/spec/spec_helper.rb
DELETED