singularity_dsl 1.2.5
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 +15 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.rubocop.yml +10 -0
- data/.singularityrc +12 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +52 -0
- data/LICENSE.txt +22 -0
- data/README.md +38 -0
- data/Rakefile +24 -0
- data/bin/singularity_runner +5 -0
- data/lib/singularity_dsl/application.rb +76 -0
- data/lib/singularity_dsl/cli/cli.rb +125 -0
- data/lib/singularity_dsl/cli/table.rb +32 -0
- data/lib/singularity_dsl/dsl/batch.rb +23 -0
- data/lib/singularity_dsl/dsl/changeset.rb +39 -0
- data/lib/singularity_dsl/dsl/components.rb +7 -0
- data/lib/singularity_dsl/dsl/dsl.rb +71 -0
- data/lib/singularity_dsl/dsl/event_store.rb +34 -0
- data/lib/singularity_dsl/dsl/registry.rb +60 -0
- data/lib/singularity_dsl/dsl/runner.rb +67 -0
- data/lib/singularity_dsl/dsl/utils.rb +28 -0
- data/lib/singularity_dsl/errors.rb +35 -0
- data/lib/singularity_dsl/files.rb +20 -0
- data/lib/singularity_dsl/git_helper.rb +94 -0
- data/lib/singularity_dsl/runstate.rb +30 -0
- data/lib/singularity_dsl/stdout.rb +16 -0
- data/lib/singularity_dsl/task.rb +30 -0
- data/lib/singularity_dsl/tasks/rake.rb +31 -0
- data/lib/singularity_dsl/tasks/rspec.rb +32 -0
- data/lib/singularity_dsl/tasks/rubocop.rb +54 -0
- data/lib/singularity_dsl/tasks/shell_task.rb +90 -0
- data/lib/singularity_dsl/version.rb +6 -0
- data/lib/singularity_dsl.rb +9 -0
- data/singularity_dsl.gemspec +31 -0
- data/spec/singularity_dsl/application_spec.rb +92 -0
- data/spec/singularity_dsl/dsl/batch_spec.rb +30 -0
- data/spec/singularity_dsl/dsl/changeset_spec.rb +54 -0
- data/spec/singularity_dsl/dsl/dsl_spec.rb +45 -0
- data/spec/singularity_dsl/dsl/event_store_spec.rb +44 -0
- data/spec/singularity_dsl/dsl/registry_spec.rb +39 -0
- data/spec/singularity_dsl/dsl/runner_spec.rb +39 -0
- data/spec/singularity_dsl/dsl/stubs/tasks/dummy_task.rb +4 -0
- data/spec/singularity_dsl/dsl/utils_spec.rb +33 -0
- data/spec/singularity_dsl/git_helper_spec.rb +72 -0
- data/spec/singularity_dsl/runstate_spec.rb +73 -0
- data/spec/singularity_dsl/task_spec.rb +54 -0
- data/spec/singularity_dsl/tasks/shell_task_spec.rb +119 -0
- metadata +231 -0
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/dsl/batch'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # dummy class to use for block contexts
         | 
| 6 | 
            +
            class TestObject
         | 
| 7 | 
            +
              def meth
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            describe 'Batch' do
         | 
| 12 | 
            +
              context '#initialize' do
         | 
| 13 | 
            +
                it 'converts name to symbol' do
         | 
| 14 | 
            +
                  batch = SingularityDsl::Dsl::Batch.new('test', self)
         | 
| 15 | 
            +
                  expect(batch.name).to eql(:test)
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              context '#execute' do
         | 
| 20 | 
            +
                it 'executes block in passed context' do
         | 
| 21 | 
            +
                  dummy = TestObject.new
         | 
| 22 | 
            +
                  dummy.stub(:meth)
         | 
| 23 | 
            +
                  batch = SingularityDsl::Dsl::Batch.new('test', dummy) do |thing|
         | 
| 24 | 
            +
                    thing.meth
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
                  expect(dummy).to receive(:meth)
         | 
| 27 | 
            +
                  batch.execute
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/dsl/changeset'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # container to include DslChangeset
         | 
