itamae 1.0.0.beta3 → 1.0.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 475a40243822c6fc6e435ba1876f210574f6ea46
4
- data.tar.gz: 0b708944f87933422ad4ba8895c82911a7b8bc9c
3
+ metadata.gz: 4aeeda7470e3841a47a420c875efb9d332f5359e
4
+ data.tar.gz: 48fe841ad7c50ab056314b47e33835d506bc5e10
5
5
  SHA512:
6
- metadata.gz: d0c73c84729f8846f6a4f824012cdea2c0214accdb5460f2096845c974625602aa5be91fdc8b2b170f174d97d80fbaf60c8719827e6e64e373b918e29b585bd9
7
- data.tar.gz: 0a16cc69999536d1ec3b6e2674926f6faa40fd5e28146a628d3247451faad2c216c07f7eb84f7568b3c8c33a00499c7d51ee4aaa953d7071cc2e440a4fcf3d67
6
+ metadata.gz: 553a0d69d5f583903f5f09226a9084165a389efa9481a94ea057e74da50d40a1828b57f60bcf4448ccc46366d5ac6aed10504bda68fb07adea2b7d1a5668c854
7
+ data.tar.gz: e14ac9b44bc9672014ef0c8d3d38eeca1a3dcbf496c07769c4a51f7c46166c9db4a6b723d5da328dcc87a24bb550e6a51d4495bec280e41048f8d593f7fea50a
data/itamae.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ["lib"]
19
19
 
20
20
  spec.add_runtime_dependency "thor"
21
- spec.add_runtime_dependency "specinfra", "2.0.0.beta32"
21
+ spec.add_runtime_dependency "specinfra", "2.0.0.beta35"
22
22
  spec.add_runtime_dependency "hashie"
23
23
  spec.add_runtime_dependency "ansi"
24
24
 
@@ -28,6 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "bundler", "~> 1.3"
29
29
  spec.add_development_dependency "rake"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
- spec.add_development_dependency "serverspec", "2.0.0.beta16"
31
+ spec.add_development_dependency "serverspec", "2.0.0.beta20"
32
32
  spec.add_development_dependency "pry-byebug"
33
33
  end
data/lib/itamae.rb CHANGED
@@ -6,7 +6,7 @@ require "itamae/resource"
6
6
  require "itamae/resource_collection"
7
7
  require "itamae/logger"
8
8
  require "itamae/node"
9
- require "itamae/specinfra"
9
+ require "itamae/backend"
10
10
 
11
11
  module Itamae
12
12
  # Your code goes here...
@@ -0,0 +1,86 @@
1
+ require 'specinfra'
2
+ require 'singleton'
3
+
4
+ module Itamae
5
+ class Backend
6
+ UnknownBackendTypeError = Class.new(StandardError)
7
+ CommandExecutionError = Class.new(StandardError)
8
+
9
+ include Singleton
10
+
11
+ def set_type(type, options = {})
12
+ case type
13
+ when :local
14
+ Specinfra.configuration.backend = :exec
15
+ when :ssh
16
+ Specinfra.configuration.request_pty = true
17
+ Specinfra.configuration.host = options.delete(:host)
18
+ Specinfra.configuration.ssh_options = options
19
+
20
+ Specinfra.configuration.backend = :ssh
21
+ else
22
+ raise UnknownBackendTypeError, "'#{type}' backend is unknown."
23
+ end
24
+ end
25
+
26
+ def run_command(commands, options = {})
27
+ options = {error: true}.merge(options)
28
+
29
+ if commands.is_a?(Array)
30
+ command = commands.map do |cmd|
31
+ Shellwords.escape(cmd)
32
+ end.join(' ')
33
+ else
34
+ command = commands
35
+ end
36
+
37
+ result = Specinfra::Runner.run_command(command)
38
+ exit_status = result.exit_status
39
+
40
+ if exit_status == 0 || !options[:error]
41
+ method = :debug
42
+ message = " Command `#{command}` exited with #{exit_status}"
43
+ else
44
+ method = :error
45
+ message = " Command `#{command}` failed. (exit status: #{exit_status})"
46
+ end
47
+
48
+ Logger.public_send(method, message)
49
+
50
+ {"stdout" => result.stdout, "stderr" => result.stderr}.each_pair do |name, value|
51
+ if value && value != ''
52
+ value.each_line do |line|
53
+ # remove control chars
54
+ case line.encoding
55
+ when Encoding::UTF_8
56
+ line = line.tr("\u0000-\u001f\u007f\u2028",'')
57
+ end
58
+
59
+ Logger.public_send(method, " #{name} | #{line}")
60
+ end
61
+ end
62
+ end
63
+
64
+ if options[:error] && exit_status != 0
65
+ raise CommandExecutionError
66
+ end
67
+
68
+ result
69
+ end
70
+
71
+ def run_specinfra(type, *args)
72
+ command = Specinfra.command.get(type, *args)
73
+
74
+ if type.to_s.start_with?("check_")
75
+ result = run_command(command, error: false)
76
+ result.exit_status == 0
77
+ else
78
+ run_command(command)
79
+ end
80
+ end
81
+
82
+ def copy_file(*args)
83
+ Specinfra::Runner.copy_file(*args)
84
+ end
85
+ end
86
+ end
data/lib/itamae/cli.rb CHANGED
@@ -13,12 +13,14 @@ module Itamae
13
13
 
