source_route 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8d7a56268a17ce2f0ea56258f3eaa28afac00dac
4
+ data.tar.gz: ffd4b43dd9a3b1dfa298695352cec8486c554d21
5
+ SHA512:
6
+ metadata.gz: c3a6f2c1acf132f9ef1b8efa0463febbd55e62bc4ecf6f36fc89af0f63793bf662bce96dbfff758663b6753de2e12491284e298da0a25d28f998ca63198320c8
7
+ data.tar.gz: 334f6cd5aafc1091a17c67ced52bd9f865a3154894a6ec72806c52eba0caa4a23ad5539df249c0e636f217d012019eebd223d8c6b297a407f892542e2f807b16
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.hound.yml ADDED
@@ -0,0 +1,2 @@
1
+ ruby:
2
+ enabled: true
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in source_route.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 raykin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # SourceRoute
2
+
3
+ Wrapper of TracePoint
4
+
5
+ ## Dependency
6
+
7
+ ruby 2
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'source_route', git: 'https://github.com/raykin/source-route'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install source_route
22
+
23
+ ## Usage
24
+
25
+ SourceRoute.enable /ActiveRecord/
26
+
27
+ ## Contributing
28
+
29
+ 1. Fork it ( https://github.com/[my-github-username]/source_route/fork )
30
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
31
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
32
+ 4. Push to the branch (`git push origin my-new-feature`)
33
+ 5. Create a new Pull Request
34
+
35
+
36
+ ### TODO
37
+
38
+ Following code is a good sample that track file running sequence, how to change it into a good code design and merge into the gem
39
+
40
+ ```ruby
41
+
42
+ files = []
43
+ tp = TracePoint.new(:line) do |tp|
44
+ if tp.path =~ /bole_api/
45
+ unless files.include? tp.path
46
+ puts "#{tp.path}".inspect
47
+ files.push(tp.path)
48
+ end
49
+ end
50
+ end
51
+ tp.enable
52
+
53
+ ```
54
+
55
+ It's better to add html output format, 'cause it can be kept.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task default: :test
4
+ task :test do
5
+ ENV['ignore_html_generation'] = 'true'
6
+ $LOAD_PATH.unshift('lib', 'test')
7
+ Dir.glob('./test/**/*_test.rb') { |f| require f }
8
+ end
@@ -0,0 +1,62 @@
1
+ require 'ostruct'
2
+ require 'logger'
3
+ require 'singleton'
4
+
5
+ require 'awesome_print'
6
+
7
+ require "source_route/version"
8
+ require "source_route/wrapper"
9
+ require "source_route/tp_result"
10
+ require "source_route/nature_value"
11
+
12
+ module SourceRoute
13
+ extend self
14
+
15
+ def wrapper
16
+ @@wrapper ||= Wrapper.instance
17
+ end
18
+
19
+ def reset
20
+ wrapper.reset
21
+ end
22
+
23
+ def disable
24
+ wrapper.reset
25
+ end
26
+
27
+ def enable(match = nil, &block)
28
+ wrapper.reset
29
+
30
+ wrapper.method_id(match) if match # TODO in future future: should add as wrapper.method_id_or(match)
31
+
32
+ wrapper.instance_eval(&block) if block_given?
33
+
34
+ wrapper.trace
35
+ end
36
+
37
+ # Not implemented. used in irb or pry.
38
+ def trace(opt, &block)
39
+ wrapper.reset
40
+ opt.each do |k, v|
41
+ wrapper.send(k, v)
42
+ end
43
+ wrapper.trace
44
+ yield
45
+ wrapper.tp.disable
46
+ SourceRoute.build_html_output if opt[:output_format] == :html
47
+ end
48
+
49
+ def build_html_output
50
+ SourceRoute::Formats::Html.render(wrapper)
51
+ end
52
+
53
+ # Not implement yet
54
+ class Logger < Logger
55
+ end
56
+ end
57
+
58
+ module SourceRoute
59
+ module Formats
60
+ autoload :Html, 'source_route/formats/html'
61
+ end
62
+ end
@@ -0,0 +1,19 @@
1
+ require 'slim'
2
+ require 'json'
3
+
4
+ module SourceRoute
5
+ module Formats
6
+ module Html
7
+
8
+ # results is instance of Wrapper
9
+ def self.render(results)
10
+ template_path = File.expand_path "../html_template.slim", __FILE__
11
+ html_output_str = Slim::Template.new(template_path).render(results)
12
+ File.open("#{Time.now.strftime('%M%S-%H-%m-%d')}-source-route.html", 'w') do |f|
13
+ f << html_output_str
14
+ end
15
+ end
16
+
17
+ end # END Html
18
+ end
19
+ end
@@ -0,0 +1,48 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title Source Route Result
5
+ link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"
6
+ script src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"
7
+ script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"
8
+
9
+ body(ng-app="SourceRoute")
10
+ / workaround for following case:
11
+ / pry(main)> ActiveRecord::Inheritance::ClassMethods.to_json => {} # Dont know why
12
+ ruby:
13
+ trace_data = @tp_attrs_results.map do |tp_result|
14
+ tp_result[:defined_class] = tp_result[:defined_class].nature_value
15
+ tp_result
16
+ end
17
+
18
+ .data-collect
19
+ #trace-data data-trace="#{trace_data.to_json}"
20
+
21
+ .container(ng-controller="MainCtrl")
22
+ .top-header
23
+ h4
24
+ | Event:
25
+ =< @conditions.event
26
+ .trace-flow
27
+ .row
28
+ .left-info.col-sm-3
29
+ .well.well-sm(ng-repeat="klass in definedClasses")
30
+ p.text-center(ng-bind="klass")
31
+ .center-info.col-sm-5
32
+ .well.well-lg(ng-repeat="trace in traces")
33
+ p
34
+ span(ng-bind="trace.defined_class")
35
+ span #
36
+ span(ng-bind="trace.method_id")
37
+ .right-info.col-sm-3
38
+
39
+ script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.25/angular.min.js"
40
+
41
+ javascript:
42
+ sourceRoute = angular.module('SourceRoute', [])
43
+ sourceRoute.controller('MainCtrl', function($scope) {
44
+ $scope.traces = angular.element("#trace-data").data('trace')
45
+ // it is possible to prevent dirty check on definedClasses after it was generated
46
+ $scope.definedClasses = _.uniq(_.map($scope.traces, 'defined_class'))
47
+ $scope.definedClasses.unshift('ALL')
48
+ })
@@ -0,0 +1,29 @@
1
+ class NilClass
2
+ def nature_value
3
+ nil
4
+ end
5
+ end
6
+
7
+ class String
8
+ def nature_value
9
+ self
10
+ end
11
+ end
12
+
13
+ class Class
14
+ def nature_value
15
+ self.name
16
+ end
17
+ end
18
+
19
+ class Module
20
+ def nature_value
21
+ self.name
22
+ end
23
+ end
24
+
25
+ class Symbol
26
+ def nature_value
27
+ to_s
28
+ end
29
+ end
@@ -0,0 +1,96 @@
1
+ module SourceRoute
2
+
3
+ class TpResult
4
+
5
+ DEFAULT_ATTRS = {
6
+ call: [:defined_class, :event, :method_id],
7
+ return: [:defined_class, :event, :method_id, :return_value]
8
+ }
9
+
10
+ def initialize(wrapper)
11
+ @wrapper = wrapper
12
+
13
+ @output_config = @wrapper.conditions.result_config
14
+
15
+ @tp_event = @wrapper.conditions.event.to_sym
16
+ if @output_config[:selected_attrs].nil? and [@wrapper.conditions.event].flatten.size == 1
17
+ @output_config[:selected_attrs] = DEFAULT_ATTRS[@tp_event] - [:event]
18
+ end
19
+ end
20
+
21
+ def build(trace_point_instance)
22
+ @tp = trace_point_instance
23
+ collect_tp_data
24
+ collect_local_var_data
25
+ collect_instance_var_data
26
+ @collect_data
27
+ end
28
+
29
+ # always run build before it # not a good design
30
+ def output
31
+
32
+ format = @output_config[:output_format].to_sym
33
+
34
+ case format
35
+ when :none
36
+ # do nothing
37
+ when :console
38
+ console_put
39
+ when :html
40
+ # I cant solve the problem: to generate html at the end,
41
+ # I have to know when the application is end
42
+ when :test
43
+ # do nothing at now
44
+ when :Proc
45
+ # customize not defined yet
46
+ # format.call(tp)
47
+ else
48
+ klass = "SourceRoute::Formats::#{format.to_s.capitalize}"
49
+ ::SourceRoute.const_get(klass).render(self, trace_point_instance)
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def collect_tp_data
56
+ @collect_data = @output_config[:selected_attrs].inject({}) do |memo, key|
57
+ memo[key.to_sym] = @tp.send(key) if @tp.respond_to?(key)
58
+ memo
59
+ end
60
+ end
61
+
62
+ def collect_local_var_data
63
+ if @wrapper.conditions.result_config[:include_local_var]
64
+ local_var_hash = {}
65
+
66
+ @tp.binding.eval('local_variables').each do |v|
67
+ local_var_hash[v] = @tp.binding.local_variable_get v
68
+ end
69
+
70
+ @collect_data.merge!(local_var: local_var_hash)
71
+ end
72
+ end
73
+
74
+ def collect_instance_var_data
75
+ if @wrapper.conditions.result_config[:include_instance_var]
76
+ instance_var_hash = {}
77
+ @tp.self.instance_variables.each do |key|
78
+ instance_var_hash[key] = @tp.self.instance_variable_get(key)
79
+ end
80
+ @collect_data.merge!(instance_var: instance_var_hash)
81
+ end
82
+ end
83
+
84
+ def console_put
85
+ ret = []
86
+ ret << "#{@collect_data[:defined_class].inspect}##{@collect_data[:method_id]}"
87
+ left_values = @collect_data.reject { |k, v| %w[defined_class method_id].include? k.to_s }
88
+ unless left_values == {}
89
+ ret << left_values
90
+ end
91
+ ap ret
92
+ end
93
+
94
+ end # END TpResult
95
+
96
+ end
@@ -0,0 +1,3 @@
1
+ module SourceRoute
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,94 @@
1
+ module SourceRoute
2
+
3
+ class Wrapper
4
+ include Singleton
5
+
6
+ attr_accessor :conditions, :tp, :tp_attrs_results
7
+ attr_accessor :output_include_local_variables, :output_include_instance_variables
8
+
9
+ def initialize
10
+ reset
11
+ end
12
+
13
+ # output_format can be console, html
14
+ def reset
15
+ @tp.disable if @tp
16
+ @conditions = OpenStruct.new(event: :call, negative: {}, positive: {},
17
+ result_config: { output_format: 'none',
18
+ selected_attrs: nil,
19
+ include_local_var: false,
20
+ include_instance_var: false
21
+ })
22
+ @tp_attrs_results = []
23
+ self
24
+ end
25
+
26
+ # TODO: make event can be array
27
+ def event(v)
28
+ @conditions.event = v.to_sym unless v.nil?
29
+ end
30
+
31
+ def set_result_config(value)
32
+ unless value.is_a? Hash
33
+ conditions.result_config = value
34
+ end
35
+ end
36
+
37
+ def output_format(data = nil, &block)
38
+ conditions.result_config[:output_format] = if data.nil?
39
+ block
40
+ else
41
+ data
42
+ end
43
+ end
44
+
45
+ def selected_attrs(data)
46
+ conditions.result_config[:selected_attrs] = [data].flatten
47
+ end
48
+
49
+ def output_include_local_variables
50
+ conditions.result_config[:include_local_var] = true
51
+ end
52
+
53
+ def output_include_instance_variables
54
+ conditions.result_config[:include_instance_var] = true
55
+ end
56
+
57
+ TRACE_POINT_METHODS = [:defined_class, :method_id, :path, :lineno]
58
+
59
+ TRACE_POINT_METHODS.each do |m|
60
+ define_method m do |v|
61
+ @conditions.positive[m] = v
62
+ end
63
+
64
+ define_method "#{m}_not" do |v|
65
+ @conditions.negative[m] = v
66
+ end
67
+ end
68
+
69
+ def trace
70
+ # dont wanna init it in tp block, cause tp block could run thousands of time in one cycle trace
71
+ tp_result = TpResult.new(self)
72
+
73
+ track = TracePoint.new conditions.event do |tp|
74
+ negative_break = conditions.negative.any? do |method_key, value|
75
+ tp.send(method_key).nature_value =~ Regexp.new(value)
76
+ end
77
+ next if negative_break
78
+ positive_break = conditions.positive.any? do |method_key, value|
79
+ tp.send(method_key).nature_value !~ Regexp.new(value)
80
+ end
81
+ next if positive_break
82
+
83
+ ret_data = tp_result.build(tp)
84
+ tp_result.output
85
+ tp_attrs_results.push(ret_data)
86
+ end
87
+ track.enable
88
+ self.tp = track
89
+ track
90
+ end
91
+
92
+ end # Wrapper
93
+
94
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'source_route/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "source_route"
8
+ spec.version = SourceRoute::VERSION
9
+ spec.authors = ["raykin"]
10
+ spec.email = ["raykincoldxiao@gmail.com"]
11
+ spec.summary = %q{Wrapper of TracePoint.}
12
+ spec.description = %q{Wrapper of TracePoint.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'awesome_print'
22
+ spec.add_dependency 'colorize'
23
+ spec.add_development_dependency "bundler", "~> 1.6"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency 'slim'
26
+ end
data/test/fake_app.rb ADDED
@@ -0,0 +1,4 @@
1
+ class FakeApp
2
+ def fakeme
3
+ end
4
+ end
@@ -0,0 +1,20 @@
1
+ # Dont change it, it's used for stardard test
2
+ # When add more complex test, update FakeApp
3
+ class SampleApp
4
+
5
+ def initialize(cool=nil)
6
+ @cool = cool if cool
7
+ end
8
+
9
+ def nonsense
10
+ end
11
+
12
+ def nonsense_with_params(param1 = nil)
13
+ param2 = 5
14
+ end
15
+
16
+ # call it with SampleApp.new(:cool), then the instance var will be init before call it
17
+ def nonsense_with_instance_var
18
+ nonsense
19
+ end
20
+ end
@@ -0,0 +1,8 @@
1
+ require 'minitest/autorun'
2
+ require File.join(File.dirname(__FILE__), 'sample_app')
3
+ require File.join(File.dirname(__FILE__), 'fake_app')
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+
7
+ require 'source_route'
8
+ require 'byebug'
@@ -0,0 +1,129 @@
1
+ require 'test_helper'
2
+
3
+ module SourceRoute
4
+ class WrapperTest < Minitest::Test
5
+
6
+ def setup
7
+ @wrapper = Wrapper.instance
8
+ super
9
+ end
10
+
11
+ def teardown
12
+ SourceRoute.reset
13
+ super
14
+ end
15
+
16
+ def test_enable_return_true
17
+ @source_route = SourceRoute.enable /nnnonsense/
18
+ assert @source_route
19
+ assert_equal @wrapper, SourceRoute.wrapper
20
+ end
21
+
22
+ def test_catch_call_event_only
23
+ SourceRoute.enable do
24
+ event :call
25
+ method_id /nonsense/
26
+ output_format :test
27
+ end
28
+ SampleApp.new.nonsense
29
+
30
+ assert @wrapper.tp
31
+ end
32
+
33
+ def test_catch_class_name_by_first_parameter
34
+ skip
35
+ # not supported yet
36
+ @source_route = SourceRoute.enable 'sampleapp'
37
+ SampleApp.new.nonsense
38
+
39
+ assert @wrapper.tp_attrs_results.size > 0
40
+ end
41
+
42
+ def test_match_class_name_by_block_define
43
+ @source_route = SourceRoute.enable do
44
+ defined_class 'SampleApp'
45
+ end
46
+
47
+ SampleApp.new.nonsense
48
+ assert @wrapper.tp_attrs_results.size > 0
49
+ end
50
+
51
+ def test_source_route_with_only_one_parameter
52
+ @source_route = SourceRoute.enable 'nonsense'
53
+ SampleApp.new.nonsense
54
+
55
+ ret_value = @wrapper.tp_attrs_results.last
56
+ assert_equal SampleApp, ret_value[:defined_class]
57
+ end
58
+
59
+ def test_wrapper_reset
60
+ SourceRoute.enable 'nonsense'
61
+ SampleApp.new.nonsense
62
+ assert_equal 1, @wrapper.tp_attrs_results.size
63
+
64
+ SourceRoute.reset
65
+ SampleApp.new.nonsense
66
+
67
+ assert_equal 0, @wrapper.tp_attrs_results.size
68
+ end
69
+
70
+ def test_source_route_with_block
71
+ SourceRoute.trace method_id: 'nonsense', output_format: :html do
72
+ SampleApp.new.nonsense
73
+ end
74
+ assert_equal 1, @wrapper.tp_attrs_results.size
75
+ refute @wrapper.tp.enabled?
76
+ end
77
+
78
+ def test_trace_without_condition
79
+ SourceRoute.trace output_format: :html do
80
+ SampleApp.new.nonsense
81
+ end
82
+ assert @wrapper.tp_attrs_results.size > 0
83
+ refute @wrapper.tp.enabled?
84
+ end
85
+
86
+ def test_show_local_variables
87
+ @source_route = SourceRoute.enable 'nonsense_with_params' do
88
+ output_include_local_variables
89
+ end
90
+
91
+ SampleApp.new.nonsense_with_params(88)
92
+ assert_equal 1, @wrapper.tp_attrs_results.size
93
+
94
+ ret_value = @wrapper.tp_attrs_results.last
95
+
96
+ assert_equal 88, ret_value[:local_var][:param1]
97
+ end
98
+
99
+ def test_show_instance_vars
100
+ @source_route = SourceRoute.enable 'nonsense' do
101
+ output_include_instance_variables
102
+ end
103
+
104
+ SampleApp.new(:cool).nonsense_with_instance_var
105
+
106
+ assert_equal 2, @wrapper.tp_attrs_results.size
107
+ ret_value = @wrapper.tp_attrs_results.pop
108
+
109
+ assert_equal :cool, ret_value[:instance_var][:@cool]
110
+ end
111
+
112
+ # Nothing has tested really
113
+ def test_html_format_output
114
+ @source_route = SourceRoute.enable 'nonsense' do
115
+ output_include_instance_variables
116
+ end
117
+
118
+ SampleApp.new(:cool).nonsense_with_instance_var
119
+
120
+ if ENV['ignore_html_generation'] == 'true'
121
+ # do nothing. it was set in Rakefile, so rake test will not generate html file
122
+ else
123
+ SourceRoute.build_html_output
124
+ end
125
+ end
126
+
127
+ end
128
+
129
+ end
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: source_route
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - raykin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: colorize
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
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: slim
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'
83
+ description: Wrapper of TracePoint.
84
+ email:
85
+ - raykincoldxiao@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".hound.yml"
92
+ - Gemfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - lib/source_route.rb
97
+ - lib/source_route/formats/html.rb
98
+ - lib/source_route/formats/html_template.slim
99
+ - lib/source_route/nature_value.rb
100
+ - lib/source_route/tp_result.rb
101
+ - lib/source_route/version.rb
102
+ - lib/source_route/wrapper.rb
103
+ - source_route.gemspec
104
+ - test/fake_app.rb
105
+ - test/sample_app.rb
106
+ - test/test_helper.rb
107
+ - test/wrapper_test.rb
108
+ homepage: ''
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.2.2
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: Wrapper of TracePoint.
132
+ test_files:
133
+ - test/fake_app.rb
134
+ - test/sample_app.rb
135
+ - test/test_helper.rb
136
+ - test/wrapper_test.rb
137
+ has_rdoc: