code_buddy 0.0.7 → 0.0.8
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/.gitignore +1 -0
- data/bin/code_buddy +16 -1
- data/code_buddy.gemspec +6 -3
- data/features/command_line.feature +6 -0
- data/features/rails2_app.feature +4 -3
- data/features/rails3_app.feature +3 -1
- data/features/step_definitions/rails_setup_steps.rb +16 -6
- data/features/support/Gemfile-rails2 +12 -0
- data/features/support/Gemfile-rails2.lock +87 -0
- data/features/support/Gemfile-rails3 +7 -0
- data/features/support/Gemfile-rails3.lock +102 -0
- data/features/support/env.rb +1 -1
- data/features/templates/rails_exception.feature.template +1 -1
- data/lib/code_buddy.rb +4 -3
- data/lib/code_buddy/app.rb +5 -9
- data/lib/code_buddy/public/javascripts/code_buddy.js +88 -21
- data/lib/code_buddy/public/stylesheets/code_buddy.css +58 -14
- data/lib/code_buddy/server.rb +44 -0
- data/lib/code_buddy/version.rb +1 -1
- data/lib/code_buddy/views/form.erb +1 -1
- data/lib/code_buddy/views/index.erb +31 -13
- metadata +77 -24
data/.gitignore
CHANGED
data/bin/code_buddy
CHANGED
@@ -2,4 +2,19 @@
|
|
2
2
|
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
3
3
|
require 'rubygems'
|
4
4
|
require 'code_buddy'
|
5
|
-
|
5
|
+
require 'code_buddy/server'
|
6
|
+
require 'daemons'
|
7
|
+
|
8
|
+
command = ARGV.shift
|
9
|
+
|
10
|
+
stdin = STDIN.read unless STDIN.tty?
|
11
|
+
if !stdin.nil? && !stdin.empty?
|
12
|
+
CodeBuddy::Server.update(stdin)
|
13
|
+
else
|
14
|
+
case command
|
15
|
+
when "start"
|
16
|
+
CodeBuddy::Server.start
|
17
|
+
when "stop"
|
18
|
+
CodeBuddy::Server.stop
|
19
|
+
end
|
20
|
+
end
|
data/code_buddy.gemspec
CHANGED
@@ -23,12 +23,15 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency 'sinatra', '~> 1.1.0'
|
24
24
|
s.add_dependency 'json_pure', '~> 1.4.6'
|
25
25
|
s.add_dependency 'coderay', '~> 0.9.6'
|
26
|
+
s.add_dependency 'daemons'
|
27
|
+
s.add_dependency 'launchy'
|
26
28
|
|
27
29
|
s.add_development_dependency 'rake', '~> 0.8.7'
|
28
|
-
s.add_development_dependency 'rspec', '~> 2.
|
30
|
+
s.add_development_dependency 'rspec', '~> 2.3.0'
|
29
31
|
s.add_development_dependency 'mocha', '~> 0.9.10'
|
30
|
-
s.add_development_dependency 'cucumber', '~> 0.
|
31
|
-
s.add_development_dependency 'aruba', '~> 0.
|
32
|
+
s.add_development_dependency 'cucumber', '~> 0.10.0'
|
33
|
+
s.add_development_dependency 'aruba', '~> 0.3.2'
|
34
|
+
s.add_development_dependency 'ruby-debug'
|
32
35
|
# s.add_development_dependency 'capybara'
|
33
36
|
# s.add_development_dependency 'akephalos'
|
34
37
|
end
|
data/features/rails2_app.feature
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
Feature: Make sure CodeBuddy works with a
|
1
|
+
Feature: Make sure CodeBuddy works with a Rails 2 app
|
2
2
|
|
3
|
+
@disable-bundler
|
3
4
|
@announce
|
4
5
|
Scenario: See a stack trace with links
|
5
|
-
Given I
|
6
|
+
Given I'm using a clean gemset "code_buddy_rails2_test"
|
7
|
+
And I have created a new Rails 2 app "new_rails2_app" with code_buddy
|
6
8
|
And I run "script/generate scaffold user"
|
7
9
|
And I overwrite "app/views/users/index.html.erb" with:
|
8
10
|
"""
|
@@ -10,7 +12,6 @@ Scenario: See a stack trace with links
|
|
10
12
|
"""
|
11
13
|
And I run "rake db:migrate"
|
12
14
|
And I run "cp ../../../features/templates/rails_exception.feature.template features/rails_exception.feature"
|
13
|
-
And I am pending
|
14
15
|
And I run "rake cucumber"
|
15
16
|
Then it should pass with:
|
16
17
|
"""
|
data/features/rails3_app.feature
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
Feature: Make sure CodeBuddy works with a Rails3 app
|
2
2
|
|
3
|
+
@disable-bundler
|
3
4
|
@announce
|
4
5
|
Scenario: See a stack trace with links
|
5
|
-
Given I
|
6
|
+
Given I'm using a clean gemset "code_buddy_rails3_test"
|
7
|
+
And I have created a new Rails 3 app "new_rails3_app" with code_buddy
|
6
8
|
And I run "rails generate scaffold users"
|
7
9
|
And I overwrite "app/views/users/index.html.erb" with:
|
8
10
|
"""
|
@@ -1,6 +1,7 @@
|
|
1
1
|
Given /^I have created a new Rails 3 app "([^"]*)" with code_buddy$/ do |app_name|
|
2
2
|
steps <<-STEPS
|
3
|
-
Given I
|
3
|
+
Given I run "bundle install --gemfile=../../features/support/Gemfile-rails3"
|
4
|
+
And I successfully run "rails new #{app_name}"
|
4
5
|
And I cd to "#{app_name}"
|
5
6
|
And I append to "Gemfile" with:
|
6
7
|
"""
|
@@ -12,13 +13,18 @@ Given /^I have created a new Rails 3 app "([^"]*)" with code_buddy$/ do |app_nam
|
|
12
13
|
"""
|
13
14
|
And I run "bundle install"
|
14
15
|
And I run "rails generate cucumber:install"
|
16
|
+
And I replace "# Add more mappings here." in "features/support/paths.rb" with:
|
17
|
+
"""
|
18
|
+
when "code_buddy"
|
19
|
+
"/code_buddy/stack/0"
|
20
|
+
"""
|
15
21
|
And I run "rake db:migrate"
|
16
22
|
STEPS
|
17
23
|
end
|
18
24
|
|
19
25
|
Given /^I have created a new Rails 2 app "([^"]*)" with code_buddy$/ do |app_name|
|
20
26
|
steps <<-STEPS
|
21
|
-
Given I run "
|
27
|
+
Given I run "bundle install --gemfile=../../features/support/Gemfile-rails2"
|
22
28
|
And I successfully run "rails _2.3.10_ #{app_name}"
|
23
29
|
And I cd to "#{app_name}"
|
24
30
|
And I replace "# Specify gems that this application depends on and have them installed with rake gems:install" in "config/environment.rb" with:
|
@@ -26,11 +32,15 @@ Given /^I have created a new Rails 2 app "([^"]*)" with code_buddy$/ do |app_nam
|
|
26
32
|
# Specify gems that this application depends on and have them installed with rake gems:install
|
27
33
|
config.gem 'code_buddy'
|
28
34
|
config.middleware.use "CodeBuddy::ShowApp"
|
29
|
-
|
30
35
|
"""
|
31
36
|
And I run "mkdir vendor/gems"
|
32
37
|
And I run "ln -s #{File.expand_path("../../..", __FILE__)} vendor/gems/code_buddy-#{CodeBuddy::VERSION}"
|
33
|
-
And I run "script/generate cucumber"
|
38
|
+
And I run "script/generate cucumber --capybara"
|
39
|
+
And I replace "# Add more mappings here." in "features/support/paths.rb" with:
|
40
|
+
"""
|
41
|
+
when "code_buddy"
|
42
|
+
"/code_buddy/stack/0"
|
43
|
+
"""
|
34
44
|
And I run "rake db:migrate"
|
35
45
|
STEPS
|
36
46
|
end
|
@@ -50,7 +60,7 @@ Given /^I enable show_exceptions in "([^"]*)"$/ do |file_name|
|
|
50
60
|
# Given %Q[I replace "config.action_dispatch.show_exceptions = false" in "#{file_name}"], pystring #Cucumber::Ast::PyString.parse('config.action_dispatch.show_exceptions = true')
|
51
61
|
cmd = "sed s/'config.action_dispatch.show_exceptions = false'/'config.action_dispatch.show_exceptions = true'/ #{file_name}"
|
52
62
|
run_simple(cmd)
|
53
|
-
|
63
|
+
_create_file(file_name, stdout_from(cmd), true)
|
54
64
|
end
|
55
65
|
|
56
66
|
Given /^I replace "([^"]*)" in "([^"]*)" with:$/ do |marker, file_name, new_text|
|
@@ -62,7 +72,7 @@ Given /^I replace "([^"]*)" in "([^"]*)" with:$/ do |marker, file_name, new_text
|
|
62
72
|
line
|
63
73
|
end
|
64
74
|
end
|
65
|
-
|
75
|
+
_create_file(file_name, new_content, true)
|
66
76
|
end
|
67
77
|
|
68
78
|
|
@@ -0,0 +1,12 @@
|
|
1
|
+
source :rubygems
|
2
|
+
|
3
|
+
gem "rake"
|
4
|
+
gem "rails", '2.3.10'
|
5
|
+
gem "cucumber", "0.10.0"
|
6
|
+
gem "cucumber-rails"
|
7
|
+
gem "capybara", '~> 0.3.8'
|
8
|
+
gem "aruba", "0.3.2"
|
9
|
+
gem "rspec", "~> 2.3.0"
|
10
|
+
gem "sqlite3-ruby"
|
11
|
+
gem "database_cleaner"
|
12
|
+
# gem "code_buddy", :path => File.expand_path("../../..", __FILE__)
|
@@ -0,0 +1,87 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
actionmailer (2.3.10)
|
5
|
+
actionpack (= 2.3.10)
|
6
|
+
actionpack (2.3.10)
|
7
|
+
activesupport (= 2.3.10)
|
8
|
+
rack (~> 1.1.0)
|
9
|
+
activerecord (2.3.10)
|
10
|
+
activesupport (= 2.3.10)
|
11
|
+
activeresource (2.3.10)
|
12
|
+
activesupport (= 2.3.10)
|
13
|
+
activesupport (2.3.10)
|
14
|
+
aruba (0.3.2)
|
15
|
+
childprocess (~> 0.1.6)
|
16
|
+
cucumber (~> 0.10.0)
|
17
|
+
rspec (~> 2.3.0)
|
18
|
+
builder (3.0.0)
|
19
|
+
capybara (0.3.9)
|
20
|
+
culerity (>= 0.2.4)
|
21
|
+
mime-types (>= 1.16)
|
22
|
+
nokogiri (>= 1.3.3)
|
23
|
+
rack (>= 1.0.0)
|
24
|
+
rack-test (>= 0.5.4)
|
25
|
+
selenium-webdriver (>= 0.0.3)
|
26
|
+
childprocess (0.1.6)
|
27
|
+
ffi (~> 0.6.3)
|
28
|
+
cucumber (0.10.0)
|
29
|
+
builder (>= 2.1.2)
|
30
|
+
diff-lcs (~> 1.1.2)
|
31
|
+
gherkin (~> 2.3.2)
|
32
|
+
json (~> 1.4.6)
|
33
|
+
term-ansicolor (~> 1.0.5)
|
34
|
+
cucumber-rails (0.3.2)
|
35
|
+
cucumber (>= 0.8.0)
|
36
|
+
culerity (0.2.14)
|
37
|
+
database_cleaner (0.6.0)
|
38
|
+
diff-lcs (1.1.2)
|
39
|
+
ffi (0.6.3)
|
40
|
+
rake (>= 0.8.7)
|
41
|
+
gherkin (2.3.3)
|
42
|
+
json (~> 1.4.6)
|
43
|
+
json (1.4.6)
|
44
|
+
json_pure (1.4.6)
|
45
|
+
mime-types (1.16)
|
46
|
+
nokogiri (1.4.4)
|
47
|
+
rack (1.1.0)
|
48
|
+
rack-test (0.5.7)
|
49
|
+
rack (>= 1.0)
|
50
|
+
rails (2.3.10)
|
51
|
+
actionmailer (= 2.3.10)
|
52
|
+
actionpack (= 2.3.10)
|
53
|
+
activerecord (= 2.3.10)
|
54
|
+
activeresource (= 2.3.10)
|
55
|
+
activesupport (= 2.3.10)
|
56
|
+
rake (>= 0.8.3)
|
57
|
+
rake (0.8.7)
|
58
|
+
rspec (2.3.0)
|
59
|
+
rspec-core (~> 2.3.0)
|
60
|
+
rspec-expectations (~> 2.3.0)
|
61
|
+
rspec-mocks (~> 2.3.0)
|
62
|
+
rspec-core (2.3.1)
|
63
|
+
rspec-expectations (2.3.0)
|
64
|
+
diff-lcs (~> 1.1.2)
|
65
|
+
rspec-mocks (2.3.0)
|
66
|
+
rubyzip (0.9.4)
|
67
|
+
selenium-webdriver (0.1.2)
|
68
|
+
childprocess (~> 0.1.5)
|
69
|
+
ffi (~> 0.6.3)
|
70
|
+
json_pure
|
71
|
+
rubyzip
|
72
|
+
sqlite3-ruby (1.3.2)
|
73
|
+
term-ansicolor (1.0.5)
|
74
|
+
|
75
|
+
PLATFORMS
|
76
|
+
ruby
|
77
|
+
|
78
|
+
DEPENDENCIES
|
79
|
+
aruba (= 0.3.2)
|
80
|
+
capybara (~> 0.3.8)
|
81
|
+
cucumber (= 0.10.0)
|
82
|
+
cucumber-rails
|
83
|
+
database_cleaner
|
84
|
+
rails (= 2.3.10)
|
85
|
+
rake
|
86
|
+
rspec (~> 2.3.0)
|
87
|
+
sqlite3-ruby
|
@@ -0,0 +1,102 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
abstract (1.0.0)
|
5
|
+
actionmailer (3.0.3)
|
6
|
+
actionpack (= 3.0.3)
|
7
|
+
mail (~> 2.2.9)
|
8
|
+
actionpack (3.0.3)
|
9
|
+
activemodel (= 3.0.3)
|
10
|
+
activesupport (= 3.0.3)
|
11
|
+
builder (~> 2.1.2)
|
12
|
+
erubis (~> 2.6.6)
|
13
|
+
i18n (~> 0.4)
|
14
|
+
rack (~> 1.2.1)
|
15
|
+
rack-mount (~> 0.6.13)
|
16
|
+
rack-test (~> 0.5.6)
|
17
|
+
tzinfo (~> 0.3.23)
|
18
|
+
activemodel (3.0.3)
|
19
|
+
activesupport (= 3.0.3)
|
20
|
+
builder (~> 2.1.2)
|
21
|
+
i18n (~> 0.4)
|
22
|
+
activerecord (3.0.3)
|
23
|
+
activemodel (= 3.0.3)
|
24
|
+
activesupport (= 3.0.3)
|
25
|
+
arel (~> 2.0.2)
|
26
|
+
tzinfo (~> 0.3.23)
|
27
|
+
activeresource (3.0.3)
|
28
|
+
activemodel (= 3.0.3)
|
29
|
+
activesupport (= 3.0.3)
|
30
|
+
activesupport (3.0.3)
|
31
|
+
arel (2.0.6)
|
32
|
+
aruba (0.3.2)
|
33
|
+
childprocess (~> 0.1.6)
|
34
|
+
cucumber (~> 0.10.0)
|
35
|
+
rspec (~> 2.3.0)
|
36
|
+
builder (2.1.2)
|
37
|
+
childprocess (0.1.6)
|
38
|
+
ffi (~> 0.6.3)
|
39
|
+
cucumber (0.10.0)
|
40
|
+
builder (>= 2.1.2)
|
41
|
+
diff-lcs (~> 1.1.2)
|
42
|
+
gherkin (~> 2.3.2)
|
43
|
+
json (~> 1.4.6)
|
44
|
+
term-ansicolor (~> 1.0.5)
|
45
|
+
diff-lcs (1.1.2)
|
46
|
+
erubis (2.6.6)
|
47
|
+
abstract (>= 1.0.0)
|
48
|
+
ffi (0.6.3)
|
49
|
+
rake (>= 0.8.7)
|
50
|
+
gherkin (2.3.3)
|
51
|
+
json (~> 1.4.6)
|
52
|
+
i18n (0.5.0)
|
53
|
+
json (1.4.6)
|
54
|
+
mail (2.2.14)
|
55
|
+
activesupport (>= 2.3.6)
|
56
|
+
i18n (>= 0.4.0)
|
57
|
+
mime-types (~> 1.16)
|
58
|
+
treetop (~> 1.4.8)
|
59
|
+
mime-types (1.16)
|
60
|
+
polyglot (0.3.1)
|
61
|
+
rack (1.2.1)
|
62
|
+
rack-mount (0.6.13)
|
63
|
+
rack (>= 1.0.0)
|
64
|
+
rack-test (0.5.7)
|
65
|
+
rack (>= 1.0)
|
66
|
+
rails (3.0.3)
|
67
|
+
actionmailer (= 3.0.3)
|
68
|
+
actionpack (= 3.0.3)
|
69
|
+
activerecord (= 3.0.3)
|
70
|
+
activeresource (= 3.0.3)
|
71
|
+
activesupport (= 3.0.3)
|
72
|
+
bundler (~> 1.0)
|
73
|
+
railties (= 3.0.3)
|
74
|
+
railties (3.0.3)
|
75
|
+
actionpack (= 3.0.3)
|
76
|
+
activesupport (= 3.0.3)
|
77
|
+
rake (>= 0.8.7)
|
78
|
+
thor (~> 0.14.4)
|
79
|
+
rake (0.8.7)
|
80
|
+
rspec (2.3.0)
|
81
|
+
rspec-core (~> 2.3.0)
|
82
|
+
rspec-expectations (~> 2.3.0)
|
83
|
+
rspec-mocks (~> 2.3.0)
|
84
|
+
rspec-core (2.3.1)
|
85
|
+
rspec-expectations (2.3.0)
|
86
|
+
diff-lcs (~> 1.1.2)
|
87
|
+
rspec-mocks (2.3.0)
|
88
|
+
term-ansicolor (1.0.5)
|
89
|
+
thor (0.14.6)
|
90
|
+
treetop (1.4.9)
|
91
|
+
polyglot (>= 0.3.1)
|
92
|
+
tzinfo (0.3.23)
|
93
|
+
|
94
|
+
PLATFORMS
|
95
|
+
ruby
|
96
|
+
|
97
|
+
DEPENDENCIES
|
98
|
+
aruba (= 0.3.2)
|
99
|
+
cucumber (= 0.10.0)
|
100
|
+
rails (= 3.0.3)
|
101
|
+
rake
|
102
|
+
rspec (~> 2.3.0)
|
data/features/support/env.rb
CHANGED
@@ -4,5 +4,5 @@ Feature: Ensure CodeBuddy creates links in a Rails app
|
|
4
4
|
Scenario: Clicking on a line of a stack trace on the exception page
|
5
5
|
When I go to the users page
|
6
6
|
Then I should see "app/views/users/index.html.erb:1"
|
7
|
-
And I
|
7
|
+
And I am on code_buddy
|
8
8
|
Then I should see "CodeBuddySee your Ruby stack come alive"
|
data/lib/code_buddy.rb
CHANGED
@@ -8,6 +8,9 @@ require 'code_buddy/stack'
|
|
8
8
|
require 'code_buddy/stack_frame'
|
9
9
|
require 'code_buddy/middleware'
|
10
10
|
|
11
|
+
module CodeBuddy
|
12
|
+
end
|
13
|
+
|
11
14
|
begin
|
12
15
|
if Rails.env.development? || Rails.env.test?
|
13
16
|
case Rails::VERSION::MAJOR
|
@@ -19,6 +22,4 @@ begin
|
|
19
22
|
end
|
20
23
|
rescue NameError
|
21
24
|
nil
|
22
|
-
end
|
23
|
-
|
24
|
-
# CodeBuddy::App.run!
|
25
|
+
end
|
data/lib/code_buddy/app.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module CodeBuddy
|
2
2
|
class App < Sinatra::Base
|
3
|
-
set :views, File.dirname(__FILE__) + '/views'
|
4
|
-
set :public, File.dirname(__FILE__) + '/public'
|
5
|
-
|
3
|
+
set :views, File.expand_path(File.dirname(__FILE__) + '/views')
|
4
|
+
set :public, File.expand_path(File.dirname(__FILE__) + '/public')
|
5
|
+
|
6
6
|
class << self
|
7
7
|
attr_reader :stack
|
8
8
|
attr_accessor :path_prefix
|
@@ -44,12 +44,8 @@ module CodeBuddy
|
|
44
44
|
|
45
45
|
def display_stack(selected_param)
|
46
46
|
@stack = self.class.stack
|
47
|
-
if @stack
|
48
|
-
|
49
|
-
erb :index
|
50
|
-
else
|
51
|
-
redirect "#{path_prefix}/new"
|
52
|
-
end
|
47
|
+
@stack.selected = selected_param if @stack
|
48
|
+
erb :index
|
53
49
|
end
|
54
50
|
|
55
51
|
def path_prefix
|
@@ -1,6 +1,4 @@
|
|
1
1
|
var CodeBuddy = {
|
2
|
-
stack : null,
|
3
|
-
stackView : null,
|
4
2
|
backbone : {}
|
5
3
|
}
|
6
4
|
|
@@ -55,11 +53,11 @@ CodeBuddy.backbone.Stack = Backbone.Model.extend({
|
|
55
53
|
selectionChanged: function(x) {
|
56
54
|
this.addresses().at(x.previousAttributes().selected).view.render()
|
57
55
|
this.addresses().at(x.changedAttributes().selected).view.render()
|
58
|
-
|
56
|
+
CodeBuddy.codeView.render()
|
59
57
|
},
|
60
58
|
|
61
59
|
toggleBookmark: function() {
|
62
|
-
this.selectedAddress().set({bookmarked:!this.get('bookmarked')})
|
60
|
+
this.selectedAddress().set({bookmarked:!this.selectedAddress().get('bookmarked')})
|
63
61
|
this.selectedAddress().view.render();
|
64
62
|
},
|
65
63
|
|
@@ -158,33 +156,102 @@ CodeBuddy.backbone.StackView = Backbone.View.extend({
|
|
158
156
|
addOneAddress: function(address, index) {
|
159
157
|
var view = new CodeBuddy.backbone.AddressView({model: address});
|
160
158
|
this.$("#stack").append(view.render().el);
|
161
|
-
}
|
159
|
+
}
|
160
|
+
})
|
162
161
|
|
162
|
+
CodeBuddy.backbone.CodeView = Backbone.View.extend({
|
163
|
+
el:$("#code-viewer"),
|
164
|
+
|
165
|
+
initialize: function() {
|
166
|
+
_.bindAll(this, 'toggleCommands','increaseOpacity', 'decreaseOpacity', 'toggle')
|
167
|
+
this.code = this.$("#code")
|
168
|
+
this.current = this.$("#current")
|
169
|
+
this.opacity = parseFloat(this.el.css("opacity"))
|
170
|
+
},
|
171
|
+
|
163
172
|
render: function() {
|
164
|
-
|
173
|
+
this.current.html('<div>' + CodeBuddy.stack.selectedAddress().get('path') + '</div>')
|
174
|
+
this.code.html(CodeBuddy.stack.selectedAddress().get('code'))
|
165
175
|
},
|
166
|
-
|
167
|
-
|
168
|
-
|
176
|
+
|
177
|
+
toggleCommands: function() {
|
178
|
+
this.$("#legend").toggle()
|
179
|
+
},
|
180
|
+
|
181
|
+
toggle: function() {
|
182
|
+
this.el.toggle()
|
169
183
|
},
|
170
184
|
|
171
185
|
editCode: function() {
|
172
|
-
|
186
|
+
$.get('../edit/' + CodeBuddy.stack.get('selected'))
|
187
|
+
},
|
188
|
+
|
189
|
+
setOpacity: function(newOpacity) {
|
190
|
+
if(newOpacity < 0) newOpacity = 0;
|
191
|
+
if(newOpacity > 1) newOpacity = 1;
|
192
|
+
this.el.css("opacity", newOpacity);
|
193
|
+
this.opacity = newOpacity;
|
194
|
+
},
|
195
|
+
|
196
|
+
increaseOpacity: function() {
|
197
|
+
this.setOpacity(this.opacity + 0.1)
|
198
|
+
},
|
199
|
+
|
200
|
+
decreaseOpacity: function() {
|
201
|
+
this.setOpacity(this.opacity - 0.1)
|
202
|
+
}
|
203
|
+
})
|
204
|
+
|
205
|
+
CodeBuddy.backbone.FormView = Backbone.View.extend({
|
206
|
+
el:$(".form"),
|
207
|
+
|
208
|
+
initialize: function() {
|
209
|
+
_.bindAll(this, 'show', 'hide')
|
210
|
+
this.el.find('textarea').bind('keydown', 'esc', this.hide)
|
211
|
+
},
|
212
|
+
|
213
|
+
show: function(){
|
214
|
+
this.el.show();
|
215
|
+
$("#code-viewer").hide()
|
216
|
+
this.el.find("textarea").focus()
|
217
|
+
return false;
|
218
|
+
},
|
219
|
+
|
220
|
+
hide: function(){
|
221
|
+
this.el.hide();
|
222
|
+
$("#code-viewer").show()
|
223
|
+
return false;
|
173
224
|
}
|
174
225
|
})
|
175
226
|
|
176
|
-
CodeBuddy.
|
177
|
-
$(document).bind('keydown', 'up',
|
178
|
-
$(document).bind('keydown', 'down',
|
179
|
-
$(document).bind('keydown', '
|
180
|
-
$(document).bind('keydown', '
|
181
|
-
$(document).bind('keydown', '
|
182
|
-
$(document).bind('keydown', '
|
227
|
+
CodeBuddy.setStackKeyBindings = function(){
|
228
|
+
$(document).bind('keydown', 'up', CodeBuddy.stackView.selectPrevious)
|
229
|
+
$(document).bind('keydown', 'down', CodeBuddy.stackView.selectNext)
|
230
|
+
$(document).bind('keydown', 'right', CodeBuddy.codeView.increaseOpacity)
|
231
|
+
$(document).bind('keydown', 'left', CodeBuddy.codeView.decreaseOpacity)
|
232
|
+
$(document).bind('keydown', 'a', CodeBuddy.stack.toggleBookmark)
|
233
|
+
$(document).bind('keydown', 's', CodeBuddy.stack.selectNextBookmark)
|
234
|
+
$(document).bind('keydown', 'h', CodeBuddy.codeView.toggle)
|
235
|
+
$(document).bind('keydown', 'e', CodeBuddy.codeView.editCode)
|
236
|
+
}
|
237
|
+
|
238
|
+
CodeBuddy.setGlobalKeyBindings = function(){
|
239
|
+
$(document).bind('keydown', 'n', CodeBuddy.form.show)
|
240
|
+
$(document).bind('keydown', 'esc', CodeBuddy.codeView.toggleCommands)
|
183
241
|
}
|
184
242
|
|
185
243
|
CodeBuddy.setup = function(stackJson) {
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
244
|
+
CodeBuddy.form = new CodeBuddy.backbone.FormView
|
245
|
+
|
246
|
+
if(stackJson) {
|
247
|
+
this.stack = new this.backbone.Stack(stackJson);
|
248
|
+
this.stackView = new this.backbone.StackView({model: this.stack});
|
249
|
+
this.codeView = new this.backbone.CodeView();
|
250
|
+
this.codeView.render();
|
251
|
+
this.setStackKeyBindings();
|
252
|
+
CodeBuddy.form.hide()
|
253
|
+
} else {
|
254
|
+
CodeBuddy.form.show()
|
255
|
+
}
|
256
|
+
CodeBuddy.setGlobalKeyBindings()
|
190
257
|
}
|
@@ -47,26 +47,46 @@ a {
|
|
47
47
|
font-size:0.85em;
|
48
48
|
}
|
49
49
|
|
50
|
-
#
|
51
|
-
top:100;
|
52
|
-
font-size: 0.8em;
|
53
|
-
z-index:10;
|
50
|
+
#code-viewer {
|
54
51
|
position: fixed;
|
55
|
-
|
56
|
-
|
52
|
+
top:110;
|
53
|
+
width:80%;
|
54
|
+
opacity:0.9;
|
55
|
+
z-index:10;
|
56
|
+
margin-left:10px;
|
57
57
|
}
|
58
|
+
|
58
59
|
#code {
|
59
60
|
min-height: 340px;
|
60
|
-
border
|
61
|
-
border-
|
61
|
+
border:2px solid #666;
|
62
|
+
border-radius:5px;
|
63
|
+
-moz-border-radius:5px;
|
64
|
+
padding:5px;
|
62
65
|
background-color: black;
|
63
|
-
position: fixed;
|
64
|
-
top:200;
|
65
|
-
width:80%;
|
66
|
-
opacity:0.8;
|
67
|
-
z-index:10;
|
68
66
|
white-space: pre;
|
69
67
|
}
|
68
|
+
|
69
|
+
#legend {
|
70
|
+
top:100;
|
71
|
+
font-size: 0.8em;
|
72
|
+
z-index:10;
|
73
|
+
padding: 5px;
|
74
|
+
background: #222;
|
75
|
+
-webkit-border-bottom-right-radius: 5px;
|
76
|
+
-webkit-border-bottom-left-radius: 5px;
|
77
|
+
-moz-border-radius-bottomright: 5px;
|
78
|
+
-moz-border-radius-bottomleft: 5px;
|
79
|
+
border-bottom-right-radius: 5px;
|
80
|
+
border-bottom-left-radius: 5px;
|
81
|
+
}
|
82
|
+
#legend ul {
|
83
|
+
margin:0;
|
84
|
+
}
|
85
|
+
#legend li {
|
86
|
+
padding:0;
|
87
|
+
}
|
88
|
+
|
89
|
+
|
70
90
|
#selected_line {
|
71
91
|
border-style: ridge;
|
72
92
|
border-color: #666666;
|
@@ -105,11 +125,35 @@ li {
|
|
105
125
|
list-style: none;
|
106
126
|
}
|
107
127
|
|
108
|
-
li:hover {
|
128
|
+
#stack li:hover {
|
109
129
|
background:#444;
|
110
130
|
cursor:pointer;
|
111
131
|
}
|
112
132
|
|
113
133
|
.bookmarked {
|
114
134
|
background:#666;
|
135
|
+
}
|
136
|
+
|
137
|
+
#opacity {
|
138
|
+
width:25px;
|
139
|
+
}
|
140
|
+
|
141
|
+
#current {
|
142
|
+
white-space:nowrap;
|
143
|
+
background:#222;
|
144
|
+
color:white;
|
145
|
+
font-weight:bold;
|
146
|
+
text-align:right;
|
147
|
+
overflow:hidden;
|
148
|
+
padding:4px;
|
149
|
+
-webkit-border-top-left-radius: 5px;
|
150
|
+
-webkit-border-top-right-radius: 5px;
|
151
|
+
-moz-border-radius-topleft: 5px;
|
152
|
+
-moz-border-radius-topright: 5px;
|
153
|
+
border-top-left-radius: 5px;
|
154
|
+
border-top-right-radius: 5px;
|
155
|
+
}
|
156
|
+
|
157
|
+
#current div {
|
158
|
+
float:right;
|
115
159
|
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module CodeBuddy
|
2
|
+
module Server
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def start
|
6
|
+
if running?
|
7
|
+
puts "Code Buddy is already running."
|
8
|
+
exit
|
9
|
+
else
|
10
|
+
Daemons.daemonize(:app_name => "code_buddy_server")
|
11
|
+
CodeBuddy::App.run! :host => 'localhost'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def stop
|
16
|
+
if process_line = running?
|
17
|
+
pid = process_line.split[1]
|
18
|
+
Process.kill("TERM", pid.to_i)
|
19
|
+
else
|
20
|
+
puts "Code Buddy is not running."
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def update(stack_string)
|
26
|
+
require 'net/http'
|
27
|
+
require 'uri'
|
28
|
+
require 'launchy'
|
29
|
+
|
30
|
+
if running?
|
31
|
+
Net::HTTP.post_form(URI.parse('http://localhost:4567/new'), {"stack" => stack_string})
|
32
|
+
else
|
33
|
+
CodeBuddy::App.stack_string = stack_string
|
34
|
+
start
|
35
|
+
end
|
36
|
+
Launchy.open("http://localhost:4567/stack/0")
|
37
|
+
end
|
38
|
+
|
39
|
+
def running?
|
40
|
+
`lsof -i :4567`.split("\n").find{|process_line| process_line =~ /ruby/}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/code_buddy/version.rb
CHANGED
@@ -2,19 +2,37 @@
|
|
2
2
|
<html>
|
3
3
|
<body>
|
4
4
|
<%= erb :banner %>
|
5
|
-
<
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
<div class="form">
|
6
|
+
Paste your stack:
|
7
|
+
<form method="post" action="/new">
|
8
|
+
<textarea name="stack" rows="40" cols="130" class="stack_form"></textarea><br/>
|
9
|
+
<input type="submit" value="submit"/>
|
10
|
+
</form>
|
11
|
+
</div>
|
12
|
+
<ul id="stack"></ul>
|
13
|
+
<div id="code-viewer">
|
14
|
+
<div id="current"></div>
|
15
|
+
<div id="code"></div>
|
16
|
+
<div id="legend">
|
17
|
+
commands:
|
18
|
+
<ul>
|
19
|
+
<li>↑ move up the stack</li>
|
20
|
+
<li>↓ move down the stack</li>
|
21
|
+
<li>n new stack trace</li>
|
22
|
+
<li>e open current frame in editor</li>
|
23
|
+
<li>← decrease opacity</li>
|
24
|
+
<li>→ increase opacity</li>
|
25
|
+
<li>h show/hide code window</li>
|
26
|
+
<li>a toggle bookmark</li>
|
27
|
+
<li>s next book mark</li>
|
28
|
+
<li>esc show/hide this legend</li>
|
29
|
+
<li>click to select a stack frame</li>
|
30
|
+
</ul>
|
31
|
+
</div>
|
11
32
|
</div>
|
12
|
-
|
13
|
-
<
|
14
|
-
|
15
|
-
|
16
|
-
<script>
|
17
|
-
CodeBuddy.setup(<%= @stack.to_json %>)
|
18
|
-
</script>
|
33
|
+
<script src="<%= @static_file_prefix %>javascripts/code_buddy.js" type="text/javascript"></script>
|
34
|
+
<script>
|
35
|
+
CodeBuddy.setup(<%= @stack.to_json if @stack %>)
|
36
|
+
</script>
|
19
37
|
</body>
|
20
38
|
</html>
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: code_buddy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 8
|
10
|
+
version: 0.0.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Pat Shaughnessy, Alex Rothenberg, Daniel Higginbotham
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-01-
|
18
|
+
date: 2011-01-11 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -81,9 +81,37 @@ dependencies:
|
|
81
81
|
type: :runtime
|
82
82
|
version_requirements: *id004
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: daemons
|
85
85
|
prerelease: false
|
86
86
|
requirement: &id005 !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
type: :runtime
|
96
|
+
version_requirements: *id005
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: launchy
|
99
|
+
prerelease: false
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 3
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
type: :runtime
|
110
|
+
version_requirements: *id006
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
prerelease: false
|
114
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
87
115
|
none: false
|
88
116
|
requirements:
|
89
117
|
- - ~>
|
@@ -95,27 +123,27 @@ dependencies:
|
|
95
123
|
- 7
|
96
124
|
version: 0.8.7
|
97
125
|
type: :development
|
98
|
-
version_requirements: *
|
126
|
+
version_requirements: *id007
|
99
127
|
- !ruby/object:Gem::Dependency
|
100
128
|
name: rspec
|
101
129
|
prerelease: false
|
102
|
-
requirement: &
|
130
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
103
131
|
none: false
|
104
132
|
requirements:
|
105
133
|
- - ~>
|
106
134
|
- !ruby/object:Gem::Version
|
107
|
-
hash:
|
135
|
+
hash: 3
|
108
136
|
segments:
|
109
137
|
- 2
|
110
|
-
-
|
138
|
+
- 3
|
111
139
|
- 0
|
112
|
-
version: 2.
|
140
|
+
version: 2.3.0
|
113
141
|
type: :development
|
114
|
-
version_requirements: *
|
142
|
+
version_requirements: *id008
|
115
143
|
- !ruby/object:Gem::Dependency
|
116
144
|
name: mocha
|
117
145
|
prerelease: false
|
118
|
-
requirement: &
|
146
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
119
147
|
none: false
|
120
148
|
requirements:
|
121
149
|
- - ~>
|
@@ -127,39 +155,53 @@ dependencies:
|
|
127
155
|
- 10
|
128
156
|
version: 0.9.10
|
129
157
|
type: :development
|
130
|
-
version_requirements: *
|
158
|
+
version_requirements: *id009
|
131
159
|
- !ruby/object:Gem::Dependency
|
132
160
|
name: cucumber
|
133
161
|
prerelease: false
|
134
|
-
requirement: &
|
162
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
135
163
|
none: false
|
136
164
|
requirements:
|
137
165
|
- - ~>
|
138
166
|
- !ruby/object:Gem::Version
|
139
|
-
hash:
|
167
|
+
hash: 55
|
140
168
|
segments:
|
141
169
|
- 0
|
142
|
-
-
|
143
|
-
-
|
144
|
-
version: 0.
|
170
|
+
- 10
|
171
|
+
- 0
|
172
|
+
version: 0.10.0
|
145
173
|
type: :development
|
146
|
-
version_requirements: *
|
174
|
+
version_requirements: *id010
|
147
175
|
- !ruby/object:Gem::Dependency
|
148
176
|
name: aruba
|
149
177
|
prerelease: false
|
150
|
-
requirement: &
|
178
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
151
179
|
none: false
|
152
180
|
requirements:
|
153
181
|
- - ~>
|
154
182
|
- !ruby/object:Gem::Version
|
155
|
-
hash:
|
183
|
+
hash: 23
|
156
184
|
segments:
|
157
185
|
- 0
|
186
|
+
- 3
|
158
187
|
- 2
|
159
|
-
|
160
|
-
version: 0.2.2
|
188
|
+
version: 0.3.2
|
161
189
|
type: :development
|
162
|
-
version_requirements: *
|
190
|
+
version_requirements: *id011
|
191
|
+
- !ruby/object:Gem::Dependency
|
192
|
+
name: ruby-debug
|
193
|
+
prerelease: false
|
194
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
195
|
+
none: false
|
196
|
+
requirements:
|
197
|
+
- - ">="
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
hash: 3
|
200
|
+
segments:
|
201
|
+
- 0
|
202
|
+
version: "0"
|
203
|
+
type: :development
|
204
|
+
version_requirements: *id012
|
163
205
|
description: See the Ruby code running in your app.
|
164
206
|
email:
|
165
207
|
- pat@patshaughnessy.net, alex@alexrothenberg.com, daniel@flyingmachinestudios.com
|
@@ -179,10 +221,15 @@ files:
|
|
179
221
|
- Rakefile
|
180
222
|
- bin/code_buddy
|
181
223
|
- code_buddy.gemspec
|
224
|
+
- features/command_line.feature
|
182
225
|
- features/rails2_app.feature
|
183
226
|
- features/rails3_app.feature
|
184
227
|
- features/sinatra.feature
|
185
228
|
- features/step_definitions/rails_setup_steps.rb
|
229
|
+
- features/support/Gemfile-rails2
|
230
|
+
- features/support/Gemfile-rails2.lock
|
231
|
+
- features/support/Gemfile-rails3
|
232
|
+
- features/support/Gemfile-rails3.lock
|
186
233
|
- features/support/env.rb
|
187
234
|
- features/templates/rails_exception.feature.template
|
188
235
|
- features/templates/sinatra_env.rb.template
|
@@ -217,6 +264,7 @@ files:
|
|
217
264
|
- lib/code_buddy/rails3/templates/rescues/routing_error.erb
|
218
265
|
- lib/code_buddy/rails3/templates/rescues/template_error.erb
|
219
266
|
- lib/code_buddy/rails3/templates/rescues/unknown_action.erb
|
267
|
+
- lib/code_buddy/server.rb
|
220
268
|
- lib/code_buddy/stack.rb
|
221
269
|
- lib/code_buddy/stack_frame.rb
|
222
270
|
- lib/code_buddy/version.rb
|
@@ -264,10 +312,15 @@ signing_key:
|
|
264
312
|
specification_version: 3
|
265
313
|
summary: See the Ruby code running in your app.
|
266
314
|
test_files:
|
315
|
+
- features/command_line.feature
|
267
316
|
- features/rails2_app.feature
|
268
317
|
- features/rails3_app.feature
|
269
318
|
- features/sinatra.feature
|
270
319
|
- features/step_definitions/rails_setup_steps.rb
|
320
|
+
- features/support/Gemfile-rails2
|
321
|
+
- features/support/Gemfile-rails2.lock
|
322
|
+
- features/support/Gemfile-rails3
|
323
|
+
- features/support/Gemfile-rails3.lock
|
271
324
|
- features/support/env.rb
|
272
325
|
- features/templates/rails_exception.feature.template
|
273
326
|
- features/templates/sinatra_env.rb.template
|