watson-ruby 1.5.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,9 +5,6 @@ module Watson
5
5
  # and post issues to Bitbucket
6
6
  class Bitbucket
7
7
 
8
- # Debug printing for this class
9
- DEBUG = false
10
-
11
8
  class << self
12
9
 
13
10
  # [todo] - Allow closing of issues from watson? Don't like that idea but maybe
@@ -3,9 +3,6 @@ module Watson
3
3
  # Controls program flow and parses options given by command line
4
4
  class Command
5
5
 
6
- # Debug printing for this class
7
- DEBUG = false
8
-
9
6
  class << self
10
7
 
11
8
  # Include for debug_print
@@ -26,18 +23,33 @@ module Watson
26
23
  _flag_list = %w[
27
24
  -c --context-depth
28
25
  -d --dirs
26
+ --debug
29
27
  -f --files
28
+ --format
30
29
  -h --help
31
30
  -i --ignore
32
31
  -p --parse-depth
33
32
  -r --remote
34
33
  -s --show
35
34
  -t --tags
36
- --format
37
35
  -u --update
38
36
  -v --version
39
37
  ]
40
38
 
39
+ # Add debug prints based on --debug flag
40
+ if (_index = args.index('--debug')) != nil
41
+ _debug_mode = Array.new
42
+ _index += 1
43
+ until _flag_list.include?(args[_index]) || _index > (args.length - 1)
44
+ _debug_mode.push(args[_index].downcase)
45
+ _index += 1
46
+ end
47
+ # Slice out so we can ignore in regular CLI parsing
48
+ args.slice!(args.index('--debug') ... _index)
49
+
50
+ Watson.debug_mode = _debug_mode
51
+ end
52
+
41
53
 
42
54
  # If we get the version or help flag, ignore all other flags
43
55
  # Just display these and exit
@@ -46,7 +58,6 @@ module Watson
46
58
  return version if args.index('-v') != nil || args.index('--version') != nil
47
59
 
48
60
 
49
-
50
61
  # If not one of the above then we are performing actual watson stuff
51
62
  # Create all the necessary watson components so we can perform
52
63
  # all actions associated with command line args
@@ -179,6 +190,8 @@ module Watson
179
190
 
180
191
  -c, --context-depth lines of context to provide with posted issue
181
192
  -d, --dirs list of directories to search in
193
+ --debug enable debug prints from specified class
194
+ all debug prints enabled if no arguments passed
182
195
  -f, --files list of files to search in
183
196
  --format set output format for watson
184
197
  [print, json, unite, silent]
@@ -441,7 +454,7 @@ module Watson
441
454
 
442
455
  # Check the config for any remote entries (GitHub or Bitbucket) and print
443
456
  # We *should* always have a repo + API together, but API should be enough
444
- if @config.github_api.empty? && @config.bitbucket_api.empty?
457
+ if @config.github_api.empty? && @config.bitbucket_api.empty? && @config.asana_api.empty?
445
458
  formatter.print_status "!", YELLOW
446
459
  print BOLD + "No remotes currently exist\n\n" + RESET
447
460
  end
@@ -461,6 +474,12 @@ module Watson
461
474
  print BOLD + "GitLab Repo : " + RESET + "#{ @config.gitlab_repo }\n\n" + RESET
462
475
  end
463
476
 
477
+ if !@config.asana_api.empty?
478
+ print BOLD + "Asana API Key : " + RESET + "#{ @config.asana_api }\n" + RESET
479
+ print BOLD + "Asana Workspace : " + RESET + "#{ @config.asana_workspace }\n" + RESET
480
+ print BOLD + "Asana Project : " + RESET + "#{ @config.asana_project }\n\n" + RESET
481
+ end
482
+
464
483
  # If github or bitbucket passed, setup
465
484
  # If just -r (0 args) do nothing and only have above printed
466
485
  # If more than 1 arg is passed, unrecognized, warn user
@@ -478,6 +497,10 @@ module Watson
478
497
  debug_print "GitLab setup called from CL\n"
479
498
  Watson::Remote::GitLab.setup(@config)
480
499
 
500
+ when "asana"
501
+ debug_print "Asana setup called from CL\n"
502
+ Watson::Remote::Asana.setup(@config)
503
+
481
504
  end
482
505
  elsif args.length > 1
483
506
  formatter.print_status "x", RED
data/lib/watson/config.rb CHANGED
@@ -7,9 +7,6 @@ module Watson
7
7
  # Include for debug_print
8
8
  include Watson
9
9
 
10
- # Debug printing for this class
11
- DEBUG = false
12
-
13
10
  # [review] - Combine into single statement (for performance or something?)
