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.
Files changed (49) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +10 -0
  5. data/.singularityrc +12 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +52 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +38 -0
  10. data/Rakefile +24 -0
  11. data/bin/singularity_runner +5 -0
  12. data/lib/singularity_dsl/application.rb +76 -0
  13. data/lib/singularity_dsl/cli/cli.rb +125 -0
  14. data/lib/singularity_dsl/cli/table.rb +32 -0
  15. data/lib/singularity_dsl/dsl/batch.rb +23 -0
  16. data/lib/singularity_dsl/dsl/changeset.rb +39 -0
  17. data/lib/singularity_dsl/dsl/components.rb +7 -0
  18. data/lib/singularity_dsl/dsl/dsl.rb +71 -0
  19. data/lib/singularity_dsl/dsl/event_store.rb +34 -0
  20. data/lib/singularity_dsl/dsl/registry.rb +60 -0
  21. data/lib/singularity_dsl/dsl/runner.rb +67 -0
  22. data/lib/singularity_dsl/dsl/utils.rb +28 -0
  23. data/lib/singularity_dsl/errors.rb +35 -0
  24. data/lib/singularity_dsl/files.rb +20 -0
  25. data/lib/singularity_dsl/git_helper.rb +94 -0
  26. data/lib/singularity_dsl/runstate.rb +30 -0
  27. data/lib/singularity_dsl/stdout.rb +16 -0
  28. data/lib/singularity_dsl/task.rb +30 -0
  29. data/lib/singularity_dsl/tasks/rake.rb +31 -0
  30. data/lib/singularity_dsl/tasks/rspec.rb +32 -0
  31. data/lib/singularity_dsl/tasks/rubocop.rb +54 -0
  32. data/lib/singularity_dsl/tasks/shell_task.rb +90 -0
  33. data/lib/singularity_dsl/version.rb +6 -0
  34. data/lib/singularity_dsl.rb +9 -0
  35. data/singularity_dsl.gemspec +31 -0
  36. data/spec/singularity_dsl/application_spec.rb +92 -0
  37. data/spec/singularity_dsl/dsl/batch_spec.rb +30 -0
  38. data/spec/singularity_dsl/dsl/changeset_spec.rb +54 -0
  39. data/spec/singularity_dsl/dsl/dsl_spec.rb +45 -0
  40. data/spec/singularity_dsl/dsl/event_store_spec.rb +44 -0
  41. data/spec/singularity_dsl/dsl/registry_spec.rb +39 -0
  42. data/spec/singularity_dsl/dsl/runner_spec.rb +39 -0
  43. data/spec/singularity_dsl/dsl/stubs/tasks/dummy_task.rb +4 -0
  44. data/spec/singularity_dsl/dsl/utils_spec.rb +33 -0
  45. data/spec/singularity_dsl/git_helper_spec.rb +72 -0
  46. data/spec/singularity_dsl/runstate_spec.rb +73 -0
  47. data/spec/singularity_dsl/task_spec.rb +54 -0
  48. data/spec/singularity_dsl/tasks/shell_task_spec.rb +119 -0
  49. metadata +231 -0
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Yzc0YjUwZWE2NmJhNGEzMzkyMzQyMjllY2VlOTk4Yzg3ZjMwYzgxZQ==
5
+ data.tar.gz: !binary |-
6
+ YThjODFlMDNhMTUwYTI3N2YxMDlmOWRhMGNjNzQ5MjE4ZDExNDczMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MmY2NWFhZWY3ZTA5ZWRjZmU1MjVjYjUwNmI4MmM2YWNkNWI0YmRkYmJjNmNj
10
+ ZTljYjM3NmIwYzBmMTM4YjNlNjk0OTBkOWY5N2MwM2M4MTEwYTA4OTljNzY2
11
+ ZjJlMGZmN2ZmYTJhNWNiOWZiMjVmNTM0ZDdjNTliZDhlMjdmZWU=
12
+ data.tar.gz: !binary |-
13
+ YzlkYmNiMDM2YzI2MjQzNzY1NWEwMWQ5OGQ2MDJjOTYyMDg0MzQ2YmJhY2E2
14
+ YTliNzYxNjU0YmNmMzhjNDA3NmRmMDUwODg4NzhkOGE3YzdjN2JhYjNlNDk1
15
+ YzJjMzUwNDkwMWZiZTNjYjE3NGJiYTJiYjEyZjM0ZThiZmY0ZmE=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ InstalledFiles
7
+ _yardoc
8
+ coverage
9
+ doc/
10
+ lib/bundler/man
11
+ pkg
12
+ rdoc
13
+ spec/reports
14
+ test/tmp
15
+ test/version_tmp
16
+ tmp
17
+ .vendor/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,10 @@
1
+ AllCops:
2
+ Includes:
3
+ - Rakefile
4
+ - Gemfile
5
+ Excludes:
6
+ - bin/*
7
+
8
+ MethodLength:
9
+ Max: 15
10
+ CountComments: false
data/.singularityrc ADDED
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+
3
+ batch :build do
4
+ shelltask { command 'bundle' }
5
+ end
6
+
7
+ batch :test do
8
+ rubocop
9
+ rspec
10
+ end
11
+
12
+ invoke_batch :test
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in singularity_dsl.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,52 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ singularity_dsl (1.2.5)
5
+ mixlib-shellout (~> 1.4)
6
+ rainbow (~> 2.0.0)
7
+ rake (~> 10.3)
8
+ rspec (~> 2.6)
9
+ rubocop (~> 0.23.0)
10
+ terminal-table (~> 1.4)
11
+ thor (~> 0.19)
12
+
13
+ GEM
14
+ remote: https://rubygems.org/
15
+ specs:
16
+ ast (2.0.0)
17
+ diff-lcs (1.2.5)
18
+ gem-release (0.7.3)
19
+ json (1.8.1)
20
+ mixlib-shellout (1.4.0)
21
+ parser (2.1.9)
22
+ ast (>= 1.1, < 3.0)
23
+ slop (~> 3.4, >= 3.4.5)
24
+ powerpack (0.0.9)
25
+ rainbow (2.0.0)
26
+ rake (10.3.2)
27
+ rspec (2.99.0)
28
+ rspec-core (~> 2.99.0)
29
+ rspec-expectations (~> 2.99.0)
30
+ rspec-mocks (~> 2.99.0)
31
+ rspec-core (2.99.1)
32
+ rspec-expectations (2.99.2)
33
+ diff-lcs (>= 1.1.3, < 2.0)
34
+ rspec-mocks (2.99.2)
35
+ rubocop (0.23.0)
36
+ json (>= 1.7.7, < 2)
37
+ parser (~> 2.1.9)
38
+ powerpack (~> 0.0.6)
39
+ rainbow (>= 1.99.1, < 3.0)
40
+ ruby-progressbar (~> 1.4)
41
+ ruby-progressbar (1.5.1)
42
+ slop (3.6.0)
43
+ terminal-table (1.4.5)
44
+ thor (0.19.1)
45
+
46
+ PLATFORMS
47
+ ruby
48
+
49
+ DEPENDENCIES
50
+ bundler (~> 1.3)
51
+ gem-release
52
+ singularity_dsl!
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 chr0n1x
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # SingularityDsl
2
+
3
+ A DSL lib for your [SingularityCI](https://github.com/behance/singularity) instance.
4
+ Inspired by TravisCI's `.travis.yml`
5
+
6
+ ...Except with the full power of Ruby, its gems & your awesome JenkinsCI machine(s)
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ gem 'singularity_dsl'
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install singularity_dsl
21
+
22
+ ## Usage
23
+
24
+ TODO: cause there are a lot of things that I want to do
25
+
26
+ ## Contributing
27
+
28
+ 1. Fork it
29
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
30
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
31
+ 4. Push to the branch (`git push origin my-new-feature`)
32
+ 5. Create new Pull Request
33
+
34
+ Make sure you run the tests!
35
+
36
+ ```
37
+ bundle exec rake test:all
38
+ ```
data/Rakefile ADDED
@@ -0,0 +1,24 @@
1
+ #!/user/bin/env rake
2
+ # encoding: utf-8
3
+
4
+ require 'bundler/gem_tasks'
5
+ require 'rubocop/rake_task'
6
+ require 'rspec/core/rake_task'
7
+
8
+ namespace :test do
9
+
10
+ RuboCop::RakeTask.new(:rubocop)
11
+
12
+ RSpec::Core::RakeTask.new(:rspec) do |t|
13
+ t.rspec_opts = '--format documentation --color'
14
+ end
15
+
16
+ desc 'Run RSpec with code coverage'
17
+ task :coverage do
18
+ ENV['COVERAGE'] = 'true'
19
+ Rake::Task['test:rspec'].execute
20
+ end
21
+
22
+ desc 'Run rubocop and rspec test'
23
+ task all: [:rubocop, :rspec]
24
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'singularity_dsl/cli/cli'
5
+ SingularityDsl::Cli::Cli.start
@@ -0,0 +1,76 @@
1
+ # encoding: utf-8
2
+
3
+ require 'singularity_dsl/dsl/runner'
4
+ require 'singularity_dsl/errors'
5
+ require 'rainbow'
6
+
7
+ module SingularityDsl
8
+ # application singleton - environment container for script
9
+ class Application
10
+ include SingularityDsl::Errors
11
+
12
+ attr_reader :runner, :dsl
13
+
14
+ def initialize
15
+ @runner = Dsl::Runner.new
16
+ end
17
+
18
+ def load_script(script)
19
+ @runner.load_ex_script script
20
+ end
21
+
22
+ def load_tasks(path)
23
+ @runner.dsl.load_tasks_in_path path
24
+ end
25
+
26
+ def run(batch = false, pass_errors = false)
27
+ begin
28
+ @runner.execute batch, pass_errors
29
+ # resource failed, :all_tasks not specified
30
+ rescue ResourceFail => failure
31
+ log_resource_fail failure
32
+ # resource actually failed & threw error
33
+ rescue ResourceError => error
34
+ log_resource_error error
35
+ ensure
36
+ post_task_runner_actions
37
+ end
38
+ @runner.state.exit_code
39
+ end
40
+
41
+ def post_task_runner_actions
42
+ script_warn @runner.state.failures if @runner.state.failed
43
+ script_error @runner.state.errors if @runner.state.error
44
+ @runner.post_actions
45
+ end
46
+
47
+ def change_list(list)
48
+ list = list.split("\n") if list.is_a? String
49
+ list = [*list]
50
+ list.sort!
51
+ @runner.dsl.changeset = list
52
+ end
53
+
54
+ private
55
+
56
+ def log_resource_fail(failure)
57
+ script_warn 'Script run failed!'
58
+ script_warn failure.message
59
+ failure.backtrace.each { |line| puts line }
60
+ end
61
+
62
+ def log_resource_error(error)
63
+ script_error 'Script run error!'
64
+ script_error error.message
65
+ error.backtrace.each { |line| puts line }
66
+ end
67
+
68
+ def script_warn(message)
69
+ puts Rainbow(message).yellow
70
+ end
71
+
72
+ def script_error(message)
73
+ puts Rainbow(message).red
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,125 @@
1
+ # encoding: utf-8
2
+
3
+ require 'singularity_dsl/application'
4
+ require 'singularity_dsl/cli/table'
5
+ require 'singularity_dsl/dsl/dsl'
6
+ require 'singularity_dsl/errors'
7
+ require 'singularity_dsl/git_helper'
8
+ require 'singularity_dsl/stdout'
9
+ require 'thor'
10
+
11
+ module SingularityDsl
12
+ # CLI
13
+ module Cli
14
+ # CLI Thor app
15
+ class Cli < Thor
16
+ include Errors
17
+ include Stdout
18
+ include Table
19
+
20
+ def initialize(*args)
21
+ super
22
+ @diff_list = nil
23
+ @git = GitHelper.new
24
+ end
25
+
26
+ class_option :task_path,
27
+ aliases: '-t',
28
+ type: :string,
29
+ desc: 'Directory where custom tasks are defined',
30
+ default: './.singularity'
31
+ class_option :all_tasks,
32
+ aliases: '-a',
33
+ type: :boolean,
34
+ desc: 'Do not stop on task failure(s), collect all results'
35
+ class_option :script,
36
+ aliases: '-s',
37
+ type: :string,
38
+ desc: 'Specify path to a .singularityrc file',
39
+ default: './.singularityrc'
40
+
41
+ # TASKS COMMAND
42
+ desc 'tasks', 'Available tasks.'
43
+ def tasks
44
+ dsl = Dsl::Dsl.new
45
+ dsl.load_tasks_in_path tasks_path if ::File.exist? tasks_path
46
+ table = task_table
47
+ dsl.task_list.each do |task|
48
+ table.add_row task_row(dsl, task)
49
+ end
50
+ puts table
51
+ end
52
+
53
+ # TEST COMMAND
54
+ desc 'test', 'Run singularity script.'
55
+ def test(app = nil)
56
+ app ||= setup_app(Application.new, singularity_script, tasks_path)
57
+ exit(app.run false, options[:all_tasks])
58
+ end
59
+
60
+ # BATCH COMMAND
61
+ desc 'batch BATCH_NAME', 'Run single task batch in the script.'
62
+ def batch(batch, app = nil)
63
+ app ||= setup_app(Application.new, singularity_script, tasks_path)
64
+ exit(app.run batch, options[:all_tasks])
65
+ end
66
+
67
+ # TEST-MERGE COMMAND
68
+ desc 'testmerge FORK BRANCH INTO_BRANCH [INTO_FORK]',
69
+ 'Perform a test merge into the local repo.'
70
+ option :run_task,
71
+ aliases: '-r',
72
+ type: :string,
73
+ desc: 'Run a batch after. If nothing given, script is run as-is',
74
+ default: ''
75
+ def testmerge(git_fork, branch, base_branch, base_fork = nil)
76
+ test_merge git_fork, branch, base_branch, base_fork
77
+ info 'File changesets'
78
+ puts @git.diff_remote base_branch, base_fork, '--name-status'
79
+ @diff_list = @git.diff_remote base_branch, base_fork, '--name-only'
80
+ @git.remove_remote git_fork
81
+ @git.remove_remote base_fork
82
+ batch target_run_task if options[:run_task]
83
+ end
84
+
85
+ private
86
+
87
+ def test_merge(git_fork, branch, base_branch, base_fork)
88
+ @git.clean_reset
89
+ @git.add_remote base_fork
90
+ @git.checkout_remote base_branch, base_fork
91
+ @git.add_remote git_fork
92
+ @git.merge_remote branch, git_fork
93
+ end
94
+
95
+ def target_run_task
96
+ target = options[:run_task]
97
+ target = false if target.eql? ''
98
+ target
99
+ end
100
+
101
+ def setup_app(app, singularity_script, tasks_path)
102
+ if File.exist? tasks_path
103
+ info "Loading tasks from #{tasks_path}"
104
+ app.load_tasks tasks_path
105
+ end
106
+ unless @diff_list.nil?
107
+ info 'Running with diff-list'
108
+ puts @diff_list
109
+ app.change_list @diff_list
110
+ end
111
+ info "Loading CI script from #{singularity_script} ..."
112
+ app.load_script singularity_script
113
+ app
114
+ end
115
+
116
+ def singularity_script
117
+ File.expand_path options[:script]
118
+ end
119
+
120
+ def tasks_path
121
+ File.expand_path options[:task_path]
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rainbow'
4
+ require 'terminal-table'
5
+
6
+ module SingularityDsl
7
+ # CLI
8
+ module Cli
9
+ # util CLI table formatting fxs
10
+ module Table
11
+ private
12
+
13
+ def task_row(dsl, task_class)
14
+ name = dsl.task_name task_class
15
+ task_name = dsl.task task_class
16
+ desc = task_class.new.description
17
+ [name, task_name, desc]
18
+ end
19
+
20
+ def task_table
21
+ headers = [
22
+ Rainbow('Task').yellow,
23
+ Rainbow('Task Function').yellow,
24
+ Rainbow('Description').yellow
25
+ ]
26
+ table = Terminal::Table.new headings: headers
27
+ table.style = { border_x: '', border_y: '', border_i: '' }
28
+ table
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ require 'singularity_dsl/task'
4
+
5
+ module SingularityDsl
6
+ # DSL classes & fxs
7
+ module Dsl
8
+ # wrapper for a batch of tasks
9
+ class Batch < Task
10
+ attr_reader :name
11
+
12
+ def initialize(name, context, &block)
13
+ @name = name.to_sym
14
+ @context = context
15
+ @proc = block
16
+ end
17
+
18
+ def execute
19
+ @context.instance_eval(&@proc)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+
3
+ module SingularityDsl
4
+ # DSL classes & fxs
5
+ module Dsl
6
+ # methods & data to store & describe changesets
7
+ module Changeset
8
+ attr_writer :changeset
9
+
10
+ @changeset = []
11
+ @existing = nil
12
+
13
+ def files_changed?(types)
14
+ types = [*types]
15
+ @changeset ||= []
16
+ types.any? do |type|
17
+ @changeset.any? { |file| file.match("\.#{type}$") }
18
+ end
19
+ end
20
+
21
+ def changed_files(types)
22
+ types = [*types]
23
+ @changeset ||= []
24
+ types.flat_map do |type|
25
+ existing_files.select { |file| file.match("\.#{type}$") }
26
+ end.sort
27
+ end
28
+
29
+ private
30
+
31
+ def existing_files
32
+ if @existing.nil?
33
+ @existing = @changeset.select { |file| ::File.exist?(file) }
34
+ end
35
+ @existing
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,7 @@
1
+ # encoding: utf-8
2
+
3
+ require 'singularity_dsl/dsl/changeset'
4
+ require 'singularity_dsl/dsl/dsl'
5
+ require 'singularity_dsl/dsl/event_store'
6
+ require 'singularity_dsl/dsl/registry'
7
+ require 'singularity_dsl/dsl/runner'
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+
3
+ require 'singularity_dsl/files'
4
+ require 'singularity_dsl/dsl/changeset'
5
+ require 'singularity_dsl/dsl/event_store'
6
+ require 'singularity_dsl/dsl/registry'
7
+ require 'singularity_dsl/dsl/utils'
8
+
9
+ module SingularityDsl
10
+ # DSL classes & fxs
11
+ module Dsl
12
+ # wrapper for DSL
13
+ class Dsl
14
+ include Changeset
15
+ include EventStore
16
+ include Files
17
+ include Utils
18
+
19
+ attr_reader :registry
20
+
21
+ def initialize
22
+ super
23
+ @registry = Registry.new
24
+ load_tasks_in_path default_task_dir
25
+ end
26
+
27
+ def define_task(klass)
28
+ raise_task_def_error klass if task_defined klass
29
+ # because define_method is private
30
+ define_singleton_method(task klass) do |&block|
31
+ @registry.add_task klass.new(&block)
32
+ end
33
+ end
34
+
35
+ def load_tasks_in_path(path)
36
+ base_tasks = task_list
37
+ files_in_path(path).each do |file|
38
+ SingularityDsl.module_eval(::File.read file)
39
+ end
40
+ load_tasks(task_list - base_tasks)
41
+ end
42
+
43
+ def invoke_batch(name)
44
+ @registry.add_batch_to_runlist name
45
+ end
46
+
47
+ def batch(name, &block)
48
+ @registry.batch(name, self, &block)
49
+ end
50
+
51
+ private
52
+
53
+ def raise_task_def_error(klass)
54
+ fail "task name clash for #{klass}"
55
+ end
56
+
57
+ def task_defined(klass)
58
+ singleton_methods(false).include?(task klass)
59
+ end
60
+
61
+ def load_tasks(list)
62
+ list.each { |klass| define_task klass }
63
+ end
64
+
65
+ def default_task_dir
66
+ dir = ::File.dirname __FILE__
67
+ ::File.join dir, '..', 'tasks'
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+
3
+ module SingularityDsl
4
+ # DSL classes & fxs
5
+ module Dsl
6
+ # default methods to for DSL objects
7
+ module EventStore
8
+ attr_reader :error_proc, :fail_proc, :success_proc, :always_proc
9
+
10
+ def initialize
11
+ @error_proc = proc {}
12
+ @fail_proc = proc {}
13
+ @success_proc = proc {}
14
+ @always_proc = proc {}
15
+ end
16
+
17
+ def on_error(&block)
18
+ @error_proc = Proc.new(&block)
19
+ end
20
+
21
+ def on_fail(&block)
22
+ @fail_proc = Proc.new(&block)
23
+ end
24
+
25
+ def on_success(&block)
26
+ @success_proc = Proc.new(&block)
27
+ end
28
+
29
+ def always(&block)
30
+ @always_proc = Proc.new(&block)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ require 'singularity_dsl/dsl/batch'
4
+ require 'singularity_dsl/task'
5
+
6
+ module SingularityDsl
7
+ # DSL classes & fxs
8
+ module Dsl
9
+ # wrapper for DSL
10
+ class Registry
11
+ def initialize
12
+ @task_list = []
13
+ @batch_list = {}
14
+ end
15
+
16
+ def add_task(task)
17
+ fail_non_type('Task', task) unless task.is_a? Task
18
+ fail_raw_type('Task', task) unless task.class < Task
19
+ @task_list.push task
20
+ end
21
+
22
+ def batch(name, context, &block)
23
+ batch_exists(name) if @batch_list.key? name.to_sym
24
+ batch = Batch.new(name.to_sym, context, &block)
25
+ @batch_list[name.to_sym] = batch
26
+ end
27
+
28
+ def add_batch_to_runlist(name)
29
+ batch_dne name unless @batch_list[name.to_sym]
30
+ @batch_list[name.to_sym].execute
31
+ end
32
+
33
+ def run_list(batch = false)
34
+ if batch
35
+ @task_list = []
36
+ add_batch_to_runlist batch
37
+ end
38
+ @task_list
39
+ end
40
+
41
+ private
42
+
43
+ def batch_dne(name)
44
+ fail "Cannot invoke batch '#{name}', does not exist"
45
+ end
46
+
47
+ def batch_exists(name)
48
+ fail "A task batch with the name '#{name}' already exists"
49
+ end
50
+
51
+ def fail_non_type(type, task)
52
+ fail "Non-#{type} given - #{task}"
53
+ end
54
+
55
+ def fail_raw_type(type, task)
56
+ fail "Cannot use raw #{type} objects - #{task}"
57
+ end
58
+ end
59
+ end
60
+ end