bobbyno-tbox 0.5.2 → 0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +23 -12
  3. data/README.rdoc +20 -9
  4. data/Rakefile +13 -1
  5. data/app_generators/java/USAGE +14 -0
  6. data/app_generators/java/java_generator.rb +39 -0
  7. data/app_generators/java/templates/Greeting.java +24 -0
  8. data/app_generators/java/templates/GreetingTest.java +18 -0
  9. data/app_generators/java/templates/build.xml +55 -0
  10. data/app_generators/java/templates/lib/hamcrest-core.jar +0 -0
  11. data/app_generators/java/templates/lib/junit.jar +0 -0
  12. data/app_generators/java/templates/project.iml +22 -0
  13. data/app_generators/java/templates/project.ipr +259 -0
  14. data/app_generators/{tbox → ruby}/USAGE +1 -2
  15. data/app_generators/ruby/ruby_generator.rb +34 -0
  16. data/app_generators/{tbox → ruby}/templates/file.txt +0 -0
  17. data/app_generators/{tbox → ruby}/templates/rakefile.rb +0 -0
  18. data/app_generators/{tbox → ruby}/templates/right_triangle.rb +0 -6
  19. data/app_generators/{tbox → ruby}/templates/tbox.rb +0 -0
  20. data/app_generators/ruby/templates/test_helper.rb +9 -0
  21. data/app_generators/{tbox → ruby}/templates/test_io.rb +0 -0
  22. data/app_generators/{tbox → ruby}/templates/test_right_triangle.rb +0 -0
  23. data/bin/tbox +6 -3
  24. data/lib/languages.rb +22 -0
  25. data/lib/tbox.rb +1 -1
  26. data/lib/tbox_app_generator.rb +41 -0
  27. data/test/test_generator_helper.rb +37 -0
  28. data/test/test_java_generator.rb +37 -0
  29. data/test/test_languages.rb +32 -0
  30. data/test/test_ruby_generator.rb +32 -0
  31. metadata +31 -18
  32. data/app_generators/tbox/tbox_generator.rb +0 -84
  33. data/app_generators/tbox/templates/README +0 -45
  34. data/app_generators/tbox/templates/test_helper.rb +0 -9
  35. data/tbox.gemspec +0 -40
  36. data/test/test_tbox_generator.rb +0 -63
@@ -2,8 +2,7 @@ Description:
2
2
 
3
3
  tbox 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. For now, tbox is geared toward Ruby, though the technique is applicable to any language that
6
- lends itself to TDD.
5
+ all tests.
7
6
 
8
7
  Usage:
9
8
 
@@ -0,0 +1,34 @@
1
+ require 'tbox_app_generator'
2
+
3
+ class RubyGenerator < TboxAppGenerator
4
+
5
+ def manifest
6
+ record do |m|
7
+ # Ensure appropriate folder(s) exists
8
+ m.directory ''
9
+ BASEDIRS.each { |path| m.directory path }
10
+
11
+ m.file "rakefile.rb", "rakefile.rb"
12
+ m.directory "lib/samples"
13
+ m.file "right_triangle.rb", "lib/samples/right_triangle.rb"
14
+ m.file "tbox.rb", "lib/tbox.rb"
15
+ m.directory "test/samples"
16
+ m.directory "test/data"
17
+ m.file "test_right_triangle.rb", "test/samples/test_right_triangle.rb"
18
+ m.file "test_io.rb", "test/test_io.rb"
19
+ m.file "file.txt", "test/data/file.txt"
20
+ m.file "test_helper.rb", "test/test_helper.rb"
21
+
22
+ m.dependency "install_rubigen_scripts", [destination_root, 'tbox'],
23
+ :shebang => options[:shebang], :collision => :force
24
+ end
25
+ end
26
+
27
+ protected
28
+ # Installation skeleton.
29
+ BASEDIRS = %w(
30
+ lib
31
+ script
32
+ test
33
+ )
34
+ end
File without changes
File without changes
@@ -14,11 +14,5 @@ class RightTriangle
14
14
  def area
15
15
  0.5 * @a * @b
16
16
  end
17
-
18
- private
19
17
 
20
- def s
21
- semiperimeter
22
- end
23
-
24
18
  end
File without changes
@@ -0,0 +1,9 @@
1
+ require 'stringio'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/tbox'
4
+
5
+ module Constants
6
+ if (!defined? TEST_DATA_DIR)
7
+ TEST_DATA_DIR = File.join(File.expand_path(File.dirname(__FILE__)), "data")
8
+ end
9
+ end
File without changes
data/bin/tbox CHANGED
@@ -2,16 +2,19 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'rubigen'
5
-
5
+ require File.dirname(__FILE__) + "/../lib/tbox"
6
+ require File.dirname(__FILE__) + "/../lib/languages"
7
+
6
8
  if %w(-v --version).include? ARGV.first
