bobbyno-shubox 0.6 → 0.8
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 +10 -1
- data/Manifest.txt +5 -1
- data/README.rdoc +61 -24
- data/Rakefile +10 -5
- data/app_generators/java/USAGE +7 -7
- data/app_generators/java/java_generator.rb +4 -4
- data/app_generators/ruby/USAGE +7 -7
- data/app_generators/ruby/ruby_generator.rb +5 -2
- data/app_generators/ruby/templates/file.txt +1 -1
- data/app_generators/ruby/templates/rakefile.rb +1 -1
- data/app_generators/ruby/templates/right_triangle.rb +3 -3
- data/app_generators/ruby/templates/test_helper.rb +1 -1
- data/app_generators/ruby/templates/test_io.rb +2 -2
- data/app_generators/ruby/templates/test_right_triangle.rb +4 -4
- data/bin/shubox +9 -5
- data/cleaner_generators/test_unit_cleaner/USAGE +7 -0
- data/cleaner_generators/test_unit_cleaner/lib/test_unit_cleaner.rb +56 -0
- data/cleaner_generators/test_unit_cleaner/templates/clean_test_unit +12 -0
- data/cleaner_generators/test_unit_cleaner/test_unit_cleaner_generator.rb +26 -0
- data/lib/languages.rb +3 -5
- data/lib/shubox.rb +7 -2
- data/lib/shubox_app_generator.rb +4 -5
- data/test/test_generator_helper.rb +8 -0
- data/test/test_java_generator.rb +6 -7
- data/test/test_languages.rb +9 -5
- data/test/test_ruby_generator.rb +11 -2
- data/test/test_test_unit_cleaner.rb +71 -0
- metadata +13 -7
data/History.txt
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
|
+
== 0.8 2009-09-22
|
|
2
|
+
|
|
3
|
+
* 1 major enhancement:
|
|
4
|
+
* clean script now included in generated shubox to reset tests in ruby.
|
|
5
|
+
* Thanks to bendyworks for the original concept in his patch.
|
|
6
|
+
* cleaners organized as generators to simplify new cleaner creation.
|
|
7
|
+
* cleaners can operate on directories or individual files.
|
|
8
|
+
|
|
9
|
+
|
|
1
10
|
== 0.7 2009-08-26
|
|
2
11
|
|
|
3
12
|
* Project rename:
|
|
4
|
-
* tbox -> shubox: Shubox helps you move more quickly from Shu to Ha and Ri.
|
|
13
|
+
* tbox -> shubox: Shubox helps you move more quickly from Shu to Ha and Ri.
|
|
5
14
|
* Thanks to Alistair Cockburn @ Agile 2009 for this one.
|
|
6
15
|
|
|
7
16
|
|
data/Manifest.txt
CHANGED
|
@@ -23,15 +23,19 @@ app_generators/ruby/templates/test_helper.rb
|
|
|
23
23
|
app_generators/ruby/templates/test_io.rb
|
|
24
24
|
app_generators/ruby/templates/test_right_triangle.rb
|
|
25
25
|
bin/shubox
|
|
26
|
+
cleaner_generators/test_unit_cleaner/USAGE
|
|
27
|
+
cleaner_generators/test_unit_cleaner/lib/test_unit_cleaner.rb
|
|
28
|
+
cleaner_generators/test_unit_cleaner/templates/clean_test_unit
|
|
29
|
+
cleaner_generators/test_unit_cleaner/test_unit_cleaner_generator.rb
|
|
26
30
|
lib/languages.rb
|
|
27
31
|
lib/shubox.rb
|
|
28
32
|
lib/shubox_app_generator.rb
|
|
29
33
|
script/console
|
|
30
34
|
script/destroy
|
|
31
35
|
script/generate
|
|
32
|
-
tbox.gemspec
|
|
33
36
|
test/test_generator_helper.rb
|
|
34
37
|
test/test_helper.rb
|
|
35
38
|
test/test_java_generator.rb
|
|
36
39
|
test/test_languages.rb
|
|
37
40
|
test/test_ruby_generator.rb
|
|
41
|
+
test/test_test_unit_cleaner.rb
|
data/README.rdoc
CHANGED
|
@@ -3,14 +3,18 @@
|
|
|
3
3
|
http://github.com/bobbyno/shubox/tree/master
|
|
4
4
|
|
|
5
5
|
More on Test-Driven Learning: http://www.bobbynorton.com/?p=36
|
|
6
|
-
|
|
7
|
-
== DESCRIPTION:
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
shubox lowers the barrier to entry for test-driven learning by providing a basic infrastructure in which
|
|
11
|
-
to start coding: A directory structure, some classes and unit tests to get started, and a build script.
|
|
7
|
+
== DESCRIPTION
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
Test-driven learning is a way to master a programming language by writing unit tests around its API's.
|
|
10
|
+
shubox lowers the barrier to entry for test-driven learning by providing a basic infrastructure in which
|
|
11
|
+
to start coding: A directory structure, some classes and unit tests to get started, and a build script.
|
|
12
|
+
|
|
13
|
+
shubox currently creates environments for Ruby and Java, but can easily be extended to any language that
|
|
14
|
+
lends itself to unit testing. shubox is built on newgem, so extending the framework is as simple as creating
|
|
15
|
+
new generator scripts.
|
|
16
|
+
|
|
17
|
+
== INSTALL
|
|
14
18
|
|
|
15
19
|
The <code>shubox</code> application is distributed as a RubyGem and is available immediately after installation.
|
|
16
20
|
|
|
@@ -20,42 +24,75 @@ The <code>shubox</code> application is distributed as a RubyGem and is available
|
|
|
20
24
|
|
|
21
25
|
Alternately, download the gem and install manually from github.
|
|
22
26
|
|
|
23
|
-
==
|
|
27
|
+
== RUBY USAGE
|
|
24
28
|
|
|
25
|
-
|
|
26
|
-
to generate your test scaffolding.
|
|
29
|
+
Ruby is the default language option in shubox:
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
<code>$ shubox /tmp/learn_ruby</code>
|
|
29
32
|
|
|
30
|
-
<code>$ cd
|
|
31
|
-
|
|
32
|
-
<code>$ shubox learning_ruby</code>
|
|
33
|
+
<code>$ cd /tmp/learn_ruby</code>
|
|
33
34
|
|
|
34
35
|
<code>$ rake</code>
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
If all goes well, you should start off with some passing tests. Write new learning tests,
|
|
38
|
+
naming each method with the intent of the lesson. Write the code that makes a test pass.
|
|
39
|
+
|
|
40
|
+
Now run script/clean. Cleaners will reset test files by deleting the method bodies.
|
|
41
|
+
Can you complete the lesson from memory? If so, can you do so faster than before?
|
|
42
|
+
If not, you may need to study the concept more closely.
|
|
43
|
+
|
|
44
|
+
Repeat a test-driven lesson until you can easily rewrite it from scratch. Once you can do so,
|
|
45
|
+
you may move on to another lesson.
|
|
37
46
|
|
|
38
|
-
|
|
47
|
+
This is repetition with a retrieval step, which leads to long-term retention.
|
|
39
48
|
|
|
40
|
-
|
|
49
|
+
== JAVA USAGE
|
|
50
|
+
|
|
51
|
+
shubox supports Java:
|
|
52
|
+
|
|
53
|
+
<code>$ shubox -l=java /tmp/LearnJava</code>
|
|
54
|
+
|
|
55
|
+
<code>$ cd /tmp/LearnJava</code>
|
|
41
56
|
|
|
42
57
|
<code>$ ant -f build/build.xml</code>
|
|
43
58
|
|
|
44
59
|
The Java command will also generate a <project name>.ipr file to allow the project to easily be
|
|
45
|
-
opened in IntelliJ 8.
|
|
60
|
+
opened in IntelliJ 8.
|
|
46
61
|
|
|
47
|
-
|
|
62
|
+
shubox does not currently include a JUnit cleaner script. Patches welcome. ;-)
|
|
48
63
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
64
|
+
== APPLICATION ARCHITECTURE
|
|
65
|
+
|
|
66
|
+
shubox is organized as a set of generators, as in newgem and RubiGen.
|
|
52
67
|
|
|
53
|
-
|
|
68
|
+
app_generators are where we define the basic environment for one of our supported languages.
|
|
69
|
+
|
|
70
|
+
cleaner_generators hold the test framework cleaning implementations to reset tests.
|
|
71
|
+
In the future, these can be mixed and matched to support polyglots like JRuby by installing both
|
|
72
|
+
JUnit and Test::Unit cleaners.
|
|
73
|
+
|
|
74
|
+
cleaner/lib folders hold the implementations of the cleaners referenced in the clean_xxx files
|
|
75
|
+
copied to the generated application. This makes it easy to upgrade existing shuboxes.
|
|
76
|
+
|
|
77
|
+
== REQUIREMENTS
|
|
54
78
|
|
|
55
79
|
* newgem
|
|
56
80
|
|
|
57
|
-
==
|
|
81
|
+
== CONTRIBUTORS
|
|
82
|
+
|
|
83
|
+
Initial concept - Bobby Norton
|
|
84
|
+
|
|
85
|
+
bendyworks for {Test::Unit cleaner patch}[http://github.com/bendyworks/shubox]
|
|
86
|
+
|
|
87
|
+
== THANKS!
|
|
58
88
|
|
|
59
|
-
|
|
89
|
+
{DRW Trading Group}[http://www.drwtrading.com] for time and feedback
|
|
90
|
+
|
|
91
|
+
Test-Driven Learning Attendees at {SCNA 2009}[http://scna.softwarecraftsmanship.org/schedule#bobby_norton]
|
|
60
92
|
|
|
61
93
|
Dr. Nic Williams for newgem and rubigen: {RubyConf 2007 Presentation}[http://rubyconf2007.confreaks.com/d3t1p1_rubigen.html]
|
|
94
|
+
|
|
95
|
+
Jim Weirich and EdgeCase for {ruby_koans}[http://github.com/edgecase/ruby_koans]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
data/Rakefile
CHANGED
|
@@ -17,13 +17,13 @@ $hoe = Hoe.spec 'shubox' do |p|
|
|
|
17
17
|
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
|
18
18
|
p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
|
|
19
19
|
p.rubyforge_name = p.name # TODO this is default value
|
|
20
|
-
p.extra_deps = [
|
|
21
|
-
['newgem', ">= #{::Newgem::VERSION}"]
|
|
22
|
-
]
|
|
20
|
+
p.extra_deps = [['newgem', "= #{::Newgem::VERSION}"]]
|
|
23
21
|
p.clean_globs |= %w[**/.DS_Store tmp *.log]
|
|
24
22
|
path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
|
|
25
23
|
p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
|
|
26
24
|
p.rsync_args = '-av --delete --ignore-errors'
|
|
25
|
+
p.readme_file = 'README.rdoc'
|
|
26
|
+
p.extra_rdoc_files = ['README.rdoc']
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
require 'newgem/tasks' # load /tasks/*.rake
|
|
@@ -35,8 +35,8 @@ Dir['tasks/**/*.rake'].each { |t| load t }
|
|
|
35
35
|
desc "Create the gem and install it"
|
|
36
36
|
task :dev => [:clean, :manifest, :clean_manifest, :gemspec, :package, :install_gem]
|
|
37
37
|
|
|
38
|
-
desc "Strip out the entries in the .git folder for ppl who haven't updated .hoerc"
|
|
39
|
-
task :clean_manifest do
|
|
38
|
+
desc "Strip out the entries in the .git folder for ppl who haven't updated .hoerc"
|
|
39
|
+
task :clean_manifest do
|
|
40
40
|
manifest = IO.readlines("Manifest.txt")
|
|
41
41
|
clean = manifest.reject {|item| item =~ /.git/ }
|
|
42
42
|
File.open("Manifest.txt", mode_string="w" ) {|file| file.puts(clean)}
|
|
@@ -44,4 +44,9 @@ end
|
|
|
44
44
|
|
|
45
45
|
task :clean do
|
|
46
46
|
rm_f("shubox.gemspec")
|
|
47
|
+
rm_rf("pkg")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
task :uninstall do
|
|
51
|
+
sh "sudo gem uninstall shubox"
|
|
47
52
|
end
|
data/app_generators/java/USAGE
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Description:
|
|
2
2
|
|
|
3
|
-
shubox lowers the barrier to entry for test-driven learning by providing a basic infrastructure in which
|
|
3
|
+
shubox lowers the barrier to entry for test-driven learning by providing a basic infrastructure in which
|
|
4
4
|
to start coding: A directory structure, some classes and unit tests to get started, and a build script
|
|
5
|
-
to run all tests.
|
|
6
|
-
|
|
5
|
+
to run all tests.
|
|
6
|
+
|
|
7
7
|
Usage:
|
|
8
|
-
|
|
9
|
-
$ cd ~/your_projects
|
|
10
|
-
$ shubox --java LearnJava
|
|
11
|
-
$ ant -f build/build.xml
|
|
8
|
+
|
|
9
|
+
$ cd ~/your_projects
|
|
10
|
+
$ shubox --java LearnJava
|
|
11
|
+
$ ant -f build/build.xml
|
|
12
12
|
|
|
13
13
|
If you have IntelliJ, open the IPR file to get started with adding your learning tests. If you have
|
|
14
14
|
a different IDE, follow the instructions to import your application as existing source.
|
|
@@ -11,24 +11,24 @@ class JavaGenerator < ShuboxAppGenerator
|
|
|
11
11
|
# root
|
|
12
12
|
m.template("project.ipr", "#{@name}.ipr")
|
|
13
13
|
m.file("project.iml", "#{@name}.iml")
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
# build
|
|
16
16
|
m.template("build.xml", "build/build.xml")
|
|
17
17
|
|
|
18
18
|
# lib
|
|
19
19
|
m.file_copy_each %w(hamcrest-core.jar junit.jar), "lib"
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
# src
|
|
22
22
|
m.directory "src/com/samples"
|
|
23
23
|
m.file("Greeting.java", "src/com/samples/Greeting.java")
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
# test
|
|
26
26
|
m.directory "test/com/samples"
|
|
27
27
|
m.file("GreetingTest.java", "test/com/samples/GreetingTest.java")
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
protected
|
|
31
|
+
protected
|
|
32
32
|
# Installation skeleton.
|
|
33
33
|
BASEDIRS = %w(
|
|
34
34
|
build
|
data/app_generators/ruby/USAGE
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Description:
|
|
2
2
|
|
|
3
|
-
shubox lowers the barrier to entry for test-driven learning by providing a basic infrastructure in which
|
|
3
|
+
shubox lowers the barrier to entry for test-driven learning by providing a basic infrastructure in which
|
|
4
4
|
to start coding: A directory structure, some classes and unit tests to get started, and a Rakefile to run
|
|
5
|
-
all tests.
|
|
6
|
-
|
|
5
|
+
all tests.
|
|
6
|
+
|
|
7
7
|
Usage:
|
|
8
|
-
|
|
9
|
-
$ cd ~/ruby_projects
|
|
10
|
-
$ shubox learning_ruby
|
|
11
|
-
$ rake
|
|
8
|
+
|
|
9
|
+
$ cd ~/ruby_projects
|
|
10
|
+
$ shubox learning_ruby
|
|
11
|
+
$ rake
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
require 'shubox_app_generator'
|
|
2
|
+
require 'shubox'
|
|
2
3
|
|
|
3
4
|
class RubyGenerator < ShuboxAppGenerator
|
|
4
5
|
|
|
5
|
-
def manifest
|
|
6
|
+
def manifest
|
|
6
7
|
record do |m|
|
|
7
8
|
# Ensure appropriate folder(s) exists
|
|
8
9
|
m.directory ''
|
|
@@ -19,8 +20,10 @@ class RubyGenerator < ShuboxAppGenerator
|
|
|
19
20
|
m.file "file.txt", "test/data/file.txt"
|
|
20
21
|
m.file "test_helper.rb", "test/test_helper.rb"
|
|
21
22
|
|
|
22
|
-
m.dependency "install_rubigen_scripts", [destination_root,
|
|
23
|
+
m.dependency "install_rubigen_scripts", [destination_root, "rubygems", "cleaner"],
|
|
23
24
|
:shebang => options[:shebang], :collision => :force
|
|
25
|
+
|
|
26
|
+
m.dependency "test_unit_cleaner", [], :destination => destination_root, :collision => :force
|
|
24
27
|
end
|
|
25
28
|
end
|
|
26
29
|
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Encapsulates the geometry of a 3-sided polygon with a right angle.
|
|
2
2
|
# http://mathworld.wolfram.com/RightTriangle.html
|
|
3
3
|
class RightTriangle
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
def initialize(base, height)
|
|
6
6
|
@a, @b = base, height
|
|
7
7
|
@c = hypotenuse
|
|
8
8
|
end
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
def hypotenuse
|
|
11
11
|
Math.sqrt((@a**2) + (@b**2))
|
|
12
12
|
end
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
def area
|
|
15
15
|
0.5 * @a * @b
|
|
16
16
|
end
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# Pro tip: Keeping an inline bookmark to the rdocs for the class under study
|
|
4
4
|
# makes it easy to continue your learning later.
|
|
5
5
|
|
|
6
6
|
# Exploring the methods of the IO class: http://www.ruby-doc.org/core/classes/IO.html
|
|
7
|
-
class TestIO < Test::Unit::TestCase
|
|
7
|
+
class TestIO < Test::Unit::TestCase
|
|
8
8
|
|
|
9
9
|
def test_readlines
|
|
10
10
|
contents = IO.readlines(File.join(Constants::TEST_DATA_DIR, "file.txt"))
|
|
@@ -2,8 +2,8 @@ require File.dirname(__FILE__) + '/../test_helper'
|
|
|
2
2
|
require 'samples/right_triangle'
|
|
3
3
|
|
|
4
4
|
# An example of testing a class in the lib folder.
|
|
5
|
-
class TestRightTriangle < Test::Unit::TestCase
|
|
6
|
-
|
|
5
|
+
class TestRightTriangle < Test::Unit::TestCase
|
|
6
|
+
|
|
7
7
|
def setup
|
|
8
8
|
@small = RightTriangle.new(3, 4)
|
|
9
9
|
@big = RightTriangle.new(120, 160)
|
|
@@ -11,10 +11,10 @@ class TestRightTriangle < Test::Unit::TestCase
|
|
|
11
11
|
|
|
12
12
|
def test_hypotenuse
|
|
13
13
|
assert_equal(5, @small.hypotenuse)
|
|
14
|
-
assert_equal(200, @big.hypotenuse)
|
|
14
|
+
assert_equal(200, @big.hypotenuse)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def test_area
|
|
17
|
+
def test_area
|
|
18
18
|
assert_equal(6, @small.area)
|
|
19
19
|
end
|
|
20
20
|
|
data/bin/shubox
CHANGED
|
@@ -4,7 +4,7 @@ require 'rubygems'
|
|
|
4
4
|
require 'rubigen'
|
|
5
5
|
require File.dirname(__FILE__) + "/../lib/shubox"
|
|
6
6
|
require File.dirname(__FILE__) + "/../lib/languages"
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
if %w(-v --version).include? ARGV.first
|
|
9
9
|
puts "#{File.basename($0)} #{Shubox::VERSION}"
|
|
10
10
|
exit(0)
|
|
@@ -12,9 +12,13 @@ end
|
|
|
12
12
|
|
|
13
13
|
require 'rubigen/scripts/generate'
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
RubiGen::Base.
|
|
18
|
-
RubiGen::
|
|
15
|
+
# require "pp"
|
|
16
|
+
RubiGen::Base.use_application_sources! :rubygems
|
|
17
|
+
RubiGen::Base.prepend_sources(*[
|
|
18
|
+
RubiGen::PathSource.new(:shubox, File.join(File.dirname(__FILE__), "..", "app_generators")),
|
|
19
|
+
RubiGen::PathSource.new(:shubox, File.join(File.dirname(__FILE__), "..", "cleaner_generators"))
|
|
20
|
+
])
|
|
21
|
+
# pp RubiGen::Base.sources
|
|
22
|
+
|
|
19
23
|
|
|
20
24
|
RubiGen::Scripts::Generate.new.run(ARGV, :generator => Languages.parse(ARGV))
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
USAGE: test_unit_cleaner path/to/file
|
|
2
|
+
|
|
3
|
+
Give the test files a clean sweep to retest yourself.
|
|
4
|
+
Deletes the method bodies from all tests in the specified file,
|
|
5
|
+
a clean sweep to retest yourself. If file is a directory,
|
|
6
|
+
all tests in the directory matching the pattern
|
|
7
|
+
path/to/file/test/**/test_*.rb will be affected.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Shubox
|
|
2
|
+
class TestUnitCleaner
|
|
3
|
+
|
|
4
|
+
def run(args)
|
|
5
|
+
if (%w(-h --help).include?(args.first) || args.empty?)
|
|
6
|
+
puts usage
|
|
7
|
+
return 0
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
target = args.first
|
|
11
|
+
|
|
12
|
+
if (/.rb$/ =~ target)
|
|
13
|
+
clean(target)
|
|
14
|
+
else
|
|
15
|
+
clean_directory(target)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
def clean_directory(dir)
|
|
21
|
+
files = Dir["#{dir}/test/**/test_*.rb"].each { |file| clean(file) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def clean(filename)
|
|
25
|
+
return if /test_helper.rb/ =~ filename
|
|
26
|
+
puts "cleaning: #{filename}"
|
|
27
|
+
|
|
28
|
+
lines = File.readlines(filename)
|
|
29
|
+
output = []
|
|
30
|
+
outside_class = true
|
|
31
|
+
|
|
32
|
+
lines.each do |line|
|
|
33
|
+
if (outside_class)
|
|
34
|
+
output << line
|
|
35
|
+
elsif (/^\s*def test_/ =~ line)
|
|
36
|
+
output << line
|
|
37
|
+
output << " end\n"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if (/class [a-zA-Z]\S* < Test::Unit::TestCase/ =~ line)
|
|
41
|
+
outside_class = false
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
output << 'end'
|
|
45
|
+
|
|
46
|
+
open(filename, 'w') do |f|
|
|
47
|
+
f.puts output.join
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def usage
|
|
52
|
+
usage_file = File.dirname(__FILE__) + "/../USAGE"
|
|
53
|
+
return File.readlines(usage_file)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class TestUnitCleanerGenerator < RubiGen::Base
|
|
2
|
+
|
|
3
|
+
def initialize(runtime_args, runtime_options = {})
|
|
4
|
+
super
|
|
5
|
+
@destination_root = File.expand_path(destination_root)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def manifest
|
|
9
|
+
script_options = { :chmod => 0755 }
|
|
10
|
+
|
|
11
|
+
record do |m|
|
|
12
|
+
m.directory 'script'
|
|
13
|
+
m.template "clean_test_unit", "script/clean_test_unit", script_options
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
def banner
|
|
19
|
+
<<-EOS
|
|
20
|
+
Install a cleaner for Test::Unit tests.
|
|
21
|
+
|
|
22
|
+
Deletes all method bodies in the tests.
|
|
23
|
+
|
|
24
|
+
EOS
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/languages.rb
CHANGED
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
class Languages
|
|
2
|
-
|
|
3
2
|
def self.parse(args)
|
|
4
3
|
lang = args.find {|arg| ((arg =~ /-l=/) or (arg =~ /--language=/)) }
|
|
5
|
-
lang
|
|
4
|
+
lang ||= "-l=ruby"
|
|
6
5
|
lang = lang.split('=')[1]
|
|
7
6
|
raise "Supported languages: #{current.inspect}" if (!current.member?(lang))
|
|
8
7
|
lang
|
|
9
8
|
end
|
|
10
|
-
|
|
9
|
+
|
|
11
10
|
def self.current
|
|
12
11
|
langs = Dir.entries(File.join(File.dirname(__FILE__), "../app_generators"))
|
|
13
12
|
langs.reject {|i| ((i == ".") or (i == ".."))}
|
|
14
13
|
end
|
|
15
|
-
|
|
14
|
+
|
|
16
15
|
def self.print
|
|
17
16
|
list = ""
|
|
18
17
|
current.each {|lang| list << lang << '|'}
|
|
19
18
|
list.chomp('|')
|
|
20
19
|
end
|
|
21
|
-
|
|
22
20
|
end
|
data/lib/shubox.rb
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
3
3
|
|
|
4
|
+
$:.unshift(File.dirname(__FILE__) + '/../cleaner_generators') unless
|
|
5
|
+
$:.include?(File.dirname(__FILE__) + '/../cleaner_generators') || $:.include?(File.expand_path(File.dirname(__FILE__) + '../cleaner_generators'))
|
|
6
|
+
|
|
4
7
|
module Shubox
|
|
5
|
-
VERSION = '0.
|
|
6
|
-
end
|
|
8
|
+
VERSION = '0.8'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
require 'test_unit_cleaner/lib/test_unit_cleaner'
|
data/lib/shubox_app_generator.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
class ShuboxAppGenerator < RubiGen::Base
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
|
4
4
|
Config::CONFIG['ruby_install_name'])
|
|
5
5
|
|
|
@@ -15,13 +15,13 @@ class ShuboxAppGenerator < RubiGen::Base
|
|
|
15
15
|
@name = base_name
|
|
16
16
|
extract_options
|
|
17
17
|
end
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
protected
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
def banner
|
|
22
22
|
"\n" << IO.readlines(File.join(File.dirname(__FILE__), "../README.rdoc"))[0]
|
|
23
23
|
end
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
def add_options!(opts)
|
|
26
26
|
opts.separator ''
|
|
27
27
|
opts.separator 'Options:'
|
|
@@ -37,5 +37,4 @@ class ShuboxAppGenerator < RubiGen::Base
|
|
|
37
37
|
def extract_options
|
|
38
38
|
@language = options[:language]
|
|
39
39
|
end
|
|
40
|
-
|
|
41
40
|
end
|
|
@@ -42,6 +42,14 @@ module RubiGen::GeneratorTestHelper
|
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
+
def run_generated_cleaner(cmd)
|
|
46
|
+
FileUtils::cd(APP_ROOT + '/script') do
|
|
47
|
+
puts "Running generated clean script in #{FileUtils::pwd} with #{cmd}"
|
|
48
|
+
`#{cmd}`
|
|
49
|
+
raise "Exit code #{$?} while running generated build script with #{cmd}" if ($?.to_s != "0")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
45
53
|
def sources
|
|
46
54
|
[RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", generator_path))]
|
|
47
55
|
end
|
data/test/test_java_generator.rb
CHANGED
|
@@ -20,18 +20,17 @@ class TestJavaGenerator < Test::Unit::TestCase
|
|
|
20
20
|
assert_directory_exists "build"
|
|
21
21
|
assert_generated_file "build/build.xml"
|
|
22
22
|
assert_file_contains(PROJECT_NAME, "build/build.xml")
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
assert_directory_exists "lib"
|
|
25
25
|
assert_generated_file "lib/junit.jar"
|
|
26
|
-
assert_generated_file "lib/hamcrest-core.jar"
|
|
27
|
-
|
|
26
|
+
assert_generated_file "lib/hamcrest-core.jar"
|
|
27
|
+
|
|
28
28
|
assert_directory_exists "src"
|
|
29
29
|
assert_generated_file "src/com/samples/Greeting.java"
|
|
30
|
-
|
|
31
|
-
assert_directory_exists "test"
|
|
30
|
+
|
|
31
|
+
assert_directory_exists "test"
|
|
32
32
|
assert_generated_file "test/com/samples/GreetingTest.java"
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
run_generated_build_script("ant -f build/build.xml")
|
|
35
35
|
end
|
|
36
|
-
|
|
37
36
|
end
|
data/test/test_languages.rb
CHANGED
|
@@ -2,7 +2,7 @@ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
|
|
|
2
2
|
require 'languages'
|
|
3
3
|
|
|
4
4
|
class TestLanguages < Test::Unit::TestCase
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
def test_list_current_languages
|
|
7
7
|
langs = Languages.current
|
|
8
8
|
assert(langs.length > 1)
|
|
@@ -10,20 +10,24 @@ class TestLanguages < Test::Unit::TestCase
|
|
|
10
10
|
assert(!langs.include?(".."))
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
+
def test_ruby_is_default_language
|
|
14
|
+
assert_equal("ruby", Languages.parse(""))
|
|
15
|
+
end
|
|
16
|
+
|
|
13
17
|
def test_parse_command_for_valid_language
|
|
14
18
|
args = %w{-l=java MyAppName}
|
|
15
19
|
assert_equal("java", Languages.parse(args))
|
|
16
20
|
args = %w{--language=ruby app_name}
|
|
17
21
|
assert_equal("ruby", Languages.parse(args))
|
|
18
22
|
end
|
|
19
|
-
|
|
23
|
+
|
|
20
24
|
def test_reject_invalid_language
|
|
21
|
-
args = %w{-l=
|
|
22
|
-
assert_raise RuntimeError do
|
|
25
|
+
args = %w{-l=nonsense}
|
|
26
|
+
assert_raise RuntimeError do
|
|
23
27
|
Languages.parse(args)
|
|
24
28
|
end
|
|
25
29
|
end
|
|
26
|
-
|
|
30
|
+
|
|
27
31
|
def test_print_languages
|
|
28
32
|
base = "java|ruby"
|
|
29
33
|
print = Languages.print
|
data/test/test_ruby_generator.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
|
|
2
2
|
require 'fileutils'
|
|
3
|
+
require 'languages'
|
|
3
4
|
|
|
4
5
|
class TestRubyGenerator < Test::Unit::TestCase
|
|
5
6
|
include RubiGen::GeneratorTestHelper
|
|
@@ -14,7 +15,7 @@ class TestRubyGenerator < Test::Unit::TestCase
|
|
|
14
15
|
|
|
15
16
|
def test_generator_without_options
|
|
16
17
|
run_generator('ruby', [APP_ROOT], sources)
|
|
17
|
-
|
|
18
|
+
|
|
18
19
|
assert_generated_file "rakefile.rb"
|
|
19
20
|
assert_directory_exists "lib/samples"
|
|
20
21
|
assert_generated_file "lib/samples/right_triangle.rb"
|
|
@@ -25,8 +26,16 @@ class TestRubyGenerator < Test::Unit::TestCase
|
|
|
25
26
|
assert_generated_file "test/data/file.txt"
|
|
26
27
|
assert_generated_file "test/test_io.rb"
|
|
27
28
|
assert_generated_file "test/test_helper.rb"
|
|
28
|
-
|
|
29
|
+
assert_generated_file "script/clean_test_unit"
|
|
30
|
+
|
|
29
31
|
run_generated_build_script("rake")
|
|
30
32
|
end
|
|
31
33
|
|
|
34
|
+
private
|
|
35
|
+
def sources
|
|
36
|
+
[ RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", "app_generators")),
|
|
37
|
+
RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__), "..", "cleaner_generators"))
|
|
38
|
+
]
|
|
39
|
+
end
|
|
40
|
+
|
|
32
41
|
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
|
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'cleaner_generators', 'test_unit_cleaner', 'lib', 'test_unit_cleaner')
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'languages'
|
|
5
|
+
|
|
6
|
+
class TestTestUnitCleaner < Test::Unit::TestCase
|
|
7
|
+
include RubiGen::GeneratorTestHelper
|
|
8
|
+
|
|
9
|
+
def setup
|
|
10
|
+
bare_setup
|
|
11
|
+
run_generator('ruby', [APP_ROOT], sources)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def teardown
|
|
15
|
+
bare_teardown
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_display_usage_with_no_args
|
|
19
|
+
no_args = Shubox::TestUnitCleaner.new.run([])
|
|
20
|
+
assert_equal(0, no_args)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_display_usage_with_help
|
|
24
|
+
help = Shubox::TestUnitCleaner.new.run(["--help"])
|
|
25
|
+
assert_equal(0, help)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_run_cleaner_on_directory
|
|
29
|
+
dir_to_clean = File.expand_path(File.join(File.dirname(__FILE__), 'tmp', 'myproject'))
|
|
30
|
+
puts "\n" + dir_to_clean
|
|
31
|
+
clean_file = File.join(dir_to_clean, 'test', 'test_io.rb')
|
|
32
|
+
puts clean_file
|
|
33
|
+
Shubox::TestUnitCleaner.new.run([dir_to_clean, "ignored extra parameter"])
|
|
34
|
+
assert_equal <<-EOF, File.read(clean_file)
|
|
35
|
+
require File.dirname(__FILE__) + '/test_helper'
|
|
36
|
+
|
|
37
|
+
# Pro tip: Keeping an inline bookmark to the rdocs for the class under study
|
|
38
|
+
# makes it easy to continue your learning later.
|
|
39
|
+
|
|
40
|
+
# Exploring the methods of the IO class: http://www.ruby-doc.org/core/classes/IO.html
|
|
41
|
+
class TestIO < Test::Unit::TestCase
|
|
42
|
+
def test_readlines
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
EOF
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_run_cleaner_on_single_file
|
|
49
|
+
file_to_clean = File.expand_path(File.join(File.dirname(__FILE__), 'tmp', 'myproject', 'test', 'samples', 'test_right_triangle.rb'))
|
|
50
|
+
Shubox::TestUnitCleaner.new.run([file_to_clean])
|
|
51
|
+
assert_equal <<-EOF, File.read(file_to_clean)
|
|
52
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
|
53
|
+
require 'samples/right_triangle'
|
|
54
|
+
|
|
55
|
+
# An example of testing a class in the lib folder.
|
|
56
|
+
class TestRightTriangle < Test::Unit::TestCase
|
|
57
|
+
def test_hypotenuse
|
|
58
|
+
end
|
|
59
|
+
def test_area
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
EOF
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
def sources
|
|
67
|
+
[ RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", "app_generators")),
|
|
68
|
+
RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__), "..", "cleaner_generators"))
|
|
69
|
+
]
|
|
70
|
+
end
|
|
71
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bobbyno-shubox
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: "0.
|
|
4
|
+
version: "0.8"
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Bobby Norton
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-
|
|
12
|
+
date: 2009-09-22 00:00:00 -07:00
|
|
13
13
|
default_executable: shubox
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
@@ -18,9 +18,9 @@ dependencies:
|
|
|
18
18
|
version_requirement:
|
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
|
20
20
|
requirements:
|
|
21
|
-
- - "
|
|
21
|
+
- - "="
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
|
-
version: 1.
|
|
23
|
+
version: 1.5.2
|
|
24
24
|
version:
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: hoe
|
|
@@ -30,9 +30,9 @@ dependencies:
|
|
|
30
30
|
requirements:
|
|
31
31
|
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
33
|
+
version: 2.3.3
|
|
34
34
|
version:
|
|
35
|
-
description: "Test-driven learning is a way to master a programming language by writing unit tests around its API's.
|
|
35
|
+
description: "Test-driven learning is a way to master a programming language by writing unit tests around its API's. shubox lowers the barrier to entry for test-driven learning by providing a basic infrastructure in which to start coding: A directory structure, some classes and unit tests to get started, and a build script."
|
|
36
36
|
email:
|
|
37
37
|
- codeculturist@gmail.com
|
|
38
38
|
executables:
|
|
@@ -43,8 +43,8 @@ extra_rdoc_files:
|
|
|
43
43
|
- History.txt
|
|
44
44
|
- Manifest.txt
|
|
45
45
|
- PostInstall.txt
|
|
46
|
-
- README.rdoc
|
|
47
46
|
- app_generators/ruby/templates/file.txt
|
|
47
|
+
- README.rdoc
|
|
48
48
|
files:
|
|
49
49
|
- History.txt
|
|
50
50
|
- MIT-LICENSE
|
|
@@ -71,6 +71,10 @@ files:
|
|
|
71
71
|
- app_generators/ruby/templates/test_io.rb
|
|
72
72
|
- app_generators/ruby/templates/test_right_triangle.rb
|
|
73
73
|
- bin/shubox
|
|
74
|
+
- cleaner_generators/test_unit_cleaner/USAGE
|
|
75
|
+
- cleaner_generators/test_unit_cleaner/lib/test_unit_cleaner.rb
|
|
76
|
+
- cleaner_generators/test_unit_cleaner/templates/clean_test_unit
|
|
77
|
+
- cleaner_generators/test_unit_cleaner/test_unit_cleaner_generator.rb
|
|
74
78
|
- lib/languages.rb
|
|
75
79
|
- lib/shubox.rb
|
|
76
80
|
- lib/shubox_app_generator.rb
|
|
@@ -82,6 +86,7 @@ files:
|
|
|
82
86
|
- test/test_java_generator.rb
|
|
83
87
|
- test/test_languages.rb
|
|
84
88
|
- test/test_ruby_generator.rb
|
|
89
|
+
- test/test_test_unit_cleaner.rb
|
|
85
90
|
has_rdoc: false
|
|
86
91
|
homepage: http://github.com/bobbyno/shubox/tree/master
|
|
87
92
|
licenses:
|
|
@@ -116,3 +121,4 @@ test_files:
|
|
|
116
121
|
- test/test_java_generator.rb
|
|
117
122
|
- test/test_languages.rb
|
|
118
123
|
- test/test_ruby_generator.rb
|
|
124
|
+
- test/test_test_unit_cleaner.rb
|