buildpack-support 1.0.0
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.
- data/LICENSE +202 -0
- data/NOTICE +2 -0
- data/docs/cache.md +77 -0
- data/docs/component.md +1 -0
- data/docs/configuration.md +27 -0
- data/docs/logging.md +54 -0
- data/docs/other.md +1 -0
- data/docs/rake.md +1 -0
- data/docs/repository.md +116 -0
- data/docs/test.md +1 -0
- data/lib/buildpack_support.rb +18 -0
- data/lib/buildpack_support/base_buildpack.rb +166 -0
- data/lib/buildpack_support/buildpack_version.rb +124 -0
- data/lib/buildpack_support/cache.rb +24 -0
- data/lib/buildpack_support/cache/application_cache.rb +41 -0
- data/lib/buildpack_support/cache/cached_file.rb +103 -0
- data/lib/buildpack_support/cache/download_cache.rb +280 -0
- data/lib/buildpack_support/cache/inferred_network_failure.rb +26 -0
- data/lib/buildpack_support/cache/internet_availability.rb +64 -0
- data/lib/buildpack_support/component.rb +24 -0
- data/lib/buildpack_support/component/application.rb +76 -0
- data/lib/buildpack_support/component/base_component.rb +78 -0
- data/lib/buildpack_support/component/base_droplet.rb +96 -0
- data/lib/buildpack_support/component/downloads.rb +88 -0
- data/lib/buildpack_support/component/services.rb +84 -0
- data/lib/buildpack_support/component/versioned_dependency_component.rb +71 -0
- data/lib/buildpack_support/component/versioned_downloads.rb +57 -0
- data/lib/buildpack_support/component/with_timing.rb +40 -0
- data/lib/buildpack_support/configuration_utils.rb +58 -0
- data/lib/buildpack_support/constantize.rb +46 -0
- data/lib/buildpack_support/dash_case.rb +29 -0
- data/lib/buildpack_support/directory_finder.rb +45 -0
- data/lib/buildpack_support/filtering_pathname.rb +227 -0
- data/lib/buildpack_support/format_duration.rb +57 -0
- data/lib/buildpack_support/logging.rb +22 -0
- data/lib/buildpack_support/logging/delegating_logger.rb +48 -0
- data/lib/buildpack_support/logging/logger_factory.rb +148 -0
- data/lib/buildpack_support/qualify_path.rb +36 -0
- data/lib/buildpack_support/rake.rb +22 -0
- data/lib/buildpack_support/rake/buildpack_stage_task.rb +86 -0
- data/lib/buildpack_support/rake/cached_artifact_finder.rb +99 -0
- data/lib/buildpack_support/rake/check_api_doc_task.rb +70 -0
- data/lib/buildpack_support/rake/dependency_cache_task.rb +87 -0
- data/lib/buildpack_support/rake/disable_remote_downloads_task.rb +80 -0
- data/lib/buildpack_support/rake/package_task.rb +133 -0
- data/lib/buildpack_support/rake/package_zip_task.rb +80 -0
- data/lib/buildpack_support/rake/repository_configuration_finder.rb +66 -0
- data/lib/buildpack_support/rake/write_version_file_task.rb +82 -0
- data/lib/buildpack_support/repository.rb +24 -0
- data/lib/buildpack_support/repository/configured_item.rb +81 -0
- data/lib/buildpack_support/repository/repository_index.rb +98 -0
- data/lib/buildpack_support/repository/wildcard_version_resolver.rb +75 -0
- data/lib/buildpack_support/shell.rb +41 -0
- data/lib/buildpack_support/snake_case.rb +30 -0
- data/lib/buildpack_support/space_case.rb +29 -0
- data/lib/buildpack_support/test/application_helper.rb +41 -0
- data/lib/buildpack_support/test/base_component_helper.rb +59 -0
- data/lib/buildpack_support/test/base_droplet_helper.rb +36 -0
- data/lib/buildpack_support/test/console_helper.rb +57 -0
- data/lib/buildpack_support/test/environment_helper.rb +32 -0
- data/lib/buildpack_support/test/internet_availability_helper.rb +29 -0
- data/lib/buildpack_support/test/logging_helper.rb +50 -0
- data/lib/buildpack_support/test/scratch_helper.rb +32 -0
- data/lib/buildpack_support/test/versioned_dependency_component_helper.rb +32 -0
- data/lib/buildpack_support/test/with_load_path_helper.rb +27 -0
- data/lib/buildpack_support/to_b.rb +38 -0
- data/lib/buildpack_support/tokenized_version.rb +157 -0
- data/lib/buildpack_support/version.rb +23 -0
- data/spec/buildpack_support/base_buildpack_spec.rb +112 -0
- data/spec/buildpack_support/buildpack_version_spec.rb +122 -0
- data/spec/buildpack_support/cache/application_cache_spec.rb +56 -0
- data/spec/buildpack_support/cache/cached_file_spec.rb +94 -0
- data/spec/buildpack_support/cache/download_cache_spec.rb +293 -0
- data/spec/buildpack_support/cache/internet_availability_spec.rb +57 -0
- data/spec/buildpack_support/cache/yield_file_with_content.rb +30 -0
- data/spec/buildpack_support/component/application_spec.rb +81 -0
- data/spec/buildpack_support/component/base_component_spec.rb +81 -0
- data/spec/buildpack_support/component/base_droplet_spec.rb +72 -0
- data/spec/buildpack_support/component/downloads_spec.rb +63 -0
- data/spec/buildpack_support/component/services_spec.rb +80 -0
- data/spec/buildpack_support/component/versioned_dependency_component_spec.rb +58 -0
- data/spec/buildpack_support/component/versioned_downloads_spec.rb +58 -0
- data/spec/buildpack_support/component/with_timing_spec.rb +30 -0
- data/spec/buildpack_support/configuration_utils_spec.rb +39 -0
- data/spec/buildpack_support/constantize_spec.rb +34 -0
- data/spec/buildpack_support/dash_case_spec.rb +41 -0
- data/spec/buildpack_support/directory_finder_spec.rb +41 -0
- data/spec/buildpack_support/filtering_pathname_spec.rb +443 -0
- data/spec/buildpack_support/format_duration_spec.rb +60 -0
- data/spec/buildpack_support/logging/delegating_logger_spec.rb +62 -0
- data/spec/buildpack_support/logging/logger_factory_spec.rb +262 -0
- data/spec/buildpack_support/qualify_path_spec.rb +42 -0
- data/spec/buildpack_support/rake/buildpack_stage_task_spec.rb +88 -0
- data/spec/buildpack_support/rake/cached_artifact_finder_spec.rb +73 -0
- data/spec/buildpack_support/rake/check_api_doc_task_spec.rb +69 -0
- data/spec/buildpack_support/rake/dependency_cache_task_spec.rb +133 -0
- data/spec/buildpack_support/rake/disable_remote_downloads_task_spec.rb +91 -0
- data/spec/buildpack_support/rake/package_task_spec.rb +335 -0
- data/spec/buildpack_support/rake/package_zip_task_spec.rb +91 -0
- data/spec/buildpack_support/rake/repository_configuration_finder_spec.rb +61 -0
- data/spec/buildpack_support/rake/write_version_file_task_spec.rb +96 -0
- data/spec/buildpack_support/repository/configured_item_spec.rb +78 -0
- data/spec/buildpack_support/repository/repository_index_spec.rb +118 -0
- data/spec/buildpack_support/repository/wildcard_version_resolver_spec.rb +73 -0
- data/spec/buildpack_support/shell_spec.rb +32 -0
- data/spec/buildpack_support/snake_case_spec.rb +45 -0
- data/spec/buildpack_support/space_case_spec.rb +41 -0
- data/spec/buildpack_support/to_b_spec.rb +41 -0
- data/spec/buildpack_support/tokenized_version_spec.rb +132 -0
- data/spec/fixtures/application/test-file +0 -0
- data/spec/fixtures/config/found-config.yml +2 -0
- data/spec/fixtures/droplet-resources/droplet-resource +0 -0
- data/spec/fixtures/stub-download-with-top-level.zip +0 -0
- data/spec/fixtures/stub-download.tar.gz +0 -0
- data/spec/fixtures/stub-download.zip +0 -0
- data/spec/fixtures/test-cache.yml +18 -0
- data/spec/fixtures/test-index.yml +2 -0
- data/spec/fixtures/test_component.rb +0 -0
- data/spec/fixtures/zip-contents/test-directory/test-deep-file +0 -0
- data/spec/fixtures/zip-contents/test-file +0 -0
- data/spec/spec_helper.rb +30 -0
- metadata +416 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'spec_helper'
|
|
17
|
+
require 'buildpack_support/component/versioned_downloads'
|
|
18
|
+
require 'buildpack_support/test/base_component_helper'
|
|
19
|
+
|
|
20
|
+
describe BuildpackSupport::Component::VersionedDownloads do
|
|
21
|
+
include_context 'base_component_helper'
|
|
22
|
+
|
|
23
|
+
let(:component) { StubVersionedDownloadsClass.new droplet, uri, version }
|
|
24
|
+
|
|
25
|
+
it 'should download and expand TAR file in the sandbox',
|
|
26
|
+
cache_fixture: 'stub-download.tar.gz' do
|
|
27
|
+
|
|
28
|
+
component.download_tar
|
|
29
|
+
expect(droplet.sandbox + 'test-file').to exist
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'should download and expand ZIP file in the sandbox',
|
|
33
|
+
cache_fixture: 'stub-download.zip' do
|
|
34
|
+
|
|
35
|
+
component.download_zip(false)
|
|
36
|
+
expect(droplet.sandbox + 'test-file').to exist
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'should download and expand ZIP file, stripping the top level directory in the sandbox',
|
|
40
|
+
cache_fixture: 'stub-download-with-top-level.zip' do
|
|
41
|
+
|
|
42
|
+
component.download_zip
|
|
43
|
+
expect(droplet.sandbox + 'test-file').to exist
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
class StubVersionedDownloadsClass
|
|
49
|
+
include BuildpackSupport::Component::VersionedDownloads
|
|
50
|
+
|
|
51
|
+
def initialize(droplet, uri, version)
|
|
52
|
+
@component_name = 'Stub Component'
|
|
53
|
+
@droplet = droplet
|
|
54
|
+
@uri = uri
|
|
55
|
+
@version = version
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'spec_helper'
|
|
17
|
+
require 'buildpack_support/component/with_timing'
|
|
18
|
+
require 'buildpack_support/test/console_helper'
|
|
19
|
+
|
|
20
|
+
describe BuildpackSupport::Component::WithTiming do
|
|
21
|
+
include BuildpackSupport::Component::WithTiming
|
|
22
|
+
include_context 'console_helper'
|
|
23
|
+
|
|
24
|
+
it 'should print timing information' do
|
|
25
|
+
expect { |b| with_timing('test-caption', &b) }.to yield_control
|
|
26
|
+
|
|
27
|
+
expect(stdout.string).to match(/ test-caption \([\d]\.[\d]s\)/)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'spec_helper'
|
|
17
|
+
require 'buildpack_support/configuration_utils'
|
|
18
|
+
require 'buildpack_support/test/logging_helper'
|
|
19
|
+
require 'buildpack_support/test/with_load_path_helper'
|
|
20
|
+
|
|
21
|
+
describe BuildpackSupport::ConfigurationUtils do
|
|
22
|
+
include_context 'with_load_path_helper'
|
|
23
|
+
include_context 'logging_helper'
|
|
24
|
+
|
|
25
|
+
let(:configurationUtils) { described_class.new }
|
|
26
|
+
|
|
27
|
+
it 'should return the empty configuration for a non-existent configuration file' do
|
|
28
|
+
with_load_path('spec/fixtures/load-path') do
|
|
29
|
+
expect(configurationUtils.load('not-found-config')).to eq({})
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'should return the configuration for a configuration file' do
|
|
34
|
+
with_load_path('spec/fixtures/load-path') do
|
|
35
|
+
expect(configurationUtils.load('found-config')).to eq('foo' => 'bar')
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'spec_helper'
|
|
17
|
+
require 'buildpack_support/constantize'
|
|
18
|
+
|
|
19
|
+
describe 'constantize' do
|
|
20
|
+
|
|
21
|
+
it 'should constantize string' do
|
|
22
|
+
expect('Test::StubClass'.constantize).to eq(Test::StubClass)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should raise error if constant does not exist' do
|
|
26
|
+
expect { 'Test::StubClass2'.constantize }.to raise_error(NameError)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module Test
|
|
32
|
+
class StubClass
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'spec_helper'
|
|
17
|
+
require 'buildpack_support/dash_case'
|
|
18
|
+
|
|
19
|
+
describe 'dash_case' do
|
|
20
|
+
|
|
21
|
+
it 'should return only lowercase strings' do
|
|
22
|
+
expect('Test'.dash_case).to eq('test')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should return the last module name' do
|
|
26
|
+
expect('Foo::Bar::Bang'.dash_case).to eq('bang')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'should split on penultimate uppercase characters' do
|
|
30
|
+
expect('FOOBar'.dash_case).to eq('foo-bar')
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'should split on lowercase characters followed an uppercase characters' do
|
|
34
|
+
expect('FooBar'.dash_case).to eq('foo-bar')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'should split on digit characters followed an uppercase characters' do
|
|
38
|
+
expect('123Bar'.dash_case).to eq('123-bar')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'spec_helper'
|
|
17
|
+
require 'buildpack_support/directory_finder'
|
|
18
|
+
require 'buildpack_support/test/with_load_path_helper'
|
|
19
|
+
|
|
20
|
+
describe BuildpackSupport::DirectoryFinder do
|
|
21
|
+
include_context 'with_load_path_helper'
|
|
22
|
+
|
|
23
|
+
let(:directoryFinder) { StubDirectoryFinderClass.new }
|
|
24
|
+
|
|
25
|
+
it 'should find the path' do
|
|
26
|
+
with_load_path('spec/fixtures/load-path') do
|
|
27
|
+
expect(directoryFinder.load_path_peer('found-directory')).to exist
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'should not find the not found directory' do
|
|
32
|
+
with_load_path('spec/fixtures/load-path') do
|
|
33
|
+
expect(directoryFinder.load_path_peer('not-found-directory')).not_to exist
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class StubDirectoryFinderClass
|
|
40
|
+
include BuildpackSupport::DirectoryFinder
|
|
41
|
+
end
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
# Encoding: utf-8
|
|
2
|
+
# Copyright 2013-2014 the original author or authors.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'spec_helper'
|
|
17
|
+
require 'buildpack_support/filtering_pathname'
|
|
18
|
+
require 'buildpack_support/test/scratch_helper'
|
|
19
|
+
require 'fileutils'
|
|
20
|
+
require 'set'
|
|
21
|
+
|
|
22
|
+
describe BuildpackSupport::FilteringPathname do
|
|
23
|
+
include_context 'scratch_helper'
|
|
24
|
+
|
|
25
|
+
let(:filter_none) { ->(_) { true } }
|
|
26
|
+
let(:filter_all) { ->(_) { false } }
|
|
27
|
+
let(:filter_goodness) { ->(pathname) { pathname.basename != Pathname.new('bad') } }
|
|
28
|
+
let(:filter_strict) { ->(pathname) { pathname.basename == Pathname.new('good') } }
|
|
29
|
+
let(:filtering_target) { described_class.new(scratch_dir, filter_goodness, false) }
|
|
30
|
+
let(:strict_filtering_target) { described_class.new(scratch_dir, filter_strict, false) }
|
|
31
|
+
let(:filtered_target) { described_class.new(scratch_dir, filter_all, false) }
|
|
32
|
+
let(:immutable_target) { described_class.new(scratch_dir, filter_goodness, false) }
|
|
33
|
+
let(:mutable_target) { described_class.new(scratch_dir, filter_goodness, true) }
|
|
34
|
+
let(:filename_target) { described_class.new(Pathname.new('/a/b'), filter_goodness, true) }
|
|
35
|
+
|
|
36
|
+
before do
|
|
37
|
+
create_file 'good'
|
|
38
|
+
create_file 'bad'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'delegate to pathnames which exist and are not filtered' do
|
|
42
|
+
filtering_pathname = described_class.new(scratch_dir, filter_none, false)
|
|
43
|
+
expect(filtering_pathname.ftype).to eq('directory')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'delegate to pathnames which do not exist' do
|
|
47
|
+
filtering_pathname = described_class.new(scratch_dir + 'no-such-file', filter_none, false)
|
|
48
|
+
expect { filtering_pathname.ftype }.to raise_error(/No such file or directory/)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'delegate to pathnames which exist but which are filtered' do
|
|
52
|
+
filtering_pathname = described_class.new(scratch_dir, filter_all, false)
|
|
53
|
+
expect { filtering_pathname.ftype }.to raise_error(/No such file or directory/)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'should fail to construct if a .nil file exists' do
|
|
57
|
+
FileUtils.touch Pathname.new("#{scratch_dir}.nil")
|
|
58
|
+
expect { described_class.new(scratch_dir, filter_all, false) }.to raise_error(/should not exist/)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'should fail if a .nil file is created after construction' do
|
|
62
|
+
filtering_pathname = described_class.new(scratch_dir + 'test.file', filter_all, false)
|
|
63
|
+
FileUtils.touch(scratch_dir + 'test.file.nil')
|
|
64
|
+
|
|
65
|
+
expect { filtering_pathname.ftype }.to raise_error(/should not exist/)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it 'should fail to construct if a .nil directory exists' do
|
|
69
|
+
FileUtils.mkdir_p Pathname.new("#{scratch_dir}.nil")
|
|
70
|
+
expect { described_class.new(scratch_dir, filter_all, false) }.to raise_error(/should not exist/)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'should return a missing method' do
|
|
74
|
+
expect { described_class.new(scratch_dir, filter_all, false).method(:chardev?) }.not_to raise_error
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'should filter the result of +' do
|
|
78
|
+
expect(filtering_target + 'good').to exist
|
|
79
|
+
expect(filtering_target + 'bad').not_to exist
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'should correctly stringify non-clean paths' do
|
|
83
|
+
expect(described_class.new(Pathname.new('/a/b/..'), filter_none, false).to_s).to eq('/a/b/..')
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'should produce correct result for + with a non-clean path' do
|
|
87
|
+
base = described_class.new(Pathname.new('/a'), filter_none, false)
|
|
88
|
+
expect((base + 'b/..').to_s).to eq('/a/b/..')
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'should produce correct result for + with a non-clean path starting with '..'' do
|
|
92
|
+
base = described_class.new(Pathname.new('/a/b'), filter_none, false)
|
|
93
|
+
expect((base + '..').to_s).to eq('/a')
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it 'should filter the result of join' do
|
|
97
|
+
expect(filtering_target.join 'good').to exist
|
|
98
|
+
expect(filtering_target.join 'bad').not_to exist
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it 'should filter the result of parent', :filter do
|
|
102
|
+
expect((filtering_target + 'good' + 'extra').parent).to exist
|
|
103
|
+
expect((filtering_target + 'bad' + 'extra').parent).not_to exist
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it 'should compare to pathnames correctly using <=>' do
|
|
107
|
+
expect((filtering_target + 'good') <=> (scratch_dir + 'good')).to eq(0)
|
|
108
|
+
expect((filtering_target + 'good') <=> (scratch_dir + 'bad')).to eq(1)
|
|
109
|
+
expect((filtering_target + 'bad') <=> (scratch_dir + 'bad')).to eq(0)
|
|
110
|
+
expect((filtering_target + 'a') <=> (scratch_dir + 'b')).to eq(-1)
|
|
111
|
+
expect((filtering_target + 'b') <=> (scratch_dir + 'a')).to eq(1)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'should compare to filtering pathnames correctly using <=>' do
|
|
115
|
+
expect((filtering_target + 'good') <=> (filtering_target + 'good')).to eq(0) # rubocop:disable UselessComparison
|
|
116
|
+
expect((filtering_target + 'good') <=> (filtering_target + 'bad')).to eq(1)
|
|
117
|
+
expect((filtering_target + 'bad') <=> (filtering_target + 'bad')).to eq(0) # rubocop:disable UselessComparison
|
|
118
|
+
expect((filtering_target + 'a') <=> (filtering_target + 'b')).to eq(-1)
|
|
119
|
+
expect((filtering_target + 'b') <=> (filtering_target + 'a')).to eq(1)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'should support sorting' do
|
|
123
|
+
a = (filtering_target + 'a')
|
|
124
|
+
b = (filtering_target + 'b')
|
|
125
|
+
expect([b, a].sort).to eq([a, b])
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it 'should compare to pathnames correctly using ==' do
|
|
129
|
+
expect((filtering_target + 'good') == (scratch_dir + 'good')).to be
|
|
130
|
+
expect((filtering_target + 'bad') == (scratch_dir + 'bad')).to be
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it 'should compare to filtering pathnames correctly using ==' do
|
|
134
|
+
expect((filtering_target + 'good') == (filtering_target + 'good')).to be # rubocop:disable UselessComparison
|
|
135
|
+
expect((filtering_target + 'bad') == (filtering_target + 'bad')).to be # rubocop:disable UselessComparison
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it 'should compare to pathnames correctly using ===' do
|
|
139
|
+
expect((filtering_target + 'good') === (scratch_dir + 'good')).to be # rubocop:disable CaseEquality
|
|
140
|
+
expect((filtering_target + 'bad') === (scratch_dir + 'bad')).to be # rubocop:disable CaseEquality
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it 'should compare to filtering pathnames correctly using ===' do
|
|
144
|
+
expect((filtering_target + 'good') === (filtering_target + 'good')).to be # rubocop:disable CaseEquality, UselessComparison
|
|
145
|
+
expect((filtering_target + 'bad') === (filtering_target + 'bad')).to be # rubocop:disable CaseEquality, UselessComparison
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it 'should delegate relative_path_from' do
|
|
149
|
+
target = filtering_target + 'test1'
|
|
150
|
+
underlying_pathname = target.send :pathname
|
|
151
|
+
expect(underlying_pathname).to receive(:relative_path_from) { Pathname.new('test1') }
|
|
152
|
+
relative_path = target.relative_path_from(Pathname.new(scratch_dir))
|
|
153
|
+
expect(relative_path).to eq(Pathname.new('test1'))
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it 'should return path when to_s is called when the path is not filtered out' do
|
|
157
|
+
expect(filtering_target.to_s).to eq(scratch_dir.to_s)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'should return path when to_s is called when the path is filtered out' do
|
|
161
|
+
expect(filtered_target.to_s).to eq(scratch_dir.to_s)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it 'should yield a Pathname for each visible result from each_entry' do
|
|
165
|
+
entries = []
|
|
166
|
+
filtering_target.each_entry do |entry|
|
|
167
|
+
entries << entry
|
|
168
|
+
end
|
|
169
|
+
expect(entries.to_set).to eq([Pathname.new('.'), Pathname.new('..'), Pathname.new('good')].to_set)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it 'should delegate each_line when the file is filtered in' do
|
|
173
|
+
target = filtering_target + 'good'
|
|
174
|
+
underlying_pathname = target.send :pathname
|
|
175
|
+
expect(underlying_pathname).to receive(:each_line).and_yield('test-line')
|
|
176
|
+
expect { |b| target.each_line(&b) }.to yield_successive_args('test-line')
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it 'should raise error from each_line when the file is filtered out' do
|
|
180
|
+
expect { (filtering_target + 'bad').each_line { |_| } }.to raise_exception Errno::ENOENT
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it 'should return each visible entry from entries' do
|
|
184
|
+
expect(filtering_target.entries.to_set).to eq([Pathname.new('.'), Pathname.new('..'), Pathname.new('good')].to_set)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it 'should delegate opendir when the directory is filtered in' do
|
|
188
|
+
expect(scratch_dir).to receive(:opendir).and_yield('test-dir')
|
|
189
|
+
expect { |b| filtering_target.opendir(&b) }.to yield_successive_args('test-dir')
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it 'should raise error from opendir when the file is filtered out' do
|
|
193
|
+
expect { (filtering_target + 'bad').opendir { |_| } }.to raise_exception Errno::ENOENT
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it 'should delegate sysopen when the file is filtered in' do
|
|
197
|
+
target = filtering_target + 'good'
|
|
198
|
+
underlying_pathname = target.send :pathname
|
|
199
|
+
expect(underlying_pathname).to receive(:sysopen).and_yield(999)
|
|
200
|
+
expect { |b| target.sysopen(&b) }.to yield_successive_args(999)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it 'should raise error from sysopen when the file is filtered out' do
|
|
204
|
+
expect { (filtering_target + 'bad').sysopen { |_| } }.to raise_exception Errno::ENOENT
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it 'should return each child as a filtered pathname from children' do
|
|
208
|
+
expect(filtering_target.children).to eq([scratch_dir + 'good'])
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it 'should return each child as a pathname from children(false)' do
|
|
212
|
+
expect(filtering_target.children(false)).to eq([Pathname.new('good')])
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it 'should yield each child as a filtered pathname from each_child' do
|
|
216
|
+
expect { |b| filtering_target.each_child(&b) }.to yield_successive_args(scratch_dir + 'good')
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it 'should yield each child as a pathname from each_child(false)' do
|
|
220
|
+
expect { |b| filtering_target.each_child(false, &b) }.to yield_successive_args(Pathname.new('good'))
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it 'should yield each component of the path from each_filename' do
|
|
224
|
+
expect { |b| filename_target.each_filename(&b) }.to yield_successive_args('a', 'b')
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it 'should yield each element of the path from descend' do
|
|
228
|
+
expect { |b| filename_target.descend(&b) }.to yield_successive_args(Pathname.new('/'), Pathname.new('/a'),
|
|
229
|
+
Pathname.new('/a/b'))
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it 'should yield each element of the path from ascend' do
|
|
233
|
+
expect { |b| filename_target.ascend(&b) }.to yield_successive_args(Pathname.new('/a/b'), Pathname.new('/a'),
|
|
234
|
+
Pathname.new('/'))
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it 'should raise error if chmod is called on an immutable instance' do
|
|
238
|
+
expect { immutable_target.chmod(0644) }.to raise_error(/FilteringPathname is immutable/)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
it 'should delegate if chmod is called on a mutable instance' do
|
|
242
|
+
expect(scratch_dir).to receive(:chmod)
|
|
243
|
+
mutable_target.chmod(0644)
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
it 'should raise error if chown is called on an immutable instance' do
|
|
247
|
+
expect { immutable_target.chown('test-user', 100) }.to raise_error(/FilteringPathname is immutable/)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it 'should delegate if chown is called on a mutable instance' do
|
|
251
|
+
expect(scratch_dir).to receive(:chown)
|
|
252
|
+
mutable_target.chown('test-user', 100)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
it 'should raise error if delete is called on an immutable instance' do
|
|
256
|
+
expect { immutable_target.delete }.to raise_error(/FilteringPathname is immutable/)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it 'should delegate if delete is called on a mutable instance' do
|
|
260
|
+
expect(scratch_dir).to receive(:delete)
|
|
261
|
+
mutable_target.delete
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
it 'should raise error if lchmod is called on an immutable instance' do
|
|
265
|
+
expect { immutable_target.lchmod(0644) }.to raise_error(/FilteringPathname is immutable/)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it 'should delegate if lchmod is called on a mutable instance' do
|
|
269
|
+
expect(scratch_dir).to receive(:lchmod)
|
|
270
|
+
mutable_target.lchmod(0644)
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it 'should raise error if lchown is called on an immutable instance' do
|
|
274
|
+
expect { immutable_target.lchown('test-user', 100) }.to raise_error(/FilteringPathname is immutable/)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
it 'should delegate if lchown is called on a mutable instance' do
|
|
278
|
+
expect(scratch_dir).to receive(:lchown)
|
|
279
|
+
mutable_target.lchown('test-user', 100)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
it 'should raise error if make_link is called on an immutable instance' do
|
|
283
|
+
expect { immutable_target.make_link('test') }.to raise_error(/FilteringPathname is immutable/)
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
it 'should delegate if make_link is called on a mutable instance' do
|
|
287
|
+
expect(scratch_dir).to receive(:make_link)
|
|
288
|
+
mutable_target.make_link('test')
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
it 'should raise error if make_symlink is called on an immutable instance' do
|
|
292
|
+
expect { immutable_target.make_symlink('test') }.to raise_error(/FilteringPathname is immutable/)
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
it 'should delegate if make_symlink is called on a mutable instance' do
|
|
296
|
+
expect(scratch_dir).to receive(:make_symlink)
|
|
297
|
+
mutable_target.make_symlink('test')
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
it 'should raise error if mkdir is called on an immutable instance' do
|
|
301
|
+
expect { immutable_target.mkdir('test') }.to raise_error(/FilteringPathname is immutable/)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it 'should delegate if mkdir is called on a mutable instance' do
|
|
305
|
+
expect(scratch_dir).to receive(:mkdir)
|
|
306
|
+
mutable_target.mkdir('test')
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
it 'should raise error if open is called on an immutable instance with a mutating mode' do
|
|
310
|
+
expect { immutable_target.open('w') { |_| } }.to raise_error(/FilteringPathname is immutable/)
|
|
311
|
+
expect { immutable_target.open('w+') { |_| } }.to raise_error(/FilteringPathname is immutable/)
|
|
312
|
+
expect { immutable_target.open('a') { |_| } }.to raise_error(/FilteringPathname is immutable/)
|
|
313
|
+
expect { immutable_target.open('a+') { |_| } }.to raise_error(/FilteringPathname is immutable/)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
it 'should delegate if open is called on an immutable instance with a non-mutating mode' do
|
|
317
|
+
expect(scratch_dir).to receive(:open)
|
|
318
|
+
immutable_target.open('r') { |_| }
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
it 'should delegate if open is called on a mutable instance' do
|
|
322
|
+
expect(scratch_dir).to receive(:open)
|
|
323
|
+
mutable_target.open('w') { |_| }
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
it 'should delegate correctly if open is called on a mutable instance with permissions' do
|
|
327
|
+
expect(scratch_dir).to receive(:open).with('w', 0755)
|
|
328
|
+
mutable_target.open('w', 0755) { |_| }
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
it 'should delegate correctly if open is called on a mutable instance with permissions and options' do
|
|
332
|
+
expect(scratch_dir).to receive(:open).with('w', 0755, external_encoding: 'UTF-8')
|
|
333
|
+
mutable_target.open('w', 0755, external_encoding: 'UTF-8') { |_| }
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
it 'should delegate correctly if open is called on a mutable instance with options but no permissions' do
|
|
337
|
+
expect(scratch_dir).to receive(:open).with('w', external_encoding: 'UTF-8')
|
|
338
|
+
mutable_target.open('w', external_encoding: 'UTF-8') { |_| }
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
it 'should cope with options on open' do
|
|
342
|
+
content = (immutable_target + 'good').open('r', external_encoding: 'UTF-8') do |file|
|
|
343
|
+
file.read
|
|
344
|
+
end
|
|
345
|
+
expect(content).to eq('good')
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
it 'should raise error if rename is called on an immutable instance' do
|
|
349
|
+
expect { immutable_target.rename('test') }.to raise_error(/FilteringPathname is immutable/)
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
it 'should delegate if rename is called on a mutable instance' do
|
|
353
|
+
expect(scratch_dir).to receive(:rename)
|
|
354
|
+
mutable_target.rename('test')
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
it 'should raise error if rmdir is called on an immutable instance' do
|
|
358
|
+
expect { immutable_target.rmdir }.to raise_error(/FilteringPathname is immutable/)
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
it 'should delegate if rmdir is called on a mutable instance' do
|
|
362
|
+
expect(scratch_dir).to receive(:rmdir)
|
|
363
|
+
mutable_target.rmdir
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
it 'should raise error if unlink is called on an immutable instance' do
|
|
367
|
+
expect { immutable_target.unlink }.to raise_error(/FilteringPathname is immutable/)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
it 'should delegate if unlink is called on a mutable instance' do
|
|
371
|
+
expect(scratch_dir).to receive(:unlink)
|
|
372
|
+
mutable_target.unlink
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
it 'should raise error if untaint is called on an immutable instance' do
|
|
376
|
+
expect { immutable_target.untaint }.to raise_error(/FilteringPathname is immutable/)
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
it 'should delegate if untaint is called on a mutable instance' do
|
|
380
|
+
expect(scratch_dir).to receive(:untaint)
|
|
381
|
+
mutable_target.untaint
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
it 'should raise error if taint is called on an immutable instance' do
|
|
385
|
+
expect { immutable_target.taint }.to raise_error(/FilteringPathname is immutable/)
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
it 'should delegate if taint is called on a mutable instance' do
|
|
389
|
+
expect(scratch_dir).to receive(:taint)
|
|
390
|
+
mutable_target.taint
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
it 'should raise error if mkpath is called on an immutable instance' do
|
|
394
|
+
expect { immutable_target.mkpath }.to raise_error(/FilteringPathname is immutable/)
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
it 'should delegate if mkpath is called on a mutable instance' do
|
|
398
|
+
expect(scratch_dir).to receive(:mkpath)
|
|
399
|
+
mutable_target.mkpath
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
it 'should raise error if rmtree is called on an immutable instance' do
|
|
403
|
+
expect { immutable_target.rmtree }.to raise_error(/FilteringPathname is immutable/)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
it 'should delegate if rmtree is called on a mutable instance' do
|
|
407
|
+
expect(scratch_dir).to receive(:rmtree)
|
|
408
|
+
mutable_target.rmtree
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
it 'should glob and filter the result' do
|
|
412
|
+
g = strict_filtering_target + '*'
|
|
413
|
+
expect(g.glob).to eq([scratch_dir + 'good'])
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
it 'should glob and yield the result' do
|
|
417
|
+
g = strict_filtering_target + '*'
|
|
418
|
+
expect { |b| g.glob(&b) }.to yield_successive_args(scratch_dir + 'good')
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
it 'should raise error if getwd is used' do
|
|
422
|
+
expect { described_class.getwd }.to raise_error(/undefined method `getwd'/)
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
it 'should raise error if glob is used' do
|
|
426
|
+
expect { described_class.glob '' }.to raise_error(/undefined method `glob'/)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
it 'should raise error if pwd is used' do
|
|
430
|
+
expect { described_class.pwd }.to raise_error(/undefined method `pwd'/)
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
def create_file(filename)
|
|
434
|
+
file = scratch_dir + filename
|
|
435
|
+
FileUtils.mkdir_p file.dirname
|
|
436
|
+
file.open('w') do |f|
|
|
437
|
+
f.write filename
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
file
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
end
|