itamae 1.0.0.beta3 → 1.0.0.beta4

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: 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
-