| 6 | 
            +
            class ChangesetTest
         | 
| 7 | 
            +
              include SingularityDsl::Dsl::Changeset
         | 
| 8 | 
            +
            end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            describe 'DslChangeset' do
         | 
| 11 | 
            +
              let(:instance) { ChangesetTest.new }
         | 
| 12 | 
            +
              before :each do
         | 
| 13 | 
            +
                instance.changeset = %w(something.php something.js something.css)
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              context '#files_changed?' do
         | 
| 17 | 
            +
                it 'correct eval for single file type' do
         | 
| 18 | 
            +
                  expect(instance.files_changed? 'php').to eql true
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                it 'correct eval for multiple file types' do
         | 
| 22 | 
            +
                  expect(instance.files_changed? %w(js css)).to eql true
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              context '#changed_files' do
         | 
| 27 | 
            +
                before :each do
         | 
| 28 | 
            +
                  ::File.stub(:exist?)
         | 
| 29 | 
            +
                        .with('something.css')
         | 
| 30 | 
            +
                        .and_return(true)
         | 
| 31 | 
            +
                  ::File.stub(:exist?)
         | 
| 32 | 
            +
                        .with('something.js')
         | 
| 33 | 
            +
                        .and_return(true)
         | 
| 34 | 
            +
                  ::File.stub(:exist?)
         | 
| 35 | 
            +
                        .with('something.php')
         | 
| 36 | 
            +
                        .and_return(false)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                it 'correct eval for single file type' do
         | 
| 40 | 
            +
                  expect(instance.changed_files 'css').to eql %w(something.css)
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                it 'correct eval for multiple file types' do
         | 
| 44 | 
            +
                  expect(instance.changed_files %w(js css))
         | 
| 45 | 
            +
                    .to eql %w(something.css something.js)
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                it 'filters for existing files' do
         | 
| 49 | 
            +
                  expect(instance.changed_files %w(php js css))
         | 
| 50 | 
            +
                    .to eql %w(something.css something.js)
         | 
| 51 | 
            +
                  expect(instance.changed_files 'php').to eql []
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/dsl/dsl'
         | 
| 4 | 
            +
            require 'singularity_dsl/dsl/registry'
         | 
| 5 | 
            +
            require 'singularity_dsl/task'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            class TestTask < SingularityDsl::Task
         | 
| 8 | 
            +
            end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            describe 'Dsl' do
         | 
| 11 | 
            +
              let(:dsl) { SingularityDsl::Dsl::Dsl.new }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              context '#initialize' do
         | 
| 14 | 
            +
                it 'creates registry' do
         | 
| 15 | 
            +
                  expect(dsl.registry).to be_a_kind_of SingularityDsl::Dsl::Registry
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              context '#define_task' do
         | 
| 20 | 
            +
                it 'creates task function for given task' do
         | 
| 21 | 
            +
                  dsl.define_task TestTask
         | 
| 22 | 
            +
                  expect(dsl.singleton_methods).to include :testtask
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                it 'throws when tasks have the same name' do
         | 
| 26 | 
            +
                  dsl.define_task TestTask
         | 
| 27 | 
            +
                  expect { dsl.define_task TestTask }
         | 
| 28 | 
            +
                    .to raise_error RuntimeError, /task name clash/
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              context '#load_tasks_in_path' do
         | 
| 33 | 
            +
                it 'does not load tasks that have already been required' do
         | 
| 34 | 
            +
                  path = ::File.dirname(__FILE__) + '/../../lib/singularity_dsl/tasks'
         | 
| 35 | 
            +
                  expect(dsl).to receive(:load_tasks).with []
         | 
| 36 | 
            +
                  dsl.load_tasks_in_path path
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                it 'actually loads new tasks from dir' do
         | 
| 40 | 
            +
                  path = ::File.dirname(__FILE__) + '/stubs/tasks'
         | 
| 41 | 
            +
                  dsl.load_tasks_in_path path
         | 
| 42 | 
            +
                  expect(dsl.singleton_methods).to include :dummytask
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/dsl/event_store'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # container to include DslEventStore
         | 
| 6 | 
            +
            class EventStoreTest
         | 
| 7 | 
            +
              include SingularityDsl::Dsl::EventStore
         | 
| 8 | 
            +
            end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            describe 'DslEventStore' do
         | 
| 11 | 
            +
              let(:instance) { EventStoreTest.new }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              context '#on_error' do
         | 
| 14 | 
            +
                it 'creates an error_proc' do
         | 
| 15 | 
            +
                  expect(instance.error_proc).to be_a_kind_of Proc
         | 
| 16 | 
            +
                  instance.on_error {}
         | 
| 17 | 
            +
                  expect(instance.error_proc).to be_a_kind_of Proc
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              context '#on_fail' do
         | 
| 22 | 
            +
                it 'creates an fail_proc' do
         | 
| 23 | 
            +
                  expect(instance.fail_proc).to be_a_kind_of Proc
         | 
| 24 | 
            +
                  instance.on_fail {}
         | 
| 25 | 
            +
                  expect(instance.fail_proc).to be_a_kind_of Proc
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              context '#on_success' do
         | 
| 30 | 
            +
                it 'creates an error_proc' do
         | 
| 31 | 
            +
                  expect(instance.success_proc).to be_a_kind_of Proc
         | 
| 32 | 
            +
                  instance.on_success {}
         | 
| 33 | 
            +
                  expect(instance.success_proc).to be_a_kind_of Proc
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              context '#always' do
         | 
| 38 | 
            +
                it 'creates an error_proc' do
         | 
| 39 | 
            +
                  expect(instance.always_proc).to be_a_kind_of Proc
         | 
| 40 | 
            +
                  instance.always {}
         | 
| 41 | 
            +
                  expect(instance.always_proc).to be_a_kind_of Proc
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/dsl/registry'
         | 
| 4 | 
            +
            require 'singularity_dsl/task'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            class TestTask < SingularityDsl::Task
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            describe 'DslRegistry' do
         | 
| 10 | 
            +
              before :each do
         | 
| 11 | 
            +
                @instance = SingularityDsl::Dsl::Registry.new
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              context '#initialize' do
         | 
| 15 | 
            +
                it 'creates empty task_list array' do
         | 
| 16 | 
            +
                  expect(@instance.run_list).to be_kind_of Array
         | 
| 17 | 
            +
                  expect(@instance.run_list).to be_empty
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              context '#add_task' do
         | 
| 22 | 
            +
                it 'adds tasks' do
         | 
| 23 | 
            +
                  task = TestTask.new
         | 
| 24 | 
            +
                  @instance.add_task task
         | 
| 25 | 
            +
                  expect(@instance.run_list).to_not be_empty
         | 
| 26 | 
            +
                  expect(@instance.run_list).to eql [task]
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                it 'fails when non-task is given' do
         | 
| 30 | 
            +
                  expect { @instance.add_task 'fail' }
         | 
| 31 | 
            +
                    .to raise_error ::RuntimeError, /Non-Task given - /
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                it 'fails when raw task is given' do
         | 
| 35 | 
            +
                  expect { @instance.add_task SingularityDsl::Task.new }
         | 
| 36 | 
            +
                    .to raise_error ::RuntimeError, /Cannot use raw Task objects - /
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/dsl/dsl'
         | 
| 4 | 
            +
            require 'singularity_dsl/dsl/runner'
         | 
| 5 | 
            +
            require 'singularity_dsl/runstate'
         | 
| 6 | 
            +
            require 'singularity_dsl/task'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            describe 'DslRunner' do
         | 
| 9 | 
            +
              let(:runner) { SingularityDsl::Dsl::Runner.new }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              context '#initialize' do
         | 
| 12 | 
            +
                it 'creates base state' do
         | 
| 13 | 
            +
                  expect(runner.state).to be_kind_of SingularityDsl::Runstate
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it 'creates base DSL' do
         | 
| 17 | 
            +
                  expect(runner.dsl).to be_kind_of SingularityDsl::Dsl::Dsl
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              context '#execute' do
         | 
| 22 | 
            +
                it 'taps & evaluates failed task.execute statuses correctly' do
         | 
| 23 | 
            +
                  task = SingularityDsl::Task.new
         | 
| 24 | 
            +
                  task.stub(:execute).and_return true
         | 
| 25 | 
            +
                  runner.dsl.registry.stub(:run_list).and_return [task]
         | 
| 26 | 
            +
                  expect(runner).to receive(:record_failure).with task
         | 
| 27 | 
            +
                  expect(runner).to receive(:resource_fail).with task
         | 
| 28 | 
            +
                  runner.execute
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              context '#load_ex_script' do
         | 
| 33 | 
            +
                it 'instance_evals contents of a file' do
         | 
| 34 | 
            +
                  ::File.stub(:read).and_return('0')
         | 
| 35 | 
            +
                  expect(runner.dsl).to receive(:instance_eval).with('0')
         | 
| 36 | 
            +
                  runner.load_ex_script 'foo'
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/dsl/utils'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class TestTask < SingularityDsl::Task
         | 
| 6 | 
            +
            end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            describe 'Utils' do
         | 
| 9 | 
            +
              include SingularityDsl::Dsl::Utils
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              context '#task_name' do
         | 
| 12 | 
            +
                it 'simplifies class names correctly' do
         | 
| 13 | 
            +
                  expect(task_name 'Foo::Bar::Blah').to eql 'Blah'
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              context '#task' do
         | 
| 18 | 
            +
                it 'returns lowercase sym representing DSL fx' do
         | 
| 19 | 
            +
                  expect(task TestTask).to eql :testtask
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              context '#task_list' do
         | 
| 24 | 
            +
                it 'returns array of tasks' do
         | 
| 25 | 
            +
                  tasks = task_list
         | 
| 26 | 
            +
                  expect(tasks).to be_a_kind_of Array
         | 
| 27 | 
            +
                  expect(tasks).to_not be_empty
         | 
| 28 | 
            +
                  tasks.each do |task|
         | 
| 29 | 
            +
                    expect(task <= SingularityDsl::Task).to eql true
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,72 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/git_helper'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe 'GitHelper' do
         | 
| 6 | 
            +
              before :each do
         | 
| 7 | 
            +
                SingularityDsl::GitHelper
         | 
| 8 | 
            +
                  .any_instance
         | 
| 9 | 
            +
                  .stub(:git_installed)
         | 
| 10 | 
            +
                  .and_return true
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
              let(:git) { SingularityDsl::GitHelper.new }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              context '#initialize' do
         | 
| 15 | 
            +
                it 'throws if git is not installed' do
         | 
| 16 | 
            +
                  SingularityDsl::GitHelper
         | 
| 17 | 
            +
                    .any_instance
         | 
| 18 | 
            +
                    .stub(:git_installed)
         | 
| 19 | 
            +
                    .and_return false
         | 
| 20 | 
            +
                  expect { SingularityDsl::GitHelper.new }
         | 
| 21 | 
            +
                    .to(raise_error ArgumentError, /git not installed/)
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              context '#clean_reset' do
         | 
| 26 | 
            +
                it 'fails when reset fails' do
         | 
| 27 | 
            +
                  git.stub(:reset).and_return 1
         | 
| 28 | 
            +
                  git.stub(:clean).and_return 0
         | 
| 29 | 
            +
                  expect { git.clean_reset }
         | 
| 30 | 
            +
                    .to(raise_error RuntimeError, /failed to clean/)
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                it 'fails when clean fails' do
         | 
| 34 | 
            +
                  git.stub(:reset).and_return 0
         | 
| 35 | 
            +
                  git.stub(:clean).and_return 1
         | 
| 36 | 
            +
                  expect { git.clean_reset }
         | 
| 37 | 
            +
                    .to(raise_error RuntimeError, /failed to clean/)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                it 'fails when both reset & clean fail' do
         | 
| 41 | 
            +
                  git.stub(:reset).and_return 1
         | 
| 42 | 
            +
                  git.stub(:clean).and_return 1
         | 
| 43 | 
            +
                  expect { git.clean_reset }
         | 
| 44 | 
            +
                    .to(raise_error RuntimeError, /failed to clean/)
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              context '#merge_remote' do
         | 
| 49 | 
            +
                it 'generates & calls correct cmd' do
         | 
| 50 | 
            +
                  git.stub(:remotes).and_return []
         | 
| 51 | 
            +
                  git.stub(:exec).with('git fetch --all')
         | 
| 52 | 
            +
                  git.stub(:exec).with('git merge bar/foo').and_return 0
         | 
| 53 | 
            +
                  git.merge_remote 'foo', 'bar'
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              context '#diff_remote' do
         | 
| 58 | 
            +
                it 'generates & calls correct cmd w/ single flag' do
         | 
| 59 | 
            +
                  git.stub(:remotes).and_return []
         | 
| 60 | 
            +
                  git.stub(:exec).with('git fetch --all')
         | 
| 61 | 
            +
                  git.stub(:exec).with('git diff bar/foo --flag').and_return 0
         | 
| 62 | 
            +
                  git.diff_remote 'foo', 'bar', '--flag'
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                it 'generates & calls correct cmd w/ multiple flags' do
         | 
| 66 | 
            +
                  git.stub(:remotes).and_return []
         | 
| 67 | 
            +
                  git.stub(:exec).with('git fetch --all')
         | 
| 68 | 
            +
                  git.stub(:exec).with('git diff bar/foo --flag --other').and_return 0
         | 
| 69 | 
            +
                  git.diff_remote 'foo', 'bar', %w(--flag, --other)
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/runstate'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe 'Runstate' do
         | 
| 6 | 
            +
              before :each do
         | 
| 7 | 
            +
                @instance = SingularityDsl::Runstate.new
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              context '#initialize' do
         | 
| 11 | 
            +
                it 'sets error & failed to false' do
         | 
| 12 | 
            +
                  expect(@instance.error).to eql false
         | 
| 13 | 
            +
                  expect(@instance.failed).to eql false
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it 'starts of with empty failure & error arrays' do
         | 
| 17 | 
            +
                  expect(@instance.errors).to be_kind_of Array
         | 
| 18 | 
            +
                  expect(@instance.errors).to be_empty
         | 
| 19 | 
            +
                  expect(@instance.failures).to be_kind_of Array
         | 
| 20 | 
            +
                  expect(@instance.failures).to be_empty
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              context '#add_failure' do
         | 
| 25 | 
            +
                it 'sets failed to true' do
         | 
| 26 | 
            +
                  @instance.add_failure 'failed'
         | 
| 27 | 
            +
                  expect(@instance.failed).to eql true
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                it 'adds failure' do
         | 
| 31 | 
            +
                  @instance.add_failure 'failed'
         | 
| 32 | 
            +
                  expect(@instance.failures).to eql ['failed']
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                it 'does NOT affect error state' do
         | 
| 36 | 
            +
                  @instance.add_failure 'failed'
         | 
| 37 | 
            +
                  expect(@instance.error).to eql false
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              context '#add_error' do
         | 
| 42 | 
            +
                it 'sets error to true' do
         | 
| 43 | 
            +
                  @instance.add_error 'error'
         | 
| 44 | 
            +
                  expect(@instance.error).to eql true
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                it 'adds error' do
         | 
| 48 | 
            +
                  @instance.add_error 'error'
         | 
| 49 | 
            +
                  expect(@instance.errors).to eql ['error']
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                it 'does NOT affect failed state' do
         | 
| 53 | 
            +
                  @instance.add_error 'error'
         | 
| 54 | 
            +
                  expect(@instance.failed).to eql false
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              context '#exit_code' do
         | 
| 59 | 
            +
                it 'returns 1 on error' do
         | 
| 60 | 
            +
                  @instance.add_error 'error'
         | 
| 61 | 
            +
                  expect(@instance.exit_code).to eql 1
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                it 'returns 1 on failure' do
         | 
