rundeck-ruby-client 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9aa49823388b4e01b0b7619238b923e13a27807a
4
+ data.tar.gz: 9450e473e98dc62286bb86130ca200937bb01ff5
5
+ SHA512:
6
+ metadata.gz: 85c7b00fd73c4909b49422a304099f680b9af30cc8b0a61298e5b154754aff579b82a1ca33f456fd7089cc4709fecc3454d655f4577265823eb13c2d09ce4278
7
+ data.tar.gz: 83b040d8353307e7268cf76ec111c5bb34ac4b4938e85e6148464e0720f474dd182ddac907f1f7f43421657e38d3e41a6131b68eb8f697d883fb0b6230515b0e
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rundeck-ruby.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Jon Phillips
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,207 @@
1
+ [![Gem Version](https://badge.fury.io/rb/rundeck-ruby.svg)](http://badge.fury.io/rb/rundeck-ruby)
2
+
3
+ # Rundeck-ruby
4
+
5
+ Like the name says, these are ruby bindings for the rundeck API
6
+
7
+ ## Installation
8
+
9
+ The usual stuff:
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'rundeck-ruby'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install rundeck-ruby
22
+
23
+ ## Getting started
24
+
25
+ So, you're not going to be using your username and password in this
26
+ library. Instead it uses rundeck's token-based authentication for
27
+ everything. See [the API docs](http://rundeck.org/docs/api/#token-authentication) for
28
+ instructions about generating a token.
29
+
30
+ ## Command-line usage
31
+
32
+ This gem installs a binstub named `rundeck`.
33
+ Surprising, huh? Anyway, `rundeck` does one thing: execute jobs. Oh, you
34
+ want more? Well then, send a pull request, buddy.
35
+
36
+ The USAGE line:
37
+ ```
38
+ rundeck exec <url> <token> <job guid> [<exec args>]
39
+ ```
40
+
41
+ For example
42
+ ```
43
+ $ rundeck exec https://my.server afdDSFasdfASD4334fasdfaasWERsW23423
44
+ cd51b400-aad2-0131-c7f8-0438353e293e -arg0 1234 - arg1 blah
45
+ https://my.server/executions/1234
46
+ ```
47
+
48
+ That will connect to your rundeck server `my.server` using your auth
49
+ token, find job cd51b400-aad2-0131-c7f8-0438353e293e and execute it. It
50
+ prints out the url of the resulting execution.
51
+
52
+ "But that's a lot of parameters," you say? Well, if you've got a better idea, submit a pull request. Also, you're probably going to `alias` common executions anyway, so it's really not too bad.
53
+
54
+ ## Library usage
55
+
56
+ ### Connecting
57
+
58
+ Connections to your rundeck server are handled with the `Session` class.
59
+ Like so:
60
+ ```
61
+ require 'rundeck-ruby'
62
+ session = Rundeck::Session('https://my.server', 'my token')
63
+ ```
64
+ That's it. You have a session.
65
+
66
+ From there you can get a hash of some of the server's system information:
67
+ ```
68
+ info_hash = session.system_info
69
+ ```
70
+
71
+ ### Listing Projects
72
+ The other thing the session lets you do get an array of your projects:
73
+ ```
74
+ names = session.projects.map(&:name)
75
+ ```
76
+
77
+ To get a single project, any of these will work:
78
+ ```
79
+ project = session.projects.find{|p| p.name == "ReallyImportantProject"}
80
+ project = session.project("ReallyImportantProject")
81
+ project = Rundeck::Project.find(session, "ReallyImportantProject")
82
+ ```
83
+
84
+ ### Listing Jobs
85
+ From each project, you can get a list of jobs. This code:
86
+ ```
87
+ session.projects.first.jobs.map(&:name)
88
+ ```
89
+ will give you a list of jobs in the project.
90
+
91
+ You can get a single job object from the project in any of these ways:
92
+ ```
93
+ job = project.jobs.find{|j| j.name == "MyJob"} # When you only have the name
94
+ job = project.job_by_id(the_job_guid)
95
+ ```
96
+
97
+ You can skip right over the project and go straight to the job too:
98
+ ```
99
+ job = Rundeck::Job.find(session, the_job_guid)
100
+ ```
101
+
102
+ ### Executing a job
103
+ Once you have a job object, you can work with its executions. To execute
104
+ the job, do this (new method with a hash):
105
+ ```
106
+ execution = job.execute!({'env' => 'integration', 'lease' => '22' })
107
+ ```
108
+
109
+ ### Finding executions
110
+
111
+ To get all executions from a job, do this:
112
+ ```
113
+ executions = job.executions
114
+ ```
115
+
116
+ If your rundeck is like mine, then there will be a boatload of executions in
117
+ each job, so getting all of them will be a pain. Unnecessary, too. To
118
+ filter down the results, do this:
119
+ ```
120
+ active_executions = job.executions do |query|
121
+ query.status = :failed
122
+ query.max = 2
123
+ query.offset = 100
124
+ end
125
+ ```
126
+ It does what it looks like.
127
+
128
+ ...or, for the whole project:
129
+ ```
130
+ active_executions = Rundeck::Execution.where(project) do |query|
131
+ query.status = :failed
132
+ query.max = 2
133
+ query.offset = 100
134
+ end
135
+ ```
136
+
137
+
138
+ You can also wait job execution end in a blocking way :
139
+ ```
140
+ log = execution.wait_end 2, 30
141
+ ```
142
+ where 2 is the interval to request the execution, and 30 the tieout
143
+ the call will be blocking until the job end and will log thing such as :
144
+
145
+ ```
146
+ [2014-06-02 17:06:48 +0200] Waiting for job create_linux_ruby, execution 67 to be finished
147
+ [2014-06-02 17:06:48 +0200] job create_linux_ruby, execution 67 to be finished .
148
+ [2014-06-02 17:06:51 +0200] job create_linux_ruby, execution 67 to be finished .
149
+ [2014-06-02 17:06:54 +0200] job create_linux_ruby, execution 67 to be finished .
150
+ [2014-06-02 17:06:57 +0200] ok !, duration 9
151
+ ```
152
+
153
+ At the end, it will return the log as a Hash of key, value corresponding to execution result, log time, log value etc ...
154
+
155
+ To get the valid statuses, ask the query object:
156
+ ```
157
+ statuses = []
158
+ active_executions = job.executions do |query|
159
+ statuses = query.class.valid_statuses
160
+ end
161
+ puts statuses
162
+ ```
163
+ Spoiler: they're one of the following: `succeeded`, `failed`, `aborted`, `running`, or `nil`.
164
+
165
+ ### Execution output
166
+ To get the output from an execution, ask it:
167
+ ```
168
+ output = execution.output
169
+ ```
170
+
171
+ `output` will be a hash containing the following keys: `id`,
172
+ `completed`, `hasFailedNodes`, `log`. `log` will, in turn, be a hash of
173
+ hostnames to log entries, which will be self-explanatory
174
+
175
+ ## Contributing
176
+
177
+ [![Code Climate](https://codeclimate.com/github/jonp/rundeck-ruby.png)](https://codeclimate.com/github/jonp/rundeck-ruby)
178
+
179
+ The usual boilerplate:
180
+
181
+ 1. Fork it
182
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
183
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
184
+ 4. Push to the branch (`git push origin my-new-feature`)
185
+ 5. Create new Pull Request
186
+
187
+ ## Wishlist
188
+
189
+ If you want to contribute, here's what I'd like to do sooner rather than
190
+ later:
191
+
192
+ * Add execution tailing to the `rundeck` binstub, à la:
193
+
194
+ ```
195
+ rundeck tail <execution url> <token>
196
+ ```
197
+
198
+ ...or...
199
+
200
+ ```
201
+ rundeck exec -tail ...the other parameters...
202
+ ```
203
+
204
+ * Running ad-hoc commands, both in irb and with the binstub
205
+ * Unit tests. While normally more of a TDDer than most, I find writing
206
+ tests for API wrappers tedious at best. It should probably be done,
207
+ though.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/exe/rundeck ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rundeck-ruby-client'
4
+ action, url, key, job, *exec_args = ARGV
5
+
6
+ abort "I can only execute. Other stuff may be added later." unless action.downcase == "exec"
7
+
8
+ sess = Rundeck::Session.new(url, key)
9
+ j = Rundeck::Job.find(sess, job)
10
+ encoded_args = URI::encode(exec_args.join(' '))
11
+ arg_query = encoded_args && "argString=#{encoded_args}"
12
+ puts j.execute!(arg_query).url
@@ -0,0 +1,111 @@
1
+ module Rundeck
2
+ class Execution
3
+ def self.from_hash(session, hash)
4
+ job = Job.from_hash(session, hash['job'])
5
+ new(session, hash, job)
6
+ end
7
+
8
+ def initialize(session, hash, job)
9
+ @id = hash['id']
10
+ @url=hash['href']
11
+ @url = URI.join(session.server, URI.split(@url)[5]).to_s if @url # They always return a url of "localhost" for their executions. Replace it with the real URL
12
+ @status=hash['status'].to_sym
13
+ @date_started = hash['date_started']
14
+ @date_ended = hash['date_ended']
15
+ @user = hash['user']
16
+ @args = (hash['argstring'] || "").split
17
+ .each_slice(2)
18
+ .reduce({}){|acc,cur| acc[cur[0]] = cur[1]; acc}
19
+ @job = job
20
+ @session = session
21
+ end
22
+ attr_reader :id, :url, :status, :date_started, :date_ended, :user, :args, :job, :session
23
+
24
+ def self.find(session, id)
25
+ result = session.get("api/1/execution/#{id}", *%w(result executions execution))
26
+ return nil unless result
27
+ job = Job.find(session, result['job']['id'])
28
+ return nil unless job
29
+ Execution.new(session, result, job)
30
+ end
31
+
32
+ def self.where(project)
33
+ qb = QueryBuilder.new
34
+ yield qb if block_given?
35
+
36
+ endpoint = "api/5/executions?project=#{project.name}#{qb.query}"
37
+ pp endpoint
38
+ results = project.session.get(endpoint, 'result', 'executions', 'execution') || []
39
+ results = [results] if results.is_a?(Hash) #Work around an inconsistency in the API
40
+ results.map {|hash| from_hash(project.session, hash)}
41
+ end
42
+
43
+ def output
44
+ ret = session.get("api/9/execution/#{id}/output")
45
+ result = ret['result']
46
+ raise "API call not successful" unless result && result['success']=='true'
47
+
48
+ #sort the output by node
49
+ ret = result['output'].slice(*%w(id completed hasFailedNodes))
50
+ ret['log'] = result['output']['entries']['entry'].group_by{|e| e['node']}
51
+ ret
52
+ end
53
+
54
+ def wait title, interval, timeout
55
+ puts "[#{Time.now}] Waiting for #{title}"
56
+ start = Time.now.to_i
57
+ stop = start + timeout
58
+ while Time.now.to_i < stop
59
+ begin
60
+ if yield
61
+ puts "[#{Time.now}] ok !, duration #{Time.now.to_i - start}"
62
+ return
63
+ end
64
+ rescue
65
+ end
66
+ $stdout.write "[#{Time.now}] #{title} .\n"
67
+ $stdout.flush
68
+ sleep interval
69
+ end
70
+ raise "Timeout while waiting end of #{title}"
71
+ end
72
+
73
+ def wait_end interval, timeout
74
+ follow_execs = nil
75
+ wait "job #{@job.name}, execution #{@id} to be finished", interval, timeout do
76
+ follow_execs = @job.executions.select{|exec| exec.id == @id}
77
+ follow_execs.first.status != :running
78
+ end
79
+ follow_execs.first.output
80
+ end
81
+
82
+ class QueryBuilder
83
+ attr_accessor :status, :max, :offset
84
+
85
+ def self.valid_statuses
86
+ %w(succeeded failed aborted running) << nil
87
+ end
88
+
89
+ def validate
90
+ raise "Invalid requested status: #{status}" unless status.nil? || elf.class.valid_statuses.include?(status.to_s)
91
+ raise "Invalid offset: #{offset}" unless offset.nil? || offset.to_i >= 0
92
+ raise "Invalid max: #{max}" unless max.nil? || max.to_i >= 0
93
+ end
94
+
95
+ def query
96
+ validate
97
+
98
+ [
99
+ "",
100
+ status && "statusFilter=#{status}",
101
+ max && "max=#{max.to_i}",
102
+ offset && "offset=#{offset.to_i}",
103
+ ].compact
104
+ .join("&")
105
+ .chomp("&")
106
+ end
107
+ end
108
+
109
+ end
110
+ end
111
+
@@ -0,0 +1,71 @@
1
+ module Rundeck
2
+ class Job
3
+
4
+ def self.find(session, id)
5
+ result = session.get("api/1/job/#{id}", 'joblist', 'job')
6
+ return nil unless result
7
+ project = Project.find(session, result['context']['project'])
8
+ return nil unless project
9
+ Job.new(session, project, result['id'], result['name'])
10
+ end
11
+
12
+ def self.from_hash(session, hash)
13
+ project = Project.find(session, hash['project'])
14
+ new(session, project, hash['id'], hash['name'])
15
+ end
16
+
17
+ def initialize(session, project, id, name)
18
+ @session = session
19
+ @project = project
20
+ @id = id
21
+ @name = name
22
+ end
23
+
24
+ attr_reader :id, :name, :project, :session
25
+
26
+ def executions
27
+ qb = JobExecutionQueryBuilder.new
28
+ yield qb if block_given?
29
+
30
+ endpoint = "api/1/job/#{id}/executions#{qb.query}"
31
+ results = session.get(endpoint, 'result', 'executions', 'execution') || []
32
+ results = [results] if results.is_a?(Hash) #Work around an inconsistency in the API
33
+ results.map{|hash| Execution.from_hash(session, hash)}
34
+ end
35
+
36
+ def execute!(args_hash)
37
+ argstr=""
38
+ args_hash.map {|param, value| argstr += "-#{param} #{value} "}
39
+ encoded_args = URI::encode(argstr)
40
+ query = "api/1/job/#{id}/run?argString=#{encoded_args}"
41
+ hash = session.get(query, 'result', 'executions', 'execution') || {}
42
+ Execution.new(session, hash, self)
43
+ end
44
+
45
+ class JobExecutionQueryBuilder
46
+ attr_accessor :status, :max, :offset
47
+
48
+ def self.valid_statuses
49
+ Execution::QueryBuilder.valid_statuses
50
+ end
51
+
52
+ def validate
53
+ raise "Invalid requested status: #{status}" unless status.nil? || self.class.valid_statuses.include?(status.to_s)
54
+ raise "Invalid offset" unless offset.nil? || offset.to_i >= 0
55
+ raise "Invalid max" unless max.nil? || max.to_i >= 0
56
+ end
57
+
58
+ def query
59
+ validate
60
+
61
+ clauses = [
62
+ status && "status=#{status}",
63
+ max && "max=#{max.to_i}",
64
+ offset && "offset=#{offset.to_i}",
65
+ ].compact.join('&')
66
+
67
+ "?#{clauses}".chomp('?')
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ require 'naught'
2
+
3
+ NullObject = Naught.build
4
+
5
+ include NullObject::Conversions
@@ -0,0 +1,34 @@
1
+ module Rundeck
2
+ class Project
3
+ def self.all(session)
4
+ @all ||= begin
5
+ result = session.get('api/3/projects', 'result', 'projects', 'project') || []
6
+ result.map{|hash| Project.new(session, hash)}
7
+ end
8
+ end
9
+
10
+ def self.find(session, name)
11
+ all(session).first{|p| p.name == name}
12
+ end
13
+
14
+ def initialize(session, hash)
15
+ @session = session
16
+ if hash.class != Array
17
+ @name = hash['name']
18
+ else
19
+ @name = hash[1]
20
+ end
21
+ end
22
+ attr_reader :session, :name
23
+
24
+ def jobs(force_reload = false)
25
+ return @jobs unless @jobs.nil? || force_reload
26
+ result = session.get("api/2/jobs?project=#{name}", 'result', 'jobs', 'job') || []
27
+ @jobs = result.map{|hash| Job.from_hash(session, hash)}
28
+ end
29
+
30
+ def job(id)
31
+ jobs.first{|j| j.id == id}
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ require 'json'
2
+ require 'active_support/all'
3
+ require 'rest_client'
4
+
5
+
6
+ module Rundeck
7
+ class Session
8
+ def initialize(server, token)
9
+ @server = server
10
+ @token = token
11
+ end
12
+
13
+ attr_reader :server, :token
14
+
15
+ def get(url, *keys)
16
+ endpoint = File.join(server, url)
17
+ xml = RestClient.get(endpoint, 'X-Rundeck-Auth-Token'=> token)
18
+ hash = Maybe(Hash.from_xml(xml))
19
+ keys.reduce(hash){|acc, cur| acc && acc[cur]}
20
+ end
21
+
22
+ def system_info
23
+ get('api/1/system/info', 'result', 'system')
24
+ end
25
+
26
+ def projects
27
+ Project.all(self)
28
+ end
29
+
30
+ def project(name)
31
+ Project.find(self, name)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module Rundeck
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "rundeck-ruby-client/maybe"
2
+ require "rundeck-ruby-client/version"
3
+ require "rundeck-ruby-client/session"
4
+ require "rundeck-ruby-client/project"
5
+ require "rundeck-ruby-client/job"
6
+ require "rundeck-ruby-client/execution"
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rundeck-ruby-client/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rundeck-ruby-client"
8
+ spec.version = Rundeck::VERSION
9
+ spec.authors = ["Jon Phillips", "Mikael Robert"]
10
+ spec.email = ["jphillips@biaprotect.com", "mikaelrob@gmail.com"]
11
+ spec.description = %q{Ruby client for Rundeck API}
12
+ spec.summary = %q{For talking to Rundeck}
13
+ spec.homepage = "https://github.com/mikrob/rundeck-ruby"
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
+ spec.bindir = 'exe'
21
+ spec.executables = `git ls-files -- exe/*`.split("\n").map{ |f| File.basename(f) }
22
+ spec.add_runtime_dependency "rest-client", "~> 1.6"
23
+ spec.add_runtime_dependency "json", "~> 1.8"
24
+ spec.add_runtime_dependency "activesupport", "~> 3.0"
25
+ spec.add_runtime_dependency "i18n", "~> 0.6"
26
+ spec.add_runtime_dependency "naught", "~> 1.0"
27
+
28
+ spec.add_development_dependency "bundler", "~> 1.3"
29
+ spec.add_development_dependency "rake", "~> 10.0"
30
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rundeck-ruby-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Jon Phillips
8
+ - Mikael Robert
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2014-06-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rest-client
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.6'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.6'
28
+ - !ruby/object:Gem::Dependency
29
+ name: json
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: '1.8'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: '1.8'
42
+ - !ruby/object:Gem::Dependency
43
+ name: activesupport
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '3.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: i18n
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '0.6'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '0.6'
70
+ - !ruby/object:Gem::Dependency
71
+ name: naught
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '1.0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '1.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: bundler
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ version: '1.3'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: '1.3'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rake
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ~>
103
+ - !ruby/object:Gem::Version
104
+ version: '10.0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ version: '10.0'
112
+ description: Ruby client for Rundeck API
113
+ email:
114
+ - jphillips@biaprotect.com
115
+ - mikaelrob@gmail.com
116
+ executables:
117
+ - rundeck
118
+ extensions: []
119
+ extra_rdoc_files: []
120
+ files:
121
+ - .gitignore
122
+ - Gemfile
123
+ - LICENSE.txt
124
+ - README.md
125
+ - Rakefile
126
+ - exe/rundeck
127
+ - lib/rundeck-ruby-client.rb
128
+ - lib/rundeck-ruby-client/execution.rb
129
+ - lib/rundeck-ruby-client/job.rb
130
+ - lib/rundeck-ruby-client/maybe.rb
131
+ - lib/rundeck-ruby-client/project.rb
132
+ - lib/rundeck-ruby-client/session.rb
133
+ - lib/rundeck-ruby-client/version.rb
134
+ - rundeck-ruby-client.gemspec
135
+ homepage: https://github.com/mikrob/rundeck-ruby
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.0.3
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: For talking to Rundeck
159
+ test_files: []