fresnel 0.5.8 → 0.5.9
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/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
|