Add heroku config

This commit is contained in:
Seth Vargo 2014-11-13 17:07:41 -05:00
parent ad15be2e16
commit d4058130e4
3 changed files with 233 additions and 0 deletions

View File

@ -0,0 +1,86 @@
module VagrantPlugins
module HerokuPush
class Config < Vagrant.plugin("2", :config)
# The name of the Heroku application to push to.
# @return [String]
attr_accessor :app
# The base directory with file contents to upload. By default this
# is the same directory as the Vagrantfile, but you can specify this
# if you have a `src` folder or `bin` folder or some other folder
# you want to upload. This directory must be a git repository.
# @return [String]
attr_accessor :dir
# The path to the git binary to shell out to. This usually is only set for
# debugging/development. If not set, the git bin will be searched for
# in the PATH.
# @return [String]
attr_accessor :git_bin
# The Git remote to push to (default: "heroku").
# @return [String]
attr_accessor :remote
# The Git branch to push to (default: "master").
# @return [String]
attr_accessor :branch
def initialize
@app = UNSET_VALUE
@dir = UNSET_VALUE
@git_bin = UNSET_VALUE
@remote = UNSET_VALUE
@branch = UNSET_VALUE
end
def finalize!
@app = nil if @app == UNSET_VALUE
@dir = "." if @dir == UNSET_VALUE
@git_bin = "git" if @git_bin == UNSET_VALUE
@remote = "heroku" if @remote == UNSET_VALUE
@branch = "master" if @branch == UNSET_VALUE
end
def validate(machine)
errors = _detected_errors
if missing?(@dir)
errors << I18n.t("heroku_push.errors.missing_attribute",
attribute: "dir",
)
end
if missing?(@git_bin)
errors << I18n.t("heroku_push.errors.missing_attribute",
attribute: "git_bin",
)
end
if missing?(@remote)
errors << I18n.t("heroku_push.errors.missing_attribute",
attribute: "remote",
)
end
if missing?(@branch)
errors << I18n.t("heroku_push.errors.missing_attribute",
attribute: "branch",
)
end
{ "Heroku push" => errors }
end
private
# Determine if the given string is "missing" (blank)
# @return [true, false]
def missing?(obj)
obj.to_s.strip.empty?
end
end
end
end

View File

@ -0,0 +1,30 @@
en:
heroku_push:
errors:
command_failed: |-
The following command exited with a non-zero exit status:
%{cmd}
stdout: %{stdout}
stderr: %{stderr}
git_not_found: |-
The Git binary '%{bin}' could not be found. Please ensure you
have downloaded and installed the latest version of Git:
http://git-scm.com/downloads
missing_attribute: |-
Missing required attribute '%{attribute}'. The Vagrant Heroku Push
plugin requires you set this attribute. Please set this attribute in
your Vagrantfile, for example:
config.push.define "heroku" do |push|
push.%{attribute} = "..."
end
not_a_git_repo: |-
The following path is not a valid Git repository:
%{path}
Please ensure you are working in the correct directory. In order to use
the Vagrant Heroku Push plugin, you must have a git repository.

View File

@ -0,0 +1,117 @@
require_relative "../../../base"
require Vagrant.source_root.join("plugins/pushes/heroku/config")
describe VagrantPlugins::HerokuPush::Config do
include_context "unit"
before(:all) do
I18n.load_path << Vagrant.source_root.join("plugins/pushes/heroku/locales/en.yml")
I18n.reload!
end
subject { described_class.new }
let(:machine) { double("machine") }
describe "#app" do
it "defaults to nil" do
subject.finalize!
expect(subject.app).to be(nil)
end
end
describe "#dir" do
it "defaults to ." do
subject.finalize!
expect(subject.dir).to eq(".")
end
end
describe "#git_bin" do
it "defaults to git" do
subject.finalize!
expect(subject.git_bin).to eq("git")
end
end
describe "#remote" do
it "defaults to git" do
subject.finalize!
expect(subject.remote).to eq("heroku")
end
end
describe "#branch" do
it "defaults to git" do
subject.finalize!
expect(subject.branch).to eq("master")
end
end
describe "#validate" do
before do
allow(machine).to receive(:env)
.and_return(double("env",
root_path: "",
))
subject.app = "bacon"
subject.dir = "."
subject.git_bin = "git"
subject.remote = "heroku"
subject.branch = "master"
end
let(:result) { subject.validate(machine) }
let(:errors) { result["Heroku push"] }
context "when the app is missing" do
it "does not return an error" do
subject.app = ""
subject.finalize!
expect(errors).to be_empty
end
end
context "when the git_bin is missing" do
it "returns an error" do
subject.git_bin = ""
subject.finalize!
expect(errors).to include(I18n.t("heroku_push.errors.missing_attribute",
attribute: "git_bin",
))
end
end
context "when the remote is missing" do
it "returns an error" do
subject.remote = ""
subject.finalize!
expect(errors).to include(I18n.t("heroku_push.errors.missing_attribute",
attribute: "remote",
))
end
end
context "when the branch is missing" do
it "returns an error" do
subject.branch = ""
subject.finalize!
expect(errors).to include(I18n.t("heroku_push.errors.missing_attribute",
attribute: "branch",
))
end
end
context "when the dir is missing" do
it "returns an error" do
subject.dir = ""
subject.finalize!
expect(errors).to include(I18n.t("heroku_push.errors.missing_attribute",
attribute: "dir",
))
end
end
end
end