squeal 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.textile ADDED
@@ -0,0 +1,69 @@
1
+ h1. Squeal
2
+
3
+ A simple object instantiation counter.
4
+
5
+ Inspired by oink (http://github.com/noahd1/oink).
6
+ I needed a non-rails one for my search engine project Picky (http://github.com/floere/picky), but oink did not fit well.
7
+
8
+ Note: It reports cumulatively until @Squeal.reset@ is called.
9
+
10
+ Only works on certain Ruby classes yet (not String, for example).
11
+
12
+ h1. Examples
13
+
14
+ h2. Installation
15
+
16
+ gem install squeal
17
+
18
+ h2. On a single class.
19
+
20
+ require 'squeal'
21
+  
22
+ TestClass.squeal do
23
+ TestClass.new
24
+ TestClass.new
25
+ Object.new
26
+ String.new
27
+ end
28
+ TestClass.new
29
+  
30
+ Squeal.report # => 'TestClass: 2'
31
+
32
+ h2. On multiple classes
33
+
34
+ require 'squeal'
35
+  
36
+  # Aliased as Squeal.record
37
+ #
38
+ Squeal.squeal(Object, TestClass) do
39
+ TestClass.new
40
+ String.new
41
+ Object.new
42
+ TestClass.new
43
+ String.new
44
+ end
45
+ Object.new
46
+ TestClass.new
47
+  
48
+ Squeal.report # => 'Object: 1, TestClass: 2'
49
+
50
+ h2. Without a block
51
+
52
+ require 'squeal'
53
+  
54
+  # Aliased as Squeal.squeal
55
+ #
56
+ Squeal.record Object, TestClass
57
+
58
+ TestClass.new
59
+ String.new
60
+ Object.new
61
+ TestClass.new
62
+ String.new
63
+
64
+ Squeal.stop
65
+
66
+ Object.new
67
+ TestClass.new
68
+  
69
+ Squeal.report # => 'Object: 1, TestClass: 2'
@@ -0,0 +1,15 @@
1
+ class Class
2
+
3
+ # Record this or the given classes.
4
+ #
5
+ def squeal &block
6
+ Squeal.record self, &block
7
+ end
8
+
9
+ # Increments this class' instantiation counter by one.
10
+ #
11
+ def squeal_increment
12
+ Squeal.increment self
13
+ end
14
+
15
+ end
data/lib/squeal.rb ADDED
@@ -0,0 +1,2 @@
1
+ require File.expand_path "../extensions/class", __FILE__
2
+ require File.expand_path "../squeal/squeal", __FILE__
@@ -0,0 +1,78 @@
1
+ class Squeal
2
+
3
+ module InitializeWrapper
4
+
5
+ alias_method :initialize_before_squeal, :initialize
6
+
7
+ def initialize *args, &block
8
+ instance = initialize_before_squeal *args, &block
9
+ self.class.squeal_increment
10
+ instance
11
+ end
12
+
13
+ end
14
+
15
+ class << self
16
+
17
+ # Increment the counter for the given class.
18
+ #
19
+ def increment klass
20
+ return unless @recording && @counters[klass]
21
+ @counters[klass] += 1
22
+ end
23
+
24
+ # Install and reset for the given class.
25
+ #
26
+ def reset_for klass
27
+ install_on klass
28
+ @counters ||= {}
29
+ @counters[klass] ||= 0
30
+ self
31
+ end
32
+
33
+ # Installs squeal on the given class if it isn't yet installed.
34
+ #
35
+ def install_on klass
36
+ klass.send :include, InitializeWrapper unless klass.include?(InitializeWrapper)
37
+ end
38
+
39
+ # Record the given classes for the duration of the block.
40
+ #
41
+ def record *klasses
42
+ @recording = true
43
+ klasses.each { |klass| reset_for klass }
44
+ if block_given?
45
+ yield
46
+ stop
47
+ end
48
+ self
49
+ end
50
+ alias squeal record
51
+
52
+ # Stop recording.
53
+ #
54
+ def stop
55
+ @recording = false
56
+ end
57
+
58
+ # Returns a string with the current instantiation count.
59
+ #
60
+ # Example:
61
+ # * SomeClass: 2, SomeOtherClass: 10
62
+ #
63
+ def report
64
+ result = []
65
+ @counters.each_pair do |klass, number|
66
+ result << "#{klass}: #{number}"
67
+ end
68
+ result.sort.join(', ')
69
+ end
70
+
71
+ # Resets the counters.
72
+ #
73
+ def reset
74
+ @counters = {}
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ describe Squeal do
4
+ before(:each) do
5
+ Object.send :remove_const, :TestClass if Object.const_defined?(:TestClass)
6
+ TestClass = Class.new
7
+ end
8
+ after(:each) do
9
+ Squeal.reset
10
+ end
11
+ it 'allows a proxy object' do
12
+ lambda { TestClass.squeal }.should_not raise_error
13
+ end
14
+ it 'records with a block' do
15
+ TestClass.squeal do
16
+ TestClass.new
17
+ TestClass.new
18
+ Object.new
19
+ String.new
20
+ end
21
+ TestClass.new
22
+
23
+ Squeal.report.should == 'TestClass: 2'
24
+ end
25
+ it 'records all mentioned classes with a block' do
26
+ Squeal.squeal(Object, TestClass) do
27
+ TestClass.new
28
+ String.new
29
+ Object.new
30
+ TestClass.new
31
+ String.new
32
+ end
33
+ Object.new
34
+ TestClass.new
35
+
36
+ Squeal.report.should == 'Object: 1, TestClass: 2'
37
+ end
38
+ it 'records the class it is used on with a block' do
39
+ TestClass.squeal do
40
+ TestClass.new
41
+ Hash.new
42
+ TestClass.new
43
+ Object.new
44
+ Hash.new
45
+ end
46
+ TestClass.new
47
+
48
+ Squeal.report.should == 'TestClass: 2'
49
+ end
50
+ it 'does not record if squeal.record has not been called' do
51
+ Hash.new
52
+ TestClass.new
53
+
54
+ Squeal.report.should == ''
55
+ end
56
+ it 'reports cumulatively until reset' do
57
+ Hash.new
58
+ TestClass.new
59
+
60
+ Squeal.report.should == ''
61
+
62
+ TestClass.squeal do
63
+ TestClass.new
64
+ Hash.new
65
+ TestClass.new
66
+ Object.new
67
+ Hash.new
68
+ end
69
+
70
+ Squeal.report.should == 'TestClass: 2'
71
+
72
+ Squeal.record(Object, TestClass) do
73
+ TestClass.new
74
+ String.new
75
+ Object.new
76
+ TestClass.new
77
+ String.new
78
+ end
79
+ Object.new
80
+ TestClass.new
81
+
82
+ Squeal.report.should == 'Object: 1, TestClass: 4'
83
+
84
+ Squeal.reset
85
+
86
+ Squeal.report.should == ''
87
+ end
88
+
89
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: squeal
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Florian Hanke
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-11-14 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Simple object instantiation recorder.
22
+ email: florian.hanke+squeal@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - README.textile
29
+ files:
30
+ - lib/extensions/class.rb
31
+ - lib/squeal/squeal.rb
32
+ - lib/squeal.rb
33
+ - README.textile
34
+ - spec/lib/squeal/squeal_spec.rb
35
+ has_rdoc: true
36
+ homepage: http://github.com/floere/squeal
37
+ licenses: []
38
+
39
+ post_install_message:
40
+ rdoc_options:
41
+ - --charset=UTF-8
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ segments:
50
+ - 0
51
+ version: "0"
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.3.7
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: Records object instantiations.
67
+ test_files:
68
+ - spec/lib/squeal/squeal_spec.rb