heckle 1.0.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.
data/History.txt ADDED
@@ -0,0 +1,5 @@
1
+ == 1.0.0 / 2006-10-22
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
5
+
data/Manifest.txt ADDED
@@ -0,0 +1,8 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/heckle
6
+ lib/heckle.rb
7
+ test/test_heckle.rb
8
+
data/README.txt ADDED
@@ -0,0 +1,49 @@
1
+ heckle
2
+ by Ryan Davis
3
+ http://www.rubyforge.org/projects/seattlerb
4
+
5
+ == DESCRIPTION:
6
+
7
+ Unit Testing Sadism. More description coming soon. I'm punting to get
8
+ this launched ASAP.
9
+
10
+ == FEATURES/PROBLEMS:
11
+
12
+ * needs some love. haha.
13
+
14
+ == SYNOPSYS:
15
+
16
+ FIX
17
+
18
+ == REQUIREMENTS:
19
+
20
+ + FIX
21
+
22
+ == INSTALL:
23
+
24
+ + sudo gem install heckle
25
+
26
+ == LICENSE:
27
+
28
+ (The MIT License)
29
+
30
+ Copyright (c) 2006 FIX
31
+
32
+ Permission is hereby granted, free of charge, to any person obtaining
33
+ a copy of this software and associated documentation files (the
34
+ 'Software'), to deal in the Software without restriction, including
35
+ without limitation the rights to use, copy, modify, merge, publish,
36
+ distribute, sublicense, and/or sell copies of the Software, and to
37
+ permit persons to whom the Software is furnished to do so, subject to
38
+ the following conditions:
39
+
40
+ The above copyright notice and this permission notice shall be
41
+ included in all copies or substantial portions of the Software.
42
+
43
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
44
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
45
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
46
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
47
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
48
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
49
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/heckle.rb'
6
+
7
+ Hoe.new('heckle', Heckle::VERSION) do |p|
8
+ p.rubyforge_name = 'seattlerb'
9
+ p.summary = 'Unit Test Sadism'
10
+ p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
11
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
12
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
13
+ end
14
+
15
+ # vim: syntax=Ruby
data/bin/heckle ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/local/bin/ruby -w
2
+
3
+ $: << 'lib'
4
+ require 'heckle'
5
+
6
+ file = ARGV.shift
7
+ impl = ARGV.shift
8
+ meth = ARGV.shift
9
+
10
+ unless file and impl and meth then
11
+ abort "usage: #{File.basename($0)} file.rb impl_class_name impl_method_name"
12
+ end
13
+
14
+ heckle = Heckle.new(file, impl, meth)
15
+ heckle.validate
data/lib/heckle.rb ADDED
@@ -0,0 +1,89 @@
1
+ require 'rubygems'
2
+ require 'parse_tree'
3
+ require 'ruby2ruby'
4
+ require 'test/unit/autorunner'
5
+
6
+ class String
7
+ def to_class
8
+ split(/::/).inject(Object) { |klass, name| klass.const_get(name) }
9
+ end
10
+ end
11
+
12
+ class Heckle < SexpProcessor
13
+ VERSION = '1.0.0'
14
+
15
+ attr_accessor :file, :klass_name, :method_name, :klass, :method
16
+ def initialize(file=nil, klass_name=nil, method_name=nil)
17
+ super()
18
+
19
+ @file, @klass_name, @method_name = file, klass_name, method_name.intern
20
+ @klass = @method = nil
21
+
22
+ self.strict = false
23
+ self.auto_shift_type = true
24
+ self.expected = Array
25
+ end
26
+
27
+ def validate
28
+ puts "Validating #{file}"
29
+
30
+ load file
31
+ if Test::Unit::AutoRunner.run then
32
+ puts "Tests passed -- heckling"
33
+
34
+ process(ParseTree.translate(klass_name.to_class, method_name))
35
+
36
+ if Test::Unit::AutoRunner.run then
37
+ puts
38
+ abort "*** Tests passed again after heckling, your tests are incomplete"
39
+ else
40
+ puts "Tests failed -- this is good"
41
+ end
42
+ else
43
+ puts "Tests failed... fix and run heckle again"
44
+ end
45
+ end
46
+
47
+ ############################################################
48
+
49
+ def process_defn(exp)
50
+ self.method = exp.shift
51
+ result = [:defn, method]
52
+
53
+ result << process(exp.shift) until exp.empty?
54
+
55
+ heckle(result) if should_heckle?
56
+
57
+ return result
58
+ end
59
+
60
+ def process_if(exp)
61
+ cond = process(exp.shift)
62
+ t = process(exp.shift)
63
+ f = process(exp.shift)
64
+
65
+ if should_heckle? then
66
+ [:if, cond, f, t]
67
+ else
68
+ [:if, cond, t, f]
69
+ end
70
+ end
71
+
72
+ def should_heckle?
73
+ method == method_name
74
+ end
75
+
76
+ def heckle(exp)
77
+ puts "Heckling #{klass_name}##{method_name}"
78
+
79
+ r2r = RubyToRuby.new
80
+ src = r2r.process(exp)
81
+
82
+ puts
83
+ puts "Replacing #{klass}##{method_name} with:"
84
+ puts src
85
+ puts
86
+
87
+ klass_name.to_class.class_eval(src)
88
+ end
89
+ end
@@ -0,0 +1,33 @@
1
+
2
+ require 'test/unit/testcase'
3
+ require 'test/unit' if $0 == __FILE__
4
+
5
+ class TestHeckle < Test::Unit::TestCase
6
+
7
+ ############################################################
8
+ # Our method under test - in here just for demo...
9
+
10
+ def many? n
11
+ if n >= 3 then
12
+ true
13
+ else
14
+ false
15
+ end
16
+ end
17
+
18
+ ############################################################
19
+
20
+ if false then
21
+ def test_many_eh_good
22
+ assert ! many?(0)
23
+ assert ! many?(1)
24
+ assert many?(3)
25
+ end
26
+ else
27
+ def test_many_eh_bad
28
+ # obviously bad - need a better example for my demo
29
+ end
30
+ end
31
+ end
32
+
33
+ puts 'loaded'
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: heckle
5
+ version: !ruby/object:Gem::Version
6
+ version: 1.0.0
7
+ date: 2006-10-22 00:00:00 -06:00
8
+ summary: Unit Test Sadism
9
+ require_paths:
10
+ - lib
11
+ - test
12
+ email: ryand-ruby@zenspider.com
13
+ homepage: " by Ryan Davis"
14
+ rubyforge_project: seattlerb
15
+ description: "== FEATURES/PROBLEMS: * needs some love. haha. == SYNOPSYS: FIX == REQUIREMENTS:"
16
+ autorequire:
17
+ default_executable:
18
+ bindir: bin
19
+ has_rdoc: true
20
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
21
+ requirements:
22
+ - - ">"
23
+ - !ruby/object:Gem::Version
24
+ version: 0.0.0
25
+ version:
26
+ platform: ruby
27
+ signing_key:
28
+ cert_chain:
29
+ post_install_message:
30
+ authors:
31
+ - Ryan Davis
32
+ files:
33
+ - History.txt
34
+ - Manifest.txt
35
+ - README.txt
36
+ - Rakefile
37
+ - bin/heckle
38
+ - lib/heckle.rb
39
+ - test/test_heckle.rb
40
+ test_files: []
41
+
42
+ rdoc_options: []
43
+
44
+ extra_rdoc_files: []
45
+
46
+ executables:
47
+ - heckle
48
+ extensions: []
49
+
50
+ requirements: []
51
+
52
+ dependencies:
53
+ - !ruby/object:Gem::Dependency
54
+ name: hoe
55
+ version_requirement:
56
+ version_requirements: !ruby/object:Gem::Version::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.1.2
61
+ version: