yesman 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -26,7 +26,7 @@ There are several optional parameters you can use that will adjust the following
26
26
 
27
27
  -o Output Directory Name (defaults to "bin")
28
28
 
29
- -x C++ extension to use for generated files (defaults to "cpp")
29
+ -e C++ extension to use for generated files (defaults to "cpp")
30
30
 
31
31
  ## Requirements
32
32
 
data/bin/yesman CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  require 'yesman'
4
4
  require 'yesman/cli_parser'
5
+ require 'yesman/config_proxy'
6
+ require 'yesman/global_config'
7
+ require 'yesman/class_type'
8
+ require 'yesman/templater'
5
9
 
6
- options = {}
7
-
8
- command = ARGV.shift
9
10
 
10
11
  def new_project
11
12
  project_name = ARGV.shift
@@ -13,11 +14,14 @@ def new_project
13
14
  parser.run ARGV
14
15
  parser.config[:project_name] = project_name
15
16
  puts "Generating new project: #{parser.config[:project_name]}"
17
+
16
18
  y = Yesman.new parser.config
17
19
  end
18
20
 
19
21
  def run_project
20
22
  flag = ARGV.shift
23
+ #cp = ConfigProxy.new
24
+ #puts cp.params
21
25
  if flag == '-d'
22
26
  debug_project
23
27
  else
@@ -33,17 +37,48 @@ def test_project
33
37
  puts "test not yet supported"
34
38
  end
35
39
 
40
+ def generate
41
+ c = ConfigProxy.new
42
+ if (c.config_exists?)
43
+ info = ARGV.shift
44
+ g = ClassGenerator.new
45
+ puts "Creating #{info}"
46
+ g.create_class_files info
47
+ else
48
+ puts "Da Da Dunn... you are not in a yesman project ABORTING..."
49
+ end
50
+ end
51
+
52
+ def init
53
+ load_global_config
54
+ run_commands
55
+ end
56
+
57
+ def load_global_config
58
+ gc = GlobalConfig.new.load
59
+ end
36
60
 
37
- case command
38
- when 'new'
39
- new_project
40
- when 'run'
41
- run_project
42
- when 'test'
43
- test_project
44
- else
45
- puts "command: #{command} not recognized"
61
+ def run_commands
62
+ command = ARGV.shift
63
+ case command
64
+ when 'new'
65
+ new_project
66
+ when 'run'
67
+ run_project
68
+ when 'test'
69
+ test_project
70
+ when 'generate'
71
+ generate
72
+ when 'g'
73
+ generate
74
+ else
75
+ puts "command: #{command} not recognized"
76
+ end
46
77
  end
47
78
 
48
79
 
80
+ init
81
+
82
+
83
+
49
84
 
@@ -0,0 +1,80 @@
1
+ require 'yesman/class_type'
2
+ require 'yesman/templater'
3
+ require 'yesman/file_util'
4
+ require 'yesman/config_proxy'
5
+
6
+ class ClassGenerator
7
+
8
+ attr_reader :templates_path
9
+ attr_reader :header_path
10
+ attr_reader :class_path
11
+ attr_reader :test_path
12
+ attr_reader :main_path
13
+ attr_reader :gtest_main_path
14
+
15
+ def initialize
16
+ @templates_path = "#{Dir.home}/.yesman/templates/"
17
+ @header_path = create_path "header.cxx.erb"
18
+ @class_path = create_path "class.cxx.erb"
19
+ @test_path = create_path "test.cxx.erb"
20
+ @main_path = create_path "main.cxx.erb"
21
+ @gtest_main_path = create_path "gtest_main.cxx.erb"
22
+
23
+ @templater = Templater.new
24
+ end
25
+
26
+ def create_class_files input
27
+ c = create_class_type input
28
+ files = [header_path, class_path, test_path]
29
+ files.each do |path|
30
+ file_contents = @templater.merge c, path
31
+ FileUtil.write_to_file create_file_name( c, path ), file_contents
32
+ end
33
+
34
+ end
35
+
36
+ def create_main
37
+ c = create_class_type "Main"
38
+ output_file_path = "#{params[:source]}/#{params[:project_name]}.#{params[:extension]}"
39
+ FileUtil.write_to_file( output_file_path, ( @templater.merge c, main_path) )
40
+ end
41
+
42
+ def create_gtest_main
43
+ c = create_class_type "GTestMain"
44
+ file_contents = @templater.merge c, gtest_main_path
45
+ FileUtil.write_to_file "#{params[:tests]}/#{params[:project_name]}Tests.#{params[:extension]}", file_contents
46
+ end
47
+
48
+ private
49
+
50
+
51
+ def create_file_name class_type, path
52
+ file_name = ""
53
+ case path
54
+ when header_path
55
+ file_name << "#{params[:source]}/" << class_type.class_name << ".h"
56
+ when class_path
57
+ file_name << "#{params[:source]}/" << class_type.class_name << ".#{params[:extension]}"
58
+ when test_path
59
+ file_name << "#{params[:tests]}/" << class_type.class_name << "Test.#{params[:extension]}"
60
+ else
61
+ file_name << "undefined"
62
+ end
63
+ file_name
64
+ end
65
+
66
+ def create_class_type input
67
+ c = ClassType.new
68
+ c.parse_from_string input
69
+ c
70
+ end
71
+
72
+ def create_path filename
73
+ "#{templates_path}#{filename}"
74
+ end
75
+
76
+ def params
77
+ cp = ConfigProxy.new
78
+ cp.params
79
+ end
80
+ end
@@ -0,0 +1,53 @@
1
+ require 'erb'
2
+ require 'yesman/config_proxy'
3
+
4
+ class ClassType
5
+ attr_reader :class_name
6
+ attr_reader :namespace
7
+ attr_reader :super_class
8
+ attr_reader :source
9
+
10
+ def initialize
11
+ @class_name = nil
12
+ @namespace = nil
13
+ @super_class = nil
14
+ @source = ConfigProxy.new.params[:source]
15
+ end
16
+
17
+ def parse_from_string input
18
+ input = input.to_s
19
+ st = input.split("<")
20
+ st.each {|s| s.strip!}
21
+
22
+ create_name_namespace st[0]
23
+
24
+ if st[1] || st[1] != ""
25
+ create_super st[1]
26
+ else
27
+ @super_class = nil
28
+ end
29
+ end
30
+
31
+ def get_binding
32
+ binding
33
+ end
34
+
35
+ private
36
+
37
+ def create_name_namespace input
38
+ if input.index( "::" )
39
+ @namespace, @class_name = input.split "::"
40
+ else
41
+ @class_name = input
42
+ end
43
+ end
44
+
45
+ def create_super input
46
+ @super_class = nil
47
+ if input
48
+ @super_class = ClassType.new
49
+ @super_class.parse_from_string input
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,42 @@
1
+ require 'yaml'
2
+
3
+ class ConfigProxy
4
+
5
+ attr_reader :params
6
+ attr_reader :config_path
7
+
8
+ def initialize
9
+ @params = nil
10
+ @config_path = ".yesman/config"
11
+ end
12
+
13
+ def create_config params
14
+ verify_config_exists
15
+ File.open( config_path, "w" ) do |file|
16
+ file.write params.to_yaml
17
+ end
18
+ @params = params;
19
+ end
20
+
21
+ def load_config
22
+ verify_config_exists
23
+ @params = YAML::load_file config_path
24
+ end
25
+
26
+ def params
27
+ if @params == nil
28
+ load_config
29
+ end
30
+ @params
31
+ end
32
+
33
+ def config_exists?
34
+ return File.exists? config_path
35
+ end
36
+
37
+ private
38
+ def verify_config_exists
39
+ FileUtil.ensure_file config_path
40
+ end
41
+
42
+ end
@@ -1,4 +1,5 @@
1
1
  require 'yesman/file_util'
2
+ require 'yesman/class_generator'
2
3
 
3
4
  class CppCreator
4
5
  attr_reader :source
@@ -9,6 +10,7 @@ class CppCreator
9
10
 
10
11
  def initialize(params = {})
11
12
  set_defaults params
13
+ @gen = ClassGenerator.new
12
14
  end
13
15
 
14
16
  def create_project
@@ -34,37 +36,10 @@ private
34
36
  end
35
37
 
36
38
  def create_source_main
37
- filename = "#{source}/#{project_name}.#{extension}"
38
- FileUtil.ensure_file filename
39
- FileUtil.write_to_file filename, get_source_main
39
+ @gen.create_main
40
40
  end
41
41
 
42
42
  def create_test_main
