code_buddy 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -8,3 +8,4 @@ cache
8
8
  Gemfile.lock
9
9
  example_trace
10
10
  tmp
11
+ *.tmproj
@@ -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
- CodeBuddy::App.run! :host => 'localhost'
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
@@ -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.2.0'
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.9.4'
31
- s.add_development_dependency 'aruba', '~> 0.2.2'
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
@@ -0,0 +1,6 @@
1
+ Feature: Code Buddy command line execution
2
+
3
+ Scenario: Start code buddy with text from stdin
4
+ Given I run "cat features/stack-trace | ./bin/code_buddy"
5
+ When I run "curl http://localhost:9292/stack/0"
6
+ Then I should see "blahblah"
@@ -1,8 +1,10 @@
1
- Feature: Make sure CodeBuddy works with a Rails3 app
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 have created a new Rails 2 app "new_rails2_app" with code_buddy
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
  """
@@ -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 have created a new Rails 3 app "new_rails3_app" with code_buddy
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 successfully run "rails new #{app_name}"
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 "gem install rails --version '=2.3.10'"
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
- create_file(file_name, stdout_from(cmd), true)
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
- create_file(file_name, new_content, true)
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,7 @@
1
+ source :rubygems
2
+
3
+ gem "rake"
4
+ gem "rails", '3.0.3'
5
+ gem "cucumber", "0.10.0"
6
+ gem "aruba", "0.3.2"
7
+ gem "rspec", "~> 2.3.0"
@@ -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)
@@ -4,6 +4,6 @@ require 'rspec/expectations'
4
4
  require 'aruba/cucumber'
5
5
 
6
6
  Before do
7
- unset_bundler_env_vars
7
+ @aruba_timeout_seconds = 120
8
8
  end
9
9
 
@@ -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 follow "app/views/users/index.html.erb:1"
7
+ And I am on code_buddy
8
8
  Then I should see "CodeBuddySee your Ruby stack come alive"
@@ -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
@@ -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
- @stack.selected = selected_param
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
- this.view.render()
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
- $('#code').html(this.model.selectedAddress().get('code'))
173
+ this.current.html('<div>' + CodeBuddy.stack.selectedAddress().get('path') + '</div>')
174
+ this.code.html(CodeBuddy.stack.selectedAddress().get('code'))
165
175
  },
166
-
167
- toggleCodeWindow: function() {
168
- $('#code').toggle()
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
- $.get('../edit/' + CodeBuddy.stack.get('selected'))
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.setKeyBindings = function(){
177
- $(document).bind('keydown', 'up', CodeBuddy.stackView.selectPrevious)
178
- $(document).bind('keydown', 'down', CodeBuddy.stackView.selectNext)
179
- $(document).bind('keydown', 'a', CodeBuddy.stack.toggleBookmark)
180
- $(document).bind('keydown', 's', CodeBuddy.stack.selectNextBookmark)
181
- $(document).bind('keydown', 'h', CodeBuddy.stackView.toggleCodeWindow)
182
- $(document).bind('keydown', 'e', CodeBuddy.stackView.editCode)
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
- this.stack = new this.backbone.Stack(stackJson);
187
- this.stackView = new this.backbone.StackView({model: this.stack});
188
- this.stackView.render();
189
- this.setKeyBindings();
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
- #legend {
51
- top:100;
52
- font-size: 0.8em;
53
- z-index:10;
50
+ #code-viewer {
54
51
  position: fixed;
55
- padding: 5px;
56
- background-color: #222222;
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-style: ridge;
61
- border-color: #666666;
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
@@ -1,3 +1,3 @@
1
1
  module CodeBuddy
2
- VERSION = '0.0.7'
2
+ VERSION = '0.0.8'
3
3
  end
@@ -4,7 +4,7 @@
4
4
  <%= erb :banner %>
5
5
  <div class="form">
6
6
  Paste your stack:
7
- <form method="post">
7
+ <form method="post" action="/new">
8
8
  <textarea name="stack" rows="40" cols="130" class="stack_form"></textarea><br/>
9
9
  <input type="submit" value="submit"/>
10
10
  </form>
@@ -2,19 +2,37 @@
2
2
  <html>
3
3
  <body>
4
4
  <%= erb :banner %>
5
- <br/>
6
- <div id="legend">
7
- commands:<br/>
8
- &#8593; move up the stack<br/>
9
- &#8595; move down the stack<br/>
10
- click to select a stack frame<br/>
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>&#8593; move up the stack</li>
20
+ <li>&#8595; move down the stack</li>
21
+ <li>n new stack trace</li>
22
+ <li>e open current frame in editor</li>
23
+ <li>&larr; decrease opacity</li>
24
+ <li>&rarr; 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
- </div>
13
- <ul id="stack"></ul>
14
- <div id='code'></div>
15
- <script src="<%= @static_file_prefix %>javascripts/code_buddy.js" type="text/javascript"></script>
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: 17
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 7
10
- version: 0.0.7
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-04 00:00:00 -05:00
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: rake
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: *id005
126
+ version_requirements: *id007
99
127
  - !ruby/object:Gem::Dependency
100
128
  name: rspec
101
129
  prerelease: false
102
- requirement: &id006 !ruby/object:Gem::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: 7
135
+ hash: 3
108
136
  segments:
109
137
  - 2
110
- - 2
138
+ - 3
111
139
  - 0
112
- version: 2.2.0
140
+ version: 2.3.0
113
141
  type: :development
114
- version_requirements: *id006
142
+ version_requirements: *id008
115
143
  - !ruby/object:Gem::Dependency
116
144
  name: mocha
117
145
  prerelease: false
118
- requirement: &id007 !ruby/object:Gem::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: *id007
158
+ version_requirements: *id009
131
159
  - !ruby/object:Gem::Dependency
132
160
  name: cucumber
133
161
  prerelease: false
134
- requirement: &id008 !ruby/object:Gem::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: 51
167
+ hash: 55
140
168
  segments:
141
169
  - 0
142
- - 9
143
- - 4
144
- version: 0.9.4
170
+ - 10
171
+ - 0
172
+ version: 0.10.0
145
173
  type: :development
146
- version_requirements: *id008
174
+ version_requirements: *id010
147
175
  - !ruby/object:Gem::Dependency
148
176
  name: aruba
149
177
  prerelease: false
150
- requirement: &id009 !ruby/object:Gem::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: 19
183
+ hash: 23
156
184
  segments:
157
185
  - 0
186
+ - 3
158
187
  - 2
159
- - 2
160
- version: 0.2.2
188
+ version: 0.3.2
161
189
  type: :development
162
- version_requirements: *id009
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