14
14
  desc "local RECIPE [RECIPE...]", "Run Itamae locally"
15
15
  option :node_json, type: :string, aliases: ['-j']
16
+ option :dry_run, type: :string, aliases: ['-n']
16
17
  def local(*recipe_files)
17
18
  Runner.run(recipe_files, :local, options)
18
19
  end
19
20
 
20
21
  desc "ssh RECIPE [RECIPE...]", "Run Itamae via ssh"
21
22
  option :node_json, type: :string, aliases: ['-j']
23
+ option :dry_run, type: :string, aliases: ['-n']
22
24
  option :host, required: true, type: :string, aliases: ['-h']
23
25
  option :user, type: :string, aliases: ['-u']
24
26
  option :key, type: :string, aliases: ['-i']
data/lib/itamae/recipe.rb CHANGED
@@ -20,13 +20,14 @@ module Itamae
20
20
  @runner.node
21
21
  end
22
22
 
23
- def run
23
+ def run(options = {})
24
24
  @resources.each do |resource|
25
- resource.run
25
+ # do action specified in the recipe
26
+ resource.run(nil, dry_run: options[:dry_run])
26
27
  end
27
28
 
28
29
  @delayed_actions.uniq.each do |action, resource|
29
- resource.run(action)
30
+ resource.run(action, dry_run: options[:dry_run])
30
31
  end
31
32
  end
32
33
 
@@ -8,11 +8,11 @@ require 'itamae/resource/template'
8
8
  require 'itamae/resource/execute'
9
9
  require 'itamae/resource/mail_alias'
10
10
  require 'itamae/resource/service'
11
+ require 'itamae/resource/link'
11
12
 
12
13
  module Itamae
13
14
  module Resource
14
15
  Error = Class.new(StandardError)
15
- CommandExecutionError = Class.new(StandardError)
16
16
  AttributeMissingError = Class.new(StandardError)
17
17
  InvalidTypeError = Class.new(StandardError)
18
18
  ParseError = Class.new(StandardError)
@@ -43,7 +43,7 @@ module Itamae
43
43
  process_attributes
44
44
  end
45
45
 
46
- def run(specific_action = nil)
46
+ def run(specific_action = nil, options = {})
47
47
  Logger.info "> Executing #{resource_type} (#{attributes})..."
48
48
 
49
49
  if do_not_run_because_of_only_if?
@@ -57,16 +57,18 @@ module Itamae
57
57
  set_current_attributes
58
58
  show_differences
59
59
 
60
- begin
60
+ unless options[:dry_run]
61
61
  public_send("#{specific_action || action}_action".to_sym)
62
- rescue Resource::CommandExecutionError
63
- Logger.error "< Failed."
64
- exit 2
65
62
  end
66
63
 
64
+ updated! if different?
65
+
67
66
  notify if updated?
68
67
 
69
68
  Logger.info "< Succeeded."
69
+ rescue Backend::CommandExecutionError
70
+ Logger.error "< Failed."
71
+ exit 2
70
72
  end
71
73
 
72
74
  def nothing_action
@@ -112,12 +114,23 @@ module Itamae
112
114
  end
113
115
 
114
116
  def set_current_attributes
117
+ # do nothing
118
+ end
119
+
120
+ def different?
121
+ @current_attributes.each_pair.any? do |key, current_value|
122
+ current_value != @attributes[key]
123
+ end
115
124
  end
116
125
 
117
126
  def show_differences
118
127
  @current_attributes.each_pair do |key, current_value|
119
128
  value = @attributes[key]
120
- Logger.info " #{key} will change from '#{current_value}' to '#{value}'"
129
+ if current_value == value
130
+ Logger.info " #{key} will not change (current value is '#{current_value}')"
131
+ else
132
+ Logger.info " #{key} will change from '#{current_value}' to '#{value}'"
133
+ end
121
134
  end
122
135
  end
123
136
 
@@ -136,48 +149,6 @@ module Itamae
136
149
  end
137
150
  end
138
151
 
139
- def run_specinfra(type, *args)
140
- command = Specinfra.command.get(type, *args)
141
-
142
- if type.to_s.start_with?("check_")
143
- result = run_command(command, error: false)
144
- result.exit_status == 0
145
- else
146
- run_command(command)
147
- end
148
- end
149
-
150
- def run_command(command, options = {})
151
- options = {error: true}.merge(options)
152
-
153
- result = backend.run_command(command)
154
- exit_status = result.exit_status
155
-
156
- if exit_status == 0 || !options[:error]
157
- method = :debug
158
- message = " Command `#{command}` exited with #{exit_status}"
159
- else
160
- method = :error
161
- message = " Command `#{command}` failed. (exit status: #{exit_status})"
162
- end
163
-
164
- Logger.public_send(method, message)
165
-
166
- if result.stdout && result.stdout != ''
167
- Logger.public_send(method, " STDOUT> #{result.stdout.chomp}")
168
- end
169
-
170
- if result.stderr && result.stderr != ''
171
- Logger.public_send(method, " STDERR> #{result.stderr.chomp}")
172
- end
173
-
174
- if options[:error] && exit_status != 0
175
- raise CommandExecutionError
176
- end
177
-
178
- result
179
- end
180
-
181
152
  def copy_file(src, dst)
182
153
  Logger.debug " Copying a file from '#{src}' to '#{dst}'..."
183
154
  unless ::File.exist?(src)
@@ -217,7 +188,7 @@ module Itamae
217
188
  end
218
189
 
219
190
  def backend
220
- Itamae.backend
191
+ Backend.instance
221
192
  end
222
193
 
223
194
  def runner
@@ -228,11 +199,22 @@ module Itamae
228
199
  @recipe.resources
229
200
  end
230
201
 
202
+ def run_command(*args)
203
+ backend.run_command(*args)
204
+ end
205
+
206
+ def run_specinfra(*args)
207
+ backend.run_specinfra(*args)
208
+ end
209
+
231
210
  def shell_escape(str)
232
211
  Shellwords.escape(str)
233
212
  end
234
213
 
235
214
  def updated!
215
+ unless @updated
216
+ Logger.debug " This resource is updated."
217
+ end
236
218
  @updated = true
237
219
  end
238
220
 
@@ -10,11 +10,12 @@ module Itamae
10
10
  define_attribute :group, type: String
11
11
 
12
12
  def set_current_attributes
13
- escaped_path = shell_escape(path)
14
- if run_command("test -d #{escaped_path}", error: false).exit_status == 0
15
- @current_attributes[:mode] = run_command("stat --format '%a' #{escaped_path}").stdout.chomp
16
- @current_attributes[:owner] = run_command("stat --format '%U' #{escaped_path}").stdout.chomp
17
- @current_attributes[:group] = run_command("stat --format '%G' #{escaped_path}").stdout.chomp
13
+ if run_specinfra(:check_file_is_directory, path)
14
+ @current_attributes[:mode] = run_specinfra(:get_file_mode, path).stdout.chomp
15
+ @current_attributes[:owner] = run_specinfra(:get_file_owner_user, path).stdout.chomp
16
+ @current_attributes[:group] = run_specinfra(:get_file_owner_group, path).stdout.chomp
17
+ else
18
+ updated!
18
19
  end
