dbg-rb 0.3.1 β†’ 0.4.0

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: dc71d393c746d79980c413057430f8f9e473d2746a343dc64ec3289dc6ea278e
4
- data.tar.gz: 6de928faad269dfa03dedc2e0f0606444cd3df2f8ce1f8660dbbdcf580b4a6ca
3
+ metadata.gz: 05a2b90f0904d6bfdbcb0a03099b305364cecdb9cd49a833e1d55338b9fb6c80
4
+ data.tar.gz: db531071fce82b46b52b12bc4b97e1b563acc38621fb83d191ef58bcdaa4b5b2
5
5
  SHA512:
6
- metadata.gz: a6c4ccb43238e5c47639339588589cdc4b175acf9cfb5ed62e332f03d9a738824891ce980f2ec8d3582ba66b7f9cc63fdb2b15868e2108f79b7dc3456810fa28
7
- data.tar.gz: 6098cf547b0efce0ef4f0751e3ae4d067b0e19864315de0de515f644da367d86b520370778eb016d9b0722a6e312e948692b6006fd2d2cfafa6bfc80c08e65cc
6
+ metadata.gz: 12f8fd0a098e18b73d66fda695ecc87d99d9b73661a130c92866dfbf143380d71f2645ec8a7cc7e773f7bd4fa8d383af25625c853133fafd7d2d787e614c4342
7
+ data.tar.gz: 774daf99ccc4c44cf23e9c2c8188bbf0bf1fc760cbc1e37f5e8128cf14ffc17512e59bfdc65efedb83b1a28e85f3f2330bcf094db5c7c1cf91a77bc4bbe26378
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dbg [![Gem Version](https://badge.fury.io/rb/dbg-rb.svg)](https://badge.fury.io/rb/dbg-rb) [![GH Actions](https://github.com/pawurb/dbg-rb/actions/workflows/ci.yml/badge.svg)](https://github.com/pawurb/dbg-rb/actions)
2
2
 
3
- ![Dbg base](https://github.com/pawurb/dbg-rb/raw/main/dbg_base.png)
3
+ ![Dbg base](https://github.com/pawurb/dbg-rb/raw/main/dbg_base2.png)
4
4
 
5
5
  Because I wrote:
6
6
 
@@ -28,29 +28,19 @@ Gem adds a global `dbg` method that you can use for puts debugging:
28
28
  require "dbg-rb"
29
29
 
30
30
  dbg(User.last.id)
31
- # [web/user_sessions_controller.rb:37] 1972
31
+ # [web/user_sessions_controller.rb:37] User.last.id = 1972
32
32
 
33
33
  ```
34
34
 
35
- It appends a caller file and line info to the debug output.
35
+ It appends a caller file, line info and source expression to the debug output.
36
36
 
37
- You can use symbols to output local variable names together with their values:
38
-
39
- ```ruby
40
- a = 1
41
- b = 2
42
-
43
- dbg(:a, :b)
44
- # [models/user.rb:22] a = 1
45
- # [models/user.rb:22] b = 2
46
- ```
47
37
 
48
38
  Hash values are pretty printed:
49
39
 
50
40
  ```ruby
51
- user = User.last.as_json
52
- dbg(:user)
53
- # [web/users_controller.rb:10 user = {
41
+
42
+ dbg(User.last.as_json)
43
+ # [web/users_controller.rb:10] User.last.as_json = {
54
44
  # "id": 160111,
55
45
  # "team_id": 1,
56
46
  # "pseudonym": "Anonymous-CBWE",
@@ -80,11 +70,10 @@ DbgRb.color_code = nil
80
70
  ```
81
71
 
82
72
  ```ruby
83
- user = User.last.as_json.slice("id", "slack_id")
84
- dbg("User last", :user)
73
+ dbg(User.last(2).map(&:as_json))
85
74
  ```
86
75
 
87
- ![Dbg color](https://github.com/pawurb/dbg-rb/raw/main/dbg_base.png)
76
+ ![Dbg color](https://github.com/pawurb/dbg-rb/raw/main/dbg_base2.png)
88
77
 
89
78
  If it does not stand out enough, you can enable `dbg` highlighting:
90
79
 
@@ -97,6 +86,31 @@ DbgRb.highlight!("πŸŽ‰πŸ’”πŸ’£πŸ•ΊπŸš€πŸ§¨πŸ™ˆπŸ€―πŸ₯³πŸŒˆπŸ¦„")
97
86
 
98
87
  ![Dbg emoji](https://github.com/pawurb/dbg-rb/raw/main/dbg_emoji.png)
99
88
 
89
+ ## Logs integration
90
+
91
+ ![Lbg logs](https://github.com/pawurb/dbg-rb/raw/main/lbg_logs.png)
92
+
93
+ Use `lbg` to send debug output through a logger instead of `stdio`:
94
+
95
+ ```ruby
96
+ require "dbg-rb"
97
+
98
+ lbg(User.last.id)
99
+ # Sends to Rails.logger.debug: [web/user_sessions_controller.rb:37] User.last.id = 1972
100
+ ```
101
+
102
+ The `lbg` method:
103
+ - Uses `Rails.logger` by default when Rails is available
104
+ - Falls back to regular `dbg` behavior if no logger is configured
105
+ - Uses `:debug` log level by default
106
+
107
+ You can configure a custom logger and log level:
108
+
109
+ ```ruby
110
+ DbgRb.logger = MyLogger.new
111
+ DbgRb.log_level = :info
112
+ ```
113
+
100
114
  ## Status
101
115
 
102
116
  Contributions & ideas very welcome!
data/dbg_base2.png ADDED
Binary file
data/inline/dbg_rb.rb CHANGED
@@ -35,13 +35,27 @@ module DbgRb
35
35
  Impl.highlight!(wrapper)
36
36
  end
37
37
 
38
+ def self.logger=(val)
39
+ Impl.logger = val
40
+ end
41
+
42
+ def self.log_level=(val)
43
+ Impl.log_level = val
44
+ end
45
+
38
46
  def self.dbg(*msgs)
39
47
  Impl.new.dbg(*msgs)
40
48
  end
41
49
 
50
+ def self.lbg(*msgs)
51
+ Impl.new.lbg(*msgs)
52
+ end
53
+
42
54
  class Impl
43
55
  @@color_code = nil
44
56
  @@highlight = false
57
+ @@logger = defined?(Rails) ? Rails.logger : nil
58
+ @@log_level = :debug
45
59
 
46
60
  def self.color_code=(val)
47
61
  @@color_code = val
@@ -51,8 +65,16 @@ module DbgRb
51
65
  @@highlight = wrapper
52
66
  end
53
67
 
54
- def dbg(value)
55
- loc = caller_locations.first(3).last
68
+ def self.logger=(val)
69
+ @@logger = val
70
+ end
71
+
72
+ def self.log_level=(val)
73
+ @@log_level = val
74
+ end
75
+
76
+ def dbg_base(value)
77
+ loc = caller_locations.first(4).last
56
78
  source_file = if (path = loc.absolute_path)
57
79
  path.split("/").last(2).join("/")
58
80
  else
@@ -60,7 +82,7 @@ module DbgRb
60
82
  end
61
83
 
62
84
  file = if (path = loc.absolute_path)
63
- path.split(":").first
85
+ path
64
86
  else
65
87
  nil
66
88
  end
@@ -71,7 +93,11 @@ module DbgRb
71
93
  File.open(file) do |f|
72
94
  f.each_line.with_index do |line, i|
73
95
  if i == loc.lineno - 1
74
- splitby, remove_parantheses = if line.include?("dbg(")
96
+ splitby, remove_parantheses = if line.include?("lbg(")
97
+ ["lbg(", true]
98
+ elsif line.include?("lbg ")
99
+ ["lbg ", false]
100
+ elsif line.include?("dbg(")
75
101
  ["dbg(", true]
76
102
  else
77
103
  ["dbg ", false]
@@ -104,8 +130,20 @@ module DbgRb
104
130
  if @@color_code != nil
105
131
  output = colorize(output, @@color_code)
106
132
  end
133
+
134
+ output
135
+ end
107
136
 
108
- puts output
137
+ def dbg(value)
138
+ puts dbg_base(value)
139
+ end
140
+
141
+ def lbg(value)
142
+ if @@logger.nil?
143
+ puts dbg_base(value)
144
+ else
145
+ @@logger.send(@@log_level, dbg_base(value))
146
+ end
109
147
  end
110
148
 
111
149
  private
@@ -126,7 +164,7 @@ module DbgRb
126
164
  dbg_inspect(val, quote_str: true)
127
165
  end.then do |value|
128
166
  if value.is_a?(String)
129
- value.gsub("\"nil\"", "nil")
167
+ value.gsub("\"nil\"", "nil").gsub("\\", "")
130
168
  else
131
169
  value
132
170
  end
@@ -139,8 +177,15 @@ module DbgRb
139
177
  end
140
178
 
141
179
  case obj
142
- when Numeric, String
180
+ when Numeric
143
181
  obj
182
+ when String
183
+ # Handle binary strings by showing their hex representation
184
+ if obj.encoding == Encoding::ASCII_8BIT
185
+ obj.bytes.map { |b| "\\x#{b.to_s(16).rjust(2, '0')}" }.join
186
+ else
187
+ obj
188
+ end
144
189
  else
145
190
  obj.inspect
146
191
  end
@@ -152,4 +197,8 @@ def dbg(value)
152
197
  DbgRb.dbg(value)
153
198
  end
154
199
 
200
+ def lbg(value)
201
+ DbgRb.lbg(value)
202
+ end
203
+
155
204
  DbgRb.color_code = 33 # yellow
data/lbg_logs.png ADDED
Binary file
data/lib/dbg-rb.rb CHANGED
@@ -11,13 +11,27 @@ module DbgRb
11
11
  Impl.highlight!(wrapper)
12
12
  end
13
13
 
14
+ def self.logger=(val)
15
+ Impl.logger = val
16
+ end
17
+
18
+ def self.log_level=(val)
19
+ Impl.log_level = val
20
+ end
21
+
14
22
  def self.dbg(*msgs)
15
23
  Impl.new.dbg(*msgs)
16
24
  end
17
25
 
26
+ def self.lbg(*msgs)
27
+ Impl.new.lbg(*msgs)
28
+ end
29
+
18
30
  class Impl
19
31
  @@color_code = nil
20
32
  @@highlight = false
33
+ @@logger = defined?(Rails) ? Rails.logger : nil
34
+ @@log_level = :debug
21
35
 
22
36
  def self.color_code=(val)
23
37
  @@color_code = val
@@ -27,8 +41,16 @@ module DbgRb
27
41
  @@highlight = wrapper
28
42
  end
29
43
 
30
- def dbg(value)
31
- loc = caller_locations.first(3).last
44
+ def self.logger=(val)
45
+ @@logger = val
46
+ end
47
+
48
+ def self.log_level=(val)
49
+ @@log_level = val
50
+ end
51
+
52
+ def dbg_base(value)
53
+ loc = caller_locations.first(4).last
32
54
  source_file = if (path = loc.absolute_path)
33
55
  path.split("/").last(2).join("/")
34
56
  else
@@ -36,7 +58,7 @@ module DbgRb
36
58
  end
37
59
 
38
60
  file = if (path = loc.absolute_path)
39
- path.split(":").first
61
+ path
40
62
  else
41
63
  nil
42
64
  end
@@ -47,7 +69,11 @@ module DbgRb
47
69
  File.open(file) do |f|
48
70
  f.each_line.with_index do |line, i|
49
71
  if i == loc.lineno - 1
50
- splitby, remove_parantheses = if line.include?("dbg(")
72
+ splitby, remove_parantheses = if line.include?("lbg(")
73
+ ["lbg(", true]
74
+ elsif line.include?("lbg ")
75
+ ["lbg ", false]
76
+ elsif line.include?("dbg(")
51
77
  ["dbg(", true]
52
78
  else
53
79
  ["dbg ", false]
@@ -80,8 +106,20 @@ module DbgRb
80
106
  if @@color_code != nil
81
107
  output = colorize(output, @@color_code)
82
108
  end
109
+
110
+ output
111
+ end
83
112
 
84
- puts output
113
+ def dbg(value)
114
+ puts dbg_base(value)
115
+ end
116
+
117
+ def lbg(value)
118
+ if @@logger.nil?
119
+ puts dbg_base(value)
120
+ else
121
+ @@logger.send(@@log_level, dbg_base(value))
122
+ end
85
123
  end
86
124
 
87
125
  private
@@ -102,7 +140,7 @@ module DbgRb
102
140
  dbg_inspect(val, quote_str: true)
103
141
  end.then do |value|
104
142
  if value.is_a?(String)
105
- value.gsub("\"nil\"", "nil")
143
+ value.gsub("\"nil\"", "nil").gsub("\\", "")
106
144
  else
107
145
  value
108
146
  end
@@ -115,8 +153,15 @@ module DbgRb
115
153
  end
116
154
 
117
155
  case obj
118
- when Numeric, String
156
+ when Numeric
119
157
  obj
158
+ when String
159
+ # Handle binary strings by showing their hex representation
160
+ if obj.encoding == Encoding::ASCII_8BIT
161
+ obj.bytes.map { |b| "\\x#{b.to_s(16).rjust(2, '0')}" }.join
162
+ else
163
+ obj
164
+ end
120
165
  else
121
166
  obj.inspect
122
167
  end
@@ -128,4 +173,8 @@ def dbg(value)
128
173
  DbgRb.dbg(value)
129
174
  end
130
175
 
176
+ def lbg(value)
177
+ DbgRb.lbg(value)
178
+ end
179
+
131
180
  DbgRb.color_code = 33 # yellow
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DbgRb
4
- VERSION = "0.3.1"
4
+ VERSION = "0.4.0"
5
5
  end
data/spec/inline_spec.rb CHANGED
@@ -116,4 +116,107 @@ describe DbgRb do
116
116
  dbg [1, 2, 3].reduce(0) { |i, agg| agg + i }
117
117
  end.to output("[spec/inline_spec.rb:116] [1, 2, 3].reduce(0) { |i, agg| agg + i } = 6\n").to_stdout
118
118
  end
119
+
120
+ it "binary input" do
121
+ random_bytes = Random.new.bytes(8)
122
+
123
+ expect do
124
+ dbg(random_bytes)
125
+ end.not_to raise_error
126
+ end
127
+
128
+ describe "lbg" do
129
+ let(:mock_logger) do
130
+ Class.new do
131
+ attr_reader :logged_messages, :logged_levels
132
+
133
+ def initialize
134
+ @logged_messages = []
135
+ @logged_levels = []
136
+ end
137
+
138
+ def debug(message)
139
+ @logged_levels << :debug
140
+ @logged_messages << message
141
+ end
142
+
143
+ def info(message)
144
+ @logged_levels << :info
145
+ @logged_messages << message
146
+ end
147
+
148
+ def warn(message)
149
+ @logged_levels << :warn
150
+ @logged_messages << message
151
+ end
152
+
153
+ def error(message)
154
+ @logged_levels << :error
155
+ @logged_messages << message
156
+ end
157
+ end.new
158
+ end
159
+
160
+ before do
161
+ DbgRb.logger = nil
162
+ DbgRb.log_level = :debug
163
+ end
164
+
165
+ it "falls back to dbg when no logger is configured" do
166
+ expect do
167
+ lbg("test")
168
+ end.to output("[spec/inline_spec.rb:167] \"test\"\n").to_stdout
169
+ end
170
+
171
+ it "uses logger when configured" do
172
+ DbgRb.logger = mock_logger
173
+
174
+ lbg("test message")
175
+
176
+ expect(mock_logger.logged_messages).to eq(["[spec/inline_spec.rb:174] \"test message\""])
177
+ expect(mock_logger.logged_levels).to eq([:debug])
178
+ end
179
+
180
+ it "uses custom log level" do
181
+ DbgRb.logger = mock_logger
182
+ DbgRb.log_level = :info
183
+
184
+ lbg("test message")
185
+
186
+ expect(mock_logger.logged_messages).to eq(["[spec/inline_spec.rb:184] \"test message\""])
187
+ expect(mock_logger.logged_levels).to eq([:info])
188
+ end
189
+
190
+ it "logs variables with logger" do
191
+ DbgRb.logger = mock_logger
192
+ test_var = 42
193
+
194
+ lbg(test_var)
195
+
196
+ expect(mock_logger.logged_messages).to eq(["[spec/inline_spec.rb:194] test_var = 42"])
197
+ expect(mock_logger.logged_levels).to eq([:debug])
198
+ end
199
+
200
+ it "logs complex objects with logger" do
201
+ DbgRb.logger = mock_logger
202
+ test_hash = { a: 1, b: "test" }
203
+
204
+ lbg(test_hash)
205
+
206
+ expected_message = "[spec/inline_spec.rb:204] test_hash = {\n \"a\": 1,\n \"b\": \"test\"\n}"
207
+ expect(mock_logger.logged_messages).to eq([expected_message])
208
+ expect(mock_logger.logged_levels).to eq([:debug])
209
+ end
210
+
211
+ it "respects color and highlight settings with logger" do
212
+ DbgRb.logger = mock_logger
213
+ DbgRb.color_code = 31
214
+ DbgRb.highlight!("!!!")
215
+
216
+ lbg("styled")
217
+
218
+ expected_message = "\e[31m!!!\n[spec/inline_spec.rb:216] \"styled\"\n!!!\e[0m"
219
+ expect(mock_logger.logged_messages).to eq([expected_message])
220
+ end
221
+ end
119
222
  end
data/spec/main_spec.rb CHANGED
@@ -116,4 +116,107 @@ describe DbgRb do
116
116
  dbg [1, 2, 3].reduce(0) { |i, agg| agg + i }
117
117
  end.to output("[spec/main_spec.rb:116] [1, 2, 3].reduce(0) { |i, agg| agg + i } = 6\n").to_stdout
118
118
  end
119
+
120
+ it "binary input" do
121
+ random_bytes = Random.new.bytes(8)
122
+
123
+ expect do
124
+ dbg(random_bytes)
125
+ end.not_to raise_error
126
+ end
127
+
128
+ describe "lbg" do
129
+ let(:mock_logger) do
130
+ Class.new do
131
+ attr_reader :logged_messages, :logged_levels
132
+
133
+ def initialize
134
+ @logged_messages = []
135
+ @logged_levels = []
136
+ end
137
+
138
+ def debug(message)
139
+ @logged_levels << :debug
140
+ @logged_messages << message
141
+ end
142
+
143
+ def info(message)
144
+ @logged_levels << :info
145
+ @logged_messages << message
146
+ end
147
+
148
+ def warn(message)
149
+ @logged_levels << :warn
150
+ @logged_messages << message
151
+ end
152
+
153
+ def error(message)
154
+ @logged_levels << :error
155
+ @logged_messages << message
156
+ end
157
+ end.new
158
+ end
159
+
160
+ before do
161
+ DbgRb.logger = nil
162
+ DbgRb.log_level = :debug
163
+ end
164
+
165
+ it "falls back to dbg when no logger is configured" do
166
+ expect do
167
+ lbg("test")
168
+ end.to output("[spec/main_spec.rb:167] \"test\"\n").to_stdout
169
+ end
170
+
171
+ it "uses logger when configured" do
172
+ DbgRb.logger = mock_logger
173
+
174
+ lbg("test message")
175
+
176
+ expect(mock_logger.logged_messages).to eq(["[spec/main_spec.rb:174] \"test message\""])
177
+ expect(mock_logger.logged_levels).to eq([:debug])
178
+ end
179
+
180
+ it "uses custom log level" do
181
+ DbgRb.logger = mock_logger
182
+ DbgRb.log_level = :info
183
+
184
+ lbg("test message")
185
+
186
+ expect(mock_logger.logged_messages).to eq(["[spec/main_spec.rb:184] \"test message\""])
187
+ expect(mock_logger.logged_levels).to eq([:info])
188
+ end
189
+
190
+ it "logs variables with logger" do
191
+ DbgRb.logger = mock_logger
192
+ test_var = 42
193
+
194
+ lbg(test_var)
195
+
196
+ expect(mock_logger.logged_messages).to eq(["[spec/main_spec.rb:194] test_var = 42"])
197
+ expect(mock_logger.logged_levels).to eq([:debug])
198
+ end
199
+
200
+ it "logs complex objects with logger" do
201
+ DbgRb.logger = mock_logger
202
+ test_hash = { a: 1, b: "test" }
203
+
204
+ lbg(test_hash)
205
+
206
+ expected_message = "[spec/main_spec.rb:204] test_hash = {\n \"a\": 1,\n \"b\": \"test\"\n}"
207
+ expect(mock_logger.logged_messages).to eq([expected_message])
208
+ expect(mock_logger.logged_levels).to eq([:debug])
209
+ end
210
+
211
+ it "respects color and highlight settings with logger" do
212
+ DbgRb.logger = mock_logger
213
+ DbgRb.color_code = 31
214
+ DbgRb.highlight!("!!!")
215
+
216
+ lbg("styled")
217
+
218
+ expected_message = "\e[31m!!!\n[spec/main_spec.rb:216] \"styled\"\n!!!\e[0m"
219
+ expect(mock_logger.logged_messages).to eq([expected_message])
220
+ end
221
+ end
119
222
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbg-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - pawurb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-20 00:00:00.000000000 Z
11
+ date: 2025-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -95,10 +95,11 @@ files:
95
95
  - README.md
96
96
  - Rakefile
97
97
  - dbg-rb.gemspec
98
- - dbg_base.png
98
+ - dbg_base2.png
99
99
  - dbg_emoji.png
100
100
  - inline/dbg_rb.rb
101
101
  - inline/sync.rb
102
+ - lbg_logs.png
102
103
  - lib/dbg-rb.rb
103
104
  - lib/dbg_rb/version.rb
104
105
  - spec/inline_spec.rb
data/dbg_base.png DELETED
Binary file