crazy-yard 3.2.2
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 +7 -0
- data/LICENSE +19 -0
- data/README.md +438 -0
- data/bin/ey +9 -0
- data/lib/engineyard.rb +9 -0
- data/lib/engineyard/cli.rb +816 -0
- data/lib/engineyard/cli/api.rb +98 -0
- data/lib/engineyard/cli/recipes.rb +129 -0
- data/lib/engineyard/cli/ui.rb +275 -0
- data/lib/engineyard/cli/web.rb +85 -0
- data/lib/engineyard/config.rb +158 -0
- data/lib/engineyard/deploy_config.rb +65 -0
- data/lib/engineyard/deploy_config/ref.rb +56 -0
- data/lib/engineyard/error.rb +82 -0
- data/lib/engineyard/eyrc.rb +59 -0
- data/lib/engineyard/repo.rb +105 -0
- data/lib/engineyard/serverside_runner.rb +159 -0
- data/lib/engineyard/templates.rb +6 -0
- data/lib/engineyard/templates/ey.yml.erb +196 -0
- data/lib/engineyard/templates/ey_yml.rb +119 -0
- data/lib/engineyard/thor.rb +215 -0
- data/lib/engineyard/version.rb +4 -0
- data/lib/vendor/thor/Gemfile +15 -0
- data/lib/vendor/thor/LICENSE.md +20 -0
- data/lib/vendor/thor/README.md +35 -0
- data/lib/vendor/thor/lib/thor.rb +473 -0
- data/lib/vendor/thor/lib/thor/actions.rb +318 -0
- data/lib/vendor/thor/lib/thor/actions/create_file.rb +105 -0
- data/lib/vendor/thor/lib/thor/actions/create_link.rb +60 -0
- data/lib/vendor/thor/lib/thor/actions/directory.rb +119 -0
- data/lib/vendor/thor/lib/thor/actions/empty_directory.rb +137 -0
- data/lib/vendor/thor/lib/thor/actions/file_manipulation.rb +314 -0
- data/lib/vendor/thor/lib/thor/actions/inject_into_file.rb +109 -0
- data/lib/vendor/thor/lib/thor/base.rb +652 -0
- data/lib/vendor/thor/lib/thor/command.rb +136 -0
- data/lib/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +80 -0
- data/lib/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/vendor/thor/lib/thor/core_ext/ordered_hash.rb +100 -0
- data/lib/vendor/thor/lib/thor/error.rb +28 -0
- data/lib/vendor/thor/lib/thor/group.rb +282 -0
- data/lib/vendor/thor/lib/thor/invocation.rb +172 -0
- data/lib/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/vendor/thor/lib/thor/parser/argument.rb +74 -0
- data/lib/vendor/thor/lib/thor/parser/arguments.rb +171 -0
- data/lib/vendor/thor/lib/thor/parser/option.rb +121 -0
- data/lib/vendor/thor/lib/thor/parser/options.rb +218 -0
- data/lib/vendor/thor/lib/thor/rake_compat.rb +72 -0
- data/lib/vendor/thor/lib/thor/runner.rb +322 -0
- data/lib/vendor/thor/lib/thor/shell.rb +88 -0
- data/lib/vendor/thor/lib/thor/shell/basic.rb +393 -0
- data/lib/vendor/thor/lib/thor/shell/color.rb +148 -0
- data/lib/vendor/thor/lib/thor/shell/html.rb +127 -0
- data/lib/vendor/thor/lib/thor/util.rb +270 -0
- data/lib/vendor/thor/lib/thor/version.rb +3 -0
- data/lib/vendor/thor/thor.gemspec +24 -0
- data/spec/engineyard/cli/api_spec.rb +50 -0
- data/spec/engineyard/cli_spec.rb +28 -0
- data/spec/engineyard/config_spec.rb +61 -0
- data/spec/engineyard/deploy_config_spec.rb +194 -0
- data/spec/engineyard/eyrc_spec.rb +76 -0
- data/spec/engineyard/repo_spec.rb +83 -0
- data/spec/engineyard_spec.rb +7 -0
- data/spec/ey/console_spec.rb +57 -0
- data/spec/ey/deploy_spec.rb +435 -0
- data/spec/ey/ey_spec.rb +23 -0
- data/spec/ey/init_spec.rb +123 -0
- data/spec/ey/list_environments_spec.rb +120 -0
- data/spec/ey/login_spec.rb +33 -0
- data/spec/ey/logout_spec.rb +24 -0
- data/spec/ey/logs_spec.rb +36 -0
- data/spec/ey/rebuild_spec.rb +18 -0
- data/spec/ey/recipes/apply_spec.rb +29 -0
- data/spec/ey/recipes/download_spec.rb +43 -0
- data/spec/ey/recipes/upload_spec.rb +99 -0
- data/spec/ey/rollback_spec.rb +73 -0
- data/spec/ey/scp_spec.rb +176 -0
- data/spec/ey/servers_spec.rb +209 -0
- data/spec/ey/ssh_spec.rb +273 -0
- data/spec/ey/status_spec.rb +45 -0
- data/spec/ey/timeout_deploy_spec.rb +18 -0
- data/spec/ey/web/disable_spec.rb +21 -0
- data/spec/ey/web/enable_spec.rb +26 -0
- data/spec/ey/web/restart_spec.rb +21 -0
- data/spec/ey/whoami_spec.rb +30 -0
- data/spec/spec_helper.rb +84 -0
- data/spec/support/bundled_ey +7 -0
- data/spec/support/fixture_recipes.tgz +0 -0
- data/spec/support/git_repos.rb +115 -0
- data/spec/support/helpers.rb +330 -0
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ruby_ext.rb +13 -0
- data/spec/support/shared_behavior.rb +278 -0
- metadata +411 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib/', __FILE__)
|
|
3
|
+
$:.unshift lib unless $:.include?(lib)
|
|
4
|
+
require 'thor/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.add_development_dependency 'bundler', '~> 1.0'
|
|
8
|
+
spec.authors = ['Yehuda Katz', 'José Valim']
|
|
9
|
+
spec.description = %q{A scripting framework that replaces rake, sake and rubigen}
|
|
10
|
+
spec.email = 'ruby-thor@googlegroups.com'
|
|
11
|
+
spec.executables = %w(thor)
|
|
12
|
+
spec.files = %w(.document CHANGELOG.md LICENSE.md README.md Thorfile thor.gemspec)
|
|
13
|
+
spec.files += Dir.glob("bin/**/*")
|
|
14
|
+
spec.files += Dir.glob("lib/**/*.rb")
|
|
15
|
+
spec.files += Dir.glob("spec/**/*")
|
|
16
|
+
spec.homepage = 'http://whatisthor.com/'
|
|
17
|
+
spec.licenses = ['MIT']
|
|
18
|
+
spec.name = 'thor'
|
|
19
|
+
spec.require_paths = ['lib']
|
|
20
|
+
spec.required_rubygems_version = '>= 1.3.6'
|
|
21
|
+
spec.summary = spec.description
|
|
22
|
+
spec.test_files = Dir.glob("spec/**/*")
|
|
23
|
+
spec.version = Thor::VERSION
|
|
24
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'engineyard/cli'
|
|
3
|
+
|
|
4
|
+
describe EY::CLI::API do
|
|
5
|
+
it "gets the api token from ~/.eyrc if possible" do
|
|
6
|
+
write_eyrc({"api_token" => "asdf"})
|
|
7
|
+
expect(EY::CLI::API.new('http://fake.local', EY::CLI::UI.new).token).to eq("asdf")
|
|
8
|
+
clean_eyrc
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "uses the token specified token over the ENV token if passed" do
|
|
12
|
+
ENV['ENGINEYARD_API_TOKEN'] = 'envtoken'
|
|
13
|
+
expect(EY::CLI::API.new('http://fake.local', EY::CLI::UI.new, 'specifiedtoken').token).to eq('specifiedtoken')
|
|
14
|
+
ENV.delete('ENGINEYARD_API_TOKEN')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "uses the token from $ENGINEYARD_API_TOKEN if set" do
|
|
18
|
+
ENV['ENGINEYARD_API_TOKEN'] = 'envtoken'
|
|
19
|
+
expect(EY::CLI::API.new('http://fake.local', EY::CLI::UI.new).token).to eq('envtoken')
|
|
20
|
+
ENV.delete('ENGINEYARD_API_TOKEN')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "without saved api token" do
|
|
24
|
+
before(:each) do
|
|
25
|
+
clean_eyrc
|
|
26
|
+
FakeWeb.register_uri(:post, "http://fake.local/api/v2/authenticate", :body => %|{"api_token": "asdf"}|, :content_type => 'application/json')
|
|
27
|
+
|
|
28
|
+
EY::CLI::UI::Prompter.enable_mock!
|
|
29
|
+
EY::CLI::UI::Prompter.add_answer "my@email.example.com"
|
|
30
|
+
EY::CLI::UI::Prompter.add_answer "secret"
|
|
31
|
+
|
|
32
|
+
capture_stdout do
|
|
33
|
+
@api = EY::CLI::API.new('http://fake.local', EY::CLI::UI.new)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "asks you for your credentials" do
|
|
38
|
+
expect(EY::CLI::UI::Prompter.questions).to eq(["Email: ","Password: "])
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "gets the api token" do
|
|
42
|
+
expect(@api.token).to eq("asdf")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "saves the api token to ~/.eyrc" do
|
|
46
|
+
expect(read_eyrc).to eq({"api_token" => "asdf"})
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'engineyard/cli'
|
|
3
|
+
|
|
4
|
+
describe EY::CLI do
|
|
5
|
+
|
|
6
|
+
it "provides help" do
|
|
7
|
+
out = capture_stdout do
|
|
8
|
+
EY::CLI.start(["help"])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
expect(out).to include("ey deploy")
|
|
12
|
+
expect(out).to include("ey ssh")
|
|
13
|
+
expect(out).to include("ey web enable")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "delegates help" do
|
|
17
|
+
out = capture_stdout do
|
|
18
|
+
EY::CLI.start(%w[help web enable])
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
expect(out).to match(/remove the maintenance page/i)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "provides error classes" do
|
|
25
|
+
expect(EY::DeployArgumentError).to be
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end # EY::CLI
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'uri'
|
|
3
|
+
|
|
4
|
+
describe EY::Config do
|
|
5
|
+
describe "environments" do
|
|
6
|
+
after { File.unlink('ey.yml') if File.exist?('ey.yml') }
|
|
7
|
+
|
|
8
|
+
it "get loaded from the config file" do
|
|
9
|
+
write_yaml({"environments" => {"production" => {"default" => true}}}, 'ey.yml')
|
|
10
|
+
expect(EY::Config.new.environments["production"]["default"]).to be_truthy
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "are present when the config file has no environments key" do
|
|
14
|
+
write_yaml({}, 'ey.yml')
|
|
15
|
+
expect(EY::Config.new.environments).to eq({})
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "rases an error when yaml produces an unexpected result" do
|
|
19
|
+
File.open('ey.yml', "w") {|f| f << "this isn't a hash" }
|
|
20
|
+
expect { EY::Config.new }.to raise_error(RuntimeError, "ey.yml load error: Expected a Hash but a String was returned.")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "doesnt crash on nil environment" do
|
|
24
|
+
write_yaml({"environments" => {"production" => nil}}, 'ey.yml')
|
|
25
|
+
expect(EY::Config.new.default_environment).to be_nil
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "endpoint" do
|
|
30
|
+
it "defaults to production Engine Yard Cloud" do
|
|
31
|
+
expect(EY::Config.new.endpoint).to eq(EY::Config.new.default_endpoint)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "loads the endpoint from $CLOUD_URL" do
|
|
35
|
+
ENV['CLOUD_URL'] = "http://fake.local/"
|
|
36
|
+
expect(EY::Config.new.endpoint).to eq('http://fake.local/')
|
|
37
|
+
ENV.delete('CLOUD_URL')
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe "files" do
|
|
42
|
+
it "looks for config/ey.yml" do
|
|
43
|
+
FileUtils.mkdir_p('config')
|
|
44
|
+
|
|
45
|
+
write_yaml({"environments" => {"staging" => {"default" => true}}}, "ey.yml")
|
|
46
|
+
write_yaml({"environments" => {"production" => {"default" => true}}}, "config/ey.yml")
|
|
47
|
+
expect(EY::Config.new.default_environment).to eq("production")
|
|
48
|
+
|
|
49
|
+
File.unlink('config/ey.yml') if File.exist?('config/ey.yml')
|
|
50
|
+
File.unlink('ey.yml') if File.exist?('ey.yml')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "looks for ey.yml" do
|
|
54
|
+
write_yaml({"environments" => {"staging" => {"default" => true}}}, "ey.yml")
|
|
55
|
+
|
|
56
|
+
expect(EY::Config.new.default_environment).to eq("staging")
|
|
57
|
+
|
|
58
|
+
File.unlink('ey.yml') if File.exist?('ey.yml')
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'tempfile'
|
|
3
|
+
|
|
4
|
+
describe EY::DeployConfig do
|
|
5
|
+
let(:tempfile) { @tempfile = Tempfile.new('ey.yml') }
|
|
6
|
+
let(:parent) { EY::Config.new(tempfile.path) }
|
|
7
|
+
let(:ui) { EY::CLI::UI.new }
|
|
8
|
+
let(:repo) { double('repo') }
|
|
9
|
+
let(:env) { env_config(nil) }
|
|
10
|
+
|
|
11
|
+
after { @tempfile.unlink if @tempfile }
|
|
12
|
+
|
|
13
|
+
def env_config(opts, config = parent)
|
|
14
|
+
EY::Config::EnvironmentConfig.new(opts, 'envname', config)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def deploy_config(cli_opts, ec = env)
|
|
18
|
+
EY::DeployConfig.new(cli_opts, ec, repo, ui)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "inside a repository" do
|
|
22
|
+
context "with no ey.yml file" do
|
|
23
|
+
let(:env) { env_config(nil, EY::Config.new('noexisto.yml')) }
|
|
24
|
+
|
|
25
|
+
it "tells you to initialize a new repository with ey init" do
|
|
26
|
+
dc = deploy_config({}, env)
|
|
27
|
+
expect { dc.migrate }.to raise_error(EY::Error, /Please initialize this application with the following command:/)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "with the migrate cli option" do
|
|
32
|
+
it "returns default command when true" do
|
|
33
|
+
dc = deploy_config({'migrate' => true})
|
|
34
|
+
expect(dc.migrate).to be_truthy
|
|
35
|
+
expect { dc.migrate_command }.to raise_error(EY::Error, /'migration_command' not found/)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "returns false when nil" do
|
|
39
|
+
dc = deploy_config({'migrate' => nil})
|
|
40
|
+
expect(dc.migrate).to be_falsey
|
|
41
|
+
expect(dc.migrate_command).to be_nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "return the custom migration command when is a string" do
|
|
45
|
+
dc = deploy_config({'migrate' => 'foo migrate'})
|
|
46
|
+
expect(dc.migrate).to be_truthy
|
|
47
|
+
expect(dc.migrate_command).to eq('foo migrate')
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "with the migrate option in the global configuration" do
|
|
52
|
+
it "return the migration command when the option is true" do
|
|
53
|
+
env = env_config('migrate' => true, 'migration_command' => 'bar migrate')
|
|
54
|
+
dc = deploy_config({}, env)
|
|
55
|
+
expect(dc.migrate).to be_truthy
|
|
56
|
+
expect(dc.migrate_command).to eq('bar migrate')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "return the false when migrate is false" do
|
|
60
|
+
env = env_config('migrate' => false, 'migration_command' => 'bar migrate')
|
|
61
|
+
dc = deploy_config({}, env)
|
|
62
|
+
expect(dc.migrate).to be_falsey
|
|
63
|
+
expect(dc.migrate_command).to be_nil
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "tells you to run ey init" do
|
|
67
|
+
env = env_config('migrate' => true)
|
|
68
|
+
dc = deploy_config({}, env)
|
|
69
|
+
expect(dc.migrate).to be_truthy
|
|
70
|
+
expect { dc.migrate_command }.to raise_error(EY::Error, /'migration_command' not found/)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "return the ey.yml migration_command when command line option --migrate is passed" do
|
|
74
|
+
env = env_config('migrate' => false, 'migration_command' => 'bar migrate')
|
|
75
|
+
dc = deploy_config({'migrate' => true}, env)
|
|
76
|
+
expect(dc.migrate).to be_truthy
|
|
77
|
+
expect(dc.migrate_command).to eq('bar migrate')
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "ref" do
|
|
82
|
+
it "returns the passed ref" do
|
|
83
|
+
expect(deploy_config({'ref' => 'master'}).ref).to eq('master')
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "returns the passed force_ref" do
|
|
87
|
+
expect(deploy_config({'force_ref' => 'force'}).ref).to eq('force')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "returns the ref if force_ref is true" do
|
|
91
|
+
expect(deploy_config({'ref' => 'master', 'force_ref' => true}).ref).to eq('master')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "overrides the ref if force_ref is set to a string" do
|
|
95
|
+
expect(deploy_config({'ref' => 'master', 'force_ref' => 'force'}).ref).to eq('force')
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context "with a default branch" do
|
|
99
|
+
let(:env) { env_config('branch' => 'default') }
|
|
100
|
+
|
|
101
|
+
it "uses the configured default if ref is not passed" do
|
|
102
|
+
out = capture_stdout do
|
|
103
|
+
expect(deploy_config({}).ref).to eq('default')
|
|
104
|
+
end
|
|
105
|
+
expect(out).to match(/Using default branch "default" from ey.yml/)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "raises if a default is set and --ref is passed on the cli (and they don't match)" do
|
|
109
|
+
expect { deploy_config({'ref' => 'master'}).ref }.to raise_error(EY::BranchMismatchError)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "returns the default if a default is set and --ref is the same" do
|
|
113
|
+
expect(deploy_config({'ref' => 'default'}).ref).to eq('default')
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "returns the ref if force_ref is set" do
|
|
117
|
+
out = capture_stdout do
|
|
118
|
+
expect(deploy_config({'ref' => 'master', 'force_ref' => true}).ref).to eq('master')
|
|
119
|
+
end
|
|
120
|
+
expect(out).to match(/Default ref overridden with "master"/)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "returns the ref if force_ref is a branch" do
|
|
124
|
+
out = capture_stdout do
|
|
125
|
+
expect(deploy_config({'force_ref' => 'master'}).ref).to eq('master')
|
|
126
|
+
end
|
|
127
|
+
expect(out).to match(/Default ref overridden with "master"/)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
context "no options, no default" do
|
|
132
|
+
it "uses the repo's current branch" do
|
|
133
|
+
expect(repo).to receive(:current_branch).and_return('current')
|
|
134
|
+
out = capture_stdout do
|
|
135
|
+
expect(deploy_config({}).ref).to eq('current')
|
|
136
|
+
end
|
|
137
|
+
expect(out).to match(/Using current HEAD branch "current"/)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
context "when outside of a repo" do
|
|
144
|
+
describe "migrate" do
|
|
145
|
+
it "returns the default migration command when migrate is true" do
|
|
146
|
+
dc = deploy_config({'app' => 'app', 'migrate' => true})
|
|
147
|
+
expect(dc.migrate).to be_truthy
|
|
148
|
+
expect(dc.migrate_command).to eq('rake db:migrate --trace')
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "returns false when nil" do
|
|
152
|
+
dc = deploy_config({'app' => 'app', 'migrate' => nil})
|
|
153
|
+
expect(dc.migrate).to be_falsey
|
|
154
|
+
expect(dc.migrate_command).to be_nil
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "return the custom migration command when is a string" do
|
|
158
|
+
dc = deploy_config({'app' => 'app', 'migrate' => 'foo migrate'})
|
|
159
|
+
expect(dc.migrate).to be_truthy
|
|
160
|
+
expect(dc.migrate_command).to eq('foo migrate')
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "raises if migrate is not passed" do
|
|
164
|
+
expect { deploy_config({'app' => 'app'}).migrate }.to raise_error(EY::RefAndMigrateRequiredOutsideRepo)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
describe "ref" do
|
|
169
|
+
it "returns the passed ref" do
|
|
170
|
+
dc = deploy_config({'app' => 'app', 'ref' => 'master'})
|
|
171
|
+
expect(dc.ref).to eq('master')
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it "returns the passed force_ref" do
|
|
175
|
+
dc = deploy_config({'app' => 'app', 'force_ref' => 'force'})
|
|
176
|
+
expect(dc.ref).to eq('force')
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "returns the ref if force_ref is true" do
|
|
180
|
+
dc = deploy_config({'app' => 'app', 'ref' => 'master', 'force_ref' => true})
|
|
181
|
+
expect(dc.ref).to eq('master')
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "overrides the ref if force_ref is set to a string" do
|
|
185
|
+
dc = deploy_config({'app' => 'app', 'ref' => 'master', 'force_ref' => 'force'})
|
|
186
|
+
expect(dc.ref).to eq('force')
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it "raises if ref is not passed" do
|
|
190
|
+
expect { deploy_config({'app' => 'app'}).ref }.to raise_error(EY::RefAndMigrateRequiredOutsideRepo)
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'engineyard/eyrc'
|
|
3
|
+
|
|
4
|
+
describe EY::EYRC do
|
|
5
|
+
before { clean_eyrc }
|
|
6
|
+
|
|
7
|
+
describe ".load" do
|
|
8
|
+
it "looks for .eyrc in $EYRC if set" do
|
|
9
|
+
expect(EY::EYRC.load.path).to eq(Pathname.new(ENV['EYRC']))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "looks for .eyrc in $HOME/.eyrc by default" do
|
|
13
|
+
ENV.delete('EYRC')
|
|
14
|
+
expect(EY::EYRC.load.path).to eq(Pathname.new("#{ENV['HOME']}/.eyrc"))
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe ".new" do
|
|
19
|
+
it "looks for eyrc in any passed file location" do
|
|
20
|
+
expect(EY::EYRC.new('/tmp/neweyrc').path).to eq(Pathname.new('/tmp/neweyrc'))
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "with a non-existing .eyrc file" do
|
|
25
|
+
it "has nil api_token" do
|
|
26
|
+
expect(File.exists?("/tmp/nonexistant")).to be_falsey
|
|
27
|
+
eyrc = EY::EYRC.new('/tmp/nonexistant')
|
|
28
|
+
expect(eyrc.exist?).to be_falsey
|
|
29
|
+
expect(eyrc.api_token).to be_nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "saving api token" do
|
|
34
|
+
before do
|
|
35
|
+
EY::EYRC.load.api_token = 'abcd'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "exists" do
|
|
39
|
+
expect(EY::EYRC.load.exist?).to be_truthy
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "recalls the api_token" do
|
|
43
|
+
expect(EY::EYRC.load.api_token).to eq('abcd')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "deletes the api_token" do
|
|
47
|
+
EY::EYRC.load.delete_api_token
|
|
48
|
+
expect(EY::EYRC.load.api_token).to be_nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "writes the api_token to api_token: .eyrc" do
|
|
52
|
+
expect(read_yaml(ENV['EYRC'])).to eq({"api_token" => "abcd"})
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context "file contains other random info" do
|
|
57
|
+
before do
|
|
58
|
+
# contains legacy endpoint behavior, no longer supported, but we won't be destructive.
|
|
59
|
+
write_yaml({"api_token" => "1234", "http://localhost/" => {"api_token" => "5678"}}, ENV['EYRC'])
|
|
60
|
+
EY::EYRC.load.api_token = 'abcd' # overwrites 1234
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "recalls the api_token" do
|
|
64
|
+
expect(EY::EYRC.load.api_token).to eq('abcd')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "deletes the api token safely on logout" do
|
|
68
|
+
EY::EYRC.load.delete_api_token
|
|
69
|
+
expect(read_yaml(ENV['EYRC'])).to eq({"http://localhost/" => {"api_token" => "5678"}})
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "maintains other random info in the file" do
|
|
73
|
+
expect(read_yaml(ENV['EYRC'])).to eq({"api_token" => "abcd", "http://localhost/" => {"api_token" => "5678"}})
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe EY::Repo do
|
|
4
|
+
let(:path) { p = TMPDIR.join('ey-test'); p.mkpath; p }
|
|
5
|
+
|
|
6
|
+
before(:each) do
|
|
7
|
+
Dir.chdir(path) { `git init -q` }
|
|
8
|
+
ENV['GIT_DIR'] = path.join('.git').to_s
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
after(:each) do
|
|
12
|
+
path.rmtree
|
|
13
|
+
ENV.delete('GIT_DIR')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def set_head(head)
|
|
17
|
+
path.join('.git','HEAD').open('w') {|f| f.write(head) }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def set_url(url, remote)
|
|
21
|
+
`git remote add #{remote} #{url}`
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe ".new" do
|
|
25
|
+
it "creates a working repo object in a repo" do
|
|
26
|
+
expect(EY::Repo.new.remotes).to be_empty
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "doesn't raise if created outside a repository until trying to do something" do
|
|
30
|
+
ENV['GIT_DIR'] = nil
|
|
31
|
+
Dir.chdir('/tmp') do
|
|
32
|
+
repo = EY::Repo.new
|
|
33
|
+
expect { repo.remotes }.to raise_error(EY::Repo::NotAGitRepository)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe ".exist?" do
|
|
39
|
+
it "is true when env vars are set to a repo" do
|
|
40
|
+
expect(EY::Repo).to be_exist
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "is true when pwd is a repo" do
|
|
44
|
+
Dir.chdir(File.dirname(ENV['GIT_DIR'])) do
|
|
45
|
+
ENV['GIT_DIR'] = nil
|
|
46
|
+
expect(EY::Repo).to be_exist
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "is false when outside of any repo" do
|
|
51
|
+
ENV['GIT_DIR'] = nil
|
|
52
|
+
Dir.chdir('/tmp') do
|
|
53
|
+
expect(EY::Repo).not_to be_exist
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "in a repository dir" do
|
|
59
|
+
|
|
60
|
+
before(:each) do
|
|
61
|
+
@repo = EY::Repo.new
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe "current_branch method" do
|
|
65
|
+
it "returns the name of the current branch" do
|
|
66
|
+
set_head "ref: refs/heads/master"
|
|
67
|
+
expect(@repo.current_branch).to eq("master")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "returns nil if there is no current branch" do
|
|
71
|
+
set_head "20bf478ab6a91ec5771130aa4c8cfd3d150c4146"
|
|
72
|
+
expect(@repo.current_branch).to be_nil
|
|
73
|
+
end
|
|
74
|
+
end # current_branch
|
|
75
|
+
|
|
76
|
+
describe "#fail_on_no_remotes!" do
|
|
77
|
+
it "raises when there are no remotes" do
|
|
78
|
+
expect { @repo.fail_on_no_remotes! }.to raise_error(EY::Repo::NoRemotesError)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
83
|
+
end
|