19
20
  end
20
21
 
@@ -21,14 +21,23 @@ module Itamae
21
21
  end
22
22
  end
23
23
 
24
- copy_file(src, path)
24
+ temppath = ::File.join(runner.tmpdir, Time.now.to_f.to_s)
25
+ copy_file(src, temppath)
25
26
 
26
27
  if mode
27
- backend.change_file_mode(path, mode)
28
+ run_specinfra(:change_file_mode, temppath, mode)
28
29
  end
29
30
  if owner || group
30
- backend.change_file_owner(path, owner, group)
31
+ run_specinfra(:change_file_owner, temppath, owner, group)
31
32
  end
33
+
34
+ if run_specinfra(:check_file_is_file, path)
35
+ # TODO: specinfra
36
+ run_command(["cp", path, "#{path}.bak"])
37
+ end
38
+
39
+ # TODO: specinfra
40
+ run_command(["mv", temppath, path])
32
41
  end
33
42
  end
34
43
  end
@@ -0,0 +1,17 @@
1
+ require 'itamae'
2
+
3
+ module Itamae
4
+ module Resource
5
+ class Link < Base
6
+ define_attribute :action, default: :create
7
+ define_attribute :link, type: String, default_name: true
8
+ define_attribute :to, type: String, required: true
9
+
10
+ def create_action
11
+ if ! run_specinfra(:check_file_is_linked_to, link, to)
12
+ run_specinfra(:link_file_to, link, to)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -8,8 +8,8 @@ module Itamae
8
8
  define_attribute :recipient, type: String, required: true
9
9
 
10
10
  def create_action
11
- if ! backend.check_mail_alias_is_aliased_to(mail_alias, recipient)
12
- backend.add_mail_alias(mail_alias, recipient)
11
+ if !run_specinfra(:check_mail_alias_is_aliased_to, mail_alias, recipient)
12
+ run_specinfra(:add_mail_alias, mail_alias, recipient)
13
13
  end
14
14
  end
15
15
  end
@@ -24,7 +24,8 @@ module Itamae
24
24
 
25
25
  private
26
26
  def run_init_script(command)
27
- run_command("#{shell_escape(init_script_path)} #{command}")
27
+ # TODO: Delegate to Specinfra
28
+ run_command([init_script_path, command])
28
29
  end
29
30
 
30
31
  def init_script_path
data/lib/itamae/runner.rb CHANGED
@@ -3,14 +3,14 @@ require 'itamae'
3
3
  module Itamae
4
4
  class Runner
5
5
  class << self
6
- def run(recipe_files, backend, options)
7
- backend = backend_from_options(backend, options)
8
- runner = self.new
9
- runner.node = node_from_options(options)
6
+ def run(recipe_files, backend_type, options)
7
+ set_backend_from_options(backend_type, options)
8
+
9
+ runner = self.new(node_from_options(options))
10
10
 
11
11
  recipe_files.each do |path|
12
12
  recipe = Recipe.new(runner, File.expand_path(path))
13
- recipe.run
13
+ recipe.run(dry_run: options[:dry_run])
14
14
  end
15
15
  end
16
16
 
@@ -27,23 +27,33 @@ module Itamae
27
27
  Node.new(hash)
28
28
  end
29
29
 
30
- def backend_from_options(type, options)
30
+ def set_backend_from_options(type, options)
31
+ opts = {}
32
+
31
33
  case type
32
34
  when :local
33
- Itamae.create_local_backend
35
+ # do nothing
34
36
  when :ssh
