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 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