callstacking-rails 0.1.19 → 0.1.20

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 122755f46a3f89ee6c310aed0ede48453bf7ff7f92c50f9809fe7466ad49159b
4
- data.tar.gz: adfdbd3892e3c6cc5b1e869ce8a1d63185610347b3079a1de8cf6ebb8009eff3
3
+ metadata.gz: bf64a69817d5a94e205db95cd79dbff2c15d1190ed001bb49d1113aa0ada96b4
4
+ data.tar.gz: 4a37b31f1d9faac2de735ea799fd7fda9151ff2300de7401ad23d9dc8c21fd5e
5
5
  SHA512:
6
- metadata.gz: baa19130df5d47f45d0df4d2a0055edb1d5a2bbb74bdff1919a20de8bd6e6fa5fe6ad8224dddf8a6b973128301f007b76f094d076e0753c1b5257f3b5852c9ac
7
- data.tar.gz: 22e7fc256542ea2f13de0f400b350a74a2e115c96610734f0db0e492d416b48d6dd19f26ea68b40a4ffac6ef3a515f27a21604b3a0fe0dca2e43f6017bf1693f
6
+ metadata.gz: 2739c75f8347b76baa6f509f4f5c31c87e3de649490d3c1d3f4c9237062b44e90cb8a0cf47cf4d025b1e9b0539834b0e8641cd6ef6a2302854f0610bf0a3775e
7
+ data.tar.gz: acecb1df5835c9b3992501e506042c1693364c326545e36d6b0fd6549b48afba0af43808a4a730135ea988bbd4f6a38c14c361d4467361456f668e5bda7fba1e
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # Callstacking::Rails
2
+ [![Build Status](https://github.com/callstacking/callstacking-rails/actions/workflows/ci.yml/badge.svg)](https://github.com/callstacking/callstacking-rails/actions/workflows/ci.yml)
2
3
 
3
4
  Call Stacking is a rolling, checkpoint debugger for Rails. It records all of the critical method calls within your app, along with their important context (param/argument/return/local variable values).
4
5
 
@@ -1,33 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "bundler/setup"
4
- require "callstacking/rails/setup"
5
- require "callstacking/rails/settings"
4
+ require "callstacking/rails"
6
5
 
7
- include Callstacking::Rails::Settings
8
-
9
- action = ARGV[0]&.downcase&.strip
6
+ action = Callstacking::Rails::Cli.action(ARGV)
7
+ settings = Callstacking::Rails::Settings.new
10
8
 
11
9
  if action.nil?
12
10
  Callstacking::Rails::Setup.instructions
13
11
  exit!(1)
14
12
  end
15
13
 
16
- read_settings
17
-
18
- case action
19
- when 'register'
20
- puts "Open the following URL to register:\n\n"
21
- puts " #{settings[:url]}/users/sign_up\n\n"
22
-
23
- when 'setup'
24
- Callstacking::Rails::Setup.new.start
25
-
26
- when 'enable'
27
- Callstacking::Rails::Setup.new.enable_disable
28
- puts "Call Stacking tracing enabled (#{Callstacking::Rails::Env.environment})"
29
-
30
- when 'disable'
31
- Callstacking::Rails::Setup.new.enable_disable(enabled: false)
32
- puts "Call Stacking tracing disabled (#{Callstacking::Rails::Env.environment})"
33
- end
14
+ cli = Callstacking::Rails::Cli.new(action, settings)
15
+ cli.run
@@ -0,0 +1,50 @@
1
+ module Callstacking
2
+ module Rails
3
+ class Cli
4
+ REGISTER = 'register'
5
+ SETUP = 'setup'
6
+ ENABLE = 'enable'
7
+ DISABLE = 'disable'
8
+
9
+ attr_reader :action, :settings
10
+
11
+ def initialize(action, settings)
12
+ @action = action
13
+ @settings = settings
14
+ end
15
+
16
+ def run
17
+ parse_options
18
+ end
19
+
20
+ def self.action(args)
21
+ args[0]&.downcase&.strip
22
+ end
23
+
24
+ private
25
+
26
+ def parse_options
27
+ case action
28
+ when REGISTER
29
+ puts "Open the following URL to register:\n\n"
30
+ puts " #{settings.url}/users/sign_up\n\n"
31
+ REGISTER
32
+
33
+ when SETUP
34
+ Callstacking::Rails::Setup.new.start
35
+ SETUP
36
+
37
+ when ENABLE
38
+ settings.enable_disable
39
+ puts "Call Stacking tracing enabled (#{Callstacking::Rails::Env.environment})"
40
+ ENABLE
41
+
42
+ when DISABLE
43
+ settings.enable_disable(enabled: false)
44
+ puts "Call Stacking tracing disabled (#{Callstacking::Rails::Env.environment})"
45
+ DISABLE
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,4 @@
1
1
  require 'json'
2
- require "callstacking/rails/client/base"
3
2
 
4
3
  module Callstacking
5
4
  module Rails
@@ -1,6 +1,5 @@
1
1
  require 'faraday'
2
2
  require 'faraday/follow_redirects'
3
- require "callstacking/rails/settings"
4
3
 
5
4
  module Callstacking
6
5
  module Rails
@@ -8,12 +7,12 @@ module Callstacking
8
7
  class Error < StandardError; end
9
8
 
10
9
  class Base
11
- include Callstacking::Rails::Settings
10
+ attr_reader :url, :auth_token
12
11
 
13
- def initialize
14
- read_settings
12
+ def initialize(url, auth_token)
13
+ @url = url
14
+ @auth_token = auth_token
15
15
  end
16
-
17
16
  def connection
18
17
  # https://github.com/lostisland/awesome-faraday
19
18
  @connection ||= Faraday.new(url) do |c|
@@ -25,7 +24,7 @@ module Callstacking
25
24
  c.request :json # This will set the "Content-Type" header to application/json and call .to_json on the body
26
25
  c.adapter Faraday.default_adapter
27
26
 
28
- if auth_token?
27
+ if auth_token.present?
29
28
  c.request :authorization, :Bearer, auth_token
30
29
  end
31
30
  end
@@ -1,4 +1,6 @@
1
1
  require "rails"
2
+ require "active_support/cache"
3
+ require "callstacking/rails/env"
2
4
  require "callstacking/rails/trace"
3
5
  require "callstacking/rails/instrument"
4
6
  require 'callstacking/rails/spans'
@@ -8,18 +10,17 @@ require "callstacking/rails/loader"
8
10
  require "callstacking/rails/client/base"
9
11
  require "callstacking/rails/client/authenticate"
10
12
  require "callstacking/rails/client/trace"
13
+ require "callstacking/rails/cli"
11
14
  require "callstacking/rails/traces_helper"
12
15
 
13
16
  module Callstacking
14
17
  module Rails
15
18
  class Engine < ::Rails::Engine
16
- cattr_accessor :spans, :trace
19
+ cattr_accessor :spans, :trace, :settings
17
20
 
18
- include Settings
19
21
  isolate_namespace Callstacking::Rails
20
22
 
21
- read_settings
22
-
23
+ @@settings||=Callstacking::Rails::Settings.new
23
24
  @@spans||=Spans.new
24
25
  @@trace||=Trace.new(@@spans)
25
26
 
@@ -31,19 +32,22 @@ module Callstacking
31
32
  ActiveSupport.on_load :action_controller do
32
33
  include Callstacking::Rails::TracesHelper
33
34
  end
34
-
35
- Callstacking::Rails::Loader.new.on_load(@@spans) if enabled?
36
35
  end
37
36
 
38
- initializer :append_before_action do
39
- ActionController::Base.send :after_action, :inject_hud
40
- end
37
+ config.after_initialize do
38
+ if @@settings.enabled?
39
+ puts "Call Stacking enabled (#{Callstacking::Rails::Env.environment})"
41
40
 
42
- if enabled?
43
- puts "Call Stacking enabled (#{Callstacking::Rails::Env.environment})"
44
- trace.tracing
45
- else
46
- puts "Call Stacking disabled (#{Callstacking::Rails::Env.environment})"
41
+ ActionController::Base.send :after_action do
42
+ inject_hud(@@settings)
43
+ end
44
+
45
+ Callstacking::Rails::Loader.new.on_load(@@spans)
46
+
47
+ @@trace.tracing
48
+ else
49
+ puts "Call Stacking disabled (#{Callstacking::Rails::Env.environment})"
50
+ end
47
51
  end
48
52
  end
49
53
  end
@@ -1,18 +1,22 @@
1
+ require "active_support/cache"
1
2
  require "active_support/concern"
2
3
  require "active_support/core_ext/class/attribute_accessors"
3
- require "callstacking/rails/env"
4
4
 
5
5
  module Callstacking
6
6
  module Rails
7
- module Settings
8
- extend ActiveSupport::Concern
9
-
10
- included do |base|
11
- attr_accessor :settings
12
- end
7
+ class Settings
8
+ attr_accessor :settings
9
+ attr_reader :client
13
10
 
14
11
  SETTINGS_FILE = "#{Dir.home}/.callstacking"
15
12
  PRODUCTION_URL = "https://callstacking.com"
13
+ ENV_KEY = 'CALLSTACKING_ENABLED'
14
+ CACHE_KEY = :callstacking_enabled
15
+
16
+ def initialize
17
+ read_settings
18
+ @client = Callstacking::Rails::Client::Authenticate.new(url, auth_token)
19
+ end
16
20
 
17
21
  def url
18
22
  settings[:url] || PRODUCTION_URL
@@ -30,9 +34,19 @@ module Callstacking
30
34
  File.write(SETTINGS_FILE, new_settings.to_yaml)
31
35
  end
32
36
 
37
+ def enable!
38
+ ::Rails.cache.write(CACHE_KEY, true)
39
+ end
40
+
41
+ def disable!
42
+ ::Rails.cache.write(CACHE_KEY, false)
43
+ end
44
+
33
45
  def enabled?
46
+ return ::Rails.cache.read(CACHE_KEY) unless ::Rails.cache.read(CACHE_KEY).nil?
47
+ return false if ENV[ENV_KEY] == 'false'
34
48
  return false if settings.nil?
35
- return false if ENV['CALLSTACKING_ENABLED'] == 'false'
49
+
36
50
  settings[:enabled]
37
51
  end
38
52
 
@@ -40,8 +54,43 @@ module Callstacking
40
54
  !enabled?
41
55
  end
42
56
 
57
+ def save(email, password, url)
58
+ props = { auth_token: '',
59
+ url: url,
60
+ enabled: true
61
+ }
62
+
63
+ props = { Callstacking::Rails::Env.environment => {
64
+ settings: props
65
+ } }
66
+
67
+ write_settings(complete_settings.merge(props))
68
+
69
+ props[Callstacking::Rails::Env.environment][:settings][:auth_token] = token(email, password)
70
+
71
+ write_settings(complete_settings.merge(props))
72
+
73
+ read_settings
74
+ end
75
+
76
+ def enable_disable(enabled: true)
77
+ settings[:enabled] = enabled
78
+
79
+ props = { Callstacking::Rails::Env.environment => {
80
+ settings: settings
81
+ } }
82
+
83
+ write_settings(complete_settings.merge(props))
84
+ end
85
+
86
+ private
87
+
88
+ def token(email, password)
89
+ client.login(email, password)
90
+ end
91
+
43
92
  def read_settings
44
- @@settings = @settings = complete_settings.dig(::Callstacking::Rails::Env.environment, :settings) || {}
93
+ @settings = complete_settings.dig(::Callstacking::Rails::Env.environment, :settings) || {}
45
94
  rescue StandardError => e
46
95
  puts e.full_message
47
96
  puts e.backtrace.join("\n")
@@ -1,53 +1,33 @@
1
1
  require 'yaml'
2
- require "callstacking/rails/settings"
3
- require "callstacking/rails/client/authenticate"
4
- require "callstacking/rails/env"
5
2
  require 'io/console'
6
3
 
7
4
  module Callstacking
8
5
  module Rails
9
6
  class Setup
10
- include ::Callstacking::Rails::Settings
11
- extend ::Callstacking::Rails::Settings
12
-
13
- attr_accessor :client
7
+ attr_accessor :settings
14
8
 
15
9
  def initialize
16
- read_settings
17
- end
18
-
19
- def client
20
- @client = Callstacking::Rails::Client::Authenticate.new
10
+ @settings = Callstacking::Rails::Settings.new
21
11
  end
22
12
 
23
13
  def start
24
14
  puts "Login to callstacking.com"
25
15
  puts
26
16
 
27
- email = prompt("Enter email:")
17
+ email = prompt("Enter email:", echo: true)
28
18
  password = prompt("Enter password:", echo: false)
29
19
 
30
- save(email, password, url)
20
+ settings.save(email, password, url)
31
21
 
32
22
  puts "Authentication successful."
33
- puts "Settings saved to #{SETTINGS_FILE}"
23
+ puts "Settings saved to #{Callstacking::Rails::Settings::SETTINGS_FILE}"
34
24
  true
35
25
  rescue StandardError => e
36
- puts "Problem authenticating: #{e.message}"
26
+ puts "Error authenticating: #{e.message}"
37
27
  puts e.backtrace.join("\n")
38
28
  false
39
29
  end
40
30
 
41
- def enable_disable(enabled: true)
42
- settings[:enabled] = enabled
43
-
44
- props = { Callstacking::Rails::Env.environment => {
45
- settings: settings
46
- } }
47
-
48
- write_settings(complete_settings.merge(props))
49
- end
50
-
51
31
  def prompt(label, echo: true)
52
32
  puts label
53
33
 
@@ -58,31 +38,7 @@ module Callstacking
58
38
  value
59
39
  end
60
40
 
61
- def token(email, password)
62
- client.login(email, password)
63
- end
64
-
65
- def save(email, password, url)
66
- props = { auth_token: '',
67
- url: url,
68
- enabled: true
69
- }
70
-
71
- props = { Callstacking::Rails::Env.environment => {
72
- settings: props
73
- } }
74
-
75
- write_settings(complete_settings.merge(props))
76
-
77
- props[Callstacking::Rails::Env.environment][:settings][:auth_token] = token(email, password)
78
-
79
- write_settings(complete_settings.merge(props))
80
-
81
- read_settings
82
- end
83
-
84
41
  def self.instructions
85
- read_settings
86
42
  puts "loading environment #{Callstacking::Rails::Env.environment}"
87
43
  puts
88
44
  puts "Usage: "
@@ -94,7 +50,7 @@ module Callstacking
94
50
  puts " > callstacking-rails setup"
95
51
  puts
96
52
  puts " Interactively prompts you for your callstacking.com username/password."
97
- puts " Stores auth details in #{SETTINGS_FILE}"
53
+ puts " Stores auth details in #{Callstacking::Rails::Settings::SETTINGS_FILE}"
98
54
  puts
99
55
  puts " > callstacking-rails enable"
100
56
  puts
@@ -107,19 +63,23 @@ module Callstacking
107
63
  puts " You can have multiple environments."
108
64
  puts " The default is #{Callstacking::Rails::Env::DEFAULT_ENVIRONMENT}."
109
65
  puts
110
- puts " The #{Callstacking::Rails::Env.environment}: section in the #{SETTINGS_FILE} contains your credentials."
66
+ puts " The #{Callstacking::Rails::Env.environment}: section in the #{Callstacking::Rails::Settings::SETTINGS_FILE} contains your credentials."
111
67
  puts " By setting the RAILS_ENV environment you can maintain multiple settings."
112
68
  puts
113
69
  puts "Questions? Create an issue: https://github.com/callstacking/callstacking-rails/issues"
70
+
71
+ :instructions
114
72
  end
115
73
 
116
74
  private
117
75
 
118
76
  def url
119
- if Callstacking::Rails::Env.production? && ENV['CALLSTACKING_RAILS_LOCAL_TEST'].nil?
120
- PRODUCTION_URL
77
+ if (Callstacking::Rails::Env.production? || ::Rails.env.test?) &&
78
+ ENV['CALLSTACKING_RAILS_LOCAL_TEST'].nil?
79
+ Callstacking::Rails::Settings::PRODUCTION_URL
121
80
  else
122
- prompt("Enter URL for #{Callstacking::Rails::Env.environment} API calls [#{PRODUCTION_URL}]:") || PRODUCTION_URL
81
+ prompt("Enter URL for #{Callstacking::Rails::Env.environment} API calls [#{Callstacking::Rails::Settings::PRODUCTION_URL}]:") ||
82
+ Callstacking::Rails::Settings::PRODUCTION_URL
123
83
  end
124
84
  end
125
85
  end
@@ -1,29 +1,25 @@
1
1
  require "rails"
2
2
  require "active_support/concern"
3
- require "callstacking/rails/client/base"
4
- require "callstacking/rails/client/authenticate"
5
- require "callstacking/rails/client/trace"
6
- require "callstacking/rails/settings"
7
3
 
8
4
  module Callstacking
9
5
  module Rails
10
6
  class Trace
11
- include Callstacking::Rails::Settings
12
-
13
7
  attr_accessor :spans, :client, :lock
8
+ attr_reader :settings
14
9
  cattr_accessor :current_request_id
15
10
 
11
+ ICON = '💥'
12
+
16
13
  def initialize(spans)
17
14
  @traces = []
18
15
  @spans = spans
16
+ @settings = Callstacking::Rails::Settings.new
19
17
 
20
18
  @lock = Mutex.new
21
- @client = Callstacking::Rails::Client::Trace.new
19
+ @client = Callstacking::Rails::Client::Trace.new(settings.url, settings.auth_token)
22
20
  end
23
21
 
24
22
  def tracing
25
- read_settings
26
-
27
23
  trace_id = nil
28
24
  max_trace_entries = nil
29
25
 
@@ -141,7 +137,7 @@ module Callstacking
141
137
  end
142
138
 
143
139
  def print_trace_url(trace_id)
144
- url = "#{settings[:url]}/traces/#{trace_id}"
140
+ url = "#{settings.url}/traces/#{trace_id}"
145
141
 
146
142
  puts "*" * url.size
147
143
  puts url
@@ -7,11 +7,8 @@ module Callstacking
7
7
  include ActionView::Helpers::TagHelper
8
8
  include ActionView::Helpers::JavaScriptHelper
9
9
  include ActionView::Context
10
- include Callstacking::Rails::Settings
11
-
12
- def hud
13
- read_settings
14
10
 
11
+ def hud(url)
15
12
  frame_url = "#{url || Callstacking::Rails::Settings::PRODUCTION_URL}/traces/#{Callstacking::Rails::Trace.current_request_id}/print"
16
13
 
17
14
  body = []
@@ -20,7 +17,7 @@ module Callstacking
20
17
  padding: 0px; position: fixed; height: 50px; width: 40px; cursor: pointer;',
21
18
  onclick: 'document.getElementById("callstacking-debugger").style.display = "unset";
22
19
  document.getElementById("callstacking-close").style.display = "unset";') do
23
- "<span title='ctrl-d'><center>💥</center></span>".html_safe
20
+ "<span title='ctrl-d'><center>#{Callstacking::Rails::Trace::ICON}</center></span>".html_safe
24
21
  end)
25
22
 
26
23
  body << (content_tag(:iframe, src: frame_url, id: 'callstacking-debugger', data: { turbo:false },
@@ -45,11 +42,8 @@ module Callstacking
45
42
  body.join
46
43
  end
47
44
 
48
- def inject_hud
49
- read_settings
50
- return unless enabled?
51
-
52
- response.body = response.body.sub(/<\/body>/i, "#{hud}</body>")
45
+ def inject_hud(settings)
46
+ response.body = response.body.sub(/<\/body>/i, "#{hud(settings.url)}</body>")
53
47
  end
54
48
  end
55
49
  end
@@ -1,5 +1,5 @@
1
1
  module Callstacking
2
2
  module Rails
3
- VERSION = "0.1.19"
3
+ VERSION = "0.1.20"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callstacking-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.19
4
+ version: 0.1.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Jones
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-09 00:00:00.000000000 Z
11
+ date: 2023-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-silence
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  description: Quickly visualize which methods call which, their parameters, and return
56
84
  values.
57
85
  email:
@@ -74,6 +102,7 @@ files:
74
102
  - config/routes.rb
75
103
  - exe/callstacking-rails
76
104
  - lib/callstacking/rails.rb
105
+ - lib/callstacking/rails/cli.rb
77
106
  - lib/callstacking/rails/client/authenticate.rb
78
107
  - lib/callstacking/rails/client/base.rb
79
108
  - lib/callstacking/rails/client/trace.rb