35
- ssh_options = {}
36
- ssh_options[:host] = options[:host]
37
- ssh_options[:user] = options[:user] || Etc.getlogin
38
- ssh_options[:keys] = [options[:key]] if options[:key]
39
- ssh_options[:port] = options[:port] if options[:port]
40
-
41
- Itamae.create_ssh_backend(ssh_options)
37
+ opts[:host] = options[:host]
38
+ opts[:user] = options[:user] || Etc.getlogin
39
+ opts[:keys] = [options[:key]] if options[:key]
40
+ opts[:port] = options[:port] if options[:port]
42
41
  end
42
+
43
+ Backend.instance.set_type(type, opts)
43
44
  end
44
45
  end
45
46
 
46
47
  attr_accessor :node
48
+ attr_accessor :tmpdir
49
+
50
+ def initialize(node)
51
+ @node = node
52
+ @tmpdir = "/tmp/itamae_tmp"
53
+
54
+ Backend.instance.run_command(["mkdir", "-p", @tmpdir])
55
+ Backend.instance.run_command(["chmod", "777", @tmpdir])
56
+ end
47
57
  end
48
58
  end
49
59
 
@@ -1,3 +1,3 @@
1
1
  module Itamae
2
- VERSION = "1.0.0.beta3"
2
+ VERSION = "1.0.0.beta4"
3
3
  end
@@ -28,6 +28,7 @@ end
28
28
  describe file('/tmp/file') do
29
29
  it { should be_file }
30
30
  its(:content) { should match(/Hello World/) }
31
+ it { should be_mode 777 }
31
32
  end
32
33
 
33
34
  describe file('/tmp/execute') do
@@ -56,14 +57,20 @@ end
56
57
  describe file('/tmp/cron_stopped') do
57
58
  it { should be_file }
58
59
  its(:content) do
59
- expect(subject.content.lines.size).to eq 0
60
+ expect(subject.content.lines.size).to eq 1
60
61
  end
61
62
  end
62
63
 
63
64
  describe file('/tmp/cron_running') do
64
65
  it { should be_file }
65
66
  its(:content) do
66
- expect(subject.content.lines.size).to eq 1
67
+ expect(subject.content.lines.size).to eq 2
67
68
  end
68
69
  end
69
70
 
71
+ describe file('/tmp-link') do
72
+ it { should be_linked_to '/tmp' }
73
+ its(:content) do
74
+ expect(subject.content.lines.size).to eq 0
75
+ end
76
+ end
@@ -49,7 +49,7 @@ remote_file "/tmp/remote_file" do
49
49
  end
50
50
 
51
51
  directory "/tmp/directory" do
52
- mode "0700"
52
+ mode "700"
53
53
  owner "vagrant"
54
54
  group "vagrant"
55
55
  end
@@ -60,6 +60,7 @@ end
60
60
 
61
61
  file "/tmp/file" do
62
62
  content "Hello World"
63
+ mode "777"
63
64
  end
64
65
 
65
66
  execute "echo 'Hello Execute' > /tmp/execute"
@@ -78,13 +79,16 @@ service "cron" do
78
79
  action :stop
79
80
  end
80
81
 
81
- execute "ps axu | grep cron | grep -v grep > /tmp/cron_stopped; true"
82
+ execute "ps -C cron > /tmp/cron_stopped; true"
82
83
 
83
84
  service "cron" do
84
85
  action :start
85
86
  end
86
87
 
87
- execute "ps axu | grep cron | grep -v grep > /tmp/cron_running; true"
88
+ execute "ps -C cron > /tmp/cron_running; true"
88
89
 
89
90
  ######
90
91
 
92
+ link "/tmp-link" do
93
+ to "/tmp"
94
+ end
@@ -86,6 +86,8 @@ class TestResource < Itamae::Resource::Base
86
86
  end
87
87
 
88
88
  describe TestResource do
89
+ subject(:resource) { described_class.new(recipe, "name") }
90
+
89
91
  let(:commands) { double(:commands) }
90
92
  let(:runner) do
91
93
  double(:runner)
@@ -95,15 +97,16 @@ describe TestResource do
95
97
  r.stub(:runner).and_return(runner)
96
98
  end
97
99
  end
98
-
99
- subject(:resource) { described_class.new(recipe, "name") }
100
-
101
- before do
102
- Itamae.backend = double(:backend).tap do |b|
100
+ let(:backend) do
101
+ double(:backend).tap do |b|
103
102
  b.stub(:commands).and_return(commands)
