rshade 0.1.3 → 0.1.8

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: c22edeb524363703e1593cc552713c7e9cef6203ab2df81d1c52ce1d39b8e68f
4
- data.tar.gz: ac8080bc18e8c4ef3ebe9274815c35cbbd201cc210791c914f366786648f07e7
3
+ metadata.gz: f10cfe61e925b1882ff42ea7580a2a6d72b5eadd4f18831a7e52813e22d1daea
4
+ data.tar.gz: cfe32fccff6bd61114bb86d0fd0d790d66c61ca41ce7bda0fc39e03af73ddb46
5
5
  SHA512:
6
- metadata.gz: e8803cd8aa9df51f749d3e68ec9a8bb86aad01d731ce69b69862f5d105fea6297c8933092b20a66a1f3a2fd62a762da11b765e4c944cd9ccd6e65a88a7483168
7
- data.tar.gz: 637c5715a9404d2e491919f32658ac499027d39cf85c126a804f6b44f5a15aa0bc469483deae67f7516f3735bd873c450105baae34a3d042c6428ed815cfe9b6
6
+ metadata.gz: 34222d8c0982a0af1ccbd37a2436f3dfa58d164ad4614a51db4c2074aff55f5adc873aa89008b173a065ec83975b3e67f9266437931efc1725baf50d04638bd5
7
+ data.tar.gz: 231f085edc963e287f1e8ae1b0843567ff5857cbfd50d80e240548e143148609c44d02d76204a6dd021765785c7ce347e6d7dcdeb49a388ff08197ce52074f45
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rshade (0.1.3)
4
+ rshade (0.1.7)
5
5
  colorize
6
6
 
7
7
  GEM
@@ -14,7 +14,7 @@ GEM
14
14
  pry (0.12.2)
15
15
  coderay (~> 1.1.0)
16
16
  method_source (~> 0.9.0)
17
- rake (10.5.0)
17
+ rake (13.0.1)
18
18
  rspec (3.8.0)
19
19
  rspec-core (~> 3.8.0)
20
20
  rspec-expectations (~> 3.8.0)
@@ -35,9 +35,9 @@ PLATFORMS
35
35
  DEPENDENCIES
36
36
  bundler (~> 1.16)
37
37
  pry
38
- rake (~> 10.0)
38
+ rake (>= 12.3.3)
39
39
  rshade!
40
40
  rspec (~> 3.0)
41
41
 
42
42
  BUNDLED WITH
43
- 1.16.6
43
+ 1.17.3
data/README.md CHANGED
@@ -5,8 +5,7 @@
5
5
  Ruby Shade or RShade gem to help you to reveal what lines of code are used in program execution.
6
6
 
7
7
  ```ruby
8
- trace = RShade::Trace.new
9
- trace.reveal do
8
+ trace = RShade::Trace.reveal do
10
9
  #your code here
11
10
  end
12
11
  trace.show
@@ -0,0 +1,72 @@
1
+ <!doctype html>
2
+
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>RShade call trace viewer</title>
7
+ <meta name="description" content="The HTML5 Herald">
8
+ <meta name="author" content="me">
9
+ <style>
10
+ body {
11
+ overflow-x: scroll;
12
+ }
13
+ .stacktrace-line {
14
+ color: #1c1c1c;
15
+ font-family: monospace;
16
+ border: 1px solid hsla(210,50%, 50%, 1);
17
+ margin-bottom: 10px;
18
+ width: fit-content;
19
+ }
20
+ .method-line {
21
+ font-size: 1.2rem;
22
+ padding: 10px;
23
+ background: hsla(210,50%, 50%, 0.1);
24
+ }
25
+
26
+ .path-line {
27
+ padding: 10px;
28
+ font-size: 0.9rem;
29
+ background: hsla(110,50%, 50%, 0.1);
30
+ }
31
+
32
+ .vars-line {
33
+ font-size: 0.7rem;
34
+ padding: 10px;
35
+ background: hsla(60,50%, 50%, 0.1);
36
+ }
37
+
38
+ </style>
39
+ </head>
40
+ <body>
41
+ <div class="stacktrace"></div>
42
+ <script>
43
+ var data = <%=json %>;
44
+ var el = document.querySelector(".stacktrace");
45
+ for(i=0; i < data.length; i++) {
46
+ var value = data[i];
47
+ var newEl = document.createElement('div');
48
+ newEl.setAttribute("class", "stacktrace-line");
49
+ newEl.style.marginLeft = `${value.depth * 10}px`
50
+
51
+ line1 = document.createElement('div');
52
+ line1.setAttribute("class", "method-line");
53
+ line1.innerText = `${value.class}#${value.method_name}`;
54
+
55
+ var line2 = document.createElement('div');
56
+ line2.setAttribute("class", "path-line");
57
+ line2.innerText = `${value.class}#${value.full_path}`;
58
+
59
+ var line3 = document.createElement('div');
60
+ line3.setAttribute("class", "vars-line");
61
+ line3.innerText = JSON.stringify(value.vars)
62
+
63
+ newEl.appendChild(line1);
64
+ newEl.appendChild(line2);
65
+ newEl.appendChild(line3);
66
+ el.appendChild(newEl)
67
+ }
68
+ console.log(data);
69
+ </script>
70
+
71
+ </body>
72
+ </html>
@@ -1,12 +1,34 @@
1
1
  require 'colorize'
