poise-archive 1.2.1 → 1.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd46ea17e4040f2682e412ffda579ad0401d4aec
4
- data.tar.gz: dc92ac0690c79f6a37a252682cc6bce4e03299ab
3
+ metadata.gz: 4242f7231038390f4f5fe3cbbffc7fc396ac5192
4
+ data.tar.gz: 52c718b6e9bef94592ca87e0eca89b5dd9d42929
5
5
  SHA512:
6
- metadata.gz: d69d2aabe6bf4eaf939b9e5816d52291225ffb3889aa19012a5b456b793a957de94fa82657e46925a2230fb71445d5fbee75463ad7abf78b86b0f63fc3627fff
7
- data.tar.gz: 7066f0bdbbffefa0cd752a7a730b441eeada22949976316bc8ad50f3b6a160de12f9d4536a6c486b88c33aa0e12bb2a7c36adbd9461f42f84e571b9f498acbe6
6
+ metadata.gz: 986c52a2da5d576ecde9094a7362443a9ddb4bd2f50f05f7a58ef39d8a4e597c00c6e9a1f0dbd6805d27ce9c66fd9e82f1955f10e425edced02343d83009ef74
7
+ data.tar.gz: a35ad89c3af875f794553c898266a0a6e5f7676d486e1796b47ed0b240d43f379fe897e9cc9fd817c32de5693af245cd50e8818141bc485f0bc1c34d0193e515
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Poise-Archive Changelog
2
2
 
3
+ ## v1.3.0
4
+
5
+ * Add support for unpacking directly from a URL.
6
+
3
7
  ## v1.2.1
4
8
 
