watson-ruby 1.0.3 → 1.0.4
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 +4 -4
- data/.travis.yml +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +9 -8
- data/Rakefile +2 -2
- data/lib/watson.rb +49 -49
- data/lib/watson/bitbucket.rb +370 -371
- data/lib/watson/command.rb +468 -468
- data/lib/watson/config.rb +490 -490
- data/lib/watson/fs.rb +59 -59
- data/lib/watson/github.rb +367 -367
- data/lib/watson/parser.rb +417 -418
- data/lib/watson/printer.rb +291 -291
- data/lib/watson/remote.rb +104 -104
- data/lib/watson/version.rb +1 -1
- data/spec/config_spec.rb +111 -111
- data/spec/fs_spec.rb +47 -47
- data/spec/parser_spec.rb +124 -124
- data/watson.gemspec +21 -21
- metadata +2 -1
data/lib/watson/remote.rb
CHANGED
@@ -1,120 +1,120 @@
|
|
1
1
|
module Watson
|
2
|
-
|
3
|
-
|
2
|
+
# Remote class that handles all remote HTTP calls to Bitbucket and GitHub
|
3
|
+
class Remote
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
# Debug printing for this class
|
6
|
+
DEBUG = false
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
# Include for debug_print
|
11
|
+
include Watson
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
13
|
+
# Required libs
|
14
|
+
require 'net/https'
|
15
|
+
require 'uri'
|
16
|
+
require 'json'
|
17
|
+
|
18
|
+
|
19
|
+
# Default options hash for http_call
|
20
|
+
# Will get merged with input argument hash to maintain defaults
|
21
|
+
HTTP_opts = {
|
22
|
+
:url => nil, #--> URL of endpoint [String]
|
23
|
+
:ssl => false, #--> Use SSL in connection (HTTPS) (True/False]
|
24
|
+
:method => nil, #--> GET or POST for respective HTTP method [String]
|
25
|
+
:basic_auth => Array.new(0), #--> Array of username and pw to use for basic authentication
|
26
|
+
# If empty, assume no user authentication [Array]
|
27
|
+
:auth => nil, #--> Authentication token [String]
|
28
|
+
:data => nil, #--> Hash of data to be POST'd in HTTP request [Hash]
|
29
|
+
:verbose => false #--> Turn on verbose debug for this call [True/False]
|
30
|
+
}
|
31
|
+
|
32
|
+
###########################################################
|
33
|
+
# Generic HTTP call method
|
34
|
+
# Accepts input hash of options that dictate how the HTTP call is to be made
|
35
|
+
def http_call( opts )
|
36
|
+
# [review] - Don't use DEBUG inside Remote class but pull from calling method's class?
|
37
|
+
# [review] - Not sure if this is the best/proper way to do things but it works...
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
# Identify method entry
|
40
|
+
debug_print "#{ self.class } : #{ __method__ }\n"
|
41
|
+
|
42
|
+
# Merge default options with those passed in by user to form complete opt list
|
43
|
+
opts = HTTP_opts.merge(opts)
|
44
44
|
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
46
|
+
# Check URL in hash and get URI from it, then set up HTTP connection
|
47
|
+
if opts[:url] =~ /^#{URI::regexp}$/
|
48
|
+
_uri = URI(opts[:url])
|
49
|
+
else
|
50
|
+
debug_print "No URL specified in input opts, exiting HTTP call\n"
|
51
|
+
return false
|
52
|
+
end
|
53
|
+
|
54
|
+
_http = Net::HTTP.new(_uri.host, _uri.port)
|
55
|
+
|
56
|
+
# Print out verbose HTTP request if :verbose is set
|
57
|
+
# For hardcore debugging when shit really doesn't work
|
58
|
+
_http.set_debug_output $stderr if opts[:verbose] == true
|
59
|
+
|
60
|
+
# If SSL is set in hash, set HTTP connection to use SSL
|
61
|
+
_http.use_ssl = true if opts[:ssl] == true
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
63
|
+
# Create request based on HTTP method
|
64
|
+
# [review] - Not sure if to fail with no method or default to GET?
|
65
|
+
case opts[:method].upcase
|
66
|
+
when "GET"
|
67
|
+
_req = Net::HTTP::Get.new(_uri.request_uri)
|
68
|
+
|
69
|
+
when "POST"
|
70
|
+
_req = Net::HTTP::Post.new(_uri.request_uri)
|
71
|
+
|
72
|
+
else
|
73
|
+
debug_print "No method specified, cannot make HTTP request\n"
|
74
|
+
return false
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
77
|
+
# Check for basic authentication key in hash
|
78
|
+
if opts[:basic_auth].size == 2
|
79
|
+
_req.basic_auth(opts[:basic_auth][0], opts[:basic_auth][1])
|
80
|
+
end
|
81
81
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
82
|
+
# Check for Authentication token key in hash to be used in header
|
83
|
+
# I think this is pretty universal, but specifically works for GitHub
|
84
|
+
if opts[:auth]
|
85
|
+
_req["Authorization"] = "token #{ opts[:auth] }"
|
86
|
+
end
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
88
|
+
# [review] - Add :data_format to use set_form_data vs json body?
|
89
|
+
# For now, use Hash or Array, this is to differentiate between
|
90
|
+
# putting post data in body vs putting it in the form
|
91
|
+
|
92
|
+
# If a POST method, :data is present, and is a Hash, fill request body with data
|
93
|
+
if opts[:method].upcase == "POST" && opts[:data] && opts[:data].is_a?(Hash)
|
94
|
+
_req.body = opts[:data].to_json
|
95
|
+
end
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
# If a POST method, :data is present, and is an Array, use set_form_data
|
98
|
+
if opts[:method].upcase == "POST" && opts[:data] && opts[:data].is_a?(Array)
|
99
|
+
_req.set_form_data(opts[:data][0])
|
100
|
+
end
|
101
101
|
|
102
|
-
|
103
|
-
|
102
|
+
# Make HTTP request
|
103
|
+
_resp = _http.request(_req)
|
104
104
|
|
105
|
-
|
106
|
-
|
107
|
-
|
105
|
+
# Debug prints for status and message
|
106
|
+
debug_print "HTTP Response Code: #{ _resp.code }\n"
|
107
|
+
debug_print "HTTP Response Msg: #{ _resp.message }\n"
|
108
108
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
# [fix] - Not sure if 401 is the only code that gives nonparseable body?
|
110
|
+
# Figure out what other response codes are bad news for JSON.parse
|
111
|
+
_json = _resp.code == "401" ? Hash.new : JSON.parse(_resp.body)
|
112
|
+
debug_print "JSON: \n #{ _json }\n"
|
113
113
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
114
|
+
# [review] - Returning hash of json + response the right thing to do?
|
115
|
+
# return {:json => _json, :resp => _resp}
|
116
|
+
return _json, _resp
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
120
|
end
|
data/lib/watson/version.rb
CHANGED
data/spec/config_spec.rb
CHANGED
@@ -2,117 +2,117 @@ module Watson
|
|
2
2
|
require_relative 'helper_spec'
|
3
3
|
|
4
4
|
describe Config do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
5
|
+
before(:each) do
|
6
|
+
@config = Config.new
|
7
|
+
@file = @config.instance_variable_get(:@rc_file)
|
8
|
+
silence_output
|
9
|
+
end
|
10
|
+
|
11
|
+
after(:each) do
|
12
|
+
File.delete(@file) if File.exists?(@file)
|
13
|
+
enable_output
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
describe '#create_conf' do
|
18
|
+
it 'create config file, return true' do
|
19
|
+
@config.create_conf.should be_true
|
20
|
+
File.exists?(@file).should be_true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#check_conf' do
|
25
|
+
context 'config does not exist' do
|
26
|
+
it 'create config file, return true' do
|
27
|
+
@config.check_conf.should be_true
|
28
|
+
File.exists?(@file).should be_true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'config does exist' do
|
33
|
+
it 'should return true' do
|
34
|
+
@config.check_conf.should be_true
|
35
|
+
File.exists?(@file).should be_true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#read_conf' do
|
41
|
+
context 'config does not exist' do
|
42
|
+
it 'no config, return false' do
|
43
|
+
@config.read_conf.should be_false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'config does exist' do
|
48
|
+
before { @config.create_conf }
|
49
|
+
|
50
|
+
it 'return true, values match default config' do
|
51
|
+
@config.create_conf.should be_true
|
52
|
+
@config.read_conf.should be_true
|
53
|
+
@config.dir_list.should include('.')
|
54
|
+
@config.tag_list.should include('fix', 'review', 'todo')
|
55
|
+
@config.ignore_list.should include('.git', '*.swp')
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#update_conf' do
|
62
|
+
before do
|
63
|
+
@config.check_conf
|
64
|
+
@config.parse_depth = 1000
|
65
|
+
@config.update_conf('parse_depth')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'updated config.parse_depth should be 1000' do
|
69
|
+
@new_config = Config.new
|
70
|
+
@new_config.check_conf.should be_true
|
71
|
+
@new_config.read_conf.should be_true
|
72
|
+
@new_config.parse_depth.to_i.should eql 1000
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# [review] - Should this be #initialize or #new?
|
77
|
+
describe '#initialize' do
|
78
|
+
it 'should initialize all member vars' do
|
79
|
+
@config.cl_entry_set.should be_false
|
80
|
+
@config.cl_tag_set.should be_false
|
81
|
+
@config.cl_ignore_set.should be_false
|
82
|
+
|
83
|
+
@config.use_less.should be_false
|
84
|
+
|
85
|
+
@config.ignore_list.should == []
|
86
|
+
@config.dir_list.should == []
|
87
|
+
@config.file_list.should == []
|
88
|
+
@config.tag_list.should == []
|
89
|
+
|
90
|
+
@config.remote_valid.should be_false
|
91
|
+
|
92
|
+
@config.github_valid.should be_false
|
93
|
+
@config.github_api.should == ''
|
94
|
+
@config.github_repo.should == ''
|
95
|
+
@config.github_issues.should == {:open => Hash.new(),
|
96
|
+
:closed => Hash.new() }
|
97
|
+
|
98
|
+
@config.bitbucket_valid.should be_false
|
99
|
+
@config.bitbucket_api.should == ''
|
100
|
+
@config.bitbucket_repo.should == ''
|
101
|
+
@config.bitbucket_issues.should == {:open => Hash.new(),
|
102
|
+
:closed => Hash.new() }
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe '#run' do
|
108
|
+
it 'should populate all member vars' do
|
109
|
+
@config.run
|
110
|
+
@config.ignore_list.should include('.git', '*.swp')
|
111
|
+
@config.tag_list.should include('fix', 'review', 'todo')
|
112
|
+
@config.dir_list.should include('.')
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
116
|
|
117
117
|
end
|
118
118
|
|