diff --git a/plugins/pushes/harmony/config.rb b/plugins/pushes/harmony/config.rb new file mode 100644 index 000000000..5053c328e --- /dev/null +++ b/plugins/pushes/harmony/config.rb @@ -0,0 +1,73 @@ +module VagrantPlugins + module HarmonyPush + class Config < Vagrant.plugin("2", :config) + # The name of the application to push to. This will be created (with + # user confirmation) if it doesn't already exist. + # + # @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. + # + # @return [String] + attr_accessor :dir + + # Lists of files to include/exclude in what is uploaded. Exclude is + # always the last run filter, so if a file is matched in both include + # and exclude, it will be excluded. + # + # The value of the array elements should be a simple file glob relative + # to the directory being packaged. + # + # @return [Array] + attr_accessor :include + attr_accessor :exclude + + # If set to true, Vagrant will automatically use VCS data to determine + # the files to upload. As a caveat: uncommitted changes will not be + # deployed. + # + # @return [Boolean] + attr_accessor :vcs + + def initialize + @app = UNSET_VALUE + @dir = UNSET_VALUE + @vcs = UNSET_VALUE + @include = [] + @exclude = [] + end + + def merge(other) + super.tap do |result| + inc = self.include.dup + inc.concat(other.include) + result.include = inc + + exc = self.exclude.dup + exc.concat(other.exclude) + result.exclude = exc + end + end + + def finalize! + @app = nil if @app == UNSET_VALUE + @dir = "." if @dir == UNSET_VALUE + @vcs = true if @vcs == UNSET_VALUE + end + + def validate(machine) + errors = _detected_errors + + if @app == nil || @app == "" + errors << I18n.t("push_harmony.errors.config.app_required") + end + + { "Harmony push" => errors } + end + end + end +end diff --git a/plugins/pushes/harmony/plugin.rb b/plugins/pushes/harmony/plugin.rb new file mode 100644 index 000000000..a0c013f82 --- /dev/null +++ b/plugins/pushes/harmony/plugin.rb @@ -0,0 +1,22 @@ +require "vagrant" + +module VagrantPlugins + module HarmonyPush + class Plugin < Vagrant.plugin("2") + name "harmony" + description <<-DESC + Deploy using HashiCorp's Harmony service. + DESC + + config(:harmony, :push) do + require File.expand_path("../config", __FILE__) + Config + end + + push(:harmony) do + require File.expand_path("../push", __FILE__) + Push + end + end + end +end diff --git a/plugins/pushes/harmony/push.rb b/plugins/pushes/harmony/push.rb new file mode 100644 index 000000000..20f1c355e --- /dev/null +++ b/plugins/pushes/harmony/push.rb @@ -0,0 +1,9 @@ +module VagrantPlugins + module HarmonyPush + class Push < Vagrant.plugin("2", :push) + def push + puts "pushed" + end + end + end +end diff --git a/test/unit/plugins/pushes/harmony/config_test.rb b/test/unit/plugins/pushes/harmony/config_test.rb new file mode 100644 index 000000000..de5ce1c33 --- /dev/null +++ b/test/unit/plugins/pushes/harmony/config_test.rb @@ -0,0 +1,84 @@ +require_relative "../../../base" + +require Vagrant.source_root.join("plugins/pushes/harmony/config") + +describe VagrantPlugins::HarmonyPush::Config do + include_context "unit" + + let(:machine) { double("machine") } + + # For testing merging + let(:one) { described_class.new } + let(:two) { described_class.new } + + def assert_invalid + errors = subject.validate(machine) + if !errors.values.any? { |v| !v.empty? } + raise "No errors: #{errors.inspect}" + end + end + + def assert_valid + errors = subject.validate(machine) + if !errors.values.all? { |v| v.empty? } + raise "Errors: #{errors.inspect}" + end + end + + def valid_defaults + end + + describe "defaults" do + before { subject.finalize! } + + its(:app) { should be_nil } + its(:dir) { should eq(".") } + its(:exclude) { should be_empty } + its(:include) { should be_empty } + its(:vcs) { should be_true } + end + + describe "app" do + before do + valid_defaults + end + + it "is invalid if not set" do + subject.app = "" + subject.finalize! + assert_invalid + end + + it "is valid if set" do + subject.app = "foo/bar" + subject.finalize! + assert_valid + end + end + + describe "exclude" do + context "merge" do + subject { one.merge(two) } + + it "appends" do + one.exclude = ["foo"] + two.exclude = ["bar"] + + expect(subject.exclude).to eq(["foo", "bar"]) + end + end + end + + describe "include" do + context "merge" do + subject { one.merge(two) } + + it "appends" do + one.include = ["foo"] + two.include = ["bar"] + + expect(subject.include).to eq(["foo", "bar"]) + end + end + end +end