hometown 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: 138e3de444e2c7c0364c252e37a411f6139257d3
4
+ data.tar.gz: 82ae1b18916e8845d8a625501194b7eeee20d95c
5
+ SHA512:
6
+ metadata.gz: 75a8cb0ac1dcbb0bfb720845fc8cbe9c6de45dc562651229a0b4a84a595af900bec66f7e045fa66c4ca221616202549f56639131c093af23f0849b5565eaa130
7
+ data.tar.gz: ae6b198008255b5a3a88bf5035368249f7eaa1b2c2c929b03c9dbd305b00bdf5a4461f801c4e1565950e565ef049f1771d1f3e24cfa0136e4e508d1f633b43a0
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/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard :minitest, :test_folders => ['test'], :all_after_pass => true do
2
+ watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
3
+ watch(%r{^lib/.*\.rb$}) { |m| "test/hometown_test.rb" }
4
+ watch(%r{^test/.+_test\.rb$})
5
+ end
6
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Jason R. Clark
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,76 @@
1
+ # Hometown
2
+
3
+ Track object creation to stamp out pesky leaks.
4
+
5
+ ## Requirements
6
+ Currently I'm testing against Ruby 2.1, but will be extending that in the future. I expect to allow back to 1.9.x, JRuby and Rubinius.
7
+
8
+ ## Installation
9
+
10
+ $ gem install hometown
11
+
12
+ ## Usage
13
+
14
+ Find where an object was created:
15
+
16
+ ```
17
+ # examples/example.rb
18
+ require 'hometown'
19
+
20
+ # Start watching Array instantiations
21
+ Hometown.watch(Array)
22
+
23
+ # Output the trace for a specific Array's creation
24
+ p Hometown.for(Array.new)
25
+
26
+
27
+ $ ruby examples/example.rb
28
+
29
+ #<Hometown::Trace:0x007fcd9c95ca10
30
+ @traced_class=Array,
31
+ @backtrace=["script:4:in `<main>'"]>
32
+ ```
33
+
34
+
35
+ Track disposal of an object:
36
+
37
+ ```
38
+ # dispose.rb
39
+ require 'hometown'
40
+
41
+ class Disposable
42
+ def dispose
43
+ # always be disposing
44
+ end
45
+ end
46
+
47
+ # Watch Disposable and track calls to dispose
48
+ Hometown.watch_for_disposal(Disposable, :dispose)
49
+
50
+ # Creating initial object
51
+ disposable = Disposable.new
52
+ puts "Still there!"
53
+ p Hometown.undisposed()
54
+
55
+ # All done!
56
+ disposable.dispose
57
+ puts "Properly disposed"
58
+ p Hometown.undisposed()
59
+
60
+
61
+ $ ruby examples/dispose.rb
62
+
63
+ Still there!
64
+ { #<Hometown::Trace:0x007f9aa516ec88 ...> => 1 }
65
+
66
+ Properly disposed!
67
+ { #<Hometown::Trace:0x007f9aa516ec88 ...> => 0 }
68
+ ```
69
+
70
+ ## Contributing
71
+
72
+ 1. Fork it ( https://github.com/[my-github-username]/hometown/fork )
73
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
74
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
75
+ 4. Push to the branch (`git push origin my-new-feature`)
76
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+
5
+ task :default => :test
6
+
7
+ Rake::TestTask.new do |test|
8
+ test.verbose = true
9
+ test.libs << "test"
10
+ test.libs << "lib"
11
+ test.test_files = FileList['test/**/*_test.rb']
12
+ end
13
+
@@ -0,0 +1,20 @@
1
+ require 'hometown'
2
+
3
+ class Disposable
4
+ def dispose
5
+ # always be disposing
6
+ end
7
+ end
8
+
9
+ # Watch Disposable and track calls to dispose
10
+ Hometown.watch_for_disposal(Disposable, :dispose)
11
+
12
+ # Creating initial object
13
+ disposable = Disposable.new
14
+ puts "Still there!"
15
+ p Hometown.undisposed()
16
+
17
+ # All done!
18
+ disposable.dispose
19
+ puts "Properly disposed"
20
+ p Hometown.undisposed()
@@ -0,0 +1,7 @@
1
+ require 'hometown'
2
+
3
+ # Start watching Array instantiations
4
+ Hometown.watch(Array)
5
+
6
+ # Output the trace for a specific Array's creation
7
+ p Hometown.for(Array.new)
data/hometown.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hometown/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hometown"
8
+ spec.version = Hometown::VERSION
9
+ spec.authors = ["Jason R. Clark"]
10
+ spec.email = ["jason@jasonrclark.com"]
11
+ spec.summary = %q{Track object creation}
12
+ spec.description = %q{Track object creation to stamp out pesky leaks.}
13
+ spec.homepage = "http://github.com/jasonrclark/hometown"
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_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake", "~> 10.2"
23
+ spec.add_development_dependency "minitest","~> 5.3"
24
+ spec.add_development_dependency "pry", "~> 0.9"
25
+ spec.add_development_dependency "pry-nav", "~> 0.2"
26
+ spec.add_development_dependency "guard", "~> 2.6"
27
+ spec.add_development_dependency "guard-minitest", "~> 1.3"
28
+ end
@@ -0,0 +1,17 @@
1
+ module Hometown
2
+ class Hooks
3
+ def initialize
4
+ @hooks = []
5
+ end
6
+
7
+ def <<(hook)
8
+ @hooks << hook
9
+ end
10
+
11
+ def run_on(instance)
12
+ @hooks.each do |hook|
13
+ hook.call(instance)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Hometown
2
+ class Trace
3
+ attr_reader :traced_class, :backtrace
4
+
5
+ def initialize(traced_class, backtrace)
6
+ @traced_class = traced_class
7
+ @backtrace = backtrace
8
+ end
9
+
10
+ def eql?(b)
11
+ @traced_class == b.traced_class &&
12
+ @backtrace == b.backtrace
13
+ end
14
+
15
+ def hash
16
+ [@traced_class, @backtrace].hash
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Hometown
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,25 @@
1
+ module Hometown
2
+ module Watch
3
+ def self.patch(clazz)
4
+ clazz.instance_eval do
5
+ @hooks = Hooks.new
6
+
7
+ class << self
8
+ def new_traced(*args, &blk)
9
+ trace = Hometown.create_trace(self, caller)
10
+
11
+ instance = new_original(*args, &blk)
12
+ instance.instance_variable_set(HOMETOWN_TRACE_ON_INSTANCE, trace)
13
+ instance.class.instance_variable_get(:@hooks).run_on(instance)
14
+
15
+ instance
16
+ end
17
+
18
+ alias_method :new_original, :new
19
+ alias_method :new, :new_traced
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module Hometown
2
+ module WatchForDisposal
3
+ def self.patch(clazz, disposal_method)
4
+ add_disposal_hooks(clazz)
5
+ patch_disposal_method(clazz, disposal_method)
6
+ end
7
+
8
+ def self.add_disposal_hooks(clazz)
9
+ hooks = clazz.instance_variable_get(:@hooks)
10
+ hooks << Proc.new do |instance|
11
+ Hometown.mark_for_disposal(instance)
12
+ end
13
+ end
14
+
15
+ def self.patch_disposal_method(clazz, disposal_method)
16
+ traced = "#{disposal_method}_traced"
17
+ original = "#{disposal_method}_original"
18
+
19
+ clazz.class_eval do
20
+ define_method(traced) do |*args, &blk|
21
+ Hometown.mark_disposed(self)
22
+ self.send(original, *args, &blk)
23
+ end
24
+
25
+ alias_method original, disposal_method
26
+ alias_method disposal_method, traced
27
+ end
28
+ end
29
+ end
30
+ end
data/lib/hometown.rb ADDED
@@ -0,0 +1,60 @@
1
+ require "hometown/hooks"
2
+ require "hometown/trace"
3
+ require "hometown/version"
4
+ require "hometown/watch"
5
+ require "hometown/watch_for_disposal"
6
+
7
+ module Hometown
8
+ HOMETOWN_TRACE_ON_INSTANCE = :@__hometown_creation_backtrace
9
+
10
+ @undisposed = {}
11
+ @watch_patches = {}
12
+ @dispose_patches = {}
13
+
14
+ def self.watch(clazz)
15
+ return if @watch_patches.include?(clazz)
16
+
17
+ @watch_patches[clazz] = true
18
+ Watch.patch(clazz)
19
+ end
20
+
21
+ def self.watch_for_disposal(clazz, disposal_method)
22
+ return if @dispose_patches.include?(clazz)
23
+
24
+ watch(clazz)
25
+
26
+ @dispose_patches[clazz] = true
27
+ WatchForDisposal.patch(clazz, disposal_method)
28
+ end
29
+
30
+ def self.already_patched?(clazz)
31
+ @patched.include?(clazz)
32
+ end
33
+
34
+ def self.for(instance)
35
+ instance.instance_variable_get(HOMETOWN_TRACE_ON_INSTANCE)
36
+ end
37
+
38
+ def self.undisposed()
39
+ @undisposed
40
+ end
41
+
42
+ def self.create_trace(clazz, backtrace)
43
+ Trace.new(clazz, backtrace)
44
+ end
45
+
46
+ def self.mark_for_disposal(instance)
47
+ trace = Hometown.for(instance)
48
+
49
+ @undisposed[trace] ||= 0
50
+ @undisposed[trace] += 1
51
+ end
52
+
53
+ def self.mark_disposed(instance)
54
+ trace = Hometown.for(instance)
55
+
56
+ if @undisposed[trace]
57
+ @undisposed[trace] -= 1
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,27 @@
1
+ require 'minitest/autorun'
2
+ require 'hometown/trace'
3
+
4
+ module Hometown
5
+ class TraceTest < Minitest::Test
6
+ def test_equality
7
+ trace1 = Trace.new(self.class, ["boo"])
8
+ trace2 = Trace.new(self.class, ["boo"])
9
+
10
+ assert trace1.eql?(trace2)
11
+ end
12
+
13
+ def test_inequality
14
+ trace1 = Trace.new(self.class, ["boo"])
15
+ trace2 = Trace.new(self.class, ["HOO"])
16
+
17
+ refute trace1.eql?(trace2)
18
+ end
19
+
20
+ def test_hash
21
+ trace1 = Trace.new(self.class, ["boo"])
22
+ trace2 = Trace.new(self.class, ["boo"])
23
+
24
+ assert_equal trace1.hash, trace2.hash
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,161 @@
1
+ require 'minitest/autorun'
2
+ require 'hometown'
3
+
4
+ class HometownTest < Minitest::Test
5
+ class Traced
6
+ end
7
+
8
+ class Untraced
9
+ end
10
+
11
+ class TracedWithBlock
12
+ def initialize(&blk)
13
+ blk.call
14
+ end
15
+ end
16
+
17
+ class Disposable
18
+ def dispose
19
+ end
20
+ end
21
+
22
+ class DisposableArguments
23
+ def dispose(a,b,c)
24
+ if block_given?
25
+ yield a, b, c
26
+ else
27
+ [a,b,c]
28
+ end
29
+ end
30
+ end
31
+
32
+ def teardown
33
+ Hometown.undisposed.clear
34
+ end
35
+
36
+ def test_untraced_class
37
+ traced_object = Untraced.new
38
+ assert_nil Hometown.for(traced_object)
39
+ end
40
+
41
+ def test_tracing_includes_classname
42
+ Hometown.watch(Traced)
43
+ traced_object = Traced.new
44
+
45
+ result = Hometown.for(traced_object)
46
+ assert_equal Traced, result.traced_class
47
+ end
48
+
49
+ def test_tracing_includes_this_file
50
+ Hometown.watch(Traced)
51
+ traced_object = Traced.new
52
+
53
+ result = Hometown.for(traced_object)
54
+ assert_includes result.backtrace.join("\n"), __FILE__
55
+ end
56
+
57
+ def test_initialize_with_block
58
+ Hometown.watch(TracedWithBlock)
59
+ traced_object = TracedWithBlock.new do
60
+ i = 1
61
+ end
62
+
63
+ result = Hometown.for(traced_object)
64
+ assert_equal TracedWithBlock, result.traced_class
65
+ end
66
+
67
+ def test_class_with_overridden_new
68
+ Hometown.watch(::Thread)
69
+ thread = Thread.new { sleep 1 }
70
+
71
+ result = Hometown.for(thread)
72
+ assert_equal ::Thread, result.traced_class
73
+ end
74
+
75
+ def test_doesnt_mark_for_disposal
76
+ Hometown.watch(TracedWithBlock)
77
+ traced_object = TracedWithBlock.new do
78
+ i = 1
79
+ end
80
+
81
+ result = Hometown.undisposed
82
+ trace = Hometown.for(traced_object)
83
+ assert_nil result[trace]
84
+ end
85
+
86
+ def test_marks_for_disposal
87
+ Hometown.watch_for_disposal(Disposable, :dispose)
88
+ dispose = Disposable.new
89
+
90
+ result = Hometown.undisposed
91
+ trace = Hometown.for(dispose)
92
+ assert_equal 1, result[trace]
93
+ end
94
+
95
+ def test_multiples_marked_for_disposal
96
+ Hometown.watch_for_disposal(Disposable, :dispose)
97
+ latest_disposed = nil
98
+ 2.times do
99
+ latest_disposed = Disposable.new
100
+ end
101
+
102
+ result = Hometown.undisposed
103
+ trace = Hometown.for(latest_disposed)
104
+ assert_equal 2, result[trace]
105
+ end
106
+
107
+ def test_actually_disposing
108
+ Hometown.watch_for_disposal(Disposable, :dispose)
109
+ dispose_me = Disposable.new
110
+
111
+ result = Hometown.undisposed
112
+ trace = Hometown.for(dispose_me)
113
+ assert_equal 1, result[trace]
114
+
115
+ dispose_me.dispose
116
+ assert_equal 0, result[trace]
117
+ end
118
+
119
+ def test_actually_disposing_with_arguments
120
+ Hometown.watch_for_disposal(DisposableArguments, :dispose)
121
+ dispose_me = DisposableArguments.new
122
+
123
+ result = Hometown.undisposed
124
+ trace = Hometown.for(dispose_me)
125
+ assert_equal 1, result[trace]
126
+
127
+ disposable = dispose_me.dispose(1,2,3)
128
+ assert_equal [1,2,3], disposable
129
+ assert_equal 0, result[trace]
130
+ end
131
+
132
+ def test_actually_disposing_with_arguments_and_block
133
+ Hometown.watch_for_disposal(DisposableArguments, :dispose)
134
+ dispose_me = DisposableArguments.new
135
+
136
+ result = Hometown.undisposed
137
+ trace = Hometown.for(dispose_me)
138
+ assert_equal 1, result[trace]
139
+
140
+ disposable = dispose_me.dispose(1,2,3) do |a, b, c|
141
+ a + b + c
142
+ end
143
+ assert_equal 6, disposable
144
+ assert_equal 0, result[trace]
145
+ end
146
+
147
+ def test_updating_watch_for_disposal
148
+ clazz = Class.new do
149
+ define_method(:dispose) do
150
+ end
151
+ end
152
+
153
+ Hometown.watch(clazz)
154
+ Hometown.watch_for_disposal(clazz, :dispose)
155
+ instance = clazz.new
156
+ trace = Hometown.for(instance)
157
+
158
+ result = Hometown.undisposed
159
+ assert_equal 1, result[trace]
160
+ end
161
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hometown
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jason R. Clark
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.2'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry-nav
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.3'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.3'
111
+ description: Track object creation to stamp out pesky leaks.
112
+ email:
113
+ - jason@jasonrclark.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - Gemfile
120
+ - Guardfile
121
+ - LICENSE.txt
122
+ - README.md
123
+ - Rakefile
124
+ - examples/dispose.rb
125
+ - examples/example.rb
126
+ - hometown.gemspec
127
+ - lib/hometown.rb
128
+ - lib/hometown/hooks.rb
129
+ - lib/hometown/trace.rb
130
+ - lib/hometown/version.rb
131
+ - lib/hometown/watch.rb
132
+ - lib/hometown/watch_for_disposal.rb
133
+ - test/hometown/trace_test.rb
134
+ - test/hometown_test.rb
135
+ homepage: http://github.com/jasonrclark/hometown
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.2.2
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: Track object creation
159
+ test_files:
160
+ - test/hometown/trace_test.rb
161
+ - test/hometown_test.rb
162
+ has_rdoc: