watson-ruby 1.5.1 → 1.6.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.
@@ -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