104
103
  end
105
104
  end
106
105
 
106
+ before do
107
+ Backend.stub(:instance).and_return(backend)
108
+ end
109
+
107
110
  describe "#run" do
108
111
  before do
109
112
  subject.action :action_name
@@ -113,23 +116,4 @@ describe TestResource do
113
116
  subject.run
114
117
  end
115
118
  end
116
-
117
- describe "#run_specinfra" do
118
- it "runs specinfra's command by specinfra's backend" do
119
- expect(Specinfra.command).to receive(:get).with(:cmd).and_return("command")
120
- expect(Itamae.backend).to receive(:run_command).with("command").
121
- and_return(Specinfra::CommandResult.new(exit_status: 0))
122
- subject.send(:run_specinfra, :cmd)
123
- end
124
- context "when the command execution failed" do
125
- it "raises CommandExecutionError" do
126
- expect(Specinfra.command).to receive(:get).with(:cmd).and_return("command")
127
- expect(Itamae.backend).to receive(:run_command).with("command").
128
- and_return(Specinfra::CommandResult.new(exit_status: 1))
129
- expect do
130
- subject.send(:run_specinfra, :cmd)
131
- end.to raise_error(Itamae::Resource::CommandExecutionError)
132
- end
133
- end
134
- end
135
119
  end
@@ -0,0 +1,24 @@
1
+ require 'itamae'
2
+
3
+ module Itamae
4
+ describe Resource::Link do
5
+ let(:recipe) { double(:recipe) }
6
+
7
+ subject(:resource) do
8
+ described_class.new(recipe, "name") do
9
+ to "/path/to/target"
10
+ end
11
+ end
12
+
13
+ describe "#create_action" do
14
+ it "runs install command of specinfra" do
15
+ subject.link :link_name
16
+ expect(subject).to receive(:run_specinfra).with(:check_file_is_linked_to, :link_name, "/path/to/target").and_return(false)
17
+ expect(subject).to receive(:run_specinfra).with(:link_file_to, :link_name, "/path/to/target")
18
+ subject.create_action
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+
@@ -2,7 +2,17 @@ require 'itamae'
2
2
 
3
3
  module Itamae
4
4
  describe Resource::RemoteFile do
5
- let(:recipe) { double(:recipe) }
5
+ let(:runner) do
6
+ double(:runner).tap do |r|
7
+ r.stub(:tmpdir).and_return("/tmp/itamae")
8
+ end
9
+ end
10
+ let(:recipe) do
11
+ double(:recipe).tap do |r|
12
+ r.stub(:runner).and_return(runner)
13
+ end
14
+ end
15
+
6
16
  subject(:resource) do
7
17
  described_class.new(recipe, "name") do
8
18
  source "source.file"
@@ -13,7 +23,10 @@ module Itamae
13
23
  describe "#create_action" do
14
24
  it "copies a file" do
15
25
  recipe.stub(:path).and_return("/recipe_dir/recipe_file")
16
- expect(subject).to receive(:copy_file).with("/recipe_dir/source.file", "/path/to/dst")
26
+ expect(subject).to receive(:copy_file).with("/recipe_dir/source.file", %r{^/tmp/itamae/[\d\.]+$})
27
+ expect(subject).to receive(:run_specinfra).with(:check_file_is_file, "/path/to/dst").and_return(true)
28
+ expect(subject).to receive(:run_command).with(["cp", "/path/to/dst", "/path/to/dst.bak"])
29
+ expect(subject).to receive(:run_command).with(["mv", %r{/tmp/itamae/[\d\.]+}, "/path/to/dst"])
17
30
  subject.create_action
18
31
  end
19
32
  end
@@ -3,6 +3,8 @@ require 'tmpdir'
3
3
 
4
4
  module Itamae
5
5
  describe Runner do
6
+ subject { described_class.new(double(:node)) }
7
+
6
8
  around do |example|
7
9
  Dir.mktmpdir do |dir|
8
10
  Dir.chdir(dir) do
@@ -22,7 +24,7 @@ module Itamae
22
24
  ).and_return(recipe)
