singularity_client 0.2.0 → 0.3.0
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.
- data/README.md +7 -2
- data/lib/singularity_client/api.rb +9 -2
- data/lib/singularity_client/cli.rb +27 -4
- data/lib/singularity_client/config.rb +22 -17
- data/lib/singularity_client/config_loader.rb +31 -0
- data/lib/singularity_client/version.rb +1 -1
- data/lib/singularity_client.rb +1 -0
- data/spec/singularity_client/api_spec.rb +33 -7
- data/spec/singularity_client/config_loader_spec.rb +48 -0
- data/spec/singularity_client/config_spec.rb +14 -10
- data/spec/spec_helper.rb +1 -0
- data/spec/vcr_cassettes/{add.yml → addPull.yml} +3 -3
- data/spec/vcr_cassettes/addPush.yml +30 -0
- metadata +11 -6
data/README.md
CHANGED
@@ -18,10 +18,11 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Configuration
|
20
20
|
|
21
|
-
|
21
|
+
Configuration options may be declared from the command line,
|
22
|
+
or defined in a `.singularity.yml` file.
|
22
23
|
|
23
24
|
By default, the tool will start looking for a `.singularity.yml` in your current working directory,
|
24
|
-
and will work its way up to the root directory. Specify a
|
25
|
+
and will work its way up to the root directory. Specify a file via the `--config` command line option.
|
25
26
|
|
26
27
|
### Available configurations:
|
27
28
|
|
@@ -30,24 +31,28 @@ and will work its way up to the root directory. Specify a path via the `--config
|
|
30
31
|
<th>Key</th>
|
31
32
|
<th>Description</th>
|
32
33
|
<th>Type</th>
|
34
|
+
<th>Required</th>
|
33
35
|
<th>Example</th>
|
34
36
|
</tr>
|
35
37
|
<tr>
|
36
38
|
<td><tt>singularity_url</tt></td>
|
37
39
|
<td>URL for the singularity server</td>
|
38
40
|
<td>String</td>
|
41
|
+
<td>Yes</td>
|
39
42
|
<td><tt>'http://singularity.net'</tt></td>
|
40
43
|
</tr>
|
41
44
|
<tr>
|
42
45
|
<td><tt>singularity_port</tt></td>
|
43
46
|
<td>Port the singularity server is operating on</td>
|
44
47
|
<td>String</td>
|
48
|
+
<td>Yes</td>
|
45
49
|
<td><tt>'9000'</tt></td>
|
46
50
|
</tr>
|
47
51
|
<tr>
|
48
52
|
<td><tt>github_organization</tt></td>
|
49
53
|
<td>Default github organization to use</td>
|
50
54
|
<td>String</td>
|
55
|
+
<td>No</td>
|
51
56
|
<td><tt>'Behance'</tt></td>
|
52
57
|
</tr>
|
53
58
|
</table>
|
@@ -17,8 +17,15 @@ module SingularityClient
|
|
17
17
|
pp(JSON.parse(response.body))
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
##
|
21
|
+
# Add to the singularity config
|
22
|
+
# the 'type' parameter can be pull_request or push
|
23
|
+
#
|
24
|
+
def self.add(config, repo, project, type)
|
25
|
+
# This is just to maintain backwards compatability
|
26
|
+
type ||= 'pull_request'
|
27
|
+
|
28
|
+
endpoint = (type == 'push') ? 'config/push' : 'config/pull_request'
|
22
29
|
post_data = {
|
23
30
|
organization: config.organization,
|
24
31
|
repo: repo,
|
@@ -10,7 +10,7 @@ module SingularityClient
|
|
10
10
|
|
11
11
|
def initialize(*args)
|
12
12
|
super
|
13
|
-
@
|
13
|
+
@cli_options = options
|
14
14
|
end
|
15
15
|
|
16
16
|
# rubocop:disable AlignHash
|
@@ -25,21 +25,44 @@ module SingularityClient
|
|
25
25
|
|
26
26
|
desc 'config', 'Get the current singularity config object'
|
27
27
|
def config
|
28
|
-
|
28
|
+
run(:config)
|
29
29
|
end
|
30
30
|
|
31
31
|
desc 'add REPO_NAME PROJECT_NAME', 'Add a github repository to singularity'
|
32
|
+
long_desc 'This will add both pull requests, and pushes, to singularity'
|
32
33
|
method_option :github_organization, aliases: '-o', type: :string,
|
33
34
|
desc: 'Override the default github organization'
|
34
35
|
def add(repo, project)
|
35
|
-
|
36
|
+
run(:add, repo, project, 'pull_request')
|
37
|
+
run(:add, repo, project, 'push')
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'addPull REPO_NAME PROJECT_NAME', 'Add repo pulls to singularity'
|
41
|
+
method_option :github_organization, aliases: '-o', type: :string,
|
42
|
+
desc: 'Override the default github organization'
|
43
|
+
def add_pull(repo, project)
|
44
|
+
run(:add, repo, project, 'pull_request')
|
45
|
+
end
|
46
|
+
|
47
|
+
desc 'addPush REPO_NAME PROJECT_NAME', 'Add repo pushes to singularity'
|
48
|
+
method_option :github_organization, aliases: '-o', type: :string,
|
49
|
+
desc: 'Override the default github organization'
|
50
|
+
def add_push(repo, project)
|
51
|
+
run(:add, repo, project, 'push')
|
36
52
|
end
|
37
53
|
|
38
54
|
desc 'comment REPO_NAME PR_NUM COMMENT', 'Write comment to a pull request'
|
39
55
|
method_option :github_organization, aliases: '-o', type: :string,
|
40
56
|
desc: 'Override the default github organization'
|
41
57
|
def comment(repo, pr, comment)
|
42
|
-
|
58
|
+
run(:comment, repo, pr, comment)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def run(action, *args)
|
64
|
+
config = SingularityClient::Config.new(@cli_options)
|
65
|
+
SingularityClient::API.send(action, config, *args)
|
43
66
|
end
|
44
67
|
end
|
45
68
|
end
|
@@ -6,16 +6,15 @@ require 'pathname'
|
|
6
6
|
module SingularityClient
|
7
7
|
# Wrapper around the config object
|
8
8
|
class Config
|
9
|
-
DOTFILE = '.singularity.yml'
|
10
|
-
|
11
9
|
attr_accessor :options
|
12
10
|
|
13
|
-
def initialize(inputs)
|
14
|
-
|
15
|
-
@options =
|
11
|
+
def initialize(inputs = {})
|
12
|
+
@options = ConfigLoader.load_from_file(inputs['config'], inputs['debug'])
|
13
|
+
@options = @options.merge(inputs)
|
16
14
|
|
17
|
-
puts "DEBUG: Using configuration from #{config_file}" if debug
|
18
15
|
puts "DEBUG: Current configuration: #{@options}" if debug
|
16
|
+
|
17
|
+
validate_config
|
19
18
|
end
|
20
19
|
|
21
20
|
def base_uri
|
@@ -27,22 +26,28 @@ module SingularityClient
|
|
27
26
|
end
|
28
27
|
|
29
28
|
def debug
|
30
|
-
@options.key?
|
29
|
+
@options.key? 'debug'
|
31
30
|
end
|
32
31
|
|
33
32
|
private
|
34
33
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
def validate_config
|
35
|
+
required_fields = %w(
|
36
|
+
singularity_url
|
37
|
+
singularity_port
|
38
|
+
)
|
39
|
+
|
40
|
+
required_fields.all? do |field|
|
41
|
+
if @options.key? field
|
42
|
+
true
|
43
|
+
else
|
44
|
+
fail <<-ERR.gsub(/^[\s\t]*/, '').gsub(/[\s\t]*\n/, ' ').strip
|
45
|
+
#{field} not defined. Please see
|
46
|
+
https://github.com/behance/singularity_client#configuration
|
47
|
+
for configuration options
|
48
|
+
ERR
|
49
|
+
end
|
39
50
|
end
|
40
|
-
|
41
|
-
fail 'Could not find .singularity.yml'
|
42
|
-
end
|
43
|
-
|
44
|
-
def load_from_file(file)
|
45
|
-
YAML.load_file(file)
|
46
51
|
end
|
47
52
|
end
|
48
53
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
module SingularityClient
|
7
|
+
# Wrapper around the config object
|
8
|
+
class ConfigLoader
|
9
|
+
DOTFILE = '.singularity.yml'
|
10
|
+
|
11
|
+
def self.load_from_file(file = false, debug = false)
|
12
|
+
# If file is defined don't look for one, else find one
|
13
|
+
file = find_config_file('.', debug) unless file
|
14
|
+
|
15
|
+
# If no config file passed in, and none found, return empty hash
|
16
|
+
file ? YAML.load_file(file) : {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.find_config_file(dir, debug)
|
20
|
+
Pathname.new(File.expand_path(dir)).ascend do |path|
|
21
|
+
file = File.join(path.to_s, DOTFILE)
|
22
|
+
if File.exist?(file)
|
23
|
+
puts "DEBUG: Using configuration from #{file}" if debug
|
24
|
+
return file
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
puts 'DEBUG: Could not find .singularity.yml' if debug
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/singularity_client.rb
CHANGED
@@ -45,15 +45,41 @@ describe SingularityClient::API do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
describe '.add' do
|
48
|
-
|
49
|
-
|
48
|
+
|
49
|
+
describe 'Adding a pull_request' do
|
50
|
+
subject(:add) do
|
51
|
+
SingularityClient::API.add(config_obj,
|
52
|
+
'test_repo',
|
53
|
+
'test_project',
|
54
|
+
'pull_request'
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'when it receives a succesful response' do
|
59
|
+
it 'it returns success!' do
|
60
|
+
VCR.use_cassette('addPull') do
|
61
|
+
expect(STDOUT).to receive(:puts).with('success!')
|
62
|
+
add
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
50
66
|
end
|
51
67
|
|
52
|
-
describe '
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
68
|
+
describe 'Adding a push' do
|
69
|
+
subject(:add) do
|
70
|
+
SingularityClient::API.add(config_obj,
|
71
|
+
'test_repo',
|
72
|
+
'test_project',
|
73
|
+
'push'
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'when it receives a succesful response' do
|
78
|
+
it 'it returns success!' do
|
79
|
+
VCR.use_cassette('addPush') do
|
80
|
+
expect(STDOUT).to receive(:puts).with('success!')
|
81
|
+
add
|
82
|
+
end
|
57
83
|
end
|
58
84
|
end
|
59
85
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe SingularityClient::ConfigLoader do
|
6
|
+
describe '.load_from_file' do
|
7
|
+
filepath = 'test/path'
|
8
|
+
config = { key: 'value' }
|
9
|
+
|
10
|
+
describe 'when filepath is provided' do
|
11
|
+
it 'loads the provided file' do
|
12
|
+
expect(SingularityClient::ConfigLoader)
|
13
|
+
.to_not receive(:find_config_file)
|
14
|
+
|
15
|
+
expect(YAML).to receive(:load_file)
|
16
|
+
.with(filepath)
|
17
|
+
.and_return(config)
|
18
|
+
|
19
|
+
expect(
|
20
|
+
SingularityClient::ConfigLoader.load_from_file(filepath, false)
|
21
|
+
).to eq(config)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'when filepath is not provided' do
|
26
|
+
describe 'and a .singularity.yml exists' do
|
27
|
+
it 'loads .singularity.yml' do
|
28
|
+
expect(SingularityClient::ConfigLoader.load_from_file).to eq(
|
29
|
+
'singularity_url' => 'http://mergeatron.dev-be-aws.net',
|
30
|
+
'singularity_port' => '3306',
|
31
|
+
'github_organization' => 'BehanceOps'
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe 'and no singularity.yml exists' do
|
37
|
+
it 'returns an empty hash' do
|
38
|
+
expect(File).to receive(:exist?)
|
39
|
+
.at_least(:once)
|
40
|
+
.with(/.*\/.singularity.yml/)
|
41
|
+
.and_return(false)
|
42
|
+
|
43
|
+
expect(SingularityClient::ConfigLoader.load_from_file).to eq({})
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -4,16 +4,20 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe SingularityClient::Config do
|
6
6
|
describe '.initialize' do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
it 'raises an exception if validation fails' do
|
8
|
+
expect(File).to receive(:exist?)
|
9
|
+
.at_least(:once)
|
10
|
+
.with(/.*\/.singularity.yml/)
|
11
|
+
.and_return(false)
|
12
|
+
|
13
|
+
error = <<-ERR.gsub(/^[\s\t]*/, '').gsub(/[\s\t]*\n/, ' ').strip
|
14
|
+
singularity_port not defined. Please see
|
15
|
+
https://github.com/behance/singularity_client#configuration
|
16
|
+
for configuration options
|
17
|
+
ERR
|
18
|
+
expect do
|
19
|
+
SingularityClient::Config.new('singularity_url' => 'test.url')
|
20
|
+
end .to raise_error(RuntimeError, error)
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
data/spec/spec_helper.rb
CHANGED
@@ -19,12 +19,12 @@ http_interactions:
|
|
19
19
|
Content-Length:
|
20
20
|
- '16'
|
21
21
|
Date:
|
22
|
-
-
|
22
|
+
- Wed, 18 Jun 2014 22:58:24 GMT
|
23
23
|
Connection:
|
24
24
|
- keep-alive
|
25
25
|
body:
|
26
26
|
encoding: US-ASCII
|
27
27
|
string: ! '{"success":true}'
|
28
|
-
http_version:
|
29
|
-
recorded_at:
|
28
|
+
http_version:
|
29
|
+
recorded_at: Wed, 18 Jun 2014 22:58:23 GMT
|
30
30
|
recorded_with: VCR 2.9.2
|
@@ -0,0 +1,30 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://mergeatron.dev-be-aws.net:3306/config/push
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: organization=some_org&repo=test_repo&project=test_project
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
X-Powered-By:
|
16
|
+
- Express
|
17
|
+
Content-Type:
|
18
|
+
- application/json
|
19
|
+
Content-Length:
|
20
|
+
- '16'
|
21
|
+
Date:
|
22
|
+
- Wed, 18 Jun 2014 22:58:24 GMT
|
23
|
+
Connection:
|
24
|
+
- keep-alive
|
25
|
+
body:
|
26
|
+
encoding: US-ASCII
|
27
|
+
string: ! '{"success":true}'
|
28
|
+
http_version:
|
29
|
+
recorded_at: Wed, 18 Jun 2014 22:58:23 GMT
|
30
|
+
recorded_with: VCR 2.9.2
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: singularity_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-06-
|
12
|
+
date: 2014-06-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -175,14 +175,17 @@ files:
|
|
175
175
|
- lib/singularity_client/api.rb
|
176
176
|
- lib/singularity_client/cli.rb
|
177
177
|
- lib/singularity_client/config.rb
|
178
|
+
- lib/singularity_client/config_loader.rb
|
178
179
|
- lib/singularity_client/request.rb
|
179
180
|
- lib/singularity_client/version.rb
|
180
181
|
- singularity_client.gemspec
|
181
182
|
- spec/singularity_client/api_spec.rb
|
183
|
+
- spec/singularity_client/config_loader_spec.rb
|
182
184
|
- spec/singularity_client/config_spec.rb
|
183
185
|
- spec/singularity_client/request_spec.rb
|
184
186
|
- spec/spec_helper.rb
|
185
|
-
- spec/vcr_cassettes/
|
187
|
+
- spec/vcr_cassettes/addPull.yml
|
188
|
+
- spec/vcr_cassettes/addPush.yml
|
186
189
|
- spec/vcr_cassettes/comment.yml
|
187
190
|
- spec/vcr_cassettes/config.yml
|
188
191
|
- spec/vcr_cassettes/error-get.yml
|
@@ -202,7 +205,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
205
|
version: '0'
|
203
206
|
segments:
|
204
207
|
- 0
|
205
|
-
hash: -
|
208
|
+
hash: -3052736762778204807
|
206
209
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
207
210
|
none: false
|
208
211
|
requirements:
|
@@ -211,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
214
|
version: '0'
|
212
215
|
segments:
|
213
216
|
- 0
|
214
|
-
hash: -
|
217
|
+
hash: -3052736762778204807
|
215
218
|
requirements: []
|
216
219
|
rubyforge_project:
|
217
220
|
rubygems_version: 1.8.23
|
@@ -220,10 +223,12 @@ specification_version: 3
|
|
220
223
|
summary: Singularity Client
|
221
224
|
test_files:
|
222
225
|
- spec/singularity_client/api_spec.rb
|
226
|
+
- spec/singularity_client/config_loader_spec.rb
|
223
227
|
- spec/singularity_client/config_spec.rb
|
224
228
|
- spec/singularity_client/request_spec.rb
|
225
229
|
- spec/spec_helper.rb
|
226
|
-
- spec/vcr_cassettes/
|
230
|
+
- spec/vcr_cassettes/addPull.yml
|
231
|
+
- spec/vcr_cassettes/addPush.yml
|
227
232
|
- spec/vcr_cassettes/comment.yml
|
228
233
|
- spec/vcr_cassettes/config.yml
|
229
234
|
- spec/vcr_cassettes/error-get.yml
|