| 65 | 
            +
                  @instance.add_failure 'failure'
         | 
| 66 | 
            +
                  expect(@instance.exit_code).to eql 1
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                it 'returns 0 otherwise' do
         | 
| 70 | 
            +
                  expect(@instance.exit_code).to eql 0
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/task'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe 'Task' do
         | 
| 6 | 
            +
              context '#initialize' do
         | 
| 7 | 
            +
                it 'does nothing if no block given' do
         | 
| 8 | 
            +
                  expect(SingularityDsl::Task).to_not receive :instance_eval
         | 
| 9 | 
            +
                  SingularityDsl::Task.new
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                it 'evals given block if given' do
         | 
| 13 | 
            +
                  expect(Kernel).to receive(:puts).with('woooooo')
         | 
| 14 | 
            +
                  SingularityDsl::Task.new { Kernel.puts 'woooooo' }
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              context '#validate_file' do
         | 
| 19 | 
            +
                it 'throws if file DNE' do
         | 
| 20 | 
            +
                  expect { SingularityDsl::Task.new.validate_file('asdbfadf') }
         | 
| 21 | 
            +
                    .to raise_error(ArgumentError, /Cannot find/)
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              context '#task_name' do
         | 
| 26 | 
            +
                it 'returns false' do
         | 
| 27 | 
            +
                  expect(SingularityDsl::Task.new.task_name).to eql false
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              context '#execute' do
         | 
| 32 | 
            +
                it 'throws' do
         | 
| 33 | 
            +
                  expect { SingularityDsl::Task.new.execute }
         | 
| 34 | 
            +
                    .to raise_error(RuntimeError,
         | 
| 35 | 
            +
                                    'SingularityDsl::Task::execute not implemented')
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              context '#failed_status' do
         | 
| 40 | 
            +
                it 'returns false for specific values' do
         | 
| 41 | 
            +
                  task = SingularityDsl::Task.new
         | 
| 42 | 
            +
                  expect(task.failed_status nil).to eql false
         | 
| 43 | 
            +
                  expect(task.failed_status 0).to eql false
         | 
| 44 | 
            +
                  expect(task.failed_status false).to eql false
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              context '#self.description' do
         | 
| 49 | 
            +
                it 'auto-generates task description' do
         | 
| 50 | 
            +
                  expect(SingularityDsl::Task.new.description)
         | 
| 51 | 
            +
                    .to eql 'Runs SingularityDsl::Task task'
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
| @@ -0,0 +1,119 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'singularity_dsl/tasks/shell_task'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe 'ShellTask' do
         | 
| 6 | 
            +
              let(:sh_task) { ShellTask.new }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              context '#initialize' do
         | 
| 9 | 
            +
                it 'starts with no conditionals' do
         | 
| 10 | 
            +
                  expect(sh_task.conditionals).to eql []
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                it 'has an echo notification as a default alt cmd' do
         | 
| 14 | 
            +
                  expect(sh_task.alternative)
         | 
| 15 | 
            +
                  .to eql 'echo "no alternative shell cmd defined"'
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              context '#condition' do
         | 
| 20 | 
            +
                it 'throws when non string given' do
         | 
| 21 | 
            +
                  expect { sh_task.condition([]) }.to raise_error
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                it 'appends the cmd to conditionals array' do
         | 
| 25 | 
            +
                  sh_task.condition 'woo'
         | 
| 26 | 
            +
                  expect(sh_task.conditionals).to eql ['woo']
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              context '#no_fail' do
         | 
| 31 | 
            +
                it 'fails when non-bool given' do
         | 
| 32 | 
            +
                  expect { sh_task.no_fail [] }.to raise_error
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              context '#alt' do
         | 
| 37 | 
            +
                it 'throws when non string given' do
         | 
| 38 | 
            +
                  expect { sh_task.alt([]) }.to raise_error
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                it 'sets alternative cmd' do
         | 
| 42 | 
            +
                  sh_task.alt 'woo'
         | 
| 43 | 
            +
                  expect(sh_task.alternative).to eql 'woo'
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              context '#command' do
         | 