43
- filename = "#{tests}/#{project_name}Tests.#{extension}"
44
- FileUtil.ensure_file filename
45
- FileUtil.write_to_file filename, get_test_main
46
- end
47
-
48
- def get_test_main
49
- main = <<END
50
- #include "gtest/gtest.h"
51
-
52
- GTEST_API_ int main(int argc, char **argv) {
53
- testing::InitGoogleTest(&argc, argv);
54
- return RUN_ALL_TESTS();
55
- }
56
- END
57
- end
58
-
59
- def get_source_main
60
- main = <<END
61
- #include <iostream>
62
-
63
- int main() {
64
- std::cout << "What up world!" << std::endl;
65
- return 0;
66
- }
67
-
68
- END
43
+ @gen.create_gtest_main
69
44
  end
70
45
  end
@@ -30,16 +30,19 @@ class FileUtil
30
30
  end
31
31
 
32
32
  def self.write_to_file filename, contents
33
+ self.ensure_file filename
33
34
  File.open( filename, "w" ) { |f| f.write( contents ) }
34
35
  end
35
36
  private
36
37
 
37
38
  def self.create_directories dirs
38
39
  next_path = ""
40
+ exists = false
39
41
  dirs.each do |dirname|
40
42
  next_path << dirname << "/"
41
- self.verify_or_make_dir next_path
43
+ exists = self.verify_or_make_dir next_path
42
44
  end
45
+ exists
43
46
  end
44
47
 
45
48
  def self.determine_path path
@@ -48,11 +51,17 @@ private
48
51
  end
49
52
 
50
53
  def self.verify_or_make_dir dirname
51
- `mkdir #{dirname}` unless (File.exists? dirname) && (File.directory? dirname)
54
+ pre_existing = (File.exists? dirname) && (File.directory? dirname)
55
+ `mkdir #{dirname}` unless pre_existing
56
+ pre_existing
52
57
  end
53
58
 
54
59
  def self.verify_or_make_file filename
55
- `touch #{filename}` unless (File.exists? filename)
60
+ pre_existing = (File.exists? filename)
61
+ unless pre_existing
62
+ `touch #{filename}`
63
+ end
64
+ pre_existing
56
65
  end
57
66
 
58
67
  end
@@ -0,0 +1,42 @@
1
+ class GlobalConfig
2
+ attr_reader :pre_existing
3
+ attr_reader :global_config_path
4
+
5
+ def initialize
6
+ @pre_existing = false
7
+ @global_config_path = "#{Dir.home}/.yesman"
8
+ end
9
+
10
+ def load
11
+ ensure_config_dir
12
+
13
+ if !pre_existing
14
+ puts "Copying file templates to #{global_config_path}"
15
+ copy_templates
16
+ create_global_config
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def copy_templates
23
+ FileUtil.ensure_path "#{global_config_path}/templates"
24
+ templates = File.join(File.dirname(File.expand_path(__FILE__)), 'templates');
25
+ FileUtil.recursive_copy(templates, global_config_path)
26
+ end
27
+
28
+ def create_global_config
29
+ params = {};
30
+ params[:source] = "src"
31
+ params[:output] = "bin"
32
+ params[:tests] = "tests"
33
+ params[:ext] = "cpp"
34
+ #TODO Write these to a config file in global_config_path
35
+ #I'm not sold that you need them at this point
36
+ end
37
+
38
+ def ensure_config_dir
39
+ @pre_existing = FileUtil.ensure_path global_config_path
40
+ end
41
+
42
+ end
@@ -6,8 +6,7 @@ class GTestInstaller
6
6
  attr_reader :gtest_dir
7
7
  attr_reader :gtest_path
8
8
  attr_reader :attr_names
9
- attr_reader :params
10
-
9
+ attr_reader :params
11
10
  def initialize options
12
11
  @params = options
13
12
  @gtest_dir = "gtest"
@@ -29,13 +28,11 @@ class GTestInstaller
29
28
  private
30
29
 
31
30
  def print_start
32
- puts "********************************"
33
- puts "** Google Test Setup **"
34
- puts "********************************"
31
+ puts "Google Test Setup"
35
32
  end
36
33
 
37
34
  def pull_source
38
- puts "checkout (svn) of GTest source code..."
35
+ puts "svn checkout of GTest source code..."
39
36
  `svn checkout #{gtest_path} #{repo_path}`
40
37
  end
41
38
 
@@ -45,7 +42,6 @@ private
45
42
  end
46
43
 
47
44
  def create_static_lib
