buildpack-support 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,38 @@
|
|
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
|
+
# A mixin that adds the ability to turn a +String+ into a boolean
|
17
|
+
class String
|
18
|
+
|
19
|
+
# Converts a +String+ to a boolean
|
20
|
+
#
|
21
|
+
# @return [Boolean] +true+ if +<STRING>.downcase == 'true'+. +false+ otherwise
|
22
|
+
def to_b
|
23
|
+
downcase == 'true'
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# A mixin that adds the ability to turn a +nil+ into a boolean
|
29
|
+
class NilClass
|
30
|
+
|
31
|
+
# Converts a +nil+ to a boolean
|
32
|
+
#
|
33
|
+
# @return [Boolean] +false+ always
|
34
|
+
def to_b
|
35
|
+
false
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,157 @@
|
|
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 'buildpack_support'
|
17
|
+
|
18
|
+
module BuildpackSupport
|
19
|
+
|
20
|
+
# A utility for manipulating JRE version numbers.
|
21
|
+
class TokenizedVersion < Array
|
22
|
+
include Comparable
|
23
|
+
|
24
|
+
# The wildcard component.
|
25
|
+
WILDCARD = '+'
|
26
|
+
|
27
|
+
# Create a tokenized version based on the input string.
|
28
|
+
#
|
29
|
+
# @param [String] version a version string
|
30
|
+
# @param [Boolean] allow_wildcards whether or not to allow '+' as the last component to represent a wildcard
|
31
|
+
def initialize(version, allow_wildcards = true)
|
32
|
+
@version = version
|
33
|
+
@version = WILDCARD if !@version && allow_wildcards
|
34
|
+
|
35
|
+
major, tail = major_or_minor_and_tail @version
|
36
|
+
minor, tail = major_or_minor_and_tail tail
|
37
|
+
micro, qualifier = micro_and_qualifier tail
|
38
|
+
|
39
|
+
concat [major, minor, micro, qualifier]
|
40
|
+
validate allow_wildcards
|
41
|
+
end
|
42
|
+
|
43
|
+
# Compare this to another array
|
44
|
+
#
|
45
|
+
# @return [Integer] A numerical representation of the comparison between two instances
|
46
|
+
def <=>(other)
|
47
|
+
comparison = 0
|
48
|
+
i = 0
|
49
|
+
while comparison == 0 && i < 3
|
50
|
+
comparison = self[i].to_i <=> other[i].to_i
|
51
|
+
i += 1
|
52
|
+
end
|
53
|
+
comparison = qualifier_compare(non_nil_qualifier(self[3]), non_nil_qualifier(other[3])) if comparison == 0
|
54
|
+
|
55
|
+
comparison
|
56
|
+
end
|
57
|
+
|
58
|
+
# Convert this to a string
|
59
|
+
#
|
60
|
+
# @return [String] a string representation of this tokenized version
|
61
|
+
def to_s
|
62
|
+
@version
|
63
|
+
end
|
64
|
+
|
65
|
+
# Check that this version has at most the given number of components.
|
66
|
+
#
|
67
|
+
# @param [Integer] maximum_components the maximum number of components this version is allowed to have
|
68
|
+
# @raise if this version has more than the given number of components
|
69
|
+
def check_size(maximum_components)
|
70
|
+
fail "Malformed version #{self}: too many version components" if self[maximum_components]
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
COLLATING_SEQUENCE = (['-', '.'] + ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a).freeze
|
76
|
+
|
77
|
+
private_constant :COLLATING_SEQUENCE
|
78
|
+
|
79
|
+
def char_compare(c1, c2)
|
80
|
+
COLLATING_SEQUENCE.index(c1) <=> COLLATING_SEQUENCE.index(c2)
|
81
|
+
end
|
82
|
+
|
83
|
+
def major_or_minor_and_tail(s)
|
84
|
+
if s.nil? || s.empty?
|
85
|
+
major_or_minor, tail = nil, nil
|
86
|
+
else
|
87
|
+
fail "Invalid version '#{s}': must not end in '.'" if s[-1] == '.'
|
88
|
+
fail "Invalid version '#{s}': missing component" if s =~ /\.[\._]/
|
89
|
+
tokens = s.match(/^([^\.]+)(?:\.(.*))?/)
|
90
|
+
|
91
|
+
major_or_minor, tail = tokens[1..-1]
|
92
|
+
|
93
|
+
fail "Invalid major or minor version '#{major_or_minor}'" unless valid_major_minor_or_micro major_or_minor
|
94
|
+
end
|
95
|
+
|
96
|
+
[major_or_minor, tail]
|
97
|
+
end
|
98
|
+
|
99
|
+
def micro_and_qualifier(s)
|
100
|
+
if s.nil? || s.empty?
|
101
|
+
micro, qualifier = nil, nil
|
102
|
+
else
|
103
|
+
fail "Invalid version '#{s}': must not end in '_'" if s[-1] == '_'
|
104
|
+
tokens = s.match(/^([^\_]+)(?:_(.*))?/)
|
105
|
+
|
106
|
+
micro, qualifier = tokens[1..-1]
|
107
|
+
|
108
|
+
fail "Invalid micro version '#{micro}'" unless valid_major_minor_or_micro micro
|
109
|
+
fail "Invalid qualifier '#{qualifier}'" unless valid_qualifier qualifier
|
110
|
+
end
|
111
|
+
|
112
|
+
[micro, qualifier]
|
113
|
+
end
|
114
|
+
|
115
|
+
def minimum_qualifier_length(a, b)
|
116
|
+
[a.length, b.length].min
|
117
|
+
end
|
118
|
+
|
119
|
+
def qualifier_compare(a, b)
|
120
|
+
comparison = 0
|
121
|
+
|
122
|
+
i = 0
|
123
|
+
until comparison != 0 || i == minimum_qualifier_length(a, b)
|
124
|
+
comparison = char_compare(a[i], b[i])
|
125
|
+
i += 1
|
126
|
+
end
|
127
|
+
|
128
|
+
comparison = a.length <=> b.length if comparison == 0
|
129
|
+
|
130
|
+
comparison
|
131
|
+
end
|
132
|
+
|
133
|
+
def non_nil_qualifier(qualifier)
|
134
|
+
qualifier.nil? ? '' : qualifier
|
135
|
+
end
|
136
|
+
|
137
|
+
def validate(allow_wildcards)
|
138
|
+
wildcarded = false
|
139
|
+
each do |value|
|
140
|
+
fail "Invalid version '#{@version}': wildcards are not allowed this context" if value == WILDCARD && !allow_wildcards
|
141
|
+
|
142
|
+
fail "Invalid version '#{@version}': no characters are allowed after a wildcard" if wildcarded && value
|
143
|
+
wildcarded = true if value == WILDCARD
|
144
|
+
end
|
145
|
+
fail "Invalid version '#{@version}': missing component" if !wildcarded && compact.length < 3
|
146
|
+
end
|
147
|
+
|
148
|
+
def valid_major_minor_or_micro(major_minor_or_micro)
|
149
|
+
major_minor_or_micro =~ /^[\d]*$/ || major_minor_or_micro =~ /^\+$/
|
150
|
+
end
|
151
|
+
|
152
|
+
def valid_qualifier(qualifier)
|
153
|
+
qualifier.nil? || qualifier.empty? || qualifier =~ /^[-\.a-zA-Z\d]*$/ || qualifier =~ /^\+$/
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
@@ -0,0 +1,23 @@
|
|
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 'buildpack_support'
|
17
|
+
|
18
|
+
module BuildpackSupport
|
19
|
+
|
20
|
+
# The version of the gem
|
21
|
+
VERSION = '1.0.0'
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,112 @@
|
|
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/base_buildpack'
|
18
|
+
require 'buildpack_support/test/console_helper'
|
19
|
+
require 'buildpack_support/test/logging_helper'
|
20
|
+
require 'buildpack_support/test/scratch_helper'
|
21
|
+
|
22
|
+
describe BuildpackSupport::BaseBuildpack do
|
23
|
+
include_context 'console_helper'
|
24
|
+
include_context 'logging_helper'
|
25
|
+
include_context 'scratch_helper'
|
26
|
+
|
27
|
+
let(:component1) { double 'component1', class: 'Component1Class', detect: nil }
|
28
|
+
let(:component2) { double 'component2', class: 'Component2Class', detect: %w(tag1 tag2) }
|
29
|
+
let(:component3) { double 'component3', class: 'Component3Class', detect: %w(tag3 tag4) }
|
30
|
+
|
31
|
+
let(:buildpack) do
|
32
|
+
buildpack = nil
|
33
|
+
StubBuildpackClass.with_buildpack(scratch_dir, 'Error %s') { |b| buildpack = b }
|
34
|
+
buildpack
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should fail to detect' do
|
38
|
+
expect { buildpack.detect }.to raise_error("Method 'detect' must be defined")
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should fail to compile' do
|
42
|
+
expect { buildpack.compile }.to raise_error("Method 'compile' must be defined")
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should fail to release' do
|
46
|
+
expect { buildpack.release }.to raise_error("Method 'release' must be defined")
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'handles exceptions correctly' do
|
50
|
+
expect { with_buildpack { |_buildpack| fail 'an exception' } }.to raise_error SystemExit
|
51
|
+
expect(stderr.string).to match(/an exception/)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should require files needed for components' do
|
55
|
+
expect(buildpack).to receive(:require).with('test_component')
|
56
|
+
buildpack.require_component Pathname.new('spec/fixtures'), 'test-component'
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should not require files needed for components if they do not exist',
|
60
|
+
log_level: 'debug' do
|
61
|
+
expect(buildpack).not_to receive(:require).with('another_test_component')
|
62
|
+
buildpack.require_component Pathname.new('spec/fixtures'), 'another-test-component'
|
63
|
+
expect(stderr.string).to match('Cannot require another-test-component because spec/fixtures/another_test_component.rb does not exist')
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should return detected components and their tags' do
|
67
|
+
components, tags = buildpack.detection 'test', [component1, component2, component3], false
|
68
|
+
expect(components).not_to include(component1)
|
69
|
+
expect(components).to include(component2, component3)
|
70
|
+
expect(tags).to include(%w(tag1 tag2), %w(tag3 tag4))
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should return no components or tags when no components are detected and unique is true' do
|
74
|
+
components, tags = buildpack.detection 'test', [component1], true
|
75
|
+
expect(components).to eq([])
|
76
|
+
expect(tags).to eq([])
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should return a component and its tags when unique is true' do
|
80
|
+
components, tags = buildpack.detection 'test', [component2], true
|
81
|
+
expect(components).to include(component2)
|
82
|
+
expect(tags).to include(%w(tag1 tag2))
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should raise an error when more than one component is detected and unique is true' do
|
86
|
+
expect { buildpack.detection 'test', [component1, component2, component3], true }.to raise_error('Application can be run by more than one test: Component2 Class, Component3 Class')
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should return detected components' do
|
90
|
+
components = buildpack.component_detection 'test', [component1, component2, component3], false
|
91
|
+
expect(components).not_to include(component1)
|
92
|
+
expect(components).to include(component2, component3)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should return detected tags' do
|
96
|
+
tags = buildpack.tag_detection 'test', [component1, component2, component3], false
|
97
|
+
expect(tags).to include(%w(tag1 tag2), %w(tag3 tag4))
|
98
|
+
end
|
99
|
+
|
100
|
+
def with_buildpack
|
101
|
+
described_class.with_buildpack(scratch_dir, 'Error %s') do |buildpack|
|
102
|
+
yield buildpack
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
class StubBuildpackClass < BuildpackSupport::BaseBuildpack
|
109
|
+
|
110
|
+
public :component_detection, :detection, :require_component, :tag_detection
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,122 @@
|
|
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
|
+
require 'spec_helper'
|
16
|
+
require 'buildpack_support/buildpack_version'
|
17
|
+
require 'buildpack_support/test/environment_helper'
|
18
|
+
require 'buildpack_support/test/logging_helper'
|
19
|
+
require 'pathname'
|
20
|
+
|
21
|
+
describe BuildpackSupport::BuildpackVersion do
|
22
|
+
include_context 'environment_helper'
|
23
|
+
include_context 'logging_helper'
|
24
|
+
|
25
|
+
let(:buildpack_version) { described_class.new }
|
26
|
+
|
27
|
+
before do |example|
|
28
|
+
configuration = example.metadata[:configuration] || {}
|
29
|
+
allow_any_instance_of(BuildpackSupport::ConfigurationUtils).to receive(:load).with('version')
|
30
|
+
.and_return(configuration)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should create offline version string from config/version.yml',
|
34
|
+
log_level: 'DEBUG',
|
35
|
+
configuration: { 'hash' => 'test-hash', 'offline' => true,
|
36
|
+
'remote' => 'test-remote', 'version' => 'test-version' } do
|
37
|
+
|
38
|
+
expect(buildpack_version.to_s).to match(/test-version (offline) | test-remote#test-hash/)
|
39
|
+
expect(buildpack_version.to_s(false)).to match(/test-version-offline-test-remote#test-hash/)
|
40
|
+
expect(stderr.string).to match(/test-version (offline) | test-remote#test-hash/)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should create online version string from config/version.yml',
|
44
|
+
log_level: 'DEBUG',
|
45
|
+
configuration: { 'hash' => 'test-hash', 'offline' => false,
|
46
|
+
'remote' => 'test-remote', 'version' => 'test-version' } do
|
47
|
+
|
48
|
+
expect(buildpack_version.to_s).to match(/test-version | test-remote#test-hash/)
|
49
|
+
expect(buildpack_version.to_s(false)).to match(/test-version-test-remote#test-hash/)
|
50
|
+
expect(stderr.string).to match(/test-version | test-remote#test-hash/)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should create version string from git repository if no config/version.yml exists',
|
54
|
+
log_level: 'DEBUG' do
|
55
|
+
|
56
|
+
git_dir = Pathname.new('.git').expand_path
|
57
|
+
|
58
|
+
allow_any_instance_of(described_class).to receive(:system)
|
59
|
+
.with('which git > /dev/null')
|
60
|
+
.and_return(true)
|
61
|
+
allow_any_instance_of(described_class).to receive(:`)
|
62
|
+
.with("git --git-dir=#{git_dir} rev-parse --short HEAD")
|
63
|
+
.and_return('test-hash')
|
64
|
+
allow_any_instance_of(described_class).to receive(:`)
|
65
|
+
.with("git --git-dir=#{git_dir} config --get remote.origin.url")
|
66
|
+
.and_return('test-remote')
|
67
|
+
|
68
|
+
expect(buildpack_version.to_s).to match(/test-remote#test-hash/)
|
69
|
+
expect(buildpack_version.to_s(false)).to match(/test-remote#test-hash/)
|
70
|
+
expect(stderr.string).to match(/test-remote#test-hash/)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should create unknown version string if no config/version.yml exists and it is not in a git repository',
|
74
|
+
log_level: 'DEBUG' do
|
75
|
+
|
76
|
+
allow_any_instance_of(described_class).to receive(:system).with('which git > /dev/null').and_return(false)
|
77
|
+
|
78
|
+
expect(buildpack_version.to_s).to match(/unknown/)
|
79
|
+
expect(buildpack_version.to_s(false)).to match(/unknown/)
|
80
|
+
expect(stderr.string).to match(/unknown/)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should create a has from the values',
|
84
|
+
configuration: { 'hash' => 'test-hash', 'offline' => true,
|
85
|
+
'remote' => 'test-remote', 'version' => 'test-version' } do |example|
|
86
|
+
|
87
|
+
allow_any_instance_of(described_class).to receive(:system).with('which git > /dev/null').and_return(false)
|
88
|
+
|
89
|
+
expect(buildpack_version.to_hash).to eq(example.metadata[:configuration])
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should exclude non-populated values from the hash' do
|
93
|
+
allow_any_instance_of(described_class).to receive(:system).with('which git > /dev/null').and_return(false)
|
94
|
+
|
95
|
+
expect(buildpack_version.to_hash).to eq({})
|
96
|
+
end
|
97
|
+
|
98
|
+
context do
|
99
|
+
|
100
|
+
let(:environment) { { 'OFFLINE' => 'true' } }
|
101
|
+
|
102
|
+
it 'should pick up offline from the environment' do
|
103
|
+
allow_any_instance_of(described_class).to receive(:system).with('which git > /dev/null').and_return(false)
|
104
|
+
|
105
|
+
expect(buildpack_version.offline).to be
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
context do
|
111
|
+
|
112
|
+
let(:environment) { { 'VERSION' => 'test-version' } }
|
113
|
+
|
114
|
+
it 'should pick up version from the environment' do
|
115
|
+
allow_any_instance_of(described_class).to receive(:system).with('which git > /dev/null').and_return(false)
|
116
|
+
|
117
|
+
expect(buildpack_version.version).to match(/test-version/)
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|