trace_wrapper 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b0064e5f0a037df2776197d1bc4f037b2143bffed37c585dd2b32c3e00206eb9
4
- data.tar.gz: 1fe3daabe757fae12b60deb33e28df9fc647c74c433b356bbbcce8085fef3e12
3
+ metadata.gz: a24b778f09263356a804557de301cd497ee947853e019021e1489119c9dbaebc
4
+ data.tar.gz: 3f30db2855adc23225ded0f7780f10b2ede9ff04909bc8ff1b26ff5a06340914
5
5
  SHA512:
6
- metadata.gz: 311db8eafe42199cb782128a12bf0271d40664a4a54de3f1aea57e0a60f144ed20225338b22e0517e9a99dab8f95dab8f8b7341a31f8b40c751ce0642a6c1954
7
- data.tar.gz: ed522468367180ee1c63029a6fbb5d670547e54d839bb6e149670baed46d9e8e27d6517e76ce9f6f89e42cd785ce54f5aeb2c2f302be36d1a24ab8aa8b8ef970
6
+ metadata.gz: dc092be9bb2b3e468ff1084447bf4c76a174b506e8e958992512a3d82662830610dae3d977bf2ff2afc3e14029b209df086341fa67c01c1afedf6d7bf6b893f2
7
+ data.tar.gz: d92524251b1fc0a1d9dba6807e67fcd9854be77245e7a28eb8b8295d138da35a3722aaf4dcd20cd09448a4a6d5f22470c84fce71a902d21e4a53f86f9a320823
@@ -0,0 +1,42 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.2.0] - 2020-04-17
10
+
11
+ ### Changed
12
+ - [BREAKING CHANGE] `:visibility` option to `wrap()` changed to just indicate the lowest visibility level wanted [commit](https://github.com/biinari/trace_wrapper/commit/84024964d846ed522192d4c1f0a8ecbb8f516323)
13
+ - Moved shell colour internals to separate, undocumented module. [commit](https://github.com/biinari/trace_wrapper/7d4a9cb04314e252c4bfd184ce815b300d1f7852)
14
+
15
+ ### Documentation
16
+ - Fixed documentation to include `README.md`.
17
+ - Added description of `#wrap` behaviour with / without a block.
18
+
19
+ ## [0.1.0] - 2020-04-17
20
+
21
+ Initial public release
22
+
23
+ ### Changed
24
+
25
+ - Changed `:method_type` choices to `:instance` (instance methods), `:self`
26
+ (class / module methods, i.e. methods called directly on receiver), `:all`
27
+ (both instance and direct methods)
28
+
29
+ ### Added
30
+
31
+ - Allow passing `receivers` as an array in first argument to `wrap()`. [commit](https://github.com/biinari/trace_wrapper/3d16a0fa823219705a1214114016d8f66e820609)
32
+ - Add `:visibility` option to `wrap()` [PR #1](https://github.com/biinari/trace_wrapper/pulls/1)
33
+ - Add `[process:thread]` identifier to trace output when calls are made on a
34
+ different process / thread to the instantiation of `TraceWrapper`.
35
+
36
+ ## 0.0.1 (never released)
37
+
38
+ [Initial commit](https://github.com/biinari/tree/f71416e97ce3b7c1e76d0d6722ea64eb4d2a01ff)
39
+
40
+ [Unreleased]: https://github.com/biinari/trace_wrapper/compare/v0.2.0...HEAD
41
+ [0.2.0]: https://github.com/biinari/trace_wrapper/compare/v0.1.0...v0.2.0
42
+ [0.1.0]: https://github.com/biinari/trace_wrapper/releases/tag/v0.1.0
data/README.md CHANGED
@@ -64,7 +64,7 @@ What is the answer to the ultimate question?
64
64
  42
65
65
  ```
66
66
 
67
- See [custom example](examples/custom.rb) for a more custom usage
67
+ See [custom example](https://github.com/biinari/trace_wrapper/blob/master/examples/custom.rb) for a more custom usage
68
68
 
69
69
  ### Options
70
70
 
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rake/testtask'
4
+ require 'rdoc/task'
4
5
 
5
6
  Rake::TestTask.new(:test) do |t|
6
7
  t.libs << 'test'
@@ -12,4 +13,10 @@ task :rubocop do
12
13
  sh 'rubocop'
13
14
  end
14
15
 
16
+ RDoc::Task.new do |rdoc|
17
+ rdoc.main = 'README.md'
18
+ rdoc.rdoc_files.include('README.md', 'lib/**/*.rb')
19
+ rdoc.rdoc_dir = 'doc'
20
+ end
21
+
15
22
  task default: %i[rubocop test]
@@ -1,32 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'trace_wrapper/version'
4
+ require 'trace_wrapper/shell'
4
5
 
5
6
  ##
6
7
  # Wraps methods on given classes or modules to output a call/return tree.
7
8
  class TraceWrapper
8
- COLOURS = {
9
- red: '31m',
10
- b_red: '1;31m',
11
- green: '32m',
12
- b_green: '1;32m',
13
- orange: '33m',
14
- yellow: '1;33m',
15
- blue: '34m',
16
- b_blue: '1;34m',
17
- purple: '35m',
18
- b_purple: '1;35m',
19
- teal: '36m',
20
- cyan: '1;36m'
21
- }.freeze
22
-
23
- ELLIPSIS = "\u2026"
9
+ include TraceWrapper::Shell
24
10
 
25
11
  class << self
26
- def wrap(*receivers, **kwargs, &block)
12
+ ##
13
+ # Wraps methods on given +receivers+ with tracing
14
+ #
15
+ # options will be passed to .new and #wrap respectively
16
+ #
17
+ # If a block is given, it will be passed to #wrap
18
+ def wrap(*receivers, **options, &block) # :yields: a_trace_wrapper
27
19
  init_keys = %i[output colour]
28
- init_args = kwargs.select { |k, _| init_keys.include?(k) }
29
- wrap_args = kwargs.reject { |k, _| init_keys.include?(k) }
20
+ init_args = options.select { |k, _| init_keys.include?(k) }
21
+ wrap_args = options.reject { |k, _| init_keys.include?(k) }
30
22
 
31
23
  new(**init_args).wrap(*receivers, **wrap_args, &block)
32
24
  end
@@ -39,7 +31,7 @@ class TraceWrapper
39
31
  #
40
32
  # :output - +IO+ object to write trace output to (default +STDOUT+)
41
33
  # :colour - True to use shell colours in output (default +nil+ will colour if
42
- # output is a TTY)
34
+ # output is a TTY)
43
35
  def initialize(output: $stdout, colour: nil)
44
36
  @output = output
45
37
  @colour = colour
@@ -54,18 +46,23 @@ class TraceWrapper
54
46
  #
55
47
  # Options
56
48
  #
57
- # :method_type - Types of methods to wrap (default: :all). Choices are:
58
- # :instance for methods on instances of receiver(s)
59
- # :self for methods called directly on the receiver(s)
60
- # :all for both
61
- # :visibility - Array of method visibility levels to wrap. Can include
62
- # :public, :protected, :private
63
- # (default [:public, :protected])
49
+ # +:method_type+ - Types of methods to wrap (default: +:all+). Choices are:
50
+ # +:instance+ (for instance methods),
51
+ # +:self+ (for receiver methods, i.e. class/module functions),
52
+ # +:all+ for both
53
+ #
54
+ # +:visibility+ - Lowest method visibility level to wrap
55
+ # (default: +:protected+). Choices are: :public, :protected, :private.
64
56
  #
65
- # If a block is given, the wrappers will be created just around the block
57
+ # If a block is given, the wrappers will be created just around the block and
58
+ # the block's result will be returned.
59
+ # The TraceWrapper instance will be yielded to the block to allow further
60
+ # wraps to be added.
61
+ #
62
+ # If no block is given, you should call unwrap after use.
66
63
  def wrap(*receivers,
67
64
  method_type: :all,
68
- visibility: %i[public protected])
65
+ visibility: :protected) # :yields: a_trace_wrapper
69
66
  unwrappers = []
70
67
  Array(*receivers).each do |receiver|
71
68
  if %i[all self].include?(method_type)
@@ -96,7 +93,7 @@ class TraceWrapper
96
93
  private
97
94
 
98
95
  # Wrap standard methods (methods on the object given) with tracing
99
- def wrap_methods(*receivers, visibility: %i[public protected])
96
+ def wrap_methods(*receivers, visibility: :protected)
100
97
  unwrappers = []
101
98
  Array(*receivers).each do |receiver|
102
99
  mod, unwrapper = wrapping_module(receiver, :self, visibility)
@@ -108,7 +105,7 @@ class TraceWrapper
108
105
 
109
106
  # Wrap instance methods (called on an instance of the class given) with
110
107
  # tracing
111
- def wrap_instance_methods(*receivers, visibility: %i[public protected])
108
+ def wrap_instance_methods(*receivers, visibility: :protected)
112
109
  unwrappers = []
113
110
  Array(*receivers).each do |receiver|
114
111
  mod, unwrapper = wrapping_module(receiver, :instance, visibility)
@@ -166,12 +163,16 @@ class TraceWrapper
166
163
  protected: :protected_methods,
167
164
  private: :private_methods
168
165
  }
169
- }.freeze
166
+ }.freeze # :nodoc:
170
167
 
171
168
  def get_methods(receiver, method_type, visibility)
172
- %i[public protected private].map do |vis|
173
- next unless visibility.include?(vis)
169
+ visibilities = %i[public protected private]
170
+ unless visibilities.include?(visibility)
171
+ raise "visibility option not recognised: #{visibility.inspect}"
172
+ end
173
+ visibilities = visibilities[0..visibilities.find_index(visibility)]
174
174
 
175
+ visibilities.map do |vis|
175
176
  lister = LIST_METHODS[method_type][vis]
176
177
  receiver.public_send(lister, false) - Object.public_send(lister)
177
178
  end.compact.flatten
@@ -208,16 +209,6 @@ class TraceWrapper
208
209
  @output.write("#{indent}#{text}\n")
209
210
  end
210
211
 
211
- def colour(text, colour)
212
- return text unless colour?
213
- "\e[#{COLOURS[colour]}#{text}\e[0m"
214
- end
215
-
216
- def colour?
217
- return @colour unless @colour.nil?
218
- @output.respond_to?(:isatty) && @output.isatty
219
- end
220
-
221
212
  def incr_indent
222
213
  process[:indent] += 1
223
214
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ class TraceWrapper
4
+ module Shell # :nodoc: all
5
+ COLOURS = {
6
+ red: '31m',
7
+ b_red: '1;31m',
8
+ green: '32m',
9
+ b_green: '1;32m',
10
+ orange: '33m',
11
+ yellow: '1;33m',
12
+ blue: '34m',
13
+ b_blue: '1;34m',
14
+ purple: '35m',
15
+ b_purple: '1;35m',
16
+ teal: '36m',
17
+ cyan: '1;36m'
18
+ }.freeze
19
+
20
+ ELLIPSIS = "\u2026"
21
+
22
+ def colour?
23
+ return @colour unless @colour.nil?
24
+ @output.respond_to?(:isatty) && @output.isatty
25
+ end
26
+
27
+ def colour(text, colour)
28
+ return text unless colour?
29
+ "\e[#{COLOURS[colour]}#{text}\e[0m"
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class TraceWrapper
4
- VERSION = '0.1.0'
4
+ # Current version of TraceWrapper
5
+ VERSION = '0.2.0'
5
6
  end
@@ -156,7 +156,7 @@ class TestTraceWrapper < Minitest::Test
156
156
  .gsub!(/@([^@]*)@/, "#{PURPLE}\\1#{CLEAR}")
157
157
 
158
158
  subject = lambda do |tracer|
159
- tracer.wrap(PlayClass, visibility: %i[public protected private])
159
+ tracer.wrap(PlayClass, visibility: :private)
160
160
  result = PlayClass.new.play_solitaire(2, 3)
161
161
 
162
162
  assert_equal('solo: 2, 3', result)
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  'source_code_uri' => 'https://github.com/biinari/trace_wrapper'
23
23
  }
24
24
  s.rdoc_options << '--main' << 'README.md'
25
+ s.extra_rdoc_files = ['README.md']
25
26
 
26
27
  s.add_development_dependency 'minitest', '~> 5.14'
27
28
  s.add_development_dependency 'rake', '~> 13.0'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trace_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bill Ruddock
@@ -60,11 +60,13 @@ description: |-
60
60
  email:
61
61
  executables: []
62
62
  extensions: []
63
- extra_rdoc_files: []
63
+ extra_rdoc_files:
64
+ - README.md
64
65
  files:
65
66
  - ".gitignore"
66
67
  - ".rubocop.yml"
67
68
  - ".travis.yml"
69
+ - CHANGELOG.md
68
70
  - Gemfile
69
71
  - LICENSE.md
70
72
  - README.md
@@ -72,6 +74,7 @@ files:
72
74
  - examples/basic.rb
73
75
  - examples/custom.rb
74
76
  - lib/trace_wrapper.rb
77
+ - lib/trace_wrapper/shell.rb
75
78
  - lib/trace_wrapper/version.rb
76
79
  - test/playground.rb
77
80
  - test/test_trace_wrapper.rb