Support `mkdir' status attributes

This commit is contained in:
Thibault Jouan 2014-10-08 11:21:32 +00:00
parent 6f2ff17b94
commit a84b34b7ca
7 changed files with 53 additions and 33 deletions

View File

@ -6,8 +6,8 @@ Feature: `mkdir' task action
"""
task :mkdir_action do
mkdir 'some_directory'
mkdir 'some_directory_0700', 0700
mkdir 'some_directory_0500', 0500
mkdir 'some_directory_0700', mode: 0700
mkdir 'some_directory_0711', mode: 0711
end
"""
@ -15,10 +15,10 @@ Feature: `mkdir' task action
When I successfully execute the recipe on remote target
Then the remote directory "some_directory" must exists
Scenario: creates directory with given permissions
Scenario: creates directory with given attributes
When I successfully execute the recipe on remote target
Then the remote directory "some_directory_0700" must have 0700 mode
And the remote directory "some_directory_0500" must have 0500 mode
And the remote directory "some_directory_0711" must have 0711 mode
Scenario: creates directories recursively
Given a recipe with:

View File

@ -7,11 +7,12 @@ module Producer
def_delegators :@env, :input, :output, :error_output, :remote
def_delegators :remote, :fs
attr_reader :env, :arguments
attr_reader :env, :arguments, :options
def initialize(env, *args)
def initialize(env, *args, **options)
@env = env
@arguments = args
@options = options
end
def name

View File

@ -2,6 +2,12 @@ module Producer
module Core
module Actions
class Mkdir < Action
def initialize(env, *args, **options)
super
@options[:permissions] = @options.delete :mode if @options.key? :mode
@options[:owner] = @options.delete :user if @options.key? :user
end
def name
'mkdir'
end
@ -10,7 +16,7 @@ module Producer
path.descend do |p|
next if fs.dir? p
fs.mkdir p.to_s
fs.chmod p.to_s, mode if mode
fs.setstat p.to_s, @options unless @options.empty?
end
end
@ -20,10 +26,6 @@ module Producer
def path
Pathname.new(arguments.first)
end
def mode
arguments[1]
end
end
end
end

View File

@ -20,13 +20,16 @@ module Producer
false
end
def chmod(path, mode)
sftp.setstat! path, permissions: mode
def setstat(path, attributes)
sftp.setstat! path, attributes
end
def mkdir(path, mode = nil)
options = mode ? { permissions: mode } : {}
sftp.mkdir! path, options
def chmod(path, mode)
setstat path, permissions: mode
end
def mkdir(path, attributes = {})
ret = sftp.mkdir! path, attributes
end
def file_read(path)

View File

@ -4,10 +4,23 @@ module Producer::Core
module Actions
describe Mkdir, :env do
let(:path) { 'some_path' }
subject(:mkdir) { described_class.new(env, path) }
let(:options) { { } }
subject(:mkdir) { described_class.new(env, path, options) }
it_behaves_like 'action'
describe '#initialize' do
let(:options) { { mode: 0700, user: 'root' } }
it 'translates mode option as permissions' do
expect(mkdir.options[:permissions]).to eq 0700
end
it 'translates user option as owner' do
expect(mkdir.options[:owner]).to eq 'root'
end
end
describe '#apply' do
before { allow(remote_fs).to receive(:dir?) { false } }
@ -16,11 +29,11 @@ module Producer::Core
mkdir.apply
end
context 'when a mode was given' do
subject(:mkdir) { described_class.new(env, path, 0700) }
context 'when status options are given' do
let(:options) { { group: 'wheel' } }
it 'changes the directory with given mode' do
expect(remote_fs).to receive(:chmod).with(path, 0700)
it 'changes the directory status with given options' do
expect(remote_fs).to receive(:setstat).with(path, options)
mkdir.apply
end
end
@ -38,7 +51,7 @@ module Producer::Core
context 'when directory already exists' do
before { allow(remote_fs).to receive(:dir?) { true } }
it 'creates directory on remote filesystem' do
it 'does not create any directory' do
expect(remote_fs).not_to receive(:mkdir)
mkdir.apply
end

View File

@ -86,18 +86,12 @@ module Producer::Core
end
describe '#mkdir' do
let(:path) { 'some_directory_path' }
let(:path) { 'some_directory_path' }
let(:attributes) { { foo: :bar } }
it 'creates the directory' do
expect(sftp).to receive(:mkdir!).with(path, anything)
fs.mkdir path
end
it 'specifies permissions from optional mode argument' do
expect(sftp).to receive(:mkdir!) do |_, options|
expect(options[:permissions]).to eq 0700
end
fs.mkdir path, 0700
expect(sftp).to receive(:mkdir!).with(path, attributes)
fs.mkdir path, attributes
end
end

View File

@ -3,7 +3,8 @@ module Producer::Core
include TestEnvHelpers
let(:arguments) { [:some, :arguments] }
subject(:action) { described_class.new(env, *arguments) }
let(:options) { { foo: :bar } }
subject(:action) { described_class.new(env, *arguments, options) }
describe '#env' do
it 'returns the assigned env' do
@ -17,6 +18,12 @@ module Producer::Core
end
end
describe '#options' do
it 'returns the assigned options' do
expect(action.options).to eq options
end
end
describe '#input' do
it 'returns env input' do
expect(action.input).to be env.input