2
- require 'rshade/source'
3
- require 'rshade/tree'
4
- require 'rshade/source_node'
2
+ require 'erb'
3
+ require 'rshade/configuration'
4
+ require 'rshade/base'
5
+ require 'rshade/event_serializer'
6
+ require 'rshade/filter/app_filter'
7
+ require 'rshade/formatter/string'
8
+ require 'rshade/formatter/json'
9
+ require 'rshade/formatter/file'
10
+ require 'rshade/formatter/html'
11
+ require 'rshade/formatter/stdout'
12
+ require 'rshade/event'
13
+ require 'rshade/event_store'
5
14
  require 'rshade/trace'
6
- require 'rshade/rspec'
15
+ require 'rshade/rspec/rspec'
7
16
  require 'rshade/version'
8
17
 
18
+
9
19
  module RShade
10
20
  APP_TRACE = :app_trace
11
21
  FULL_TRACE = :full_trace
22
+
23
+ class << self
24
+ attr_writer :config
25
+
26
+ def config
27
+ @config ||= Configuration.new
28
+ end
29
+
30
+ def configure
31
+ yield configuration
32
+ end
33
+ end
12
34
  end
@@ -0,0 +1,13 @@
1
+ module RShade
2
+ class Base
3
+ def initialize(*args); end
4
+
5
+ def self.call(*args)
6
+ new(*args).call
7
+ end
8
+
9
+ def call
10
+ raise NotImplementedError
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ module RShade
2
+ class Configuration
3
+ RUBY_VERSION_PATTERN = /ruby-[0-9.]*/
4
+
5
+ attr_accessor :track_gems, :filter, :formatter
6
+
7
+ def initialize
8
+ @track_gems = Set.new
9
+ end
10
+
11
+ def excluded_paths
12
+ @excluded_paths ||= begin
13
+ paths = [ENV['GEM_PATH'].split(':'), parse_ruby_version].flatten.compact
14
+ paths.reject do |v|
15
+ track_gems.any? { |gem_name| v.include? gem_name }
16
+ end
17
+ end
18
+ end
19
+
20
+ def parse_ruby_version
21
+ val = RUBY_VERSION_PATTERN.match(ENV['GEM_PATH'])
22
+ return nil unless val
23
+
24
+ val[0]
25
+ end
26
+
27
+ def filter
28
+ @filter ||= ::RShade::Filter::AppFilter
29
+ end
30
+
31
+ def formatter
32
+ @formatter ||= ::RShade::Formatter::Stdout
33
+ end
34
+
35
+ def store_dir
36
+ File.expand_path('../../tmp', __dir__)
37
+ end
38
+
39
+ def root_dir
40
+ @root_dir ||= File.expand_path('../../', __dir__)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,35 @@
1
+ module RShade
2
+ # nodoc
3
+ class Event
4
+ attr_reader :hash
5
+ attr_accessor :depth
6
+
7
+ def initialize(hash)
8
+ @hash = hash
9
+ end
10
+
11
+ def level
12
+ @hash[:level]
13
+ end
14
+
15
+ def klass
16
+ @hash[:klass]
17
+ end
18
+
19
+ def path
20
+ @hash[:path]
21
+ end
22
+
23
+ def lineno
24
+ @hash[:lineno]
25
+ end
26
+
27
+ def method_name
28
+ @hash[:method_name]
29
+ end
30
+
31
+ def vars
32
+ @hash[:vars]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ require 'date'
2
+ module RShade
3
+ class EventSerializer < Base
4
+ attr_reader :evt, :level
5
+ SERIALIZE_CLASSES = [NilClass, TrueClass, FalseClass, Numeric, Time, Date, String, Symbol, Array]
6
+ def initialize(evt, level)
7
+ @evt = evt
8
+ @level = level
9
+ end
10
+
11
+ def call
12
+ { level: @level, path: evt.path, lineno: evt.lineno, klass: evt.defined_class, method_name: evt.method_id, vars: process_locals(evt) }
13
+ end
14
+
15
+ def process_locals(evt)
16
+ vars = {}
17
+ evt.binding.local_variables.each do |var|
18
+ local_var = evt.binding.local_variable_get var
19
+ if SERIALIZE_CLASSES.any? { |klass| local_var.is_a?(klass) }
20
+ vars[var] = local_var
21
+ elsif local_var.is_a?(Hash)
22
+ vars[var] = shallow_copy_of_hash(local_var)
23
+ else
24
+ class_name = local_var.is_a?(Class) ? local_var.to_s : local_var.class.to_s
25
+ vars[var] = "FILTERED[#{class_name}]"
26
+ end
27
+ end
28
+ vars
29
+ end
30
+
31
+ #TODO: work on more efficient way to serialize hash
32
+ def shallow_copy_of_hash(hash)
33
+ {}.tap do |new_hash|
34
+ hash.each do |k,v|
35
+ new_hash[k] = v.to_s
36
+ end
37
+ new_hash
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,23 @@
1
+ module RShade
2
+ # nodoc
3
+ class EventStore
4
+ attr_reader :events
5
+
6
+ def initialize
7
+ @events = []
8
+ end
9
+
10
+ def <<(event)
11
+ events << event
12
+ end
13
+
14
+ def iterate(&block)
15
+ pos_map = {}
16
+ @events.map {|item| item.level }.uniq.sort.each_with_index { |item, index| pos_map[item] = index}
17
+ @events.uniq{|item| [item.level, "#{item.klass}##{item.method_name}"]}.sort_by { |item| item.depth }.each do |item|
18
+ item.depth = pos_map[item.level]
19
+ yield(item, item.depth)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ module RShade
2
+ module Filter
3
+ class AppFilter < ::RShade::Base
4
+ attr_reader :data
5
+
6
+ def initialize(data)
7
+ @data = data
8
+ end
9
+
10
+ def call
11
+ valid?(data[:path])
12
+ end
13
+
14
+ def valid?(path)
15
+ return true if RShade.config.track_gems.any? { |item| path.include? item }
16
+ RShade.config.excluded_paths.none? { |item| path.include? item }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ module RShade
2
+ module Formatter
3
+ class File < ::RShade::Base
4
+ attr_reader :formatter, :event_store
5
+ FILE_NAME = 'stacktrace.json'.freeze
6
+
7
+ def initialize(event_store, args={})
8
+ @event_store = event_store
9
+ @formatter = args.fetch(:format, Json)
10
+ end
11
+
12
+ def call
13
+ data = formatter.call(event_store)
14
+ if formatter == Json
15
+ write_to_file(JSON.pretty_generate(data))
16
+ else
17
+ write_to_file(data.to_s)
18
+ end
19
+ end
20
+
21
+ def write_to_file(data)
22
+ ::File.open(::File.join(RShade.config.store_dir, FILE_NAME), "w+") do |f|
23
+ f.write data
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ module RShade
2
+ module Formatter
3
+ class Html < ::RShade::Base
4
+ attr_reader :formatter, :event_store
5
+ FILE_NAME = 'stacktrace.html'.freeze
6
+ TEMPLATE = 'html/template.html.erb'
7
+
8
+ def initialize(event_store, args={})
9
+ @event_store = event_store
10
+ @formatter = args.fetch(:formatter, Json)
11
+ end
12
+
13
+ def call
14
+ data = formatter.call(event_store)
15
+ erb_template = ERB.new(template)
16
+ content = erb_template.result_with_hash({json: data.to_json})
17
+ write_to_file(content)
18
+ end
19
+
20
+ def write_to_file(data)
21
+ ::File.open(::File.join(RShade.config.store_dir, FILE_NAME), "w+") do |f|
22
+ f.write data
23
+ end
24
+ end
25
+
26
+ def template
27
+ @template ||=::File.read(::File.join(::RShade.config.root_dir, TEMPLATE))
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,60 @@
1
+ module RShade
2
+ module Formatter
3
+ class Json < ::RShade::Base
4
+ attr_reader :event_store
5
+
6
+ def initialize(event_store)
7
+ @event_store = event_store
8
+ end
9
+
10
+ def call
11
+ flat
12
+ end
13
+
14
+ def flat
15
+ arr = []
16
+ event_store.iterate do |node, depth|
17
+ arr << item(node)
18
+ end
19
+ arr.sort_by { |item| item[:depth]}
20
+ end
21
+
22
+ def hierarchical
23
+ hash = {}
24
+ event_store.iterate do |node, depth|
25
+ ref = hash_iterate(hash, depth)
26
+ ref[:data] = item(node)
27
+ end
28
+ sort_hash(hash)
29
+ end
30
+
31
+ def sort_hash(h)
32
+ {}.tap do |h2|
33
+ h.sort.each do |k,v|
34
+ h2[k] = v.is_a?(Hash) ? sort_hash(v) : v
35
+ end
36
+ end
37
+ end
38
+
39
+ def hash_iterate(hash, depth)
40
+ (0..depth).each do |lvl|
41
+ unless hash[:inner]
42
+ hash[:inner] = {}
43
+ end
44
+ hash = hash[:inner]
45
+ end
46
+ hash
47
+ end
48
+
49
+ def item(value)
50
+ {
51
+ class: value.klass.to_s,
52
+ method_name: value.method_name,
53
+ full_path: "#{value.path}:#{value.lineno}",
54
+ depth: value.depth,
55
+ vars: value.vars
56
+ }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,10 @@
1
+ module RShade
2
+ module Formatter
3
+ class Stdout < String
4
+ def call
5
+ buffer = super
6
+ puts buffer
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,30 @@
1
+ module RShade
2
+ module Formatter
3
+ class String < ::RShade::Base
4
+ attr_reader :event_store
5
+ ROOT_SEP = "---\n"
6
+
7
+ def initialize(event_store)
8
+ @event_store = event_store
9
+ end
10
+
11
+ def call
12
+ buffer = StringIO.new
13
+ event_store.iterate do |node, depth|
14
+ if depth == 1
15
+ buffer << ROOT_SEP
16
+ next
17
+ end
18
+ puts line(node, depth)
19
+ end
20
+ buffer.string
21
+ end
22
+
23
+ def line(value, depth)
24
+ class_method = "#{value.klass}##{value.method_name}".colorize(:green)
25
+ full_path = "#{value.path}:#{value.lineno}".colorize(:blue)
26
+ "#{' ' * depth}#{class_method}(#{value.vars}) -> #{full_path}\n"
27
+ end
28
+ end
29
+ end
30
+ end
File without changes
@@ -2,15 +2,13 @@ module RShade
2
2
  REPORTS = []