23
25
  expect(recipe).to receive(:run)
24
26
  end
25
- described_class.run(recipes, :exec, {})
27
+ described_class.run(recipes, :local, {})
26
28
  end
27
29
  end
28
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itamae
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta3
4
+ version: 1.0.0.beta4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryota Arai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-15 00:00:00.000000000 Z
11
+ date: 2014-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.0.beta32
33
+ version: 2.0.0.beta35
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 2.0.0.beta32
40
+ version: 2.0.0.beta35
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: hashie
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 2.0.0.beta16
131
+ version: 2.0.0.beta20
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 2.0.0.beta16
138
+ version: 2.0.0.beta20
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: pry-byebug
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +168,7 @@ files:
168
168
  - bin/itamae
169
169
  - itamae.gemspec
170
170
  - lib/itamae.rb
171
+ - lib/itamae/backend.rb
171
172
  - lib/itamae/cli.rb
172
173
  - lib/itamae/logger.rb
173
174
  - lib/itamae/node.rb
@@ -177,6 +178,7 @@ files:
177
178
  - lib/itamae/resource/directory.rb
178
179
  - lib/itamae/resource/execute.rb
179
180
  - lib/itamae/resource/file.rb
181
+ - lib/itamae/resource/link.rb
180
182
  - lib/itamae/resource/mail_alias.rb
181
183
  - lib/itamae/resource/package.rb
182
184
  - lib/itamae/resource/remote_file.rb
@@ -184,7 +186,6 @@ files:
184
186
  - lib/itamae/resource/template.rb
185
187
  - lib/itamae/resource_collection.rb
186
188
  - lib/itamae/runner.rb
187
- - lib/itamae/specinfra.rb
188
189
  - lib/itamae/version.rb
189
190
  - spec/integration/Vagrantfile
190
191
  - spec/integration/default_spec.rb
@@ -197,6 +198,7 @@ files:
197
198
  - spec/unit/lib/itamae/node_spec.rb
198
199
  - spec/unit/lib/itamae/recipe_spec.rb
199
200
  - spec/unit/lib/itamae/resource/base_spec.rb
201
+ - spec/unit/lib/itamae/resource/link_spec.rb
200
202
  - spec/unit/lib/itamae/resource/package_spec.rb
201
203
  - spec/unit/lib/itamae/resource/remote_file_spec.rb
202
204
  - spec/unit/lib/itamae/resource_spec.rb
@@ -238,6 +240,7 @@ test_files:
238
240
  - spec/unit/lib/itamae/node_spec.rb
239
241
  - spec/unit/lib/itamae/recipe_spec.rb
240
242
  - spec/unit/lib/itamae/resource/base_spec.rb
243
+ - spec/unit/lib/itamae/resource/link_spec.rb
241
244
  - spec/unit/lib/itamae/resource/package_spec.rb
242
245
  - spec/unit/lib/itamae/resource/remote_file_spec.rb
243
246
  - spec/unit/lib/itamae/resource_spec.rb
@@ -1,44 +0,0 @@
1
- require 'specinfra'
2
-
3
- # TODO: move to specinfra
4
-
5
- module Itamae
6
- def self.backend=(backend)
7
- @backend = backend
8
- end
9
-
10
- def self.backend
11
- @backend
12
- end
13
-
14
- def self.create_local_backend
15
- create_backend(:exec)
16
- end
17
-
18
- def self.create_ssh_backend(options)
19
- Specinfra.configuration.request_pty = true
20
-
21
- Specinfra.configuration.host = options.delete(:host)
22
- Specinfra.configuration.ssh_options = options
23
- create_backend(:ssh)
24
- end
25
-
26
- private
27
- def self.create_backend(type)
28
- Specinfra.configuration.backend = type
29
- Itamae.backend = Specinfra::Runner
30
- end
31
-
32
- module SpecinfraHelpers
33
- module RunCommand
34
- def backend
35
- Itamae.backend
36
- end
37
-
38
- def run_command(cmd)
39
- backend.run_command(cmd)
40
- end
41
- end
42
- end
43
- end
44
-