14
11
  # [todo] - Add config options (rc file) for default max depth and context lines
15
12
 
@@ -21,6 +18,8 @@ module Watson
21
18
  attr_accessor :file_list
22
19
  # List of tags to look for when parsing
23
20
  attr_accessor :tag_list
21
+ # List of custom filetypes to accept
22
+ attr_accessor :type_list
24
23
  # Number of directories to parse recursively
25
24
  attr_accessor :parse_depth
26
25
  # Number of lines of issue context to grab
@@ -70,6 +69,17 @@ module Watson
70
69
  # Hash to hold list of all Bitbucket issues associated with repo
71
70
  attr_accessor :bitbucket_issues
72
71
 
72
+ # Flag for whether Asana access is avaliable
73
+ attr_accessor :asana_valid
74
+ # Asana API Key
75
+ attr_accessor :asana_api
76
+ # Asana workspace
77
+ attr_accessor :asana_workspace
78
+ # Asana project within the workspace to place issues
79
+ attr_accessor :asana_project
80
+ # Hash to hold list of all Asana issues associated with repo
81
+ attr_accessor :asana_issues
82
+
73
83
 
74
84
  # Flag for whether GitLab access is avaliable
75
85
  attr_accessor :gitlab_valid
@@ -119,6 +129,7 @@ module Watson
119
129
  @dir_list = Array.new()
120
130
  @file_list = Array.new()
121
131
  @tag_list = Array.new()
132
+ @type_list = Hash.new()
122
133
  @issue_count = 0
123
134
 
124
135
  # Remote options
@@ -147,8 +158,16 @@ module Watson
147
158
  @gitlab_issues = Hash.new()
148
159
 
149
160
 
161
+ @asana_valid = false
162
+ @asana_api = ""
163
+ @asana_workspace = ""
164
+ @asana_project = ""
165
+ @asana_issues = Hash.new()
166
+
150
167
 
151
168
  @output_format = Watson::Formatters::DefaultFormatter
169
+
170
+
152
171
  end
153
172
 
154
173
 
@@ -176,6 +195,11 @@ module Watson
176
195
  unless @gitlab_api.empty? && @gitlab_repo.empty?
177
196
  Remote::GitLab.get_issues(self)
178
197
  end
198
+
199
+ unless @asana_api.empty? && @asana_project.empty? && @asana_workspace.empty?
200
+ Remote::Asana.get_issues(self)
201
+ end
202
+
179
203
  end
180
204
 
181
205
 
@@ -207,40 +231,41 @@ module Watson
207
231
 
208
232
  ###########################################################
209
233
  # Watson config creater
210
- # Copies default config from /assets/defaultConf to the current directory
234
+ # Attempts to create config based on $HOME/.watsonrc
235
+ # If this doesn't exist, copies default config from /assets/defaultConf to $HOME and current directory
211
236
  def create_conf
212
237
  # [review] - Not sure if I should use the open/read/write or Fileutils.cp
213
238
 
214
239
  # Identify method entry
215
240
  debug_print "#{ self.class } : #{ __method__ }\n"
216
241
 
217
-
218
- # Generate full path since File doesn't care about the LOAD_PATH
242
+ # Full path to assets/defaultConf (File class doesn't look at LOAD_PATH)
219
243
  # [review] - gsub uses (.?)+ to grab anything after lib (optional), better regex?
220
244
  _full_path = __dir__.gsub(%r!/lib/watson(.?)+!, '') + "/assets/defaultConf"
221
245
  debug_print "Full path to defaultConf (in gem): #{ _full_path }\n"
222
246
 
223
- # Check to make sure we can access the default file
224
- if !Watson::FS.check_file(_full_path)
225
- print "Unable to open #{ _full_path }\n"
226
- print "Cannot create default, exiting...\n"
227
- return false
247
+ # $HOME/.watsonrc exists, '~' should be crossplatform with File.expand_path
248
+ _home_path = File.expand_path('~') + '/.watsonrc'
249
+
250
+ # Obtain default config to write to current directory
251
+ if Watson::FS.check_file(_home_path)
252
+ _default = File.open(_home_path, 'r') { |file| file.read }
253
+ debug_print ".watsonrc found in $HOME, using as base\n"
254
+ elsif Watson::FS.check_file(_full_path)
255
+ _default = File.open(_full_path, 'r') { |file| file.read }
256
+ # Write default to $HOME
257
+ File.open(_home_path, 'w') { |file| file.write(_default) }
258
+ debug_print ".watsonrc not found in $HOME, using assets\n"
228
259
  else