| 48 | 
            +
                it 'sets commands!' do
         | 
| 49 | 
            +
                  cmd = 'echo "hi :)"'
         | 
| 50 | 
            +
                  sh_task.command cmd
         | 
| 51 | 
            +
                  expect(sh_task.shell.command).to eql cmd
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                it 'sets live_stream to STDOUT' do
         | 
| 55 | 
            +
                  cmd = 'echo "hi :)"'
         | 
| 56 | 
            +
                  sh_task.command cmd
         | 
| 57 | 
            +
                  expect(sh_task.shell.live_stream).to eql STDOUT
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              context '#task_name' do
         | 
| 62 | 
            +
                it 'returns command' do
         | 
| 63 | 
            +
                  expect(sh_task.task_name).to eql false
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                it 'returns command' do
         | 
| 67 | 
            +
                  cmd = 'echo "hi :)"'
         | 
| 68 | 
            +
                  sh_task.command cmd
         | 
| 69 | 
            +
                  expect(sh_task.task_name).to eql 'echo "hi :)"'
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
              context '#execute' do
         | 
| 74 | 
            +
                it 'errors when command() was never called' do
         | 
| 75 | 
            +
                  expect { sh_task.execute }.to raise_error
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                it 'runs command returns correct status, with conditionals' do
         | 
| 79 | 
            +
                  cmd = 'echo "hi :)"'
         | 
| 80 | 
            +
                  alt = 'echo "no"'
         | 
| 81 | 
            +
                  sh_task.live_stream = false
         | 
| 82 | 
            +
                  sh_task.command cmd
         | 
| 83 | 
            +
                  sh_task.alt alt
         | 
| 84 | 
            +
                  sh_task.condition 'ls'
         | 
| 85 | 
            +
                  expect(sh_task).to_not receive(:command).with(alt)
         | 
| 86 | 
            +
                  expect(sh_task.shell).to receive(:run_command)
         | 
| 87 | 
            +
                  expect(sh_task.shell).to receive(:exitstatus).and_return 0
         | 
| 88 | 
            +
                  expect(sh_task.execute).to eql 0
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                it 'runs alternative command' do
         | 
| 92 | 
            +
                  cmd = 'echo "hi :)"'
         | 
| 93 | 
            +
                  alt = 'echo "no"'
         | 
| 94 | 
            +
                  sh_task.command cmd
         | 
| 95 | 
            +
                  sh_task.alt alt
         | 
| 96 | 
            +
                  sh_task.condition 'ls -z'
         | 
| 97 | 
            +
                  expect(sh_task).to_not receive(:command).with(cmd)
         | 
| 98 | 
            +
                  expect(sh_task).to receive(:command).with(alt)
         | 
| 99 | 
            +
                  expect(sh_task.shell).to receive(:run_command)
         | 
| 100 | 
            +
                  expect(sh_task.shell).to receive(:exitstatus).and_return 0
         | 
| 101 | 
            +
                  expect(sh_task.execute).to eql 0
         | 
| 102 | 
            +
                end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                it 'runs command returns correct status, no conditionals' do
         | 
| 105 | 
            +
                  sh_task.command 'echo "hi :)"'
         | 
| 106 | 
            +
                  expect(sh_task.shell).to receive(:run_command)
         | 
| 107 | 
            +
                  expect(sh_task.shell).to receive(:exitstatus).and_return 0
         | 
| 108 | 
            +
                  expect(sh_task.execute).to eql 0
         | 
| 109 | 
            +
                end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                it 'returns 0 if no_fail set' do
         | 
| 112 | 
            +
                  sh_task.command 'ls -z'
         | 
| 113 | 
            +
                  sh_task.no_fail true
         | 
| 114 | 
            +
                  expect(sh_task.shell).to receive(:run_command)
         | 
| 115 | 
            +
                  expect(sh_task.shell).to_not receive(:exitstatus)
         | 
| 116 | 
            +
                  expect(sh_task.execute).to eql 0
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
              end
         | 
| 119 | 
            +
            end
         |