fresnel 0.5.8 → 0.5.9
Sign up to get free protection for your applications and to get access to all the features.
- data/fresnel.gemspec +2 -2
- data/lib/fresnel/lighthouse.rb +1 -3
- data/lib/fresnel/setup_wizard.rb +10 -1
- data/lib/fresnel/string.rb +5 -1
- data/lib/fresnel.rb +84 -36
- metadata +2 -2
data/fresnel.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.name = 'fresnel'
|
4
4
|
s.summary = "Fresnel is a console manager to LighthouseApp.com using the official lighthouse api."
|
5
5
|
s.description = s.summary
|
6
|
-
s.version = '0.5.
|
7
|
-
s.date = '
|
6
|
+
s.version = '0.5.9'
|
7
|
+
s.date = '2010-01-03'
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Gerard de Brieder", "Wes Oldenbeuving"]
|
10
10
|
s.email = "smeevil@gmail.com"
|
data/lib/fresnel/lighthouse.rb
CHANGED
data/lib/fresnel/setup_wizard.rb
CHANGED
@@ -31,8 +31,16 @@ class SetupWizard
|
|
31
31
|
config['user_id']=ask("My lighthouse user_id is : ", Integer) do |q|
|
32
32
|
q.default=user_id
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
|
+
puts "What are your commonly used tags ?"
|
36
|
+
puts "Please write them down like : [l]ow [m]edium [h]igh awe[s]ome"
|
37
|
+
puts "When adding tags you can give something like : special s design h"
|
38
|
+
puts "this will be expanded to : special awesome design high"
|
39
|
+
tags=ask("Tags : ")
|
40
|
+
config['tags']=tags.split(" ")
|
41
|
+
|
35
42
|
puts "generated your config in #{fresnel.global_config_file}, going on with main program..."
|
43
|
+
# TODO: Refactor GlobalConfig into its own object, responsible for loading and saving itself.
|
36
44
|
File.open(fresnel.global_config_file,'w+'){ |f| f.write(YAML::dump(config)) }
|
37
45
|
end
|
38
46
|
|
@@ -47,6 +55,7 @@ class SetupWizard
|
|
47
55
|
else
|
48
56
|
config['project_id']=data[project_id.to_i].id
|
49
57
|
puts "generated your config in #{fresnel.project_config_file}, going on with main program..."
|
58
|
+
# TODO: Refactor ProjectConfig into its own object, responsible for loading and saving itself.
|
50
59
|
File.open(fresnel.project_config_file,'w+'){ |f| f.write(YAML::dump(config)) }
|
51
60
|
end
|
52
61
|
end
|
data/lib/fresnel/string.rb
CHANGED
@@ -9,6 +9,10 @@ class String
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def scrape_urls
|
12
|
-
scan(/(http|https)(:\/\/)([a-zA-Z0-9.\/_-]+)| (www\.[a-zA-Z0-9.\/_-]+)/).map{ |url| url.join}
|
12
|
+
scan(/(http|https)(:\/\/)([a-zA-Z0-9.\/_-]+\?[&=a-zA-Z0-9.\/_-]+)| (www\.[a-zA-Z0-9.\/_-]+)/).map{ |url| url.join}
|
13
|
+
end
|
14
|
+
|
15
|
+
def scrape_textmate_links
|
16
|
+
scan(/(\.?\/.*?\.rb:\d+):in/)
|
13
17
|
end
|
14
18
|
end
|
data/lib/fresnel.rb
CHANGED
@@ -34,47 +34,56 @@ class Fresnel
|
|
34
34
|
@app_description="A lighthouseapp console manager"
|
35
35
|
@lighthouse=Lighthouse
|
36
36
|
@cache=Cache.new
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
load_global_config
|
38
|
+
load_project_config
|
39
|
+
initialize_lighthouse
|
40
40
|
end
|
41
41
|
|
42
42
|
def load_global_config
|
43
|
-
|
44
|
-
config
|
43
|
+
unless File.exists? self.global_config_file
|
44
|
+
puts Frame.new(:header=>"Notice",:body=>"global config not found at #{self.global_config_file}, starting wizard")
|
45
|
+
SetupWizard.global(self)
|
46
|
+
return load_global_config
|
47
|
+
end
|
45
48
|
|
46
|
-
|
47
|
-
@@debug=config['debug'] if config.has_key?('debug')
|
48
|
-
@@term_size=config['term_size'] if config.has_key?('term_size')
|
49
|
+
config = YAML.load_file(self.global_config_file)
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
else
|
58
|
-
puts Frame.new(:header=>"Notice",:body=>"global config not found at #{self.global_config_file}, starting wizard")
|
51
|
+
@@cache_timeout=config['cache_timeout'] if config.has_key?('cache_timeout')
|
52
|
+
@@debug=config['debug'] if config.has_key?('debug')
|
53
|
+
@@term_size=config['term_size'] if config.has_key?('term_size')
|
54
|
+
@@tags=config['tags']
|
55
|
+
unless config && config.class==Hash && config.has_key?('account') && config.has_key?('token') && config.has_key?('user_id') && config.has_key?('tags')
|
56
|
+
puts Frame.new(:header=>"Warning !",:body=>"global config did not validate , recreating")
|
59
57
|
SetupWizard.global(self)
|
60
|
-
load_global_config
|
58
|
+
return load_global_config
|
61
59
|
end
|
60
|
+
|
61
|
+
@lighthouse_account = config['account']
|
62
|
+
@lighthouse_token = config['token']
|
63
|
+
@current_user_id = config['user_id']
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def initialize_lighthouse
|
68
|
+
@lighthouse.account = @lighthouse_account
|
69
|
+
@lighthouse.token = @lighthouse_token
|
70
|
+
nil
|
62
71
|
end
|
63
72
|
|
64
73
|
def load_project_config
|
65
|
-
|
66
|
-
config = YAML.load_file(self.project_config_file)
|
67
|
-
if config && config.class==Hash && config.has_key?('project_id')
|
68
|
-
return config['project_id']
|
69
|
-
else
|
70
|
-
puts Frame.new(:header=>"Warning !",:body=>"project config found but project_id was not declared")
|
71
|
-
load_project_config
|
72
|
-
end
|
73
|
-
else
|
74
|
+
unless File.exists? self.project_config_file
|
74
75
|
puts Frame.new(:header=>"Notice",:body=>"project config not found at #{self.project_config_file}, starting wizard")
|
75
76
|
SetupWizard.project(self)
|
76
|
-
load_project_config
|
77
|
+
return load_project_config
|
78
|
+
end
|
79
|
+
|
80
|
+
config = YAML.load_file(self.project_config_file) || Hash.new
|
81
|
+
unless config['project_id']
|
82
|
+
puts Frame.new(:header=>"Warning !",:body=>"project config found but project_id was not declared")
|
83
|
+
return load_project_config
|
77
84
|
end
|
85
|
+
@current_project_id = config['project_id']
|
86
|
+
nil
|
78
87
|
end
|
79
88
|
|
80
89
|
def account
|
@@ -100,7 +109,7 @@ class Fresnel
|
|
100
109
|
license=InputDetector.new("License # : ",(0...LICENSES.size).to_a).answer
|
101
110
|
license=LICENSES[license.to_i].first
|
102
111
|
end
|
103
|
-
|
112
|
+
|
104
113
|
puts "collected :"
|
105
114
|
puts "#{name} : #{license}"
|
106
115
|
project = Lighthouse::Project.new(:name => name)
|
@@ -157,6 +166,7 @@ class Fresnel
|
|
157
166
|
system("clear")
|
158
167
|
options[:all] ? print("Fetching all tickets#{" in bin #{options[:bin_name]}" if options[:bin_name].present?}...") : print("Fetching unresolved tickets#{" in bin #{options[:bin_name]}" if options[:bin_name].present?}...")
|
159
168
|
STDOUT.flush
|
169
|
+
@current_project_id=options[:project_id]||self.current_project_id
|
160
170
|
project_id=options[:project_id]||self.current_project_id
|
161
171
|
tickets=options[:tickets]||cache.load(:name=>"fresnel_project_#{project_id}_tickets#{"_all" if options[:all]}", :action=>"Lighthouse::Ticket.find(:all, :params=>{:project_id=>#{project_id} #{",:q=>'not-state:closed'" unless options[:all]}})")
|
162
172
|
puts " [done] - data is #{tickets.age}s old , max is #{@@cache_timeout}s"
|
@@ -295,7 +305,7 @@ class Fresnel
|
|
295
305
|
ticket = get_ticket(number)
|
296
306
|
puts Frame.new(
|
297
307
|
:header=>[
|
298
|
-
"Ticket ##{number} : #{ticket.title.chomp.truncate(
|
308
|
+
"Ticket ##{number} : #{ticket.title.chomp.truncate(@@term_size-5)}",
|
299
309
|
"Date : #{DateParser.string(ticket.created_at.to_s)} by #{ticket.creator_name}",
|
300
310
|
"Tags : #{ticket.tag}"
|
301
311
|
],
|
@@ -322,7 +332,7 @@ class Fresnel
|
|
322
332
|
puts "Current state : #{ticket.versions.last.state}"
|
323
333
|
choices = {
|
324
334
|
:states => %w[open resolved invalid hold new],
|
325
|
-
:actions => %w[quit tickets bins comments assign self web links]
|
335
|
+
:actions => %w[quit tickets bins comments assign self web links errors]
|
326
336
|
}
|
327
337
|
states = choices[:states]
|
328
338
|
action=InputDetector.pretty_prompt(choices).answer
|
@@ -334,6 +344,7 @@ class Fresnel
|
|
334
344
|
when "s" then claim(:ticket=>number)
|
335
345
|
when "w" then open_browser_for_ticket(number)
|
336
346
|
when "l" then links(number)
|
347
|
+
when "e" then errors(number)
|
337
348
|
when *(states.map{|state| state[0,1]})
|
338
349
|
change_state(:ticket=>number,:state=>states.find{|state| state[0,1] == action})
|
339
350
|
else
|
@@ -365,6 +376,30 @@ class Fresnel
|
|
365
376
|
show_ticket(number)
|
366
377
|
end
|
367
378
|
|
379
|
+
def errors(number)
|
380
|
+
ticket = get_ticket(number)
|
381
|
+
errors = ticket.versions.map{ |version| version.body.to_s.scrape_textmate_links }.flatten
|
382
|
+
if errors.size == 0
|
383
|
+
puts "No errors found"
|
384
|
+
sleep 1
|
385
|
+
elsif errors.size == 1
|
386
|
+
error=errors.first
|
387
|
+
error=~/(.*?):(\d+)/
|
388
|
+
`mate -l #{$2} #{File.expand_path(".")}#{$1.gsub(/^\./,"")}`
|
389
|
+
else
|
390
|
+
error_table=table do |t|
|
391
|
+
t.headings=['#','error']
|
392
|
+
errors.each_with_index{|error,i|t << [i,error]}
|
393
|
+
end
|
394
|
+
puts error_table
|
395
|
+
pick=InputDetector.new("open error # : ", (0...errors.size).to_a).answer
|
396
|
+
error=errors[pick.to_i]
|
397
|
+
error=~/(.*?):(\d+)/
|
398
|
+
`mate -l #{$2} #{File.expand_path(".")}#{$1.gsub(/^\./,"")}`
|
399
|
+
end
|
400
|
+
show_ticket(number)
|
401
|
+
end
|
402
|
+
|
368
403
|
def comment(number,state=nil)
|
369
404
|
puts "create comment for #{number}"
|
370
405
|
ticket=get_ticket(number)
|
@@ -413,16 +448,30 @@ class Fresnel
|
|
413
448
|
body << l
|
414
449
|
end
|
415
450
|
body=body.to_s
|
416
|
-
tags=ask("Tags : ")
|
451
|
+
tags=ask("Tags #{@@tags.join(",")} : ")
|
417
452
|
tags=tags.split(" ")
|
453
|
+
expanded_tags=[]
|
454
|
+
tags.each do |tag|
|
455
|
+
match=false
|
456
|
+
if tag.length==1
|
457
|
+
@@tags.each do |predefined_tag|
|
458
|
+
if predefined_tag=~/\[#{tag}\]/
|
459
|
+
match=true
|
460
|
+
expanded_tags<<predefined_tag.gsub(/\[|\]/,"")
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|
464
|
+
expanded_tags<<tag unless match
|
465
|
+
end
|
418
466
|
end
|
467
|
+
puts "tags are #{expanded_tags.inspect}"
|
419
468
|
puts "creating ticket..."
|
420
469
|
ticket = Lighthouse::Ticket.new(
|
421
470
|
:project_id=>self.current_project_id,
|
422
471
|
:title=>title,
|
423
472
|
:body=>body
|
424
473
|
)
|
425
|
-
ticket.tags=
|
474
|
+
ticket.tags=expanded_tags
|
426
475
|
if ticket.save
|
427
476
|
File.delete("/tmp/fresnel_new_ticket")
|
428
477
|
show_ticket(ticket.number)
|
@@ -475,9 +524,8 @@ class Fresnel
|
|
475
524
|
end
|
476
525
|
end
|
477
526
|
puts members_table
|
478
|
-
#
|
479
|
-
pick
|
480
|
-
options[:user_id]=members[pick].user.id
|
527
|
+
pick=InputDetector.new("Assign to user # : ",((0...members.size).to_a)).answer
|
528
|
+
options[:user_id]=members[pick.to_i].user.id
|
481
529
|
end
|
482
530
|
ticket=get_ticket(options[:ticket])
|
483
531
|
ticket.assigned_user_id=options[:user_id]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fresnel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerard de Brieder
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date:
|
13
|
+
date: 2010-01-03 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|