7
- require File.dirname(__FILE__) + "/../lib/tbox"
8
9
  puts "#{File.basename($0)} #{Tbox::VERSION}"
9
10
  exit(0)
10
11
  end
11
12
 
12
13
  require 'rubigen/scripts/generate'
14
+
13
15
  source = RubiGen::PathSource.new(:application,
14
16
  File.join(File.dirname(__FILE__), "../app_generators"))
15
17
  RubiGen::Base.reset_sources
16
18
  RubiGen::Base.append_sources source
17
- RubiGen::Scripts::Generate.new.run(ARGV, :generator => 'tbox')
19
+
20
+ RubiGen::Scripts::Generate.new.run(ARGV, :generator => Languages.parse(ARGV))
data/lib/languages.rb ADDED
@@ -0,0 +1,22 @@
1
+ class Languages
2
+
3
+ def self.parse(args)
4
+ lang = args.find {|arg| ((arg =~ /-l=/) or (arg =~ /--language=/)) }
5
+ lang = "-l=ruby" if lang.nil?
6
+ lang = lang.split('=')[1]
7
+ raise "Supported languages: #{current.inspect}" if (!current.member?(lang))
8
+ lang
9
+ end
10
+
11
+ def self.current
12
+ langs = Dir.entries(File.join(File.dirname(__FILE__), "../app_generators"))
13
+ langs.reject {|i| ((i == ".") or (i == ".."))}
14
+ end
15
+
16
+ def self.print
17
+ list = ""
18
+ current.each {|lang| list << lang << '|'}
19
+ list.chomp('|')
20
+ end
21
+
22
+ end
data/lib/tbox.rb CHANGED
@@ -2,5 +2,5 @@ $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  module Tbox
5
- VERSION = '0.5.2'
5
+ VERSION = '0.6'
6
6
  end
@@ -0,0 +1,41 @@
1
+ class TboxAppGenerator < 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
+
41
+ end
@@ -27,3 +27,40 @@ rescue LoadError
27
27
  require 'rubigen'
28
28
  end
29
29
  require 'rubigen/helpers/generator_test_helper'