5
9
  * [#1](https://github.com/poise/poise-archive/issues/1) Restore file permissions
data/README.md CHANGED
@@ -16,15 +16,9 @@ It supports `.tar`, `.tar.gz`, `.tar.bz2`, and `.zip` archive files.
16
16
  To download an unpack and archive:
17
17
 
18
18
  ```ruby
19
- poise_archive 'myapp.tgz' do
20
- action :nothing
19
+ poise_archive 'https://example.com/myapp.tgz' do
21
20
  destination '/opt/myapp'
22
21
  end
23
-
24
- remote_file "#{Chef::Config[:file_cache_path]}/myapp.tgz" do
25
- source 'https://example.com/myapp.tgz'
26
- notifies :unpack, 'poise_archive[myapp.tgz]', :immediately
27
- end
28
22
  ```
29
23
 
30
24
  ## Platforms
@@ -45,6 +39,19 @@ poise_archive '/tmp/myapp-1.2.0.tar' do
45
39
  end
46
40
  ```
47
41
 
42
+ A URL can also be passed as the source path, optionally with extra properties to
43
+ be merged with `source_properties`.
44
+
45
+ ```ruby
46
+ poise_archive 'http://example.com/myapp-1.2.0.zip' do
47
+ destination '/srv/myapp-1.2.0'
48
+ end
49
+
50
+ poise_archive ['http://example.com/myapp-1.2.0.zip', {headers: {'Authentication' => '...'}}] do
51
+ destination '/srv/myapp-1.2.0'
52
+ end
53
+ ```
54
+
48
55
  #### Actions
49
56
 
50
57
  * `:unpack` – Unpack the archive. *(default)*
@@ -52,12 +59,16 @@ end
52
59
  #### Properties
53
60
 
54
61
  * `path` – Path to the archive. If relative, it is taken as a file inside
55
- `Chef::Config[:file_cache_path]`. *(name attribute)*
62
+ `Chef::Config[:file_cache_path]`. If a URL, it is downloaded to a cache file
63
+ first. *(name attribute)*
56
64
  * `destination` – Path to unpack the archive to. If not specified, the path of
57
- the archive without the file extension is used. *(default: auto)*
65
+ the archive without the file extension is used. Required when unpacking from
66
+ a URL. *(default: auto)*
58
67
  * `group` – Group to run the unpack as.
59
68
  * `keep_existing` – Keep existing files in the destination directory when
60
69
  unpacking. *(default: false)*
70
+ * `source_properties` – Property key/value pairs to be applied to the
71
+ `remote_file` file resource when downloading a URL. *(default: {retries: 5})*
61
72
  * `strip_components` – Number of intermediary directories to skip when
62
73
  unpacking. Works like GNU tar's `--strip-components`. *(default: 1)*
63
74
  * `user` – User to run the unpack as.
@@ -55,7 +55,14 @@ module PoiseArchive
55
55
  #
56
56
  # @return [void]
57
57
  def action_unpack
58
- converge_by("unpack archive #{new_resource.path} to #{new_resource.absolute_destination}") do
58
+ if new_resource.is_url?
59
+ download_resource = download_file
60
+ # Check if the download resource updated, if not don't run the rest
61
+ # of the unpack for idempotence. I could also check
62
+ # new_resource.updated? but this seems more future proof.
63
+ return if !download_resource.updated_by_last_action?
64
+ end
65
+ converge_by("unpack archive #{new_resource.path} to #{new_resource.destination}") do
59
66
  notifying_block do
60
67
  create_directory
61
68
  end
@@ -66,11 +73,31 @@ module PoiseArchive
66
73
 
67
74
  private
68
75
 
76
+ # Download the source file to a cache path.
77
+ #
78
+ # @return [Chef::Resource]
79
+ def download_file
80
+ # resource_state used for closure breaking on the notifying block.
81
+ resource_state = []
82
+ notifying_block do
83
+ # TODO handle cookbook:// for cookbook_file "downloads".
84
+ resource_state << remote_file(new_resource.absolute_path) do
85
+ source new_resource.path
86
+ retries 5 # As a default, could be overridden by source_properties.
87
+ new_resource.merged_source_properties.each do |key, value|
88
+ send(key, value)
89
+ end
90
+ end
91
+ end
92
+ # Return the download resource for state tracking.
93
+ resource_state.first
94
+ end
95
+
69
96
  # Make sure the destination directory exists.
70
97
  #
71
98
  # @return [void]
72
99
  def create_directory
73
- directory new_resource.absolute_destination do
100
+ directory new_resource.destination do
74
101
  group new_resource.group if new_resource.group
75
102
  owner new_resource.user if new_resource.user
76
103
  # There is explicitly no mode being set here. If a non-default mode
@@ -85,7 +112,7 @@ module PoiseArchive
85
112
  def empty_directory
86
113
  # If you want to keep it, not my problem.
87
114
  return if new_resource.keep_existing
88
- dest = new_resource.absolute_destination
115
+ dest = new_resource.destination
89
116
  Dir.entries(dest).each do |entry|
90
117
  next if entry == '.' || entry == '..'
91
118
  FileUtils.remove_entry_secure(::File.join(dest, entry))
@@ -51,8 +51,8 @@ module PoiseArchive
51
51
  # @return [void]
52
52
  def install_prereqs
53
53
  utils = ['tar']
54
- utils << 'bzip2' if new_resource.path =~ /\.t?bz/
55
- utils << 'xz-utils' if new_resource.path =~ /\.t?xz/
54
+ utils << 'bzip2' if new_resource.absolute_path =~ /\.t?bz/
55
+ utils << 'xz-utils' if new_resource.absolute_path =~ /\.t?xz/
56
56
  # This is a resource.
57
57
  package utils
58
58
  end
@@ -64,17 +64,17 @@ module PoiseArchive
64
64
  # Build the tar command.
65
65
  cmd = %w{tar}
66
66
  cmd << "--strip-components=#{new_resource.strip_components}" if new_resource.strip_components && new_resource.strip_components > 0
67
- cmd << if new_resource.path =~ /\.t?gz/
67
+ cmd << if new_resource.absolute_path =~ /\.t?gz/
68
68
  '-xzvf'
69
- elsif new_resource.path =~ /\.t?bz/
69
+ elsif new_resource.absolute_path =~ /\.t?bz/
70
70
  '-xjvf'
71
- elsif new_resource.path =~ /\.t?xz/
71
+ elsif new_resource.absolute_path =~ /\.t?xz/
72
72
  '-xJvf'
73
73
  else
74
74
  '-xvf'
75
75
  end
76
- cmd << new_resource.path
77
- poise_shell_out!(cmd, cwd: new_resource.absolute_destination, group: new_resource.group, user: new_resource.user)
76
+ cmd << new_resource.absolute_path
77
+ poise_shell_out!(cmd, cwd: new_resource.destination, group: new_resource.group, user: new_resource.user)
78
78
  end
79
79
 
80
80
  end
@@ -108,8 +108,8 @@ module PoiseArchive
108
108
  #
109
109
  # @return [void]
110
110
  def open_file!
111
- @raw_file = ::File.open(new_resource.path, 'rb')
112
- @file = case new_resource.path
111
+ @raw_file = ::File.open(new_resource.absolute_path, 'rb')
112
+ @file = case new_resource.absolute_path
113
113
  when /\.tar$/
114
114
  nil # So it uses @raw_file instead.
115
115
  when /\.t?gz/
@@ -49,7 +49,7 @@ module PoiseArchive
49
49
 
50
50
  def unpack_zip
51
51
  @zip_entry_paths = []
52
- ::Zip::File.open(new_resource.path) do |zip_file|
52
+ ::Zip::File.open(new_resource.absolute_path) do |zip_file|
53
53
  zip_file.each do |entry|
54
54
  entry_name = entry.name.split(/\//).drop(new_resource.strip_components).join('/')
55
55
  # If strip_components wiped out the name, don't process this entry.
@@ -14,6 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
+ require 'base64'
18
+ require 'uri'
19
+
17
20
  require 'chef/resource'
18
21
  require 'poise'
19
22
 
@@ -29,6 +32,10 @@ module PoiseArchive
29
32
  # @action unpack
30
33
  # @example
31
34
  # poise_archive '/opt/myapp.tgz'
35
+ # @example Downloading from a URL with options
36
+ # poise_archive ['http://example.com/myapp.zip', {headers: {'Authentication' => '...'}}] do
37
+ # destination '/opt/myapp'
38
+ # end
32
39
  class Resource < Chef::Resource
33
40
  include Poise
34
41
  provides(:poise_archive)
@@ -36,14 +43,15 @@ module PoiseArchive
36
43
 
37
44
  # @!attribute path
38
45
  # Path to the archive. If relative, it is taken as a file inside
39
- # `Chef::Config[:file_cache_path]`.
40
- # @return [String]
41
- attribute(:path, kind_of: String, name_attribute: true)
46
+ # `Chef::Config[:file_cache_path]`. Can also be a URL to download the
47
+ # archive from.
48
+ # @return [String, Array]
49
+ attribute(:path, kind_of: String, default: lazy { @raw_name.is_a?(Array) ? @raw_name[0] : name }, required: true)
42
50
  # @!attribute destination
43
51
  # Path to unpack the archive to. If not specified, the path of the
44
52
  # archive without the file extension is used.
45
53
  # @return [String, nil, false]
46
- attribute(:destination, kind_of: [String, NilClass, FalseClass])
54
+ attribute(:destination, kind_of: [String, NilClass, FalseClass], default: lazy { default_destination })
47
55
  # @!attribute group
48
56
  # Group to run the unpack as.
49
57
  # @return [String, Integer, nil, false]
@@ -52,6 +60,11 @@ module PoiseArchive
52
60
  # Keep existing files in the destination directory when unpacking.
53
61
  # @return [Boolean]
54
62
  attribute(:keep_existing, equal_to: [true, false], default: false)
63
+ # @!attribute source_properties
64
+ # Properties to pass through to the underlying download resource if
65
+ # using one. Merged with the array form of {#name}.
66
+ # @return [Hash]
67
+ attribute(:source_properties, option_collector: true, forced_keys: %i{retries})
55
68
  # @!attribute strip_components
56
69
  # Number of intermediary directories to skip when unpacking. Works
57
70
  # like GNU tar's --strip-components.
@@ -66,16 +79,67 @@ module PoiseArchive
66
79
  # @api private
67
80
  alias_method :owner, :user
68
81
 
82
+ def initialize(name, run_context)
83
+ @raw_name = name # Capture this before it gets coerced to a string.
84
+ super
85
+ end
86
+
87
+ # Regexp for URL-like paths.
88
+ # @api private
89
+ URL_PATHS = %r{^(\w+:)?//}
90
+
91
+ # Check if the source path is a URL.
92
+ #
93
+ # @api private
94
+ # @return [Boolean]
95
+ def is_url?
96
+ path =~ URL_PATHS
97
+ end
98
+
99
+ # Expand a relative file path against `Chef::Config[:file_cache_path]`.
100
+ # For URLs it returns the cache file path.
101
+ #
102
+ # @api private
103
+ # @return [String]
69
104
  def absolute_path
70
- ::File.expand_path(path, Chef::Config[:file_cache_path])
105
+ if is_url?
106
+ # Use the last path component without the query string plus the name
107
+ # of the resource in Base64. This should be both mildly readable and
108
+ # also unique per invocation.
109
+ url_part = URI(path).path.split(/\//).last
110
+ base64_name = Base64.strict_encode64(name).gsub(/\=/, '')
111
+ ::File.join(Chef::Config[:file_cache_path], "#{base64_name}_#{url_part}")
112
+ else
113
+ ::File.expand_path(path, Chef::Config[:file_cache_path])
114
+ end
115
+ end
116
+
117
+ # Merge the explicit source properties with the array form of the name.
118
+ #
119
+ # @api private
120
+ # @return [Hash]
121
+ def merged_source_properties
122
+ if @raw_name.is_a?(Array) && @raw_name[1]
123
+ source_properties.merge(@raw_name[1])
124
+ else
125
+ source_properties
126
+ end
71
127
  end
72
128
 
129
+ private
130
+
73
131
  # Filename components to ignore.
74
132
  # @api private
75
133
  BASENAME_IGNORE = /(\.(t?(ar|gz|bz2?|xz)|zip))+$/
76
134
 
77
- def absolute_destination
78
- destination || begin
135
+ # Default value for the {#destination} property
136
+ #
137
+ # @api private
138
+ # @return [String]
139
+ def default_destination
140
+ if is_url?
141
+ raise ValueError.new("Destination for URL-based archive #{self} must be specified explicitly")
142
+ else
79
143
  ::File.join(::File.dirname(absolute_path), ::File.basename(path).gsub(BASENAME_IGNORE, ''))
80
144
  end
81
145
  end
@@ -16,5 +16,5 @@
16
16
 
17
17
 
18
18
  module PoiseArchive
19
- VERSION = '1.2.1'
19
+ VERSION = '1.3.0'
20
20
  end
@@ -29,6 +29,23 @@ user 'poise' do
29
29
  system true
30
30
  end
31
31
 
32
+ # Directory for HTTP serving.
33
+ directory '/test_http' do
34
+ mode '777'
35
+ end
36
+
37
+ # Copy all fixture files for HTTP serving.
38
+ %w{tar tar.gz tar.bz2 zip}.each do |ext|
39
+ cookbook_file "/test_http/myapp-1.0.0.#{ext}" do
40
+ source "myapp-1.0.0.#{ext}"
41
+ end
42
+ end
43
+
44
+ # Start up a background web server.
45
+ require 'webrick'
46
+ server = WEBrick::HTTPServer.new(Port: 8000, DocumentRoot: '/test_http')
47
+ Thread.new { server.start }
48
+
32
49
  # Tests for each fixture file.
33
50
  [
34
51
  {ext: 'tar', provider: nil},
@@ -78,6 +95,12 @@ end
78
95
  provider test[:provider] if test[:provider]
79
96
  user 'poise'
80
97
  end
98
+
99
+ poise_archive "#{test_base}/myapp-1.0.0.#{test[:ext]}_http" do
100
+ path "http://localhost:8000/myapp-1.0.0.#{test[:ext]}"
101
+ destination "#{test_base}/#{test[:ext]}_http"
102
+ provider test[:provider] if test[:provider]
103
+ end
81
104
  end
82
105
 
83
106
  # Some general tests for core features.
@@ -60,6 +60,12 @@ RSpec.shared_examples 'a poise_archive test' do |ext|
60
60
  it { is_expected.to be_owned_by 'poise' }
61
61
  it { is_expected.to be_mode '755' } unless os[:family] == 'windows'
62
62
  end
63
+ describe file("#{base}_http/README") do
64
+ its(:content) { is_expected.to eq "This is a project!\n\n" }
65
+ end
66
+ describe file("#{base}_http/src/main.c") do
67
+ it { is_expected.to be_a_file }
68
+ end
63
69
  end
64
70
 
65
71
  describe 'default provider' do
@@ -23,7 +23,7 @@ describe PoiseArchive::Resources::PoiseArchive do
23
23
  poise_archive '/tmp/myapp.tar'
24
24
  end
25
25
 
26
- it { is_expected.to unpack_poise_archive('/tmp/myapp.tar').with(absolute_path: '/tmp/myapp.tar', absolute_destination: '/tmp/myapp') }
26
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.tar').with(absolute_path: '/tmp/myapp.tar', destination: '/tmp/myapp') }
27
27
  end # /context an implicit destination
28
28
 
29
29
  context 'an explicit destination' do
@@ -33,7 +33,7 @@ describe PoiseArchive::Resources::PoiseArchive do
33
33
  end
34
34
  end
35
35
 
36
- it { is_expected.to unpack_poise_archive('/tmp/myapp.tar').with(absolute_path: '/tmp/myapp.tar', absolute_destination: '/opt/myapp') }
36
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.tar').with(absolute_path: '/tmp/myapp.tar', destination: '/opt/myapp') }
37
37
  end # /context an explicit destination
38
38
  end # /context an absolute path
39
39
 
@@ -54,7 +54,7 @@ describe PoiseArchive::Resources::PoiseArchive do
54
54
  poise_archive 'myapp.tar'
55
55
  end
56
56
 
57
- it { is_expected.to unpack_poise_archive('myapp.tar').with(absolute_path: '/var/chef/cache/myapp.tar', absolute_destination: '/var/chef/cache/myapp') }
57
+ it { is_expected.to unpack_poise_archive('myapp.tar').with(absolute_path: '/var/chef/cache/myapp.tar', destination: '/var/chef/cache/myapp') }
58
58
  end # /context an implicit destination
59
59
 
60
60
  context 'an explicit destination' do
@@ -65,7 +65,7 @@ describe PoiseArchive::Resources::PoiseArchive do
65
65
  end
66
66
  end
67
67
 
68
- it { is_expected.to unpack_poise_archive('myapp.tar').with(absolute_path: '/var/chef/cache/myapp.tar', absolute_destination: '/opt/myapp') }
68
+ it { is_expected.to unpack_poise_archive('myapp.tar').with(absolute_path: '/var/chef/cache/myapp.tar', destination: '/opt/myapp') }
69
69
  end # /context an explicit destination
70
70
  end # /context a relative path
71
71
 
@@ -74,7 +74,7 @@ describe PoiseArchive::Resources::PoiseArchive do
74
74
  poise_archive '/tmp/myapp.tar.gz'
75
75
  end
76
76
 
77
- it { is_expected.to unpack_poise_archive('/tmp/myapp.tar.gz').with(absolute_path: '/tmp/myapp.tar.gz', absolute_destination: '/tmp/myapp') }
77
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.tar.gz').with(absolute_path: '/tmp/myapp.tar.gz', destination: '/tmp/myapp') }
78
78
  end # /context with .tar.gz
79
79
 
80
80
  context 'with .tgz' do
@@ -82,7 +82,7 @@ describe PoiseArchive::Resources::PoiseArchive do
82
82
  poise_archive '/tmp/myapp.tgz'
83
83
  end
84
84
 
85
- it { is_expected.to unpack_poise_archive('/tmp/myapp.tgz').with(absolute_path: '/tmp/myapp.tgz', absolute_destination: '/tmp/myapp') }
85
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.tgz').with(absolute_path: '/tmp/myapp.tgz', destination: '/tmp/myapp') }
86
86
  end # /context with .tgz
87
87
 
88
88
  context 'with .tar.bz2' do
@@ -90,7 +90,7 @@ describe PoiseArchive::Resources::PoiseArchive do
90
90
  poise_archive '/tmp/myapp.tar.bz2'
91
91
  end
92
92
 
93
- it { is_expected.to unpack_poise_archive('/tmp/myapp.tar.bz2').with(absolute_path: '/tmp/myapp.tar.bz2', absolute_destination: '/tmp/myapp') }
93
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.tar.bz2').with(absolute_path: '/tmp/myapp.tar.bz2', destination: '/tmp/myapp') }
94
94
  end # /context with .tar.bz2
95
95
 
96
96
  context 'with .tbz2' do
@@ -98,7 +98,7 @@ describe PoiseArchive::Resources::PoiseArchive do
98
98
  poise_archive '/tmp/myapp.tbz2'
99
99
  end
100
100
 
101
- it { is_expected.to unpack_poise_archive('/tmp/myapp.tbz2').with(absolute_path: '/tmp/myapp.tbz2', absolute_destination: '/tmp/myapp') }
101
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.tbz2').with(absolute_path: '/tmp/myapp.tbz2', destination: '/tmp/myapp') }
102
102
  end # /context with .tbz2
103
103
 
104
104
  context 'with .tar.xz' do
@@ -106,7 +106,7 @@ describe PoiseArchive::Resources::PoiseArchive do
106
106
  poise_archive '/tmp/myapp.tar.xz'
107
107
  end
108
108
 
109
- it { is_expected.to unpack_poise_archive('/tmp/myapp.tar.xz').with(absolute_path: '/tmp/myapp.tar.xz', absolute_destination: '/tmp/myapp') }
109
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.tar.xz').with(absolute_path: '/tmp/myapp.tar.xz', destination: '/tmp/myapp') }
110
110
  end # /context with .tar.xz
111
111
 
112
112
  context 'with .txz' do
@@ -114,7 +114,7 @@ describe PoiseArchive::Resources::PoiseArchive do
114
114
  poise_archive '/tmp/myapp.txz'
115
115
  end
116
116
 
117
- it { is_expected.to unpack_poise_archive('/tmp/myapp.txz').with(absolute_path: '/tmp/myapp.txz', absolute_destination: '/tmp/myapp') }
117
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.txz').with(absolute_path: '/tmp/myapp.txz', destination: '/tmp/myapp') }
118
118
  end # /context with .txz
119
119
 
120
120
  context 'with .zip' do
@@ -122,7 +122,7 @@ describe PoiseArchive::Resources::PoiseArchive do
122
122
  poise_archive '/tmp/myapp.zip'
123
123
  end
124
124
 
125
- it { is_expected.to unpack_poise_archive('/tmp/myapp.zip').with(absolute_path: '/tmp/myapp.zip', absolute_destination: '/tmp/myapp') }
125
+ it { is_expected.to unpack_poise_archive('/tmp/myapp.zip').with(absolute_path: '/tmp/myapp.zip', destination: '/tmp/myapp') }
126
126
  end # /context with .zip
127
127
 
128
128
  context 'with a hidden file' do
@@ -130,7 +130,7 @@ describe PoiseArchive::Resources::PoiseArchive do
130
130
  poise_archive '/tmp/.myapp.tar'
131
131
  end
132
132
 
133
- it { is_expected.to unpack_poise_archive('/tmp/.myapp.tar').with(absolute_path: '/tmp/.myapp.tar', absolute_destination: '/tmp/.myapp') }
133
+ it { is_expected.to unpack_poise_archive('/tmp/.myapp.tar').with(absolute_path: '/tmp/.myapp.tar', destination: '/tmp/.myapp') }
134
134
  end # /context with a hidden file
135
135
 
136
136
  context 'with a version number' do
@@ -138,7 +138,7 @@ describe PoiseArchive::Resources::PoiseArchive do
138
138
  poise_archive '/tmp/myapp-1.0.0.tar'
139
139
  end
140
140
 
141
- it { is_expected.to unpack_poise_archive('/tmp/myapp-1.0.0.tar').with(absolute_path: '/tmp/myapp-1.0.0.tar', absolute_destination: '/tmp/myapp-1.0.0') }
141
+ it { is_expected.to unpack_poise_archive('/tmp/myapp-1.0.0.tar').with(absolute_path: '/tmp/myapp-1.0.0.tar', destination: '/tmp/myapp-1.0.0') }
142
142
  end # /context with a version number
143
143
 
144
144
  context 'with a version number and .tar.gz' do
@@ -146,6 +146,56 @@ describe PoiseArchive::Resources::PoiseArchive do
146
146
  poise_archive '/tmp/myapp-1.0.0.tar.gz'
147
147
  end
148
148
 
149
- it { is_expected.to unpack_poise_archive('/tmp/myapp-1.0.0.tar.gz').with(absolute_path: '/tmp/myapp-1.0.0.tar.gz', absolute_destination: '/tmp/myapp-1.0.0') }
149
+ it { is_expected.to unpack_poise_archive('/tmp/myapp-1.0.0.tar.gz').with(absolute_path: '/tmp/myapp-1.0.0.tar.gz', destination: '/tmp/myapp-1.0.0') }
150
150
  end # /context with a version number and .tar.gz
151
+
152
+ context 'with a URL' do
153
+ recipe do
154
+ Chef::Config[:file_cache_path] = '/var/chef/cache'
155
+ poise_archive 'http://example.com/myapp-1.0.0.zip' do
156
+ destination '/tmp/myapp'
157
+ end
158
+ end
159
+
160
+ it { is_expected.to unpack_poise_archive('http://example.com/myapp-1.0.0.zip').with(path: 'http://example.com/myapp-1.0.0.zip', absolute_path: '/var/chef/cache/aHR0cDovL2V4YW1wbGUuY29tL215YXBwLTEuMC4wLnppcA_myapp-1.0.0.zip', destination: '/tmp/myapp', merged_source_properties: {}) }
161
+ end # /context with a URL
162
+
163
+ context 'with a URL and name properties' do
164
+ recipe do
165
+ Chef::Config[:file_cache_path] = '/var/chef/cache'
166
+ poise_archive ['http://example.com/myapp-1.0.0.zip', {retries: 0}] do
167
+ destination '/tmp/myapp'
168
+ end
169
+ end
170
+
171
+ it { is_expected.to unpack_poise_archive('http://example.com/myapp-1.0.0.zip, {:retries=>0}').with(path: 'http://example.com/myapp-1.0.0.zip', absolute_path: '/var/chef/cache/aHR0cDovL2V4YW1wbGUuY29tL215YXBwLTEuMC4wLnppcCwgezpyZXRyaWVzPT4wfQ_myapp-1.0.0.zip', destination: '/tmp/myapp', merged_source_properties: {'retries' => 0}) }
172
+ end # /context with a URL and name properties
173
+
174
+ context 'with a URL and source properties' do
175
+ recipe do
176
+ Chef::Config[:file_cache_path] = '/var/chef/cache'
177
+ poise_archive 'http://example.com/myapp-1.0.0.zip' do
178
+ destination '/tmp/myapp'
179
+ source_properties do
180
+ retries 0
181
+ end
182
+ end
183
+ end
184
+
185
+ it { is_expected.to unpack_poise_archive('http://example.com/myapp-1.0.0.zip').with(path: 'http://example.com/myapp-1.0.0.zip', absolute_path: '/var/chef/cache/aHR0cDovL2V4YW1wbGUuY29tL215YXBwLTEuMC4wLnppcA_myapp-1.0.0.zip', destination: '/tmp/myapp', merged_source_properties: {'retries' => 0}) }
186
+ end # /context with a URL and source properties
187
+
188
+ context 'with a URL and both properties' do
189
+ recipe do
190
+ Chef::Config[:file_cache_path] = '/var/chef/cache'
191
+ poise_archive ['http://example.com/myapp-1.0.0.zip', {retries: 100}] do
192
+ destination '/tmp/myapp'
193
+ source_properties do
194
+ retries 0
195
+ end
196
+ end
197
+ end
198
+
199
+ it { is_expected.to unpack_poise_archive('http://example.com/myapp-1.0.0.zip, {:retries=>100}').with(path: 'http://example.com/myapp-1.0.0.zip', absolute_path: '/var/chef/cache/aHR0cDovL2V4YW1wbGUuY29tL215YXBwLTEuMC4wLnppcCwgezpyZXRyaWVzPT4xMDB9_myapp-1.0.0.zip', destination: '/tmp/myapp', merged_source_properties: {'retries' => 100}) }
200
+ end # /context with a URL and both properties
151
201
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: poise-archive
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Noah Kantrowitz