229
- # Open default config file in read mode and read into temp
230
- _input = File.open(_full_path, 'r')
231
- _default = _input.read
232
-
233
- # Open rc file in current directory in write mode and write default
234
- _output = File.open(@rc_file, 'w')
235
- _output.write(_default)
236
-
237
- # Close both default and new rc files
238
- _input.close
239
- _output.close
240
-
241
- debug_print "Successfully wrote defaultConf to current directory\n"
242
- return true
260
+ print "Unable to find .watsonrc in $HOME or #{ _full_path}\n"
261
+ print "Cannot create a default config, exiting...\n"
262
+ return false
243
263
  end
264
+
265
+ # Open @rc_file and write the default contents to it
266
+ File.open(@rc_file, 'w') { |file| file.write(_default) }
267
+ debug_print "Successfully wrote defaultConf to current directory\n"
268
+ true
244
269
  end
245
270
 
246
271
 
@@ -370,6 +395,16 @@ module Watson
370
395
  debug_print "@tag_list --> #{ @tag_list }\n"
371
396
 
372
397
 
398
+ when "type"
399
+ # Regex to grab ".type" => ["param1", "param2"]
400
+ _mtch = _line.match(/(\"\S+\")\s+=>\s+(\[(\".+\")+\])/)
401
+ if !_mtch.nil?
402
+ _ext = _mtch[1].gsub(/\"/, '')
403
+ _type = JSON.parse(_mtch[2])
404
+ @type_list[_ext] = _type
405
+ end
406
+
407
+
373
408
  when "ignore"
374
409
  # Same as previous for ignores
375
410
  # [review] - Populate @tag_list, then check size instead
@@ -441,6 +476,20 @@ module Watson
441
476
  @gitlab_repo = _line.chomp!
442
477
  debug_print "GitLab Repo: #{ @gitlab_repo }\n"
443
478
 
479
+ when "asana_project"
480
+ @asana_project = _line.chomp!
481
+ debug_print "Asana Project: #{ @asana_project }\n"
482
+
483
+ when "asana_api"
484
+ @asana_api = _line.chomp!
485
+ debug_print "Asana API: #{ @asana_api }\n"
486
+
487
+ when "asana_workspace"
488
+ @asana_workspace = _line.chomp!
489
+ debug_print "Asana Workspace: #{ @asana_workspace }\n"
490
+
491
+
492
+
444
493
  else
445
494
  debug_print "Unknown tag found #{_section}\n"
446
495
  end
@@ -555,3 +604,8 @@ module Watson
555
604
  end
556
605
  end
557
606
 
607
+ if __FILE__ == $0
608
+ @config = Watson::Config.new
609
+ end
610
+
611
+
@@ -1,7 +1,6 @@
1
1
  module Watson::Formatters
2
2
  class BaseFormatter
3
3
  include Watson
4
- DEBUG = false
5
4
 
6
5
  def initialize(config)
7
6
  @config = config
@@ -171,6 +171,15 @@ module Watson::Formatters
171
171
  MESSAGE
172
172
  end
173
173
 
174
+ if _AS = @config.asana_issues[issue[:md5]]
175
+ debug_print "Found #{ issue[:title]} in remote issues\n"
176
+ completed = _AS[:state]
177
+
178
+ cprint <<-MESSAGE.gsub(/^(\s+)/, '').chomp
179
+ #{BOLD}[#{RESET}#{completed ? GREEN : RED}#{BOLD}AS##{_AS[:id]}#{RESET}#{BOLD}]#{RESET}
180
+ MESSAGE
181
+ end
182
+
174
183
 
175
184
  cprint "\n"
176
185
  end
data/lib/watson/fs.rb CHANGED
@@ -3,9 +3,6 @@ module Watson
3
3
  # Contains all methods for file access in watson
4
4
  class FS
5
5
 
6
- # Debug printing for this class
7
- DEBUG = false
8
-
9
6
  class << self
10
7
  # [todo] - Not sure whether to make check* methods return FP
11
8
  # Makes it nice to get it returned and use it but
data/lib/watson/github.rb CHANGED
@@ -5,9 +5,6 @@ module Watson
5
5
  # and post issues to GitHub
6
6
  class GitHub
7
7
 
8
- # Debug printing for this class
9
- DEBUG = false
10
-
11
8
  class << self
12
9
 
13
10
  # [todo] - Allow closing of issues from watson? Don't like that idea but maybe
@@ -102,6 +99,10 @@ module Watson
102
99
  return false
103
100
  end
104
101
 
102
+ # Label for Auth Token
103
+ print BOLD + "Auth Token Label (leave blank to ignore): " + RESET
104
+ _label = $stdin.gets.chomp
105
+
105
106
  _endpoint = "https://api.github.com" if _endpoint.empty?
106
107
 
107
108
  # HTTP Request to get OAuth Token
@@ -117,7 +118,7 @@ module Watson
117
118
  :method => "POST",
118
119
  :basic_auth => [_username, _password],
119
120
  :data => {"scopes" => ["repo"],
120
- "note" => "watson",
121
+ "note" => "watson - #{_label}",
121
122
  "note_url" => "http://watson.goosecode.com/" },
122
123
  :verbose => false
123
124
  }
data/lib/watson/gitlab.rb CHANGED
@@ -5,9 +5,6 @@ module Watson
5
5
  # and post issues to GitLab
6
6
  class GitLab
7
7
 
8
- # Debug printing for this class
9
- DEBUG = false
10
-
11
8
  class << self
12
9
 
13
10
  # [todo] - Keep asking for user data until valid instead of leaving app
data/lib/watson/parser.rb CHANGED
@@ -12,9 +12,6 @@ module Watson
12
12
  require 'digest'
13
13
  require 'pp'
14
14
 
15
- # Debug printing for this class
16
- DEBUG = false
17
-
18
15
  ###########################################################
19
16
  # Initialize the parser with the current watson config
20
17
  def initialize(config)
@@ -406,10 +403,15 @@ module Watson
406
403
  '.lua' => ['--', '--[['], # Lua
407
404
  '.vim' => ['"'], # VimL
408
405
  '.md' => ['<!--'], # Markdown
409
- '.html' => ['<!--'] # HTML
406
+ '.html' => ['<!--'], # HTML
407
+ '.el' => [';'] # Emacslisp
410
408
  }
411
409
 
412
- loop do
410
+ # Merge config file type list with defaults
411
+ _ext.merge!(@config.type_list)
412
+
413
+
414
+ loop do
413
415
  _mtch = filename.match(/(\.(\S+))$/)
414
416
  debug_print "Extension: #{ _mtch }\n"
415
417
 
@@ -25,9 +25,6 @@ module Watson
25
25
  # Include for debug_print (for class methods)
26
26
  include Watson
27
27
 
28
- # Debug printing for this class
29
- DEBUG = false
30
-
31
28
  ###########################################################
32
29
  # Printer initialization method to setup necessary parameters, states, and vars
33
30
  def initialize(config)
data/lib/watson/remote.rb CHANGED
@@ -2,9 +2,6 @@ module Watson
2
2
  # Remote class that handles all remote HTTP calls to Bitbucket and GitHub
3
3
  class Remote
4
4
 
5
- # Debug printing for this class
6
- DEBUG = false
7
-
8
5
  class << self
9
6
 
10
7
  # Include for debug_print
@@ -129,7 +126,7 @@ module Watson
129
126
  def post_structure(structure, config, counter)
130
127
 
131
128
  # Return if remote isn't valid or both github and bitbucket aren't valid
132
- return false if !config.remote_valid || (!config.github_valid && !config.bitbucket_valid && !config.gitlab_valid)
129
+ return false if !config.remote_valid || (!config.asana_valid && !config.github_valid && !config.bitbucket_valid && !config.gitlab_valid)
133
130
  formatter = Printer.new(config).build_formatter
134
131
 
135
132
  # Parse through entire structure and post issues to remote
@@ -140,6 +137,7 @@ module Watson
140
137
  Remote::GitHub.post_issue(issue, config) if config.github_valid
141
138
  Remote::Bitbucket.post_issue(issue, config) if config.bitbucket_valid
142
139
  Remote::GitLab.post_issue(issue, config) if config.gitlab_valid
140
+ Remote::Asana.post_issue(issue, config) if config.asana_valid
143
141
  formatter.print_status "!", GREEN
144
142
  print BOLD + "Remote Posting Status: #{counter += 1} / #{config.issue_count}"
145
143
  print "\r"
@@ -1,3 +1,3 @@
1
1
  module Watson
2
- VERSION = "1.5.1"
2
+ VERSION = "1.6.0"
3
3
  end
data/spec/config_spec.rb CHANGED
@@ -98,6 +98,12 @@ describe Config do
98
98
  @config.bitbucket_repo.should == ''
99
99
  @config.bitbucket_issues.should == Hash.new()
100
100
 
101
+ @config.asana_valid.should be_false
102
+ @config.asana_api.should == ''
103
+ @config.asana_workspace.should == ''
104
+ @config.asana_project.should == ''
105
+ @config.asana_issues.should == Hash.new()
106
+
101
107
  end
102
108
  end
103
109