3
3
 
4
4
  module RSpecHelper
5
- def rshade_reveal(type = ::RShade::APP_TRACE)
5
+ def rshade_reveal(options = {})
6
6
  raise 'No block given' unless block_given?
7
-
8
- trace = Trace.new
9
- trace.reveal do
7
+ options.merge!(formatter: Formatter::String) { |_key,v1, _v2| v1 }
8
+ result = Trace.reveal(options) do
10
9
  yield
11
10
  end
12
-
13
- REPORTS.push trace.show(type)
11
+ REPORTS.push result.show
14
12
  end
15
13
  end
16
14
  end
@@ -0,0 +1,4 @@
1
+ module RShade
2
+ class Storage
3
+ end
4
+ end
@@ -1,12 +1,21 @@
1
1
  module RShade
2
2
  class Trace
3
- attr_accessor :source_tree, :open, :close, :set
3
+ attr_accessor :event_store, :formatter, :filter
4
4
  EVENTS = %i[call return].freeze
5
5
 
6
- def initialize
7
- @source_tree = SourceNode.new(nil)
6
+ def initialize(options={})
7
+ @event_store = EventStore.new
8
+ @formatter = options.fetch(:formatter, RShade.config.formatter)
9
+ @filter = options.fetch(:filter, RShade.config.filter)
8
10
  @tp = TracePoint.new(*EVENTS, &method(:process_trace))
9
- @stack = [@source_tree]
11
+ @level = 1
12
+ @stat = {}
13
+ @calls = 0
14
+ @returns = 0
15
+ end
16
+
17
+ def self.reveal(options={}, &block)
18
+ new(options).reveal(&block)
10
19
  end
11
20
 
12
21
  def reveal
@@ -14,55 +23,31 @@ module RShade
14
23
 
15
24
  @tp.enable
16
25
  yield
26
+ self
17
27
  ensure
18
28
  @tp.disable
19
29
  end
20
30
 
21
- def show(type = ::RShade::APP_TRACE)
22
- return show_app_trace if type == ::RShade::APP_TRACE
23
-
24
- show_full_trace
31
+ def show
32
+ formatter.call(event_store)
25
33
  end
26
34
 
27
- def show_full_trace(tree = nil)
28
- buffer = StringIO.new
29
- tree ||= source_tree
30
- tree.pre_order_traverse do |node, depth|
31
- if node.root?
32
- buffer << "---\n"
33
- next
34
- end
35
-
36
- buffer << "#{' ' * depth} #{node.value.pretty}\n" if node.value
37
- end
38
- puts buffer.string
39
- end
40
-
41
- def show_app_trace
42
- clone = source_tree.clone_by do |node|
43
- next true if node.root?
44
-
45
- node.value.app_code?
46
- end
47
- show_full_trace(clone)
35
+ def stat
36
+ { calls: @calls, returns: @returns }
48
37
  end
49
38
 
50
39
  def process_trace(tp)
51
40
  if tp.event == :call
52
- parent = @stack.last
53
- vars = {}
54
- tp.binding.local_variables.each do |var|
55
- vars[var] = tp.binding.local_variable_get var
56
- end
57
- hash = { level: @stack.size, path: tp.path, lineno: tp.lineno, klass: tp.defined_class, method_name: tp.method_id, vars: vars }
58
- node = SourceNode.new(Source.new(hash))
59
- node.parent = parent
60
- parent << node
61
- @stack.push node
41
+ @level +=1
42
+ hash = EventSerializer.call(tp, @level)
43
+ return unless filter.call(hash)
44
+ @calls += 1
45
+ event_store << Event.new(hash)
62
46
  end
63
47
 
64
- if tp.event == :return && @stack.size > 1
65
- @stack.pop
48
+ if tp.event == :return && @level > 0
49
+ @returns += 1
50
+ @level -=1
66
51
  end
67
52
  end
68
53
  end
@@ -1,3 +1,3 @@
1
1
  module RShade
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.8"
3
3
  end
@@ -39,6 +39,6 @@ Gem::Specification.new do |spec|
39
39
  spec.add_runtime_dependency 'colorize'
40
40
 
41
41
  spec.add_development_dependency "bundler", "~> 1.16"
42
- spec.add_development_dependency "rake", "~> 10.0"
42
+ spec.add_development_dependency "rake", ">= 12.3.3"
43
43
  spec.add_development_dependency "rspec", "~> 3.0"
44
44
  end
data/todo.md ADDED
@@ -0,0 +1,8 @@
1
+ 1. Should I use rails way organizing module/file naming or not?
2
+ 2. Reduce global state usage
3
+ 3. Problem with stack deep
4
+ 4. Problem when have binary values error in serialization (Encoding problems)
5
+ 5. Make filter while tracing that will be more efficient
6
+ 6. sort depth and than replace values
7
+ 7. tree not working bcz of vars serialization
8
+ 8. Some classes in Rails can't serialize safely produce StackTraceTooDeep
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rshade
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Lopatin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-14 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: 12.3.3
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: 12.3.3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -83,15 +83,27 @@ files:
83
83
  - Rakefile
84
84
  - bin/console
85
85
  - bin/setup
86
+ - html/template.html.erb
86
87
  - lib/rshade.rb
87
- - lib/rshade/rspec.rb
88
- - lib/rshade/source.rb
89
- - lib/rshade/source_node.rb
88
+ - lib/rshade/base.rb
89
+ - lib/rshade/configuration.rb
90
+ - lib/rshade/event.rb
91
+ - lib/rshade/event_serializer.rb
92
+ - lib/rshade/event_store.rb
93
+ - lib/rshade/filter/app_filter.rb
94
+ - lib/rshade/formatter/file.rb
95
+ - lib/rshade/formatter/html.rb
96
+ - lib/rshade/formatter/json.rb
97
+ - lib/rshade/formatter/stdout.rb
98
+ - lib/rshade/formatter/string.rb
99
+ - lib/rshade/rails/rails.rb
100
+ - lib/rshade/rspec/rspec.rb
101
+ - lib/rshade/storage.rb
90
102
  - lib/rshade/trace.rb
91
- - lib/rshade/tree.rb
92
103
  - lib/rshade/version.rb
93
104
  - rshade.gemspec
94
105
  - shade.jpg
106
+ - todo.md
95
107
  homepage: https://github.com/gingray/rshade
96
108
  licenses:
97
109
  - MIT
@@ -115,8 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
127
  - !ruby/object:Gem::Version
116
128
  version: '0'
117
129
  requirements: []
118
- rubyforge_project:
119
- rubygems_version: 2.7.8
130
+ rubygems_version: 3.0.8
120
131
  signing_key:
121
132
  specification_version: 4
122
133
  summary: https://github.com/gingray/rshade
@@ -1,57 +0,0 @@
1
- module RShade
2
- # nodoc
3
- class Source
4
- RUBY_VERSION_PATTERN = /ruby-[0-9.]*/
5
-
6
- def initialize(hash)
7
- @hash = hash
8
- end
9
-
10
- def klass
11
- @hash[:klass]
12
- end
13
-
14
- def lib_code?
15
- !app_code?
16
- end
17
-
18
- def app_code?
19
- @app_code ||= exclude_path.none? { |item| path.include? item }
20
- end
21
-
22
- def path
23
- @hash[:path]
24
- end
25
-
26
- def lineno
27
- @hash[:lineno]
28
- end
29
-
30
- def method_name
31
- @hash[:method_name]
32
- end
33
-
34
- def vars
35
- @hash[:vars]
36
- end
37
-
38
- def exclude_path
39
- @path_arr ||= begin
40
- [ENV['GEM_PATH'].split(':'), parse_ruby_version].flatten.compact
41
- end
42
- end
43
-
44
- def parse_ruby_version
45
- val = RUBY_VERSION_PATTERN.match(ENV['GEM_PATH'])
46
- return nil unless val
47
-
48
- val[0]
49
- end
50
-
51
- def pretty
52
- class_method = "#{klass}##{method_name}".colorize(:green)
53
- full_path = "#{path}:#{lineno}".colorize(:blue)
54
- "#{class_method}(#{vars.to_json}) -> #{full_path}"
55
- end
56
- end
57
- end
@@ -1,23 +0,0 @@
1
- module RShade
2
- # nodoc
3
- class SourceNode < Tree
4
- def initialize(value = nil)
5
- super(value)
6
- end
7
-
8
- def clone_by(new_tree = SourceNode.new(nil), &block)
9
- if yield(self)
10
- new_tree.value = value
11
- node = SourceNode.new(nil)
12
- node.parent = new_tree
13
- new_tree << node
14
- new_tree = node
15
- end
16
-
17
- nodes.each do |item|
18
- item.clone_by(new_tree, &block)
19
- end
20
- new_tree
21
- end
22
- end
23
- end
@@ -1,30 +0,0 @@
1
- module RShade
2
- # nodoc
3
- class Tree
4
- attr_accessor :parent, :value
5
- attr_reader :nodes
6
-
7
- def initialize(value = nil)
8
- @value = value
9
- @nodes = []
10
- @parent = nil
11
- end
12
-
13
- def root?
14
- !parent
15
- end
16
-
17
- def <<(node)
18
- @nodes << node
19
- end
20
-
21
- def pre_order_traverse(depth = 0, &block)
22
- return unless block_given?
23
-
24
- yield(self, depth)
25
- nodes.each do |item|
26
- item.pre_order_traverse(depth + 1, &block)
27
- end
28
- end
29
- end
30
- end