pbs_job 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fc1d00b54a1f3831231d2298367a8d6c04146b27
4
+ data.tar.gz: d3d52813019b0a936c1cbb679f93db234ffb087a
5
+ SHA512:
6
+ metadata.gz: b57061cfd8bc858dce808277bbfe3353b663fd72f4a29f572ce8a01fa7aaa1ae4b99a47713a3b6090d03106aa48d39699b652bd1d10ebbd73649d734a893c8e9
7
+ data.tar.gz: d3ba18b5ae94087a58b85210d55923e7467c89814a7378e098ffad66f39f237c69a6c27f3f9581675afc6cfbfc20f8e2ba5f511366321006996e0194831772ec
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ .DS_Store
2
+ results.html
3
+ pkg
4
+ html
5
+ coverage
6
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pbs_job.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Dustin Morrill
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,29 @@
1
+ # PbsJob
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'pbs_job'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install pbs_job
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler'
3
+
4
+ require 'rake/clean'
5
+ require 'rake/testtask'
6
+
7
+ include Rake::DSL
8
+
9
+ Bundler::GemHelper.install_tasks
10
+
11
+ Rake::TestTask.new do |t|
12
+ t.libs << "lib" << 'spec/support'
13
+ t.test_files = FileList['spec/**/*_spec.rb']
14
+ t.verbose = false
15
+ t.warning = false # pry-rescue has a lot of warnings
16
+ end
17
+
18
+ task :default => [:test]
data/bin/pbs_job ADDED
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env ruby
2
+ require "rubygems"
3
+ require 'thor'
4
+ require 'date'
5
+
6
+ module PbsJob
7
+ class New < Thor::Group
8
+ include Thor::Actions
9
+
10
+ argument :name, :desc => 'Name of the new job.'
11
+ argument :email_address, :desc => 'Email to which to send PBS alerts.'
12
+
13
+ class_option(
14
+ :link_results,
15
+ {
16
+ :desc => 'Directory to which to redirect results',
17
+ :default => nil,
18
+ :aliases => 'r'
19
+ }
20
+ )
21
+ class_option(
22
+ :script,
23
+ {
24
+ :desc => 'Type of script to make the task script',
25
+ :default => '<script type>',
26
+ :aliases => 's'
27
+ }
28
+ )
29
+
30
+ def self.source_root
31
+ File.expand_path('../../', __FILE__)
32
+ end
33
+
34
+ def gen_root
35
+ empty_directory full_name
36
+ end
37
+
38
+ def qsub_script
39
+ create_file_from_template 'job.qsub'
40
+ end
41
+
42
+ def pbs_script
43
+ create_file_from_template 'job.pbs'
44
+ end
45
+
46
+ def task
47
+ create_file_from_template 'task'
48
+ end
49
+
50
+ def results
51
+ results_path = File.join full_name, 'results'
52
+ if options[:link_results]
53
+ create_link(results_path, options[:link_results])
54
+ else
55
+ empty_directory results_path
56
+ end
57
+ end
58
+
59
+ def streams
60
+ empty_directory streams_path
61
+ end
62
+
63
+ private
64
+
65
+ def create_file_from_template(file_name)
66
+ template(
67
+ "templates/#{file_name}.tt",
68
+ "#{full_name}/#{file_name}"
69
+ )
70
+ end
71
+
72
+ # @returns [String] Name with date appended
73
+ def full_name
74
+ @full_name ||= -> do
75
+ today = Date.today
76
+ month = Date::MONTHNAMES[today.month].downcase
77
+ "#{name}.#{month}#{today.day}_#{today.year}"
78
+ end.call
79
+ end
80
+
81
+ def abs_job_root
82
+ @abs_job_root ||= File.expand_path(full_name)
83
+ end
84
+
85
+ def streams_path
86
+ @streams_path ||= File.join full_name, 'streams'
87
+ end
88
+
89
+ def abs_stream_prefix
90
+ @abs_stream_prefix ||= File.join abs_job_root, streams_path, full_name
91
+ end
92
+ end
93
+
94
+ class PbsJob < Thor
95
+ map 'n' => :new
96
+
97
+ register(
98
+ New,
99
+ 'new',
100
+ 'new NAME EMAIL_ADDRESS [OPTIONS]',
101
+ "Creates a new PBS job with the name NAME and arranges for PBS alerts to be sent to EMAIL_ADDRESS, customized by OPTIONS"
102
+ )
103
+ tasks["new"].options = New.class_options
104
+ end
105
+ end
106
+
107
+ PbsJob::PbsJob.start(ARGV)
@@ -0,0 +1,3 @@
1
+ module PbsJob
2
+ VERSION = "0.0.1"
3
+ end
data/lib/pbs_job.rb ADDED
@@ -0,0 +1,4 @@
1
+ require_relative "pbs_job/version"
2
+
3
+ module PbsJob
4
+ end
data/pbs_job.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pbs_job/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pbs_job"
8
+ spec.version = PbsJob::VERSION
9
+ spec.authors = ["Dustin Morrill"]
10
+ spec.email = ["morrill@ualberta.ca"]
11
+ spec.description = %q{PBS/Torque job generator}
12
+ spec.summary = %q{Creates a directory and file structure for a well organized PBS/Torque job.}
13
+ spec.homepage = "https://github.com/dmorrill10/pbs_job"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'thor', '~> 0.18.1'
22
+
23
+ spec.add_development_dependency "bundler", '~> 1.3.5'
24
+ spec.add_development_dependency 'bahia', '~> 0.7.2'
25
+ spec.add_development_dependency 'rake', '~> 10.1.0'
26
+ spec.add_development_dependency 'minitest', '~> 5.0.6'
27
+ spec.add_development_dependency 'awesome_print', '~> 1.1.0'
28
+ spec.add_development_dependency 'simplecov', '~> 0.7.1'
29
+ end
@@ -0,0 +1,128 @@
1
+ require_relative 'support/spec_helper'
2
+
3
+ require "date"
4
+ require 'tmpdir'
5
+
6
+ describe 'pbs_job' do
7
+
8
+ HELP = <<-HELP
9
+ Commands:
10
+ pbs_job help [COMMAND] # Describe available commands or ...
11
+ pbs_job new NAME EMAIL_ADDRESS [OPTIONS] # Creates a new PBS job with the ...
12
+
13
+ HELP
14
+ NAME = 'test_job'
15
+ EMAIL_ADDRESS = 'email@address'
16
+ TODAY = Date.today
17
+ MONTH = Date::MONTHNAMES[TODAY.month].downcase
18
+ JOB_ROOT = "#{NAME}.#{MONTH}#{TODAY.day}_#{TODAY.year}"
19
+ QSUB_SCRIPT = "#{JOB_ROOT}/job.qsub"
20
+ PBS_SCRIPT = "#{JOB_ROOT}/job.pbs"
21
+ TASK = "#{JOB_ROOT}/task"
22
+ RESULTS = "#{JOB_ROOT}/results"
23
+ STREAMS = "#{JOB_ROOT}/streams"
24
+
25
+ it 'prints usage and options without arguments' do
26
+ pbs_job
27
+ stdout.must_equal HELP
28
+ end
29
+ it 'prints help' do
30
+ pbs_job 'help'
31
+ stdout.must_equal HELP
32
+ end
33
+
34
+ describe 'new' do
35
+ it 'prints help' do
36
+ pbs_job 'help new'
37
+ stdout.must_equal <<-GEN_HELP
38
+ Usage:
39
+ pbs_job new NAME EMAIL_ADDRESS [OPTIONS]
40
+
41
+ Options:
42
+ r, [--link-results=LINK_RESULTS] # Directory to which to redirect results
43
+ s, [--script=SCRIPT] # Type of script to make the task script
44
+ # Default: <script type>
45
+
46
+ Creates a new PBS job with the name NAME and arranges for PBS alerts to be sent to EMAIL_ADDRESS, customized by OPTIONS
47
+ GEN_HELP
48
+ end
49
+ it 'requires name argument' do
50
+ pbs_job 'new'
51
+ stderr.must_equal "No value provided for required arguments 'name', 'email_address'\n"
52
+ end
53
+ it 'requires an email argument' do
54
+ pbs_job "new #{NAME}"
55
+ stderr.must_equal "No value provided for required arguments 'email_address'\n"
56
+ end
57
+ it 'creates a file structure for job components' do
58
+ in_tmp_dir do
59
+ pbs_job "new #{NAME} #{EMAIL_ADDRESS}"
60
+ stdout.must_equal <<-DIR
61
+ \e[1m\e[32m create\e[0m #{JOB_ROOT}
62
+ \e[1m\e[32m create\e[0m #{QSUB_SCRIPT}
63
+ \e[1m\e[32m create\e[0m #{PBS_SCRIPT}
64
+ \e[1m\e[32m create\e[0m #{TASK}
65
+ \e[1m\e[32m create\e[0m #{RESULTS}
66
+ \e[1m\e[32m create\e[0m #{STREAMS}
67
+ DIR
68
+ File.directory?(JOB_ROOT).must_equal true
69
+ File.file?(QSUB_SCRIPT).must_equal true
70
+ File.file?(PBS_SCRIPT).must_equal true
71
+ File.file?(TASK).must_equal true
72
+ File.directory?(RESULTS).must_equal true
73
+ File.directory?(STREAMS).must_equal true
74
+ end
75
+ end
76
+ end
77
+ describe 'script type option' do
78
+ it '--script allows specification of the script type of task' do
79
+ in_tmp_dir do
80
+ pbs_job "new #{NAME} #{EMAIL_ADDRESS} --script=bash"
81
+ stdout.must_equal <<-DIR
82
+ \e[1m\e[32m create\e[0m #{JOB_ROOT}
83
+ \e[1m\e[32m create\e[0m #{QSUB_SCRIPT}
84
+ \e[1m\e[32m create\e[0m #{PBS_SCRIPT}
85
+ \e[1m\e[32m create\e[0m #{TASK}
86
+ \e[1m\e[32m create\e[0m #{RESULTS}
87
+ \e[1m\e[32m create\e[0m #{STREAMS}
88
+ DIR
89
+ File.directory?(JOB_ROOT).must_equal true
90
+ File.file?(QSUB_SCRIPT).must_equal true
91
+ File.file?(PBS_SCRIPT).must_equal true
92
+ File.file?(TASK).must_equal true
93
+ File.directory?(RESULTS).must_equal true
94
+ File.directory?(STREAMS).must_equal true
95
+ end
96
+ end
97
+ end
98
+ describe 'results link option' do
99
+ it '--link-results allows redirection of results' do
100
+ linked_results = '/scratch/results'
101
+ in_tmp_dir do
102
+ pbs_job "new #{NAME} #{EMAIL_ADDRESS} --link-results=#{linked_results}"
103
+ stdout.must_equal <<-DIR
104
+ \e[1m\e[32m create\e[0m #{JOB_ROOT}
105
+ \e[1m\e[32m create\e[0m #{QSUB_SCRIPT}
106
+ \e[1m\e[32m create\e[0m #{PBS_SCRIPT}
107
+ \e[1m\e[32m create\e[0m #{TASK}
108
+ \e[1m\e[32m create\e[0m #{RESULTS}
109
+ \e[1m\e[32m create\e[0m #{STREAMS}
110
+ DIR
111
+ File.directory?(JOB_ROOT).must_equal true
112
+ File.file?(QSUB_SCRIPT).must_equal true
113
+ File.file?(PBS_SCRIPT).must_equal true
114
+ File.file?(TASK).must_equal true
115
+ File.symlink?(RESULTS).must_equal true
116
+ File.readlink(RESULTS).must_equal linked_results
117
+ File.directory?(STREAMS).must_equal true
118
+ end
119
+ end
120
+ end
121
+
122
+ def in_tmp_dir
123
+ Dir.mktmpdir do |dir|
124
+ Dir.chdir dir
125
+ yield dir if block_given?
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,21 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'minitest/autorun'
5
+ require 'minitest/spec'
6
+
7
+ begin
8
+ require 'awesome_print'
9
+ module Minitest::Assertions
10
+ def mu_pp(obj)
11
+ obj.awesome_inspect
12
+ end
13
+ end
14
+ rescue LoadError
15
+ end
16
+
17
+ require 'bahia'
18
+
19
+ class MiniTest::Spec
20
+ include Bahia
21
+ end
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env bash
2
+ #PBS -m abe -M <%= email_address %>
3
+ cd <%= abs_job_root %>
4
+ ./task > "<%= abs_stream_prefix %>.out" 2> "<%= abs_stream_prefix %>.err"
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+ # This script runs job.pbs with qsub. Customize as necessary
3
+ qsub job.pbs -N "<%= full_name %>" -e "<%= abs_stream_prefix %>.e" -o "<%= abs_stream_prefix %>.o"
data/templates/task.tt ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env <%= options[:script] %>
2
+
3
+ # This is the meat of the job.
4
+ # Please place the task you'd like your job to run.
5
+ # For example, this is where you would put
6
+ # experiment logic.
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pbs_job
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dustin Morrill
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.18.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.18.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.5
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: bahia
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 0.7.2
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 0.7.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 10.1.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 10.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 5.0.6
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 5.0.6
83
+ - !ruby/object:Gem::Dependency
84
+ name: awesome_print
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.1.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 1.1.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 0.7.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.1
111
+ description: PBS/Torque job generator
112
+ email:
113
+ - morrill@ualberta.ca
114
+ executables:
115
+ - pbs_job
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - .gitignore
120
+ - Gemfile
121
+ - LICENSE.txt
122
+ - README.md
123
+ - Rakefile
124
+ - bin/pbs_job
125
+ - lib/pbs_job.rb
126
+ - lib/pbs_job/version.rb
127
+ - pbs_job.gemspec
128
+ - spec/pbs_job_spec.rb
129
+ - spec/support/spec_helper.rb
130
+ - templates/job.pbs.tt
131
+ - templates/job.qsub.tt
132
+ - templates/task.tt
133
+ homepage: https://github.com/dmorrill10/pbs_job
134
+ licenses:
135
+ - MIT
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.0.3
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: Creates a directory and file structure for a well organized PBS/Torque job.
157
+ test_files:
158
+ - spec/pbs_job_spec.rb
159
+ - spec/support/spec_helper.rb
160
+ has_rdoc: