osc-machete 2.0.0.pre2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 00b1524199570027e478eda1a0cc138cfe19c176
4
- data.tar.gz: 33984c5911b6d573ccb152def90b129bc4d1573c
2
+ SHA256:
3
+ metadata.gz: e83b320b7f61439e04b289507d2731cebf2bb46209b90deafebb83319cdeb81c
4
+ data.tar.gz: 93f38ebb3a88edb94ee029bba3827408b4b48a54874ceda731e36d49be724acc
5
5
  SHA512:
6
- metadata.gz: bb042baf00cc3d323db113d28d8cc7d0530ecebcbce25b4be7157161199698ac28ee079237050e72fae3285ac2000a3e14882096a504b68f8602cd9a63878d05
7
- data.tar.gz: b2147e8540d40e2befc8b9dd5201ae7178d70fcca2bad6cb234c97a86d1155c33199913af7a4417905e7c2111ab46686900da61b75bb04313b7a985aec503f01
6
+ metadata.gz: 6ec3ae443f7deed3d0d99d1bc69b9d6ed4842181af11ecdbb6d15f85d3dad4bd5a553c51683f36728f9fe12ca11bcd6fd8f7e595e729d1fac0b6e43f4c3e267d
7
+ data.tar.gz: 2e3dd9f7fe061ee7e8052b792e10240582840dae8bf2d8f72235327b7d84cd17b7d0722eca1efc9870587cd0a0a267374e03169526e71eb7f20d68a46df87d7b
@@ -0,0 +1,43 @@
1
+ name: Publish Gem
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "*"
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Set version
14
+ id: version
15
+ run: echo ::set-output name=version::${GITHUB_REF#refs/*/v}
16
+
17
+ - name: checkout
18
+ uses: actions/checkout@v2
19
+
20
+ - name: Setup Ruby using Bundler
21
+ uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: "2.7.1"
24
+ bundler-cache: true
25
+ bundler: "2.1.4"
26
+
27
+ - name: install gems
28
+ run: bundle install
29
+
30
+ - name: Setup Rubygems credentials
31
+ run: |
32
+ set +x
33
+ mkdir -p ~/.gem
34
+ cat << EOF > ~/.gem/credentials
35
+ ---
36
+ :rubygems_api_key: ${{ secrets.OSC_ROBOT_RUBYGEMS_TOKEN }}
37
+ EOF
38
+ chmod 0600 ~/.gem/credentials
39
+
40
+ - name: Publish Gem
41
+ run: |
42
+ bundle exec rake build
43
+ gem push pkg/osc-machete-${{ steps.version.outputs.version }}.gem
data/CHANGELOG.md CHANGED
@@ -5,6 +5,64 @@ This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [1.2.2] - 2017-08-04
9
+
10
+ ### Fixed
11
+
12
+ - host name for Ruby Cluster changed
13
+
14
+ ## [1.2.1] - 2016-12-16
15
+
16
+ ### Fixed
17
+
18
+ - host name for Quick Cluster changed
19
+
20
+ ## [1.2.0] - 2016-09-06
21
+
22
+ ### Added
23
+
24
+ - TorqueHelper.default= so we can specify a different TorqueHelper
25
+ - TorqueHelper#pbs to get the PBS::Batch object for the given id, script, or host.
26
+ This lets us change the TorqueHelper instance used as a default with a
27
+ different TorqueHelper class or instance that has a different implementation
28
+ of TorqueHelper#pbs.
29
+ - (OSC specific) Owens cluster support
30
+ - (OSC specific) LIB and BIN for specifying torque lib locations
31
+
32
+ ### Changed
33
+
34
+ - Depends on latest version of pbs ruby gem 2.0
35
+ - TorqueHelper.default returns the same instance every time (which is now
36
+ memoized) instead of creating a new instance
37
+
38
+ ### Deprecated
39
+
40
+ - `OSC::Machete::User` - use `OodSupport::User` instead
41
+ - `OSC::Machete::Process` - use `OodSupport::Process` instead
42
+
43
+ ### Fixed
44
+
45
+ - yardoc documentation for OSC::Machete::Status class methods
46
+ - deprecation warnings by using File.exist? instead of File.exists?
47
+
48
+ ## [1.1.4] - 2016-08-17
49
+
50
+ ### Added
51
+
52
+ - `Job#host` getter (which should have been there but was accidentally omitted)
53
+
54
+ ## [1.1.3] - 2016-06-07
55
+
56
+ ### Fixed
57
+
58
+ - README and gemspec docs update for rubygems.org release
59
+
60
+ ## [1.1.2] - 2016-06-07
61
+
62
+ ### Fixed
63
+
64
+ - Copyright in LICENSE.txt
65
+
8
66
  ## [1.1.1] - 2016-02-24
9
67
 
10
68
  ### Fixed
@@ -79,7 +137,13 @@ lib/osc/machete/torque_helper.rb _(still an internal class right now, not meant
79
137
 
80
138
  Previous release of osc-machete
81
139
 
82
- [Unreleased]: https://github.com/AweSim-OSC/osc-machete/compare/v1.1.1...master
140
+ [Unreleased]: https://github.com/AweSim-OSC/osc-machete/compare/v1.2.2...master
141
+ [1.2.2]: https://github.com/AweSim-OSC/osc-machete/compare/v1.2.1...v1.2.2
142
+ [1.2.1]: https://github.com/AweSim-OSC/osc-machete/compare/v1.2.0...v1.2.1
143
+ [1.2.0]: https://github.com/AweSim-OSC/osc-machete/compare/v1.1.4...v1.2.0
144
+ [1.1.4]: https://github.com/AweSim-OSC/osc-machete/compare/v1.1.3...v1.1.4
145
+ [1.1.3]: https://github.com/AweSim-OSC/osc-machete/compare/v1.1.2...v1.1.3
146
+ [1.1.2]: https://github.com/AweSim-OSC/osc-machete/compare/v1.1.1...v1.1.2
83
147
  [1.1.1]: https://github.com/AweSim-OSC/osc-machete/compare/v1.1.0...v1.1.1
84
148
  [1.1.0]: https://github.com/AweSim-OSC/osc-machete/compare/v1.0.1...v1.1.0
85
149
  [1.0.1]: https://github.com/AweSim-OSC/osc-machete/compare/v1.0.0...v1.0.1
@@ -205,7 +205,7 @@ class OSC::Machete::Job
205
205
  # something if the script name is munged
206
206
 
207
207
  # recursively delete the directory after killing the job
208
- Pathname.new(path).rmtree if path && rmdir && File.exists?(path)
208
+ Pathname.new(path).rmtree if path && rmdir && File.exist?(path)
209
209
  end
210
210
  end
211
211
 
@@ -1,10 +1,13 @@
1
1
  # Class that maintains the User and additional methods for the process.
2
2
  # Helper methods provided use the Process module underneath.
3
3
  #
4
+ # @deprecated Please use {http://www.rubydoc.info/gems/ood_support/OodSupport/Process OodSupport::Process} instead.
4
5
  class OSC::Machete::Process
5
6
 
6
7
  def initialize
7
8
  @user = OSC::Machete::User.from_uid(Process.uid)
9
+
10
+ warn "[DEPRECATION] `OSC::Machete::Process` is deprecated. Please use `OodSupport::Process` instead (see ood_support gem)."
8
11
  end
9
12
 
10
13
  # The system name of the process user
@@ -55,27 +55,42 @@ class OSC::Machete::Status
55
55
  end
56
56
 
57
57
 
58
- # TODO: these methods are previously declared so we can document them easily
59
- # if there is a better way to document class methods we'll do that
60
-
61
- # @return [Status]
62
- def self.undetermined() end
63
- # @return [Status]
64
- def self.not_submitted() end
65
- # @return [Status]
66
- def self.passed() end
67
- # @return [Status]
68
- def self.failed() end
69
- # @return [Status]
70
- def self.running() end
71
- # @return [Status]
72
- def self.queued() end
73
- # @return [Status]
74
- def self.held() end
75
- # @return [Status]
76
- def self.suspended() end
77
-
58
+ # NOTE: on yard documentation: to do something like what I do below,
59
+ # documenting a set of class methods, you must have the documentation block be
60
+ # inside the `class << self` block or else the last documented method will be
61
+ # ignored or hidden if newlines exist between each @!method block. If no
62
+ # newlines exist, like below, the entire block would have been ignored.
63
+ # Also, indenting the tags for the rest of the methods is required when
64
+ # omitting newlines, otherwise, each method includes all of the returns below
65
+ # it - so yard displays 6 return Status lines for the method.
66
+ #
67
+ # Why do we have no newlines here? So that "View source" on each of these
68
+ # class methods points to the block itself.
78
69
  class << self
70
+ # @!method undetermined
71
+ # A 'null' special case for Status
72
+ # @return [Status]
73
+ #
74
+ # @!method not_submitted
75
+ # @return [Status]
76
+ #
77
+ # @!method passed
78
+ # @return [Status]
79
+ #
80
+ # @!method failed
81
+ # @return [Status]
82
+ #
83
+ # @!method running
84
+ # @return [Status]
85
+ #
86
+ # @!method queued
87
+ # @return [Status]
88
+ #
89
+ # @!method held
90
+ # @return [Status]
91
+ #
92
+ # @!method suspended
93
+ # @return [Status]
79
94
  VALUES_HASH.each do |char, name|
80
95
  define_method(name) do
81
96
  OSC::Machete::Status.new(char)
@@ -84,22 +99,28 @@ class OSC::Machete::Status
84
99
  end
85
100
 
86
101
  # @!method undetermined?
87
- # the Status value Null object
88
- # @return [Boolean] true if undetermined
102
+ # @return [Boolean] true if undetermined
103
+
89
104
  # @!method not_submitted?
90
- # @return [Boolean] true if not_submitted
105
+ # @return [Boolean] true if not_submitted
106
+
91
107
  # @!method failed?
92
- # @return [Boolean] true if failed
108
+ # @return [Boolean] true if failed
109
+
93
110
  # @!method passed?
94
- # @return [Boolean] true if passed
111
+ # @return [Boolean] true if passed
112
+
95
113
  # @!method held?
96
- # @return [Boolean] true if held
114
+ # @return [Boolean] true if held
115
+
97
116
  # @!method queued?
98
- # @return [Boolean] true if queued
117
+ # @return [Boolean] true if queued
118
+
99
119
  # @!method running?
100
- # @return [Boolean] true if running
120
+ # @return [Boolean] true if running
121
+
101
122
  # @!method suspended?
102
- # @return [Boolean] true if suspended
123
+ # @return [Boolean] true if suspended
103
124
  VALUES_HASH.each do |char, name|
104
125
  define_method("#{name}?") do
105
126
  self == OSC::Machete::Status.new(char)
@@ -12,22 +12,27 @@ class OSC::Machete::TorqueHelper
12
12
  BIN = ENV['TORQUE_BIN'] || '/opt/torque/bin'
13
13
  HOSTS = {
14
14
  'oakley' => 'oak-batch.osc.edu',
15
- 'ruby' => 'ruby-batch.osc.edu',
16
- 'quick' => 'quick-batch.osc.edu',
17
- 'owens' => 'owens-batch.ten.osc.edu'
15
+ 'ruby' => 'ruby-batch.ten.osc.edu',
16
+ 'quick' => 'quick-batch.ten.osc.edu',
17
+ 'owens' => 'owens-batch.ten.osc.edu',
18
+ :default => 'oak-batch.osc.edu'
18
19
  }
19
20
 
20
- # Alias to initialize a new object.
21
- def self.default
22
- self::new()
21
+ class << self
22
+ #@!attribute default
23
+ # @return [TorqueHelper] default TorqueHelper instance to use
24
+ attr_writer :default
25
+ def default
26
+ @default ||= self::new()
27
+ end
23
28
  end
24
29
 
25
30
  # Returns an OSC::Machete::Status ValueObject for a char
26
31
  #
27
32
  # @param [String] char The Torque status char
28
33
  #
29
- # @example Completed
30
- # status_for_char("C") #=> OSC::Machete::Status.completed
34
+ # @example Passed
35
+ # status_for_char("C") #=> OSC::Machete::Status.passed
31
36
  # @example Queued
32
37
  # status_for_char("W") #=> OSC::Machete::Status.queued
33
38
  #
@@ -60,16 +65,6 @@ class OSC::Machete::TorqueHelper
60
65
  #
61
66
  # Bills against the project specified by the primary group of the user.
62
67
  def qsub(script, host: nil, depends_on: {}, account_string: nil)
63
- # if the script is set to run on Oakley in PBS headers
64
- # this is to obviate current torque filter defect in which
65
- # a script with PBS header set to specify oak-batch ends
66
- # isn't properly handled and the job gets limited to 4GB
67
- pbs = PBS::Batch.new(
68
- host: HOSTS.fetch( host || host_from_script_pbs_header(script) ),
69
- lib: LIB,
70
- bin: BIN
71
- )
72
-
73
68
  headers = { depend: qsub_dependencies_header(depends_on) }
74
69
  headers.clear if headers[:depend].empty?
75
70
 
@@ -83,7 +78,7 @@ class OSC::Machete::TorqueHelper
83
78
  headers[PBS::ATTR[:A]] = default_account_string
84
79
  end
85
80
 
86
- pbs.submit_script(script, headers: headers, qsub: true)
81
+ pbs(host: host, script: script).submit_script(script, headers: headers, qsub: true)
87
82
  end
88
83
 
89
84
  # convert dependencies hash to a PBS header string
@@ -117,13 +112,7 @@ class OSC::Machete::TorqueHelper
117
112
  # @return [Status] The job state
118
113
  def qstat(pbsid, host: nil)
119
114
  id = pbsid.to_s
120
- pbs = PBS::Batch.new(
121
- host: HOSTS.fetch( host || host_from_pbsid(id) ),
122
- lib: LIB,
123
- bin: BIN
124
- )
125
-
126
- status = pbs.get_job(id, filters: [:job_state])
115
+ status = pbs(host: host, id: id).get_job(id, filters: [:job_state])
127
116
  status_for_char status[id][:job_state][0] # get status from status char value
128
117
  rescue PBS::UnkjobidError
129
118
  OSC::Machete::Status.passed
@@ -136,15 +125,28 @@ class OSC::Machete::TorqueHelper
136
125
  # @return [nil]
137
126
  def qdel(pbsid, host: nil)
138
127
  id = pbsid.to_s
139
- pbs = PBS::Batch.new(
140
- host: HOSTS.fetch( host || host_from_pbsid(id) ),
128
+ pbs(host: host, id: id).delete_job(id)
129
+ rescue PBS::UnkjobidError
130
+ # Common use case where trying to delete a job that is no longer in the system.
131
+ end
132
+
133
+ def pbs(host: nil, id: nil, script: nil)
134
+ if host
135
+ # actually check if host is "oakley" i.e. a cluster key
136
+ host = HOSTS.fetch(host.to_s, host.to_s)
137
+ else
138
+ # try to determine host
139
+ key = host_from_pbsid(id) if id
140
+ key = host_from_script_pbs_header(script) if script && key.nil?
141
+
142
+ host = HOSTS.fetch(key, HOSTS.fetch(:default))
143
+ end
144
+
145
+ PBS::Batch.new(
146
+ host: host,
141
147
  lib: LIB,
142
148
  bin: BIN
143
149
  )
144
-
145
- pbs.delete_job(id)
146
- rescue PBS::UnkjobidError
147
- # Common use case where trying to delete a job that is no longer in the system.
148
150
  end
149
151
 
150
152
  private
@@ -159,8 +161,6 @@ class OSC::Machete::TorqueHelper
159
161
  "quick"
160
162
  elsif (File.open(script) { |f| f.read =~ /#PBS -q @owens-batch/ })
161
163
  "owens"
162
- else
163
- "oakley" # DEFAULT
164
164
  end
165
165
  end
166
166
 
@@ -174,8 +174,6 @@ class OSC::Machete::TorqueHelper
174
174
  "quick"
175
175
  elsif (pbsid =~ /owens/ )
176
176
  "owens"
177
- else
178
- "oakley" # DEFAULT
179
177
  end
180
178
  end
181
179
  end
@@ -1,6 +1,7 @@
1
1
  # Class that maintains the name and home identifiers of a User.
2
2
  # Helper methods provided use the Etc module underneath.
3
3
  #
4
+ # @deprecated Please use {http://www.rubydoc.info/gems/ood_support/OodSupport/User OodSupport::User} instead.
4
5
  class OSC::Machete::User
5
6
 
6
7
  attr_reader :name
@@ -19,6 +20,8 @@ class OSC::Machete::User
19
20
  #
20
21
  def initialize(username = Etc.getpwuid.name)
21
22
  @name = username
23
+
24
+ warn "[DEPRECATION] `OSC::Machete::User` is deprecated. Please use `OodSupport::User` instead (see ood_support gem)."
22
25
  end
23
26
 
24
27
  # factory method to produce a User from specified uid
@@ -1,6 +1,6 @@
1
1
  module OSC
2
2
  module Machete
3
3
  # The current gem version
4
- VERSION = "2.0.0.pre2"
4
+ VERSION = "2.0.0"
5
5
  end
6
6
  end
data/osc-machete.gemspec CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
- spec.required_ruby_version = '~> 2.2'
21
+ spec.required_ruby_version = '>= 2.7'
22
22
 
23
- spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "bundler", "~> 2.0"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "mocha"
26
26
  spec.add_development_dependency "minitest", ">= 5.0"
@@ -1,7 +1,7 @@
1
1
  #PBS -l walltime=00:30:00
2
2
  #PBS -l nodes=1:ppn=12
3
3
  #PBS -S /bin/bash
4
- #PBS -q @quick-batch.osc.edu
4
+ #PBS -q @quick-batch.ten.osc.edu
5
5
  #PBS -N foobar
6
6
  #PBS -j oe
7
7
  #PBS -r n
data/test/test_job_dir.rb CHANGED
@@ -34,6 +34,6 @@ class TestJobDir < Minitest::Test
34
34
  # Create unique directory
35
35
  new_jobdir = OSC::Machete::JobDir.new(@parent).new_jobdir
36
36
  Dir.mkdir(new_jobdir)
37
- assert Dir.exists?("#{@parent}/9"), "Directory was not created: #{@parent}/9"
37
+ assert Dir.exist?("#{@parent}/9"), "Directory was not created: #{@parent}/9"
38
38
  end
39
39
  end
@@ -24,41 +24,41 @@ class TestLocation < Minitest::Test
24
24
  def test_render_default_replace_template
25
25
  setup_render
26
26
  @location1.render("")
27
- assert_equal true, File.exists?("#{@dir1}/file.txt")
28
- assert_equal false, File.exists?("#{@dir1}/file.txt.mustache")
27
+ assert_equal true, File.exist?("#{@dir1}/file.txt")
28
+ assert_equal false, File.exist?("#{@dir1}/file.txt.mustache")
29
29
  end
30
30
 
31
31
  def test_render_user_replace_template
32
32
  setup_render
33
33
  @location1.render("", {replace: true})
34
- assert_equal true, File.exists?("#{@dir1}/file.txt")
35
- assert_equal false, File.exists?("#{@dir1}/file.txt.mustache")
34
+ assert_equal true, File.exist?("#{@dir1}/file.txt")
35
+ assert_equal false, File.exist?("#{@dir1}/file.txt.mustache")
36
36
  end
37
37
 
38
38
  def test_render_user_doesnt_replace_template
39
39
  setup_render
40
40
  @location1.render("", {replace: false})
41
- assert_equal true, File.exists?("#{@dir1}/file.txt")
42
- assert_equal true, File.exists?("#{@dir1}/file.txt.mustache")
41
+ assert_equal true, File.exist?("#{@dir1}/file.txt")
42
+ assert_equal true, File.exist?("#{@dir1}/file.txt.mustache")
43
43
  end
44
44
 
45
45
  def test_copy_to_shouldnt_copy_developer_files
46
46
  setup_copy_to
47
47
 
48
48
  @location1.copy_to(@dir2)
49
- assert_equal true, Dir.exists?("#{@dir2}")
50
- assert_equal false, Dir.exists?("#{@dir2}/.git")
51
- assert_equal false, Dir.exists?("#{@dir2}/.svn")
52
- assert_equal false, Dir.exists?("#{@dir2}/test.dir.1")
53
- assert_equal true, Dir.exists?("#{@dir2}/test.dir.2")
54
- assert_equal true, File.exists?("#{@dir2}/test.1")
55
- assert_equal false, File.exists?("#{@dir2}/test.2")
56
- assert_equal true, File.exists?("#{@dir2}/test.3")
57
- assert_equal false, File.exists?("#{@dir2}/test.4")
58
- assert_equal false, File.exists?("#{@dir2}/test.dir.2/test.1")
59
- assert_equal false, File.exists?("#{@dir2}/test.dir.2/test.2")
60
- assert_equal true, File.exists?("#{@dir2}/test.dir.2/test.4")
61
- assert_equal false, File.exists?("#{@dir2}/.gitignore")
49
+ assert_equal true, Dir.exist?("#{@dir2}")
50
+ assert_equal false, Dir.exist?("#{@dir2}/.git")
51
+ assert_equal false, Dir.exist?("#{@dir2}/.svn")
52
+ assert_equal false, Dir.exist?("#{@dir2}/test.dir.1")
53
+ assert_equal true, Dir.exist?("#{@dir2}/test.dir.2")
54
+ assert_equal true, File.exist?("#{@dir2}/test.1")
55
+ assert_equal false, File.exist?("#{@dir2}/test.2")
56
+ assert_equal true, File.exist?("#{@dir2}/test.3")
57
+ assert_equal false, File.exist?("#{@dir2}/test.4")
58
+ assert_equal false, File.exist?("#{@dir2}/test.dir.2/test.1")
59
+ assert_equal false, File.exist?("#{@dir2}/test.dir.2/test.2")
60
+ assert_equal true, File.exist?("#{@dir2}/test.dir.2/test.4")
61
+ assert_equal false, File.exist?("#{@dir2}/.gitignore")
62
62
  end
63
63
 
64
64
 
@@ -106,7 +106,7 @@ class TestTorqueHelper < Minitest::Test
106
106
  # Test that qdel works for quick batch
107
107
  def test_qdel_quick
108
108
  PBS::Batch.any_instance.stubs(:delete_job).returns(true)
109
- assert_equal true, @shell.qdel("123.quick-batch.osc.edu")
109
+ assert_equal true, @shell.qdel("123.quick-batch.ten.osc.edu")
110
110
  PBS::Batch.any_instance.unstub(:delete_job)
111
111
  end
112
112
 
@@ -120,18 +120,18 @@ class TestTorqueHelper < Minitest::Test
120
120
  # Test that qdel throws exception on PBS exception
121
121
  def test_qdel_throws_exception
122
122
  PBS::Batch.any_instance.stubs(:delete_job).raises(PBS::Error)
123
- assert_raises(PBS::Error) { @shell.qdel("123.quick-batch.osc.edu") }
123
+ assert_raises(PBS::Error) { @shell.qdel("123.quick-batch.ten.osc.edu") }
124
124
  PBS::Batch.any_instance.unstub(:delete_job)
125
125
 
126
126
  PBS::Batch.any_instance.stubs(:delete_job).raises(PBS::SystemError)
127
- assert_raises(PBS::SystemError) { @shell.qdel("123.quick-batch.osc.edu") }
127
+ assert_raises(PBS::SystemError) { @shell.qdel("123.quick-batch.ten.osc.edu") }
128
128
  PBS::Batch.any_instance.unstub(:delete_job)
129
129
  end
130
130
 
131
131
  # Test that qdel doesn't throw exception if Unknown Job Id exception
132
132
  def test_qdel_doesnt_throw_exception_on_unknown_job_id
133
133
  PBS::Batch.any_instance.stubs(:delete_job).raises(PBS::UnkjobidError)
134
- @shell.qdel("123.quick-batch.osc.edu")
134
+ @shell.qdel("123.quick-batch.ten.osc.edu")
135
135
  PBS::Batch.any_instance.unstub(:delete_job)
136
136
  end
137
137
 
@@ -206,4 +206,49 @@ class TestTorqueHelper < Minitest::Test
206
206
  PBS::Batch.any_instance.unstub(:submit_script)
207
207
  @shell.unstub(:default_account_string)
208
208
  end
209
+
210
+ def test_pbs_default_host
211
+ s = @shell.pbs
212
+ assert_equal 'oak-batch.osc.edu', s.host
213
+ assert_equal OSC::Machete::TorqueHelper::LIB, s.lib.to_s
214
+ assert_equal OSC::Machete::TorqueHelper::BIN, s.bin.to_s
215
+ end
216
+
217
+ def test_pbs_host_variations
218
+ # you can use the cluster ids
219
+ assert_equal 'ruby-batch.ten.osc.edu', @shell.pbs(host: 'ruby').host
220
+
221
+ # or you can use the host itself
222
+ assert_equal 'ruby-batch.osc.edu', @shell.pbs(host: 'ruby-batch.osc.edu').host
223
+ assert_equal '@ruby-batch', @shell.pbs(host: '@ruby-batch').host
224
+
225
+ assert_equal 'ruby-batch.ten.osc.edu', @shell.pbs(id: '4567').host
226
+ assert_equal 'ruby-batch.ten.osc.edu', @shell.pbs(script: @script_ruby).host
227
+ assert_equal 'oak-batch.osc.edu', @shell.pbs(script: @script_oakley).host
228
+ end
229
+
230
+ def test_setting_default_torque_helper
231
+ d = OSC::Machete::TorqueHelper.default
232
+
233
+ assert_equal 'oak-batch.osc.edu', OSC::Machete::TorqueHelper.default.pbs.host
234
+
235
+ # this is an example of how you can quickly modify the default behavior of
236
+ # a TorqueHelper instance to provide a new host, id, and script
237
+ d2 = OSC::Machete::TorqueHelper.new
238
+ class << d2
239
+ def pbs(host: nil, id: nil, script: nil)
240
+ PBS::Batch.new(
241
+ host: "ruby-batch.osc.edu",
242
+ lib: LIB,
243
+ bin: BIN
244
+ )
245
+ end
246
+ end
247
+
248
+ OSC::Machete::TorqueHelper.default = d2
249
+
250
+ assert_equal 'ruby-batch.osc.edu', OSC::Machete::TorqueHelper.default.pbs.host
251
+
252
+ OSC::Machete::TorqueHelper.default = d
253
+ end
209
254
  end
@@ -71,7 +71,7 @@ class TestTorqueHelperLive < Minitest::Test
71
71
 
72
72
  # Qstat it to make sure it's queued.
73
73
  live_status = torque.qstat(live_job)
74
- assert_equal @job_state_queued, live_status
74
+ assert_includes OSC::Machete::Status.active_values, live_status
75
75
 
76
76
  # Delete it and assert true returned.
77
77
  live_delete_status = torque.qdel(live_job)
@@ -102,7 +102,7 @@ class TestTorqueHelperLive < Minitest::Test
102
102
 
103
103
  # Qstat it to make sure it's queued.
104
104
  live_status = torque.qstat(live_job)
105
- assert_equal @job_state_queued, live_status
105
+ assert_includes OSC::Machete::Status.active_values, live_status
106
106
 
107
107
  # Delete it and assert true returned.
108
108
  live_delete_status = torque.qdel(live_job)
@@ -128,11 +128,11 @@ class TestTorqueHelperLive < Minitest::Test
128
128
  if Socket.gethostname == @submit_host
129
129
  # Submit a small job.
130
130
  live_job = torque.qsub(@script_ruby)
131
- assert_match /^\d+$/, live_job
131
+ assert_match(/^\d+$/, live_job)
132
132
 
133
133
  # Qstat it to make sure it's queued.
134
134
  live_status = torque.qstat(live_job)
135
- assert_equal @job_state_queued, live_status
135
+ assert_includes OSC::Machete::Status.active_values, live_status
136
136
 
137
137
  # Delete it and assert true returned.
138
138
  live_delete_status = torque.qdel(live_job)
@@ -157,11 +157,11 @@ class TestTorqueHelperLive < Minitest::Test
157
157
  if Socket.gethostname == @submit_host
158
158
  # Submit a small job.
159
159
  live_job = torque.qsub(@script_quick, host: 'quick')
160
- assert_match /\d+.quick-batch.osc.edu/, live_job
160
+ assert_match(/\d+.quick-batch.ten.osc.edu/, live_job)
161
161
 
162
162
  # Qstat it to make sure it's queued.
163
163
  live_status = torque.qstat(live_job)
164
- assert_equal @job_state_queued, live_status
164
+ assert_includes OSC::Machete::Status.active_values, live_status
165
165
 
166
166
  # Delete it and assert true returned.
167
167
  live_delete_status = torque.qdel(live_job)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: osc-machete
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.pre2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Franz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-30 00:00:00.000000000 Z
11
+ date: 2022-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '2.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -102,6 +102,7 @@ executables: []
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
+ - ".github/workflows/publish.yml"
105
106
  - ".gitignore"
106
107
  - CHANGELOG.md
107
108
  - Gemfile
@@ -144,17 +145,16 @@ require_paths:
144
145
  - lib
145
146
  required_ruby_version: !ruby/object:Gem::Requirement
146
147
  requirements:
147
- - - "~>"
148
+ - - ">="
148
149
  - !ruby/object:Gem::Version
149
- version: '2.2'
150
+ version: '2.7'
150
151
  required_rubygems_version: !ruby/object:Gem::Requirement
151
152
  requirements:
152
- - - ">"
153
+ - - ">="
153
154
  - !ruby/object:Gem::Version
154
- version: 1.3.1
155
+ version: '0'
155
156
  requirements: []
156
- rubyforge_project:
157
- rubygems_version: 2.4.5
157
+ rubygems_version: 3.1.2
158
158
  signing_key:
159
159
  specification_version: 4
160
160
  summary: Common interface for working with HPC batch jobs (currently OSC specific)
@@ -175,4 +175,3 @@ test_files:
175
175
  - test/test_status.rb
176
176
  - test/test_torque_helper.rb
177
177
  - test/test_torque_helper_live.rb
178
- has_rdoc: