simple_profiler 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1685cfb1b589526acc923cfbc8c9806d368b32d1
4
+ data.tar.gz: 6959fcfd29813c058f5a5fc612c3874b2f5c51a2
5
+ SHA512:
6
+ metadata.gz: 03ed4d5171e8f7403d879b548274c397603105cb4bd7cdbbe81bbd0f096f46053ed9fef4ecb12a060f782915f07daacd3b6befdf70bdd3709feb582db370d20c
7
+ data.tar.gz: 840a8fb61993ae559cb1d9a9be115bb57c36e7d990f015503f06904601c36fd075093d7620ee79cce8fcc457855272f408476ce7dd4829093d79466088676d69
data/.coveralls.yml ADDED
@@ -0,0 +1,2 @@
1
+ service_name: travis-ci
2
+ repo_token: MvID3lGDWmo8LqUQbdx0tL3ggoNqvMYD0
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ simple_profiler
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby 2.0
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0
5
+ - 2.1
6
+ - 2.2
7
+ - 2.3.0
8
+ - jruby
9
+ before_install:
10
+ - gem install bundler
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in simple_profiler.gemspec
4
+ gemspec
5
+
6
+ gem 'coveralls', require: false
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # SimpleProfiler
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/simple_profiler.png)](https://rubygems.org/gems/simple_profiler)
4
+ [![Build Status](https://travis-ci.org/gabynaiman/simple_profiler.png?branch=master)](https://travis-ci.org/gabynaiman/simple_profiler)
5
+ [![Coverage Status](https://coveralls.io/repos/gabynaiman/simple_profiler/badge.png?branch=master)](https://coveralls.io/r/gabynaiman/simple_profiler?branch=master)
6
+ [![Code Climate](https://codeclimate.com/github/gabynaiman/simple_profiler.png)](https://codeclimate.com/github/gabynaiman/simple_profiler)
7
+ [![Dependency Status](https://gemnasium.com/gabynaiman/simple_profiler.png)](https://gemnasium.com/gabynaiman/simple_profiler)
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'simple_profiler'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install simple_profiler
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ class MyClass
29
+ def execute
30
+ ...
31
+ end
32
+
33
+ def self.execute!
34
+ ...
35
+ end
36
+ end
37
+ ```
38
+
39
+ **Configuration**
40
+ ```ruby
41
+ SimpleProfiler.profile_class_methods MyClass, :execute!
42
+ SimpleProfiler.profile_instance_methods MyClass, :execute
43
+
44
+ summary_reporter = SimpleProfiler::Reporters::Summary.new
45
+ logger_reporter = SimpleProfiler::Reporters::Logger.new Logger.new('profile.log')
46
+
47
+ SimpleProfiler.configure do |config|
48
+ config.reporters = [summary_reporter, logger_reporter]
49
+ end
50
+ ```
51
+
52
+ **Summary**
53
+ ```ruby
54
+ ranking = summary_reporter.summary.ranking
55
+
56
+ ranking[0][:klass] # => 'MyClass'
57
+ ranking[0][:method] # => :execute
58
+ ranking[0][:hits] # => hits count
59
+ ```
60
+
61
+ **Logger**
62
+ ```
63
+ # Logfile created on 2016-05-31 15:12:30 -0300 by profile.rb/41954
64
+ D, [2016-05-31T15:12:30.302556 #7582] DEBUG -- : MyClass.execute! -> 0.0 sec. - 0.0MB - (Total Memory: 36.80078125MB)
65
+ D, [2016-05-31T15:12:30.302642 #7582] DEBUG -- : MyClass.execute! -> 0.0 sec. - 0.0MB - (Total Memory: 36.80078125MB)
66
+ D, [2016-05-31T15:12:30.302694 #7582] DEBUG -- : MyClass.execute! -> 0.0 sec. - 0.0MB - (Total Memory: 36.80078125MB)
67
+ ```
68
+
69
+ ## Development
70
+
71
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
72
+
73
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
74
+
75
+ ## Contributing
76
+
77
+ Bug reports and pull requests are welcome on GitHub at https://github.com/gabynaiman/simple_profiler.
78
+
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:spec) do |t|
5
+ t.libs << 'spec'
6
+ t.pattern = 'spec/**/*_spec.rb'
7
+ t.verbose = false
8
+ t.warning = false
9
+ end
10
+
11
+ desc 'Console'
12
+ task :console do
13
+ require 'pry'
14
+ require 'simple_profiler'
15
+ ARGV.clear
16
+ Pry.start
17
+ end
18
+
19
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "simple_profiler"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,17 @@
1
+ module SimpleProfiler
2
+ class Event < Struct.new(:klass, :target, :method, :args, :started_at, :finalized_at, :memory_at_beginning, :memory_at_end)
3
+
4
+ def total_time
5
+ finalized_at - started_at
6
+ end
7
+
8
+ def used_memory
9
+ memory_at_end - memory_at_beginning
10
+ end
11
+
12
+ def to_s
13
+ separator = target == :class ? '.' : '#'
14
+ "#{klass}#{separator}#{method} -> #{total_time.round(4)} sec. - #{used_memory}MB - (Total Memory: #{memory_at_end}MB)"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ module SimpleProfiler
2
+ module Reporters
3
+ class Logger
4
+
5
+ def initialize(logger, options={})
6
+ @options = options
7
+ @logger = logger
8
+ end
9
+
10
+ def notify(event)
11
+ logger.debug event.to_s if login?(event)
12
+ end
13
+
14
+ private
15
+
16
+ attr_reader :logger
17
+ attr_reader :options
18
+
19
+ def login?(event)
20
+ event.total_time >= options.fetch(:min_time, 0) ||
21
+ event.used_memory >= options.fetch(:min_memory, 0)
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,50 @@
1
+ module SimpleProfiler
2
+ module Reporters
3
+ class Summary
4
+
5
+ attr_reader :events
6
+
7
+ def initialize
8
+ @events = []
9
+ end
10
+
11
+ def notify(event)
12
+ @events << event
13
+ end
14
+
15
+ def ranking(options={})
16
+ order = options.fetch(:sort_by, :total_time)
17
+
18
+ events_by_method = events.group_by {|e| {klass: e.klass.to_s, method: e.method, target: e.target}}
19
+ ranking = events_by_method.map do |key, values|
20
+ key.merge statistics_for(values)
21
+ end
22
+
23
+ ranking.sort_by {|e| e[order]}.reverse
24
+ end
25
+
26
+ private
27
+
28
+ def statistics_for(events)
29
+ count = 0
30
+ total_time = 0
31
+ total_memory = 0
32
+
33
+ events.each do |e|
34
+ count += 1
35
+ total_time += e.total_time
36
+ total_memory += e.used_memory
37
+ end
38
+
39
+ {
40
+ hits: count,
41
+ total_time: total_time,
42
+ avg_time: count == 0 ? 0 : total_time / count,
43
+ total_memory: total_memory,
44
+ avg_memory: count == 0 ? 0 : total_memory / count
45
+ }
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,3 @@
1
+ module SimpleProfiler
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,65 @@
1
+ require 'datacenter'
2
+ require 'class_config'
3
+
4
+ require_relative 'simple_profiler/version'
5
+ require_relative 'simple_profiler/event'
6
+ require_relative 'simple_profiler/reporters/logger'
7
+ require_relative 'simple_profiler/reporters/summary'
8
+
9
+ Datacenter.logger.level = Logger::ERROR
10
+
11
+ module SimpleProfiler
12
+
13
+ extend ClassConfig
14
+ attr_config :reporters, [SimpleProfiler::Reporters::Logger.new(Logger.new(STDOUT))]
15
+
16
+ class << self
17
+
18
+ def profile_instance_methods(klass, *methods)
19
+ methods.each do |method|
20
+ new_method = "__#{method}_profiled__"
21
+ klass.send :alias_method, new_method, method
22
+ klass.send(:define_method, method) do |*args, &block|
23
+ SimpleProfiler.track klass, :instance, method, args do
24
+ send new_method, *args, &block
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ def profile_class_methods(klass, *methods)
31
+ methods.each do |method|
32
+ new_method = "__#{method}_profiled__"
33
+ klass.singleton_class.send :alias_method, new_method, method
34
+ klass.send(:define_singleton_method, method) do |*args, &block|
35
+ SimpleProfiler.track klass, :class, method, args do
36
+ send new_method, *args, &block
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ def track(klass, target, method, args)
43
+ started_at = Time.now
44
+ memory = process.memory
45
+
46
+ result = yield
47
+
48
+ notify Event.new(klass, target, method, args, started_at, Time.now, memory, process.memory)
49
+ result
50
+ end
51
+
52
+ private
53
+
54
+ def notify(event)
55
+ reporters.each do |report|
56
+ report.notify event
57
+ end
58
+ end
59
+
60
+ def process
61
+ @process ||= Datacenter::Process.new Process.pid
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'simple_profiler/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "simple_profiler"
8
+ spec.version = SimpleProfiler::VERSION
9
+ spec.authors = ['Gabriel Naiman']
10
+ spec.email = ['gabynaiman@gmail.com']
11
+ spec.summary = 'Simple Profiler'
12
+ spec.description = 'Simple Profiler'
13
+ spec.homepage = 'https://github.com/gabynaiman/simple_profiler'
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 'datacenter', '~> 0.3'
22
+ spec.add_dependency 'class_config', '~> 0.0'
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.10"
25
+ spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "minitest", '~> 4.7'
27
+ spec.add_development_dependency 'turn', '~> 0.9'
28
+ spec.add_development_dependency 'pry-nav'
29
+ spec.add_development_dependency 'simplecov'
30
+ end
@@ -0,0 +1,8 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+ SimpleCov.start
@@ -0,0 +1,24 @@
1
+ require 'coverage_helper'
2
+ require 'simple_profiler'
3
+ require 'minitest/autorun'
4
+ require 'turn'
5
+ require 'pry-nav'
6
+
7
+ Turn.config do |c|
8
+ c.format = :pretty
9
+ c.natural = true
10
+ c.ansi = true
11
+ end
12
+
13
+ class Minitest::Spec
14
+
15
+ let(:temp_path) {File.expand_path "./tmp", File.dirname(__FILE__)}
16
+
17
+ before do
18
+ FileUtils.mkpath temp_path
19
+ end
20
+
21
+ after do
22
+ FileUtils.rm_rf temp_path
23
+ end
24
+ end
@@ -0,0 +1,85 @@
1
+ require 'minitest_helper'
2
+
3
+ describe SimpleProfiler do
4
+
5
+ class TestRunner
6
+ def self.run
7
+ 'profile_class_methods OK'
8
+ end
9
+ def run
10
+ 'profile_instance_methods OK'
11
+ end
12
+ end
13
+
14
+ class TestReporter
15
+ def initialize(filename)
16
+ @filename = filename
17
+ end
18
+ def notify(event)
19
+ File.write @filename, "#{event.klass}-#{event.method}"
20
+ end
21
+ end
22
+
23
+ SimpleProfiler.profile_class_methods TestRunner, :run
24
+ SimpleProfiler.profile_instance_methods TestRunner, :run
25
+
26
+ it 'Profile class methods' do
27
+ filename = File.join temp_path, "file_#{(Time.now.to_f * 1000).to_i}.txt"
28
+
29
+ SimpleProfiler.configure do |config|
30
+ config.reporters = [TestReporter.new(filename)]
31
+ end
32
+
33
+ TestRunner.run.must_equal 'profile_class_methods OK'
34
+ File.exist?(filename).must_equal true
35
+ File.read(filename).must_equal "TestRunner-run"
36
+ end
37
+
38
+ it 'Profile instance methods' do
39
+ filename = File.join temp_path, "file_#{(Time.now.to_f * 1000).to_i}.txt"
40
+
41
+ SimpleProfiler.configure do |config|
42
+ config.reporters = [TestReporter.new(filename)]
43
+ end
44
+
45
+ TestRunner.new.run.must_equal 'profile_instance_methods OK'
46
+ File.exist?(filename).must_equal true
47
+ File.read(filename).must_equal "TestRunner-run"
48
+ end
49
+
50
+ it 'Profile with logger' do
51
+ filename = File.join temp_path, "file_#{(Time.now.to_f * 1000).to_i}.log"
52
+ logger = ::Logger.new filename
53
+
54
+ SimpleProfiler.configure do |config|
55
+ config.reporters = [SimpleProfiler::Reporters::Logger.new(logger)]
56
+ end
57
+
58
+ 3.times do
59
+ TestRunner.run.must_equal 'profile_class_methods OK'
60
+ end
61
+
62
+ File.exist?(filename).must_equal true
63
+ file = File.read(filename)
64
+ file.lines.count.must_equal 4
65
+ end
66
+
67
+ it 'Profile with summary' do
68
+ SimpleProfiler.configure do |config|
69
+ config.reporters = [SimpleProfiler::Reporters::Summary.new]
70
+ end
71
+
72
+ 3.times do
73
+ TestRunner.run.must_equal 'profile_class_methods OK'
74
+ end
75
+
76
+ summary = SimpleProfiler.reporters.first
77
+ ranking = summary.ranking
78
+
79
+ ranking.count.must_equal 1
80
+ ranking[0][:klass].must_equal 'TestRunner'
81
+ ranking[0][:method].must_equal :run
82
+ ranking[0][:hits].must_equal 3
83
+ end
84
+
85
+ end
@@ -0,0 +1,40 @@
1
+ require 'minitest_helper'
2
+
3
+ describe 'Summary' do
4
+
5
+ let(:events) do
6
+ [
7
+ SimpleProfiler::Event.new(Struct, :class, :run, [], Time.now, Time.now+1, 5, 10),
8
+ SimpleProfiler::Event.new(Struct, :class, :run, [], Time.now, Time.now+1, 10, 15),
9
+ SimpleProfiler::Event.new(Struct, :instance, :run, [], Time.now, Time.now+1, 15, 16)
10
+ ]
11
+ end
12
+
13
+ it 'Accumulate events' do
14
+ summary = SimpleProfiler::Reporters::Summary.new
15
+ events.each do |event|
16
+ summary.notify event
17
+ end
18
+
19
+ summary.events.must_equal events
20
+ end
21
+
22
+ it 'Ranking' do
23
+ summary = SimpleProfiler::Reporters::Summary.new
24
+ events.each do |event|
25
+ summary.notify event
26
+ end
27
+ ranking = summary.ranking(sort_by: :hits)
28
+
29
+ ranking.count.must_equal 2
30
+ ranking[0][:klass].must_equal 'Struct'
31
+ ranking[0][:target].must_equal :class
32
+ ranking[0][:method].must_equal :run
33
+ ranking[0][:hits].must_equal 2
34
+ ranking[1][:klass].must_equal 'Struct'
35
+ ranking[1][:target].must_equal :instance
36
+ ranking[1][:method].must_equal :run
37
+ ranking[1][:hits].must_equal 1
38
+ end
39
+
40
+ end
metadata ADDED
@@ -0,0 +1,182 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple_profiler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gabriel Naiman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: datacenter
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '0.3'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '0.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: class_config
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '0.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.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.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '4.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '4.7'
83
+ - !ruby/object:Gem::Dependency
84
+ name: turn
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '0.9'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '0.9'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-nav
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Simple Profiler
126
+ email:
127
+ - gabynaiman@gmail.com
128
+ executables:
129
+ - console
130
+ - setup
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .coveralls.yml
135
+ - .gitignore
136
+ - .ruby-gemset
137
+ - .ruby-version
138
+ - .travis.yml
139
+ - Gemfile
140
+ - README.md
141
+ - Rakefile
142
+ - bin/console
143
+ - bin/setup
144
+ - lib/simple_profiler.rb
145
+ - lib/simple_profiler/event.rb
146
+ - lib/simple_profiler/reporters/logger.rb
147
+ - lib/simple_profiler/reporters/summary.rb
148
+ - lib/simple_profiler/version.rb
149
+ - simple_profiler.gemspec
150
+ - spec/coverage_helper.rb
151
+ - spec/minitest_helper.rb
152
+ - spec/simple_profiler_spec.rb
153
+ - spec/summary_spec.rb
154
+ homepage: https://github.com/gabynaiman/simple_profiler
155
+ licenses:
156
+ - MIT
157
+ metadata: {}
158
+ post_install_message:
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project:
174
+ rubygems_version: 2.4.8
175
+ signing_key:
176
+ specification_version: 4
177
+ summary: Simple Profiler
178
+ test_files:
179
+ - spec/coverage_helper.rb
180
+ - spec/minitest_helper.rb
181
+ - spec/simple_profiler_spec.rb
182
+ - spec/summary_spec.rb