poise-languages 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/lib/poise_languages/scl/mixin.rb +23 -3
- data/lib/poise_languages/scl/resource.rb +44 -7
- data/lib/poise_languages/utils.rb +20 -1
- data/lib/poise_languages/version.rb +1 -1
- data/poise-languages.gemspec +1 -1
- data/test/spec/scl/mixin_spec.rb +42 -2
- data/test/spec/scl/resource_spec.rb +38 -3
- data/test/spec/utils_spec.rb +39 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4a05fa47de317277eae76e90f0e2f8fd4f03d72
|
4
|
+
data.tar.gz: e3c4ef2901a9c2ccb9f0467334389060533448e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dce25fe02f0b2c9c66764c19d1278d95262b0a2ae7aa2ff865a223baa21f6acc97df83ef22cd1e438e378ca9043f2bfca19d522c24e63be5818cae7394142557
|
7
|
+
data.tar.gz: b0ec72f8eda800c9a0a0423920c5bd704697af0c4561431d3e30e14e471b495b9b240e6e2aa288b5f1fc38c19203d27a9e859ff9577ee8d16a97032f3e2d1cc5
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v1.2.0
|
4
|
+
|
5
|
+
* Support for installing development headers with SCL providers.
|
6
|
+
* Add `PoiseLanguages::Utils.shelljoin` for encoding command arrays with some
|
7
|
+
bash metadata characters allowed.
|
8
|
+
* [#1](https://github.com/poise/poise-languages/pull/1) – Fix typo in gemspec.
|
9
|
+
|
3
10
|
## v1.1.0
|
4
11
|
|
5
12
|
* Add helpers for installing from static archives.
|
@@ -24,9 +24,12 @@ module PoiseLanguages
|
|
24
24
|
|
25
25
|
def install_scl_package
|
26
26
|
pkg = scl_package
|
27
|
-
poise_languages_scl pkg[:name] do
|
27
|
+
poise_languages_scl options[:package_name] || pkg[:name] do
|
28
|
+
action :upgrade if options[:package_upgrade]
|
29
|
+
dev_package options[:dev_package] == true ? pkg[:devel_name] : options[:dev_package]
|
28
30
|
parent new_resource
|
29
31
|
url pkg[:url]
|
32
|
+
version options[:package_version]
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
@@ -83,6 +86,23 @@ module PoiseLanguages
|
|
83
86
|
!!find_scl_package(node, version)
|
84
87
|
end
|
85
88
|
|
89
|
+
# Set some default inversion provider options. Package name can't get
|
90
|
+
# a default value here because that would complicate the handling of
|
91
|
+
# {system_package_candidates}.
|
92
|
+
#
|
93
|
+
# @api private
|
94
|
+
def default_inversion_options(node, resource)
|
95
|
+
super.merge({
|
96
|
+
# Install dev headers?
|
97
|
+
dev_package: true,
|
98
|
+
# Manual overrides for package name and/or version.
|
99
|
+
package_name: nil,
|
100
|
+
package_version: nil,
|
101
|
+
# Set to true to use action :upgrade on system packages.
|
102
|
+
package_upgrade: false,
|
103
|
+
})
|
104
|
+
end
|
105
|
+
|
86
106
|
def find_scl_package(node, version)
|
87
107
|
pkg = scl_packages.find {|p| p[:version].start_with?(version) }
|
88
108
|
return unless pkg
|
@@ -97,8 +117,8 @@ module PoiseLanguages
|
|
97
117
|
@scl_packages ||= []
|
98
118
|
end
|
99
119
|
|
100
|
-
def scl_package(version, name, urls)
|
101
|
-
scl_packages << {version: version, name: name, urls: urls}
|
120
|
+
def scl_package(version, name, devel_name=nil, urls)
|
121
|
+
scl_packages << {version: version, name: name, devel_name: devel_name, urls: urls}
|
102
122
|
end
|
103
123
|
|
104
124
|
def included(klass)
|
@@ -33,16 +33,18 @@ module PoiseLanguages
|
|
33
33
|
class Resource < Chef::Resource
|
34
34
|
include Poise
|
35
35
|
provides(:poise_languages_scl)
|
36
|
-
actions(:install, :uninstall)
|
36
|
+
actions(:install, :upgrade, :uninstall)
|
37
37
|
|
38
38
|
# @!attribute package_name
|
39
39
|
# Name of the SCL package for the language.
|
40
40
|
# @return [String]
|
41
41
|
attribute(:package_name, kind_of: String, name_attribute: true)
|
42
|
+
attribute(:dev_package, kind_of: [String, NilClass])
|
42
43
|
# @!attribute url
|
43
44
|
# URL to the SCL repository package for the language.
|
44
45
|
# @return [String]
|
45
46
|
attribute(:url, kind_of: String, required: true)
|
47
|
+
attribute(:version, kind_of: [String, NilClass])
|
46
48
|
# @!attribute parent
|
47
49
|
# Resource for the language runtime. Used only for messages.
|
48
50
|
# @return [Chef::Resource]
|
@@ -66,7 +68,22 @@ module PoiseLanguages
|
|
66
68
|
notifying_block do
|
67
69
|
install_scl_utils
|
68
70
|
install_scl_repo_package
|
69
|
-
|
71
|
+
flush_yum_cache
|
72
|
+
install_scl_package(:install)
|
73
|
+
install_scl_devel_package(:install) if new_resource.dev_package
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# The `upgrade` action for the `poise_languages_scl` resource.
|
78
|
+
#
|
79
|
+
# @return [void]
|
80
|
+
def action_upgrade
|
81
|
+
notifying_block do
|
82
|
+
install_scl_utils
|
83
|
+
install_scl_repo_package
|
84
|
+
flush_yum_cache
|
85
|
+
install_scl_package(:upgrade)
|
86
|
+
install_scl_devel_package(:upgrade) if new_resource.dev_package
|
70
87
|
end
|
71
88
|
end
|
72
89
|
|
@@ -77,7 +94,9 @@ module PoiseLanguages
|
|
77
94
|
notifying_block do
|
78
95
|
uninstall_scl_utils
|
79
96
|
uninstall_scl_repo_package
|
97
|
+
uninstall_scl_devel_package if new_resource.dev_package
|
80
98
|
uninstall_scl_package
|
99
|
+
flush_yum_cache
|
81
100
|
end
|
82
101
|
end
|
83
102
|
|
@@ -95,9 +114,25 @@ module PoiseLanguages
|
|
95
114
|
end
|
96
115
|
end
|
97
116
|
|
98
|
-
def
|
117
|
+
def flush_yum_cache
|
118
|
+
ruby_block 'flush_yum_cache' do
|
119
|
+
block do
|
120
|
+
# Equivalent to flush_cache after: true
|
121
|
+
Chef::Provider::Package::Yum::YumCache.instance.reload
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def install_scl_package(action)
|
99
127
|
yum_package new_resource.package_name do
|
100
|
-
|
128
|
+
action action
|
129
|
+
version new_resource.version
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def install_scl_devel_package(action)
|
134
|
+
yum_package new_resource.dev_package do
|
135
|
+
action action
|
101
136
|
end
|
102
137
|
end
|
103
138
|
|
@@ -114,9 +149,11 @@ module PoiseLanguages
|
|
114
149
|
end
|
115
150
|
|
116
151
|
def uninstall_scl_package
|
117
|
-
install_scl_package
|
118
|
-
|
119
|
-
|
152
|
+
install_scl_package(:remove)
|
153
|
+
end
|
154
|
+
|
155
|
+
def uninstall_scl_devel_package
|
156
|
+
install_scl_devel_package(:remove)
|
120
157
|
end
|
121
158
|
|
122
159
|
end
|
@@ -24,6 +24,25 @@ module PoiseLanguages
|
|
24
24
|
include Which
|
25
25
|
extend self
|
26
26
|
|
27
|
+
# Default whitelist for {#shelljoin}.
|
28
|
+
SHELLJOIN_WHITELIST = [/^2?[><]/]
|
29
|
+
|
30
|
+
# An improved version of Shellwords.shelljoin that doesn't escape a few
|
31
|
+
# things.
|
32
|
+
#
|
33
|
+
# @param cmd [Array<String>] Command array to join.
|
34
|
+
# @param whitelist [Array<Regexp>] Array of patterns to whitelist.
|
35
|
+
# @return [String]
|
36
|
+
def shelljoin(cmd, whitelist: SHELLJOIN_WHITELIST)
|
37
|
+
cmd.map do |str|
|
38
|
+
if whitelist.any? {|pat| str =~ pat }
|
39
|
+
str
|
40
|
+
else
|
41
|
+
Shellwords.shellescape(str)
|
42
|
+
end
|
43
|
+
end.join(' ')
|
44
|
+
end
|
45
|
+
|
27
46
|
# Convert the executable in a string or array command to an absolute path.
|
28
47
|
#
|
29
48
|
# @param cmd [String, Array<String>] Command to fix up.
|
@@ -41,7 +60,7 @@ module PoiseLanguages
|
|
41
60
|
# If which returns false, just leave it I guess.
|
42
61
|
cmd[0] = which(cmd.first, path: path) || cmd.first
|
43
62
|
end
|
44
|
-
cmd =
|
63
|
+
cmd = shelljoin(cmd) unless was_array
|
45
64
|
cmd
|
46
65
|
end
|
47
66
|
|
data/poise-languages.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.version = PoiseLanguages::VERSION
|
24
24
|
spec.authors = ['Noah Kantrowitz']
|
25
25
|
spec.email = %w{noah@coderanger.net}
|
26
|
-
spec.description = "A Chef cookbook to help writing language
|
26
|
+
spec.description = "A Chef cookbook to help writing language cookbooks."
|
27
27
|
spec.summary = spec.description
|
28
28
|
spec.homepage = 'https://github.com/poise/poise-languages'
|
29
29
|
spec.license = 'Apache 2.0'
|
data/test/spec/scl/mixin_spec.rb
CHANGED
@@ -29,6 +29,9 @@ describe PoiseLanguages::Scl::Mixin do
|
|
29
29
|
def scl_package
|
30
30
|
{name: 'python34', url: 'http://something.rpm'}
|
31
31
|
end
|
32
|
+
def options
|
33
|
+
{dev_package: true}
|
34
|
+
end
|
32
35
|
def action_run
|
33
36
|
install_scl_package
|
34
37
|
end
|
@@ -47,6 +50,9 @@ describe PoiseLanguages::Scl::Mixin do
|
|
47
50
|
def scl_package
|
48
51
|
{name: 'python34', url: 'http://something.rpm'}
|
49
52
|
end
|
53
|
+
def options
|
54
|
+
{dev_package: true}
|
55
|
+
end
|
50
56
|
def action_run
|
51
57
|
uninstall_scl_package
|
52
58
|
end
|
@@ -181,6 +187,17 @@ EOH
|
|
181
187
|
end # /context with an scl_source line
|
182
188
|
end # /describe #parse_enable_file
|
183
189
|
|
190
|
+
describe '.default_inversion_options' do
|
191
|
+
provider(:poise_test) do
|
192
|
+
include Poise(inversion: :poise_test)
|
193
|
+
include described_class
|
194
|
+
end
|
195
|
+
let(:node) { double('node') }
|
196
|
+
let(:new_resource) { double('resource') }
|
197
|
+
subject { provider(:poise_test).default_inversion_options(node, new_resource) }
|
198
|
+
it { is_expected.to eq({dev_package: true, package_name: nil, package_version: nil, package_upgrade: false}) }
|
199
|
+
end # /describe .default_inversion_options
|
200
|
+
|
184
201
|
describe '.provides_auto?' do
|
185
202
|
let(:node) { double('node', :"[]" => {'machine' => 'x86_64'}) }
|
186
203
|
let(:new_resource) { double('resource') }
|
@@ -196,13 +213,13 @@ EOH
|
|
196
213
|
let(:version) { '' }
|
197
214
|
provider(:poise_test) do
|
198
215
|
include described_class
|
199
|
-
scl_package('3.4.2', 'rh-python34', {
|
216
|
+
scl_package('3.4.2', 'rh-python34', 'rh-python34-python-devel', {
|
200
217
|
['redhat', 'centos'] => {
|
201
218
|
'~> 7.0' => 'https://www.softwarecollections.org/en/scls/rhscl/rh-python34/epel-7-x86_64/download/rhscl-rh-python34-epel-7-x86_64.noarch.rpm',
|
202
219
|
'~> 6.0' => 'https://www.softwarecollections.org/en/scls/rhscl/rh-python34/epel-6-x86_64/download/rhscl-rh-python34-epel-6-x86_64.noarch.rpm',
|
203
220
|
},
|
204
221
|
})
|
205
|
-
scl_package('3.3.2', 'python33', {
|
222
|
+
scl_package('3.3.2', 'python33', 'python33-python-devel', {
|
206
223
|
['redhat', 'centos'] => {
|
207
224
|
'~> 7.0' => 'https://www.softwarecollections.org/en/scls/rhscl/python33/epel-7-x86_64/download/rhscl-python33-epel-7-x86_64.noarch.rpm',
|
208
225
|
'~> 6.0' => 'https://www.softwarecollections.org/en/scls/rhscl/python33/epel-6-x86_64/download/rhscl-python33-epel-6-x86_64.noarch.rpm',
|
@@ -221,6 +238,7 @@ EOH
|
|
221
238
|
is_expected.to include({
|
222
239
|
version: '3.4.2',
|
223
240
|
name: 'rh-python34',
|
241
|
+
devel_name: 'rh-python34-python-devel',
|
224
242
|
url: 'https://www.softwarecollections.org/en/scls/rhscl/rh-python34/epel-7-x86_64/download/rhscl-rh-python34-epel-7-x86_64.noarch.rpm',
|
225
243
|
})
|
226
244
|
end
|
@@ -233,6 +251,7 @@ EOH
|
|
233
251
|
is_expected.to include({
|
234
252
|
version: '3.3.2',
|
235
253
|
name: 'python33',
|
254
|
+
devel_name: 'python33-python-devel',
|
236
255
|
url: 'https://www.softwarecollections.org/en/scls/rhscl/python33/epel-6-x86_64/download/rhscl-python33-epel-6-x86_64.noarch.rpm',
|
237
256
|
})
|
238
257
|
end
|
@@ -242,5 +261,26 @@ EOH
|
|
242
261
|
let(:chefspec_options) { {platform: 'ubuntu', version: '12.04'} }
|
243
262
|
it { is_expected.to be_nil }
|
244
263
|
end # /context on Ubuntu
|
264
|
+
|
265
|
+
context 'with no devel package' do
|
266
|
+
provider(:poise_test) do
|
267
|
+
include described_class
|
268
|
+
scl_package('3.4.2', 'rh-python34', {
|
269
|
+
['redhat', 'centos'] => {
|
270
|
+
'~> 7.0' => 'https://www.softwarecollections.org/en/scls/rhscl/rh-python34/epel-7-x86_64/download/rhscl-rh-python34-epel-7-x86_64.noarch.rpm',
|
271
|
+
'~> 6.0' => 'https://www.softwarecollections.org/en/scls/rhscl/rh-python34/epel-6-x86_64/download/rhscl-rh-python34-epel-6-x86_64.noarch.rpm',
|
272
|
+
},
|
273
|
+
})
|
274
|
+
end
|
275
|
+
let(:chefspec_options) { {platform: 'centos', version: '7.0'} }
|
276
|
+
it do
|
277
|
+
is_expected.to include({
|
278
|
+
version: '3.4.2',
|
279
|
+
name: 'rh-python34',
|
280
|
+
devel_name: nil,
|
281
|
+
url: 'https://www.softwarecollections.org/en/scls/rhscl/rh-python34/epel-7-x86_64/download/rhscl-rh-python34-epel-7-x86_64.noarch.rpm',
|
282
|
+
})
|
283
|
+
end
|
284
|
+
end # /context with no devel package
|
245
285
|
end # /describe .find_scl_package
|
246
286
|
end
|
@@ -18,12 +18,20 @@ require 'spec_helper'
|
|
18
18
|
|
19
19
|
describe PoiseLanguages::Scl::Resource do
|
20
20
|
step_into(:poise_languages_scl)
|
21
|
+
step_into(:ruby_block)
|
21
22
|
let(:chefspec_options) { {platform: 'centos', version: '7.0'} }
|
23
|
+
let(:yum_cache) { double('yum_cache', reload: nil) }
|
24
|
+
before do
|
25
|
+
allow(Chef::Provider::Package::Yum::YumCache).to receive(:instance).and_return(yum_cache)
|
26
|
+
end
|
22
27
|
|
23
28
|
context 'action :install' do
|
24
29
|
recipe do
|
25
|
-
r = ruby_block 'parent'
|
30
|
+
r = ruby_block 'parent' do
|
31
|
+
block { }
|
32
|
+
end
|
26
33
|
poise_languages_scl 'mylang' do
|
34
|
+
dev_package 'mylang-devel'
|
27
35
|
parent r
|
28
36
|
url 'http://mylang.rpm'
|
29
37
|
end
|
@@ -31,14 +39,39 @@ describe PoiseLanguages::Scl::Resource do
|
|
31
39
|
|
32
40
|
it { is_expected.to upgrade_package('scl-utils') }
|
33
41
|
it { is_expected.to install_rpm_package('rhscl-mylang').with(source: 'http://mylang.rpm') }
|
34
|
-
it { is_expected.to install_yum_package('mylang')
|
42
|
+
it { is_expected.to install_yum_package('mylang') }
|
43
|
+
it { is_expected.to install_yum_package('mylang-devel') }
|
44
|
+
it { expect(yum_cache).to receive(:reload); run_chef }
|
35
45
|
end # /context action :install
|
36
46
|
|
47
|
+
context 'action :upgrade' do
|
48
|
+
recipe do
|
49
|
+
r = ruby_block 'parent' do
|
50
|
+
block { }
|
51
|
+
end
|
52
|
+
poise_languages_scl 'mylang' do
|
53
|
+
action :upgrade
|
54
|
+
dev_package 'mylang-devel'
|
55
|
+
parent r
|
56
|
+
url 'http://mylang.rpm'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it { is_expected.to upgrade_package('scl-utils') }
|
61
|
+
it { is_expected.to install_rpm_package('rhscl-mylang').with(source: 'http://mylang.rpm') }
|
62
|
+
it { is_expected.to upgrade_yum_package('mylang') }
|
63
|
+
it { is_expected.to upgrade_yum_package('mylang-devel') }
|
64
|
+
it { expect(yum_cache).to receive(:reload); run_chef }
|
65
|
+
end # /context action :upgrade
|
66
|
+
|
37
67
|
context 'action :uninstall' do
|
38
68
|
recipe do
|
39
|
-
r = ruby_block 'parent'
|
69
|
+
r = ruby_block 'parent' do
|
70
|
+
block { }
|
71
|
+
end
|
40
72
|
poise_languages_scl 'mylang' do
|
41
73
|
action :uninstall
|
74
|
+
dev_package 'mylang-devel'
|
42
75
|
parent r
|
43
76
|
url 'http://mylang.rpm'
|
44
77
|
end
|
@@ -47,5 +80,7 @@ describe PoiseLanguages::Scl::Resource do
|
|
47
80
|
it { is_expected.to remove_package('scl-utils') }
|
48
81
|
it { is_expected.to remove_rpm_package('rhscl-mylang') }
|
49
82
|
it { is_expected.to remove_yum_package('mylang') }
|
83
|
+
it { is_expected.to remove_yum_package('mylang-devel') }
|
84
|
+
it { expect(yum_cache).to receive(:reload); run_chef }
|
50
85
|
end # /context action :uninstall
|
51
86
|
end
|
data/test/spec/utils_spec.rb
CHANGED
@@ -17,6 +17,45 @@
|
|
17
17
|
require 'spec_helper'
|
18
18
|
|
19
19
|
describe PoiseLanguages::Utils do
|
20
|
+
describe '#shelljoin' do
|
21
|
+
let(:cmd) { [] }
|
22
|
+
subject { described_class.shelljoin(cmd) }
|
23
|
+
|
24
|
+
context 'with an empty array' do
|
25
|
+
it { is_expected.to eq '' }
|
26
|
+
end # /context with an empty array
|
27
|
+
|
28
|
+
context 'with simple arguments' do
|
29
|
+
let(:cmd) { %w{a b c} }
|
30
|
+
it { is_expected.to eq 'a b c' }
|
31
|
+
end # /context with simple arguments
|
32
|
+
|
33
|
+
context 'with complex arguments' do
|
34
|
+
let(:cmd) { ['a', 'b c', '--d=e'] }
|
35
|
+
it { is_expected.to eq 'a b\\ c --d\\=e' }
|
36
|
+
end # /context with complex arguments
|
37
|
+
|
38
|
+
context 'with input redirect' do
|
39
|
+
let(:cmd) { %w{a b < c} }
|
40
|
+
it { is_expected.to eq 'a b < c' }
|
41
|
+
end # /context with input redirect
|
42
|
+
|
43
|
+
context 'with input redirect and no space' do
|
44
|
+
let(:cmd) { %w{a b <c} }
|
45
|
+
it { is_expected.to eq 'a b <c' }
|
46
|
+
end # /context with input redirect
|
47
|
+
|
48
|
+
context 'with output redirect' do
|
49
|
+
let(:cmd) { %w{a b > c} }
|
50
|
+
it { is_expected.to eq 'a b > c' }
|
51
|
+
end # /context with output redirect
|
52
|
+
|
53
|
+
context 'with error redirect' do
|
54
|
+
let(:cmd) { %w{a b 2> c} }
|
55
|
+
it { is_expected.to eq 'a b 2> c' }
|
56
|
+
end # /context with error redirect
|
57
|
+
end # /describe #shelljoin
|
58
|
+
|
20
59
|
describe '#absolute_command' do
|
21
60
|
let(:path) { double('path') }
|
22
61
|
let(:cmd) { }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poise-languages
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noah Kantrowitz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: halite
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.0'
|
55
|
-
description: A Chef cookbook to help writing language
|
55
|
+
description: A Chef cookbook to help writing language cookbooks.
|
56
56
|
email:
|
57
57
|
- noah@coderanger.net
|
58
58
|
executables: []
|
@@ -118,7 +118,7 @@ rubyforge_project:
|
|
118
118
|
rubygems_version: 2.4.8
|
119
119
|
signing_key:
|
120
120
|
specification_version: 4
|
121
|
-
summary: A Chef cookbook to help writing language
|
121
|
+
summary: A Chef cookbook to help writing language cookbooks.
|
122
122
|
test_files:
|
123
123
|
- test/docker/docker.ca
|
124
124
|
- test/docker/docker.pem
|