48
- puts "creating GTest static lib: 'libgtest.a'"
49
45
  `ar -rv #{params[:tests]}/gtest/libgtest.a #{params[:tests]}/gtest/gtest-all.o`
50
46
  end
51
47
 
@@ -65,6 +61,7 @@ private
65
61
  FileUtil.kill_directory gtest_dir
66
62
  FileUtil.kill_file "#{params[:tests]}/gtest/gtest-all.o"
67
63
  FileUtil.kill_directory "#{params[:tests]}/gtest/include/gtest/.svn"
64
+ FileUtil.kill_directory "#{params[:tests]}/gtest/include/gtest/internal/.svn"
68
65
  end
69
66
 
70
67
  def repo_path
@@ -0,0 +1,22 @@
1
+ require 'erb'
2
+
3
+ class Templater
4
+
5
+ def merge class_type, template_path
6
+ @class_type = class_type
7
+ @template_path = template_path
8
+
9
+ load_template
10
+ apply_class_to_template
11
+ @output
12
+ end
13
+
14
+ def load_template
15
+ @loaded_template = ERB.new File.read( @template_path )
16
+ end
17
+
18
+ def apply_class_to_template
19
+ @output = @loaded_template.result( @class_type.get_binding )
20
+ end
21
+
22
+ end
@@ -0,0 +1,14 @@
1
+ #include "<%=class_name%>.h"
2
+ <% if namespace %>
3
+ namespace <%=namespace%> {
4
+ <%end%>
5
+ <%=class_name%>::<%=class_name%>() {
6
+ // TODO Auto-generated constructor stub
7
+ }
8
+
9
+ <%=class_name%>::~<%=class_name%>() {
10
+ // TODO Auto-generated destructor stub
11
+ }
12
+ <% if namespace %>
13
+ } /* namespace <%=namespace%> */
14
+ <%end%>
@@ -0,0 +1,6 @@
1
+ #include "gtest/gtest.h"
2
+
3
+ GTEST_API_ int main(int argc, char **argv) {
4
+ testing::InitGoogleTest(&argc, argv);
5
+ return RUN_ALL_TESTS();
6
+ }
@@ -0,0 +1,17 @@
1
+ #ifndef <%=@class_name.upcase%>_H_
2
+ #define <%=@class_name.upcase%>_H_
3
+ <% if @super_class%>#include "<%=@super_class.class_name%>.h"<%end%>
4
+ <% if @namespace %>
5
+ namespace <%=@namespace%> {
6
+ <%end%>
7
+ class <%=@class_name%><%if @super_class%>: public <%if @super_class.namespace%><%=@super_class.namespace%>::<%end%><%=@super_class.class_name%><%end%> {
8
+ public:
9
+ <%=@class_name%>();
10
+ virtual ~<%=@class_name%>();
11
+
12
+
13
+ };
14
+ <% if @namespace %>
15
+ } /* namespace <%=@namespace%> */
16
+ <%end%>
17
+ #endif /* <%=@class_name.upcase%>_H_ */
@@ -0,0 +1,6 @@
1
+ #include <iostream>
2
+
3
+ int main() {
4
+ std::cout << "What up world!!" << std::endl;
5
+ return 0;
6
+ }
@@ -0,0 +1,27 @@
1
+ #include "gtest/gtest.h"
2
+ #include "../<%=source%>/<%=@class_name%>.h"
3
+
4
+ <%if @namespace%>using namespace <%=@namespace%>;<%end%>
5
+
6
+ class <%=class_name%>Test : public testing::Test {
7
+ protected:
8
+
9
+ virtual void SetUp() {
10
+ // Called before each test, dump if not necessary
11
+ }
12
+
13
+ virtual void TearDown() {
14
+ // Called after each test is run, dump if not necesary
15
+ }
16
+
17
+ // Declare any needed helper methods
18
+
19
+
20
+ // Declare variables your tests want to use
21
+
22
+
23
+ };
24
+
25
+ TEST_F(<%=class_name%>Test, Method) {
26
+ EXPECT_EQ( 1, 1 );
27
+ }
@@ -1,3 +1,3 @@
1
1
  module Yesman
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/yesman.rb CHANGED
@@ -7,6 +7,7 @@ class Yesman
7
7
 
8
8
  def initialize options = {}
9
9
  create_defaults options
10
+ @cp = ConfigProxy.new
10
11
  init
11
12
  end