30
+
31
+ module RubiGen::GeneratorTestHelper
32
+ def assert_file_contains(keyword, filename)
33
+ ipr = IO.readlines(File.join(APP_ROOT, filename)).to_s
34
+ assert(ipr =~ Regexp.new(keyword))
35
+ end
36
+
37
+ def run_generated_build_script(cmd)
38
+ FileUtils::cd(APP_ROOT) do
39
+ puts "Running generated build script in #{FileUtils::pwd} with #{cmd}"
40
+ `#{cmd}`
41
+ raise "Exit code #{$?} while running generated build script with #{cmd}" if ($?.to_s != "0")
42
+ end
43
+ end
44
+
45
+ def sources
46
+ [RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", generator_path))]
47
+ end
48
+
49
+ def generator_path
50
+ "app_generators"
51
+ end
52
+ # Some generator-related assertions:
53
+ # assert_generated_file(name, &block) # block passed the file contents
54
+ # assert_directory_exists(name)
55
+ # assert_generated_class(name, &block)
56
+ # assert_generated_module(name, &block)
57
+ # assert_generated_test_for(name, &block)
58
+ # The assert_generated_(class|module|test_for) &block is passed the body of the class/module within the file
59
+ # assert_has_method(body, *methods) # check that the body has a list of methods (methods with parentheses not supported yet)
60
+ #
61
+ # Other helper methods are:
62
+ # app_root_files - put this in teardown to show files generated by the test method (e.g. p app_root_files)
63
+ # bare_setup - place this in setup method to create the APP_ROOT folder for each test
64
+ # bare_teardown - place this in teardown method to destroy the TMP_ROOT or APP_ROOT folder after each test
65
+ end
66
+
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+
3
+ class TestJavaGenerator < Test::Unit::TestCase
4
+ include RubiGen::GeneratorTestHelper
5
+
6
+ def setup
7
+ bare_setup
8
+ end
9
+
10
+ def teardown
11
+ bare_teardown
12
+ end
13
+
14
+ def test_generator_without_options
15
+ run_generator('java', [APP_ROOT], sources)
16
+ assert_generated_file "myproject.ipr"
17
+ assert_generated_file "myproject.iml"
18
+ assert_file_contains(PROJECT_NAME, "myproject.ipr")
19
+
20
+ assert_directory_exists "build"
21
+ assert_generated_file "build/build.xml"
22
+ assert_file_contains(PROJECT_NAME, "build/build.xml")
23
+
24
+ assert_directory_exists "lib"
25
+ assert_generated_file "lib/junit.jar"
26
+ assert_generated_file "lib/hamcrest-core.jar"
27
+
28
+ assert_directory_exists "src"
29
+ assert_generated_file "src/com/samples/Greeting.java"
30
+
31
+ assert_directory_exists "test"
32
+ assert_generated_file "test/com/samples/GreetingTest.java"
33
+
34
+ run_generated_build_script("ant -f build/build.xml")
35
+ end
36
+
37
+ end
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+ require 'languages'
3
+
4
+ class TestLanguages < Test::Unit::TestCase
5
+
6
+ def test_list_current_languages
7
+ langs = Languages.current
8
+ assert(langs.length > 1)
9
+ assert(!langs.include?("."))
10
+ assert(!langs.include?(".."))
11
+ end
12
+
13
+ def test_parse_command_for_valid_language
14
+ args = %w{-l=java MyAppName}
15
+ assert_equal("java", Languages.parse(args))
16
+ args = %w{--language=ruby app_name}
17
+ assert_equal("ruby", Languages.parse(args))
18
+ end
19
+
20
+ def test_reject_invalid_language
21
+ args = %w{-l=non sense}
22
+ assert_raise RuntimeError do
23
+ Languages.parse(args)
24
+ end
25
+ end
26
+
27
+ def test_print_languages
28
+ base = "java|ruby"
29
+ print = Languages.print
30
+ assert(print.include?(base))
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+ require 'fileutils'
3
+
4
+ class TestRubyGenerator < 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('ruby', [APP_ROOT], sources)
17
+
18
+ assert_generated_file "rakefile.rb"
19
+ assert_directory_exists "lib/samples"
20
+ assert_generated_file "lib/samples/right_triangle.rb"
21
+ assert_generated_file "lib/tbox.rb"
22
+ assert_directory_exists "test/samples"
23
+ assert_generated_file "test/samples/test_right_triangle.rb"
24
+ assert_directory_exists "test/data"
25
+ assert_generated_file "test/data/file.txt"
26
+ assert_generated_file "test/test_io.rb"
27
+ assert_generated_file "test/test_helper.rb"
28
+
29
+ run_generated_build_script("rake")
30
+ end
31
+
32
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bobbyno-tbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: "0.6"
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-06-18 00:00:00 -07:00
12
+ date: 2009-06-24 00:00:00 -07:00
13
13
  default_executable: tbox
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,7 +32,7 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.8.0
34
34
  version:
35
- description: Provides a basic directory structure for test-driven learning.
35
+ description: "Test-driven learning is a way to master a programming language by writing unit tests around its API's. tbox 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:
@@ -44,7 +44,7 @@ extra_rdoc_files:
44
44
  - Manifest.txt
45
45
  - PostInstall.txt
46
46
  - README.rdoc
47
- - app_generators/tbox/templates/file.txt
47
+ - app_generators/ruby/templates/file.txt
48
48
  files:
49
49
  - History.txt
50
50
  - MIT-LICENSE
@@ -52,25 +52,36 @@ files:
52
52
  - PostInstall.txt
53
53
  - README.rdoc
54
54
  - Rakefile
55
- - app_generators/tbox/USAGE
56
- - app_generators/tbox/tbox_generator.rb
57
- - app_generators/tbox/templates/README
58
- - app_generators/tbox/templates/file.txt
59
- - app_generators/tbox/templates/rakefile.rb
60
- - app_generators/tbox/templates/right_triangle.rb
61
- - app_generators/tbox/templates/tbox.rb
62
- - app_generators/tbox/templates/test_helper.rb
63
- - app_generators/tbox/templates/test_io.rb
64
- - app_generators/tbox/templates/test_right_triangle.rb
55
+ - app_generators/java/USAGE
56
+ - app_generators/java/java_generator.rb
57
+ - app_generators/java/templates/Greeting.java
58
+ - app_generators/java/templates/GreetingTest.java
59
+ - app_generators/java/templates/build.xml
60
+ - app_generators/java/templates/lib/hamcrest-core.jar
61
+ - app_generators/java/templates/lib/junit.jar
62
+ - app_generators/java/templates/project.iml
63
+ - app_generators/java/templates/project.ipr
64
+ - app_generators/ruby/USAGE
65
+ - app_generators/ruby/ruby_generator.rb
66
+ - app_generators/ruby/templates/file.txt
67
+ - app_generators/ruby/templates/rakefile.rb
68
+ - app_generators/ruby/templates/right_triangle.rb
69
+ - app_generators/ruby/templates/tbox.rb
70
+ - app_generators/ruby/templates/test_helper.rb
71
+ - app_generators/ruby/templates/test_io.rb
72
+ - app_generators/ruby/templates/test_right_triangle.rb
65
73
  - bin/tbox
74
+ - lib/languages.rb
66
75
  - lib/tbox.rb
76
+ - lib/tbox_app_generator.rb
67
77
  - script/console
68
78
  - script/destroy
69
79
  - script/generate
70
- - tbox.gemspec
71
80
  - test/test_generator_helper.rb
72
81
  - test/test_helper.rb
73
- - test/test_tbox_generator.rb
82
+ - test/test_java_generator.rb
83
+ - test/test_languages.rb
84
+ - test/test_ruby_generator.rb
74
85
  has_rdoc: false
75
86
  homepage: http://github.com/bobbyno/tbox/tree/master
76
87
  post_install_message: PostInstall.txt
@@ -97,8 +108,10 @@ rubyforge_project: tbox
97
108
  rubygems_version: 1.2.0
98
109
  signing_key:
99
110
  specification_version: 3
100
- summary: "Test-driven learning is a way to master a programming language by writing unit tests around its API's, tbox 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 Rakefile to run all tests."
111
+ summary: Test-driven learning is a way to master a programming language by writing unit tests around its API's
101
112
  test_files:
102
113
  - test/test_generator_helper.rb
103
114
  - test/test_helper.rb
104
- - test/test_tbox_generator.rb
115
+ - test/test_java_generator.rb
116
+ - test/test_languages.rb
117
+ - test/test_ruby_generator.rb
@@ -1,84 +0,0 @@
1
- class TboxGenerator < RubiGen::Base
2
-
3
- DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
4
- Config::CONFIG['ruby_install_name'])
5
-
6
- default_options :author => nil
7
-
8
- attr_reader :name
9
-
10
- def initialize(runtime_args, runtime_options = {})
11
- super
12
- usage if args.empty?
13
- @destination_root = File.expand_path(args.shift)
14
- @name = base_name
15
- extract_options
16
- end
17
-
18
- def manifest
19
- record do |m|
20
- # Ensure appropriate folder(s) exists
21
- m.directory ''
22
- BASEDIRS.each { |path| m.directory path }
23
-
24
- m.file "rakefile.rb", "rakefile.rb"
25
- m.file "README", "README"
26
- m.file "../../../MIT-LICENSE", "MIT-LICENSE"
27
- # Create stubs
28
- # m.template "template.rb", "some_file_after_erb.rb"
29
- # m.template_copy_each ["template.rb", "template2.rb"]
30
- # m.file "file", "some_file_copied"
31
- # m.file_copy_each ["path/to/file", "path/to/file2"]
32
- m.directory "lib/samples"
33
- m.file "right_triangle.rb", "lib/samples/right_triangle.rb"
34
- m.file "tbox.rb", "lib/tbox.rb"
35
- m.directory "test/samples"
36
- m.directory "test/data"
37
- m.file "test_right_triangle.rb", "test/samples/test_right_triangle.rb"
38
- m.file "test_io.rb", "test/test_io.rb"
39
- m.file "file.txt", "test/data/file.txt"
40
- m.file "test_helper.rb", "test/test_helper.rb"
41
-
42
- m.dependency "install_rubigen_scripts", [destination_root, 'tbox'],
43
- :shebang => options[:shebang], :collision => :force
44
- end
45
- end
46
-
47
- protected
48
- def banner
49
- <<-EOS
50
- Creates a test-driven learning environment: A directory structure, some sample classes and unit tests,
51
- and a Rakefile to run all tests.
52
-
53
- USAGE: #{spec.name} dir_name
54
- EOS
55
- end
56
-
57
- def add_options!(opts)
58
- opts.separator ''
59
- opts.separator 'Options:'
60
- # For each option below, place the default
61
- # at the top of the file next to "default_options"
62
- # opts.on("-a", "--author=\"Your Name\"", String,
63
- # "Some comment about this option",
64
- # "Default: none") { |o| options[:author] = o }
65
- opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
66
- end
67
-
68
- def extract_options
69
- # for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
70
- # Templates can access these value via the attr_reader-generated methods, but not the
71
- # raw instance variable value.
72
- # @author = options[:author]
73
- end
74
-
75
- # Installation skeleton. Intermediate directories are automatically
76
- # created so don't sweat their absence here.
77
- BASEDIRS = %w(
78
- lib
79
- log
80
- script
81
- test
82
- tmp
83
- )
84
- end