shubox 0.9
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 +57 -0
- data/MIT-LICENSE +22 -0
- data/Manifest.txt +57 -0
- data/PostInstall.txt +6 -0
- data/README.rdoc +128 -0
- data/Rakefile +61 -0
- data/app_generators/clojure/USAGE +15 -0
- data/app_generators/clojure/clojure_generator.rb +46 -0
- data/app_generators/clojure/templates/README.rdoc +29 -0
- data/app_generators/clojure/templates/bin/repl.sh +3 -0
- data/app_generators/clojure/templates/bin/runtests.sh +3 -0
- data/app_generators/clojure/templates/lib/clojure-contrib.jar +0 -0
- data/app_generators/clojure/templates/lib/clojure.jar +0 -0
- data/app_generators/clojure/templates/lib/jline-0.9.94.jar +0 -0
- data/app_generators/clojure/templates/project.iml +19 -0
- data/app_generators/clojure/templates/project.ipr +261 -0
- data/app_generators/clojure/templates/src/repl.clj +3 -0
- data/app_generators/clojure/templates/test/core/about_clojure_testing.clj +21 -0
- data/app_generators/clojure/templates/test/core/about_forms.clj +22 -0
- data/app_generators/clojure/templates/test/tests.clj +11 -0
- data/app_generators/java/USAGE +14 -0
- data/app_generators/java/java_generator.rb +39 -0
- data/app_generators/java/templates/Greeting.java +24 -0
- data/app_generators/java/templates/GreetingTest.java +18 -0
- data/app_generators/java/templates/build.xml +55 -0
- data/app_generators/java/templates/lib/hamcrest-core.jar +0 -0
- data/app_generators/java/templates/lib/junit.jar +0 -0
- data/app_generators/java/templates/project.iml +22 -0
- data/app_generators/java/templates/project.ipr +259 -0
- data/app_generators/ruby/USAGE +12 -0
- data/app_generators/ruby/ruby_generator.rb +37 -0
- data/app_generators/ruby/templates/file.txt +3 -0
- data/app_generators/ruby/templates/rakefile.rb +9 -0
- data/app_generators/ruby/templates/right_triangle.rb +18 -0
- data/app_generators/ruby/templates/shubox.rb +6 -0
- data/app_generators/ruby/templates/test_helper.rb +9 -0
- data/app_generators/ruby/templates/test_io.rb +15 -0
- data/app_generators/ruby/templates/test_right_triangle.rb +21 -0
- data/bin/shubox +24 -0
- data/cleaner_generators/test_unit_cleaner/USAGE +7 -0
- data/cleaner_generators/test_unit_cleaner/lib/test_unit_cleaner.rb +93 -0
- data/cleaner_generators/test_unit_cleaner/templates/clean_test_unit +12 -0
- data/cleaner_generators/test_unit_cleaner/templates/filter_test_unit +13 -0
- data/cleaner_generators/test_unit_cleaner/test_unit_cleaner_generator.rb +27 -0
- data/lib/languages.rb +20 -0
- data/lib/shubox.rb +11 -0
- data/lib/shubox_app_generator.rb +40 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/cleaners/test_test_unit_cleaner.rb +111 -0
- data/test/generators/test_clojure_generator.rb +44 -0
- data/test/generators/test_java_generator.rb +37 -0
- data/test/generators/test_ruby_generator.rb +34 -0
- data/test/lib/test_languages.rb +38 -0
- data/test/test_generator_helper.rb +72 -0
- data/test/test_helper.rb +4 -0
- metadata +144 -0
@@ -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,93 @@
|
|
1
|
+
module Shubox
|
2
|
+
class TestUnitCleaner
|
3
|
+
|
4
|
+
attr_reader :class_pattern
|
5
|
+
attr_reader :test_pattern
|
6
|
+
attr_reader :test_file_path
|
7
|
+
attr_reader :ending
|
8
|
+
|
9
|
+
attr_reader :koan_pattern
|
10
|
+
attr_reader :koan_file_path
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@class_pattern = /class [a-zA-Z]\S* < Test::Unit::TestCase/
|
14
|
+
@test_pattern = /^\s*def test_/
|
15
|
+
@test_file_path = "/test/**/test_*.rb"
|
16
|
+
@ending = "end"
|
17
|
+
|
18
|
+
# Support for github.com/edgecase/ruby_koans
|
19
|
+
@koan_pattern = /class [a-zA-Z]\S* < EdgeCase::Koan/
|
20
|
+
@koan_file_path = "/test/**/about_*.rb"
|
21
|
+
end
|
22
|
+
|
23
|
+
def run(args)
|
24
|
+
target = args.first
|
25
|
+
return usage if empty_or_help?(target)
|
26
|
+
|
27
|
+
if File.file?(target)
|
28
|
+
clean_file(target)
|
29
|
+
else
|
30
|
+
clean_directory(target)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def clean_class(lines)
|
35
|
+
output = []
|
36
|
+
outside_class = true
|
37
|
+
|
38
|
+
lines.each do |line|
|
39
|
+
if (outside_class || comment?(line))
|
40
|
+
output << line
|
41
|
+
elsif (start_of_test?(line))
|
42
|
+
output << line
|
43
|
+
output << " #{@ending}\n"
|
44
|
+
end
|
45
|
+
|
46
|
+
if (start_of_class?(line))
|
47
|
+
outside_class = false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
output << @ending
|
51
|
+
output.join
|
52
|
+
end
|
53
|
+
|
54
|
+
def comment?(line)
|
55
|
+
(line =~ /^\s*#/ || line =~ /^\s*$/)
|
56
|
+
end
|
57
|
+
|
58
|
+
def empty_or_help?(input)
|
59
|
+
return (input.nil? || input.empty? || %w(-h --help).include?(input))
|
60
|
+
end
|
61
|
+
|
62
|
+
def usage
|
63
|
+
usage_file = File.dirname(__FILE__) + "/../USAGE"
|
64
|
+
return File.readlines(usage_file)
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def start_of_class?(line)
|
69
|
+
(@class_pattern =~ line || @koan_pattern =~ line)
|
70
|
+
end
|
71
|
+
|
72
|
+
def start_of_test?(line)
|
73
|
+
@test_pattern =~ line
|
74
|
+
end
|
75
|
+
|
76
|
+
def clean_directory(dir)
|
77
|
+
Dir[dir + @test_file_path].each { |file| clean_file(file) }
|
78
|
+
Dir[dir + @koan_file_path].each { |file| clean_file(file) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def clean_file(filename)
|
82
|
+
return if /test_helper.rb/ =~ filename
|
83
|
+
puts "cleaning: #{filename}"
|
84
|
+
|
85
|
+
lines = File.readlines(filename)
|
86
|
+
output = clean_class(lines)
|
87
|
+
|
88
|
+
open(filename, 'w') do |f|
|
89
|
+
f.puts output
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,27 @@
|
|
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.file "clean_test_unit", "script/clean_test_unit", script_options
|
14
|
+
m.file "filter_test_unit", "script/filter_test_unit", script_options
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def banner
|
20
|
+
<<-EOS
|
21
|
+
Install a cleaner for Test::Unit tests.
|
22
|
+
|
23
|
+
Deletes all method bodies in the tests.
|
24
|
+
|
25
|
+
EOS
|
26
|
+
end
|
27
|
+
end
|
data/lib/languages.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
class Languages
|
2
|
+
def self.parse(args)
|
3
|
+
lang = args.find {|arg| ((arg =~ /-l=/) or (arg =~ /--language=/)) }
|
4
|
+
lang ||= "-l=ruby"
|
5
|
+
lang = lang.split('=')[1]
|
6
|
+
raise "Supported languages: #{current.inspect}" if (!current.member?(lang))
|
7
|
+
lang
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.current
|
11
|
+
langs = Dir.entries(File.join(File.dirname(__FILE__), "../app_generators"))
|
12
|
+
langs.reject {|i| ((i == ".") or (i == ".."))}
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.print
|
16
|
+
list = ""
|
17
|
+
current.each {|lang| list << lang << '|'}
|
18
|
+
list.chomp('|')
|
19
|
+
end
|
20
|
+
end
|
data/lib/shubox.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
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
|
+
|
7
|
+
module Shubox
|
8
|
+
VERSION = '0.9'
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'test_unit_cleaner/lib/test_unit_cleaner'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class ShuboxAppGenerator < RubiGen::Base
|
2
|
+
|
3
|
+
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
4
|
+
Config::CONFIG['ruby_install_name'])
|
5
|
+
|
6
|
+
default_options :language => 'ruby'
|
7
|
+
|
8
|
+
attr_reader :language
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
def initialize(runtime_args, runtime_options = {})
|
12
|
+
super
|
13
|
+
usage if args.empty?
|
14
|
+
@destination_root = File.expand_path(args.shift)
|
15
|
+
@name = base_name
|
16
|
+
extract_options
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def banner
|
22
|
+
"\n" << IO.readlines(File.join(File.dirname(__FILE__), "../README.rdoc"))[0]
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_options!(opts)
|
26
|
+
opts.separator ''
|
27
|
+
opts.separator 'Options:'
|
28
|
+
# For each option below, place the default
|
29
|
+
# at the top of the file next to "default_options"
|
30
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
31
|
+
# "Some comment about this option",
|
32
|
+
# "Default: none") { |o| options[:author] = o }
|
33
|
+
opts.on("-l", "--language=name", "Language of the environment to generate. Options: #{Languages.print}", "Default: ruby")
|
34
|
+
opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
35
|
+
end
|
36
|
+
|
37
|
+
def extract_options
|
38
|
+
@language = options[:language]
|
39
|
+
end
|
40
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/shubox.rb'}"
|
9
|
+
puts "Loading shubox gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
@@ -0,0 +1,111 @@
|
|
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_or_help
|
19
|
+
cleaner = Shubox::TestUnitCleaner.new
|
20
|
+
no_args = cleaner.run([""])
|
21
|
+
assert_equal(cleaner.usage, no_args)
|
22
|
+
|
23
|
+
help = cleaner.run(["--help"])
|
24
|
+
assert_equal(cleaner.usage, help)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_detect_comments
|
28
|
+
line = " # Comment here"
|
29
|
+
cleaner = Shubox::TestUnitCleaner.new
|
30
|
+
assert(cleaner.comment?(line))
|
31
|
+
assert(!cleaner.comment?("hello"))
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_run_cleaner_on_directory
|
35
|
+
dir_to_clean = File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', 'myproject'))
|
36
|
+
clean_file = File.join(dir_to_clean, 'test', 'test_io.rb')
|
37
|
+
Shubox::TestUnitCleaner.new.run([dir_to_clean, "ignored extra parameter"])
|
38
|
+
assert_equal <<-EOF, File.read(clean_file)
|
39
|
+
require File.dirname(__FILE__) + '/test_helper'
|
40
|
+
|
41
|
+
# Pro tip: Keeping an inline bookmark to the rdocs for the class under study
|
42
|
+
# makes it easy to continue your learning later.
|
43
|
+
|
44
|
+
# Exploring the methods of the IO class: http://www.ruby-doc.org/core/classes/IO.html
|
45
|
+
class TestIO < Test::Unit::TestCase
|
46
|
+
|
47
|
+
# See String Match for =~ syntax: http://www.ruby-doc.org/core/classes/String.html#M000792
|
48
|
+
def test_readlines_reads_files_as_array
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
EOF
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_run_cleaner_on_single_file
|
56
|
+
file_to_clean = File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', 'myproject', 'test', 'samples', 'test_right_triangle.rb'))
|
57
|
+
contents = File.read(file_to_clean)
|
58
|
+
|
59
|
+
cleaner = Shubox::TestUnitCleaner.new
|
60
|
+
cleaner.run([file_to_clean])
|
61
|
+
cleaned_file = File.read(file_to_clean)
|
62
|
+
|
63
|
+
assert_equal <<-EOF, cleaned_file
|
64
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
65
|
+
require 'samples/right_triangle'
|
66
|
+
|
67
|
+
# An example of testing a class in the lib folder.
|
68
|
+
class TestRightTriangle < Test::Unit::TestCase
|
69
|
+
|
70
|
+
|
71
|
+
def test_hypotenuse
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_area
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
EOF
|
79
|
+
|
80
|
+
cleaned_contents = cleaner.clean_class(contents)
|
81
|
+
assert_equal(cleaned_contents, cleaned_file.strip)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Including support for cleaning github.com/edgecase/ruby_koans
|
85
|
+
def test_clean_koans
|
86
|
+
koan = <<-EOF
|
87
|
+
require File.dirname(__FILE__) + '/edgecase'
|
88
|
+
|
89
|
+
class AboutAsserts < EdgeCase::Koan
|
90
|
+
|
91
|
+
# We shall contemplate truth by testing reality, via asserts.
|
92
|
+
def test_assert_truth
|
93
|
+
assert true
|
94
|
+
end
|
95
|
+
end
|
96
|
+
EOF
|
97
|
+
|
98
|
+
clean_koan = <<-EOF
|
99
|
+
require File.dirname(__FILE__) + '/edgecase'
|
100
|
+
|
101
|
+
class AboutAsserts < EdgeCase::Koan
|
102
|
+
|
103
|
+
# We shall contemplate truth by testing reality, via asserts.
|
104
|
+
def test_assert_truth
|
105
|
+
end
|
106
|
+
end
|
107
|
+
EOF
|
108
|
+
cleaner = Shubox::TestUnitCleaner.new
|
109
|
+
assert_equal(clean_koan.strip, cleaner.clean_class(koan))
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "test_generator_helper.rb")
|
2
|
+
require 'fileutils'
|
3
|
+
require 'languages'
|
4
|
+
|
5
|
+
class TestClojureGenerator < Test::Unit::TestCase
|
6
|
+
include RubiGen::GeneratorTestHelper
|
7
|
+
|
8
|
+
def setup
|
9
|
+
bare_setup
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
bare_teardown
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_generator_without_options
|
17
|
+
run_generator('clojure', [APP_ROOT], sources)
|
18
|
+
|
19
|
+
assert_generated_file "README.rdoc"
|
20
|
+
assert_generated_file "myproject.ipr"
|
21
|
+
assert_generated_file "myproject.iml"
|
22
|
+
assert_file_contains(PROJECT_NAME, "myproject.ipr")
|
23
|
+
|
24
|
+
assert_directory_exists "bin"
|
25
|
+
assert_generated_file "bin/repl.sh"
|
26
|
+
assert_generated_file "bin/runtests.sh"
|
27
|
+
|
28
|
+
assert_directory_exists "lib"
|
29
|
+
assert_generated_file "lib/clojure.jar"
|
30
|
+
assert_generated_file "lib/clojure-contrib.jar"
|
31
|
+
assert_generated_file "lib/jline-0.9.94.jar"
|
32
|
+
|
33
|
+
assert_directory_exists "src"
|
34
|
+
assert_generated_file "src/repl.clj"
|
35
|
+
|
36
|
+
assert_directory_exists "test"
|
37
|
+
assert_directory_exists "test/core"
|
38
|
+
assert_generated_file "test/core/about_clojure_testing.clj"
|
39
|
+
assert_generated_file "test/core/about_forms.clj"
|
40
|
+
assert_generated_file "test/tests.clj"
|
41
|
+
|
42
|
+
run_generated_build_script("bin/runtests.sh")
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "test_generator_helper.rb")
|
2
|
+
require 'languages'
|
3
|
+
|
4
|
+
class TestJavaGenerator < Test::Unit::TestCase
|
5
|
+
include RubiGen::GeneratorTestHelper
|
6
|
+
|
7
|
+
def setup
|
8
|
+
bare_setup
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
bare_teardown
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_generator_without_options
|
16
|
+
run_generator('java', [APP_ROOT], sources)
|
17
|
+
assert_generated_file "myproject.ipr"
|
18
|
+
assert_generated_file "myproject.iml"
|
19
|
+
assert_file_contains(PROJECT_NAME, "myproject.ipr")
|
20
|
+
|
21
|
+
assert_directory_exists "build"
|
22
|
+
assert_generated_file "build/build.xml"
|
23
|
+
assert_file_contains(PROJECT_NAME, "build/build.xml")
|
24
|
+
|
25
|
+
assert_directory_exists "lib"
|
26
|
+
assert_generated_file "lib/junit.jar"
|
27
|
+
assert_generated_file "lib/hamcrest-core.jar"
|
28
|
+
|
29
|
+
assert_directory_exists "src"
|
30
|
+
assert_generated_file "src/com/samples/Greeting.java"
|
31
|
+
|
32
|
+
assert_directory_exists "test"
|
33
|
+
assert_generated_file "test/com/samples/GreetingTest.java"
|
34
|
+
|
35
|
+
run_generated_build_script("ant -f build/build.xml")
|
36
|
+
end
|
37
|
+
end
|