12
13
 
@@ -26,11 +27,14 @@ class Yesman
26
27
  end
27
28
 
28
29
  def create_all
30
+ @cp.create_config params
29
31
  p = CppCreator.new params
30
32
  p.create_project
33
+ puts "Project directories created"
31
34
 
32
35
  g = GTestInstaller.new params
33
36
  g.download_and_install
37
+
34
38
  end
35
39
 
36
40
  end
@@ -0,0 +1,58 @@
1
+ require 'helper'
2
+
3
+ def create_class string
4
+ ex = ClassType.new
5
+ ex.parse_from_string string
6
+ ex
7
+ end
8
+ describe ClassType do
9
+
10
+ it "handles namespaced inheritance for both itself and parent" do
11
+ ct = ClassType.new
12
+ ct.parse_from_string "jsk::Testing < std::Parent"
13
+ ct.class_name.should eql "Testing"
14
+ ct.namespace.should eql "jsk"
15
+ ct.super_class.class_name.should eq "Parent"
16
+ ct.super_class.namespace.should eq "std"
17
+ end
18
+
19
+ it "should handle namespaced non inheritance" do
20
+ ct = create_class "jsk::Testing"
21
+ ct.class_name.should eq "Testing"
22
+ ct.namespace.should eq "jsk"
23
+ ct.super_class.should eq nil
24
+ end
25
+
26
+ it "should handle single class name with ns inheritance" do
27
+ cb = create_class "SingleTesting < jsk::Parent"
28
+ cb.class_name.should eq "SingleTesting"
29
+ cb.namespace.should eq nil
30
+ cb.super_class.namespace.should eq "jsk"
31
+ cb.super_class.class_name.should eq "Parent"
32
+ end
33
+
34
+ it "should handle non-ns for both self and super" do
35
+ cx = create_class "SingleTest < ParentTest"
36
+ cx.class_name.should eq "SingleTest"
37
+ cx.namespace.should eq nil
38
+ cx.super_class.namespace.should eq nil
39
+ cx.super_class.class_name.should eq "ParentTest"
40
+ end
41
+
42
+ it "should handle non-ns inherited" do
43
+ cj = create_class "jsk::BaseClass < Map"
44
+ cj.class_name.should eq "BaseClass"
45
+ cj.namespace.should eq "jsk"
46
+ cj.super_class.class_name.should eq "Map"
47
+ cj.super_class.namespace.should eq nil
48
+ end
49
+
50
+ it "should handle non inheritance, non ns" do
51
+ cp = create_class "FooBar"
52
+ cp.class_name.should eq "FooBar"
53
+ cp.namespace.should eq nil
54
+ cp.super_class.should eq nil
55
+ end
56
+ end
57
+
58
+
data/spec/helper.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'yesman/class_type'
2
+ require 'yesman/templater'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yesman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-22 00:00:00.000000000 Z
12
+ date: 2012-11-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mixlib-cli
@@ -42,11 +42,23 @@ files:
42
42
  - Rakefile
43
43
  - bin/yesman
44
44
  - lib/yesman.rb
45
+ - lib/yesman/class_generator.rb
46
+ - lib/yesman/class_type.rb
45
47
  - lib/yesman/cli_parser.rb
48
+ - lib/yesman/config_proxy.rb
46
49
  - lib/yesman/cpp_creator.rb
47
50
  - lib/yesman/file_util.rb
51
+ - lib/yesman/global_config.rb
48
52
  - lib/yesman/gtest_installer.rb
53
+ - lib/yesman/templater.rb
54
+ - lib/yesman/templates/class.cxx.erb
55
+ - lib/yesman/templates/gtest_main.cxx.erb
56
+ - lib/yesman/templates/header.cxx.erb
57
+ - lib/yesman/templates/main.cxx.erb
58
+ - lib/yesman/templates/test.cxx.erb
49
59
  - lib/yesman/version.rb
60
+ - spec/class_type_spec.rb
61
+ - spec/helper.rb
50
62
  - yesman.gemspec
51
63
  homepage: ''
52
64
  licenses: []
@@ -73,4 +85,6 @@ signing_key:
73
85
  specification_version: 3
74
86
  summary: Yesman creates project directory structures, downloads and builds GTest for
75
87
  C++ development projects
76
- test_files: []
88
+ test_files:
89
+ - spec/class_type_spec.rb
90
+ - spec/helper.rb