dirt 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/Gemfile +22 -0
  2. data/Gemfile.lock +91 -0
  3. data/MIT-LICENSE +23 -0
  4. data/README.md +150 -0
  5. data/core/contexts/commit_git_repository.rb +56 -0
  6. data/core/contexts/create_basic_face.rb +60 -0
  7. data/core/contexts/create_default_structure.rb +57 -0
  8. data/core/contexts/create_git_repository.rb +45 -0
  9. data/core/contexts/roles/.gitkeep +0 -0
  10. data/core/contexts/roles/generating.rb +26 -0
  11. data/core/dirt.rb +14 -0
  12. data/core/models/.gitkeep +0 -0
  13. data/core/tests/behaviours/commit_files.feature +36 -0
  14. data/core/tests/behaviours/create_basic_face.feature +49 -0
  15. data/core/tests/behaviours/create_default_structure.feature +55 -0
  16. data/core/tests/behaviours/create_vcs_repository.feature +26 -0
  17. data/core/tests/behaviours/step_definitions/given.rb +18 -0
  18. data/core/tests/behaviours/step_definitions/then.rb +55 -0
  19. data/core/tests/behaviours/step_definitions/when.rb +21 -0
  20. data/core/tests/behaviours/support/env.rb +100 -0
  21. data/core/tests/behaviours/support/helpers.rb +21 -0
  22. data/core/tests/factories.rb +23 -0
  23. data/core/version.rb +3 -0
  24. data/faces/cli/bin/dirt +6 -0
  25. data/faces/cli/integrations/generate_context.feature +40 -0
  26. data/faces/cli/integrations/generate_face.feature +53 -0
  27. data/faces/cli/integrations/generate_model.feature +11 -0
  28. data/faces/cli/integrations/generate_project.feature +143 -0
  29. data/faces/cli/integrations/generate_role.feature +12 -0
  30. data/faces/cli/integrations/step_definitions/given.rb +16 -0
  31. data/faces/cli/integrations/step_definitions/then.rb +48 -0
  32. data/faces/cli/integrations/step_definitions/when.rb +28 -0
  33. data/faces/cli/integrations/support/env.rb +21 -0
  34. data/faces/cli/optparse/main.rb +143 -0
  35. data/faces/cli/thor/.gitkeep +0 -0
  36. data/templates/faces/web/template.helpers.rb +4 -0
  37. data/templates/template.Gemfile +18 -0
  38. data/templates/template.env.rb +13 -0
  39. data/templates/template.gitignore +21 -0
  40. data/templates/template.project_name.rb +14 -0
  41. metadata +104 -0
@@ -0,0 +1,21 @@
1
+ require 'rspec/matchers'
2
+
3
+ RSpec::Matchers.define :exist do
4
+ match do |actual_path|
5
+ File.exist?(actual_path) == true
6
+ end
7
+
8
+ failure_message_for_should do |actual|
9
+ "expected '#{actual.to_s}' to exist"
10
+ end
11
+ end
12
+
13
+ def recent_history(n=1)
14
+ unless @commands
15
+ FakeFS.deactivate!
16
+ @commands = history.to_a
17
+ FakeFS.activate!
18
+ end
19
+
20
+ @commands.shift(n)
21
+ end
@@ -0,0 +1,23 @@
1
+ #--
2
+ # Copyright (c) 2014 Tenjin Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
@@ -0,0 +1,3 @@
1
+ module Dirt
2
+ VERSION = '0.1.1'
3
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ require 'bundler'
3
+ #Bundler.setup(:default)
4
+ require_relative '../optparse/main'
5
+
6
+ Samling::Cli::Main.new.execute!(ARGV.dup)
@@ -0,0 +1,40 @@
1
+ Feature: it should create new Dirt context in the context directory
2
+
3
+ Scenario:
4
+ Given this feature is unimplemented
5
+
6
+ # Happy cases:
7
+ # dirt generate context CLASSNAME
8
+
9
+ # Unhappy cases:
10
+ # dirt generate context
11
+
12
+
13
+ # Scenario Outline: Running with just project flag
14
+ # Given I am in "<parent_path>"
15
+ # When I run dirt generate with:
16
+ # | flag | value |
17
+ # | project | <project_name> |
18
+ # Then it should say "Time to grow, little <project_name>..."
19
+ # And it should say "Created project structure in <parent_path>/<project_directory>."
20
+ # And ls should show the following files in "<parent_path>/<project_directory>":
21
+ # | path |
22
+ # | config |
23
+ # | dirt/contexts |
24
+ # | dirt/contexts/roles |
25
+ # | dirt/models |
26
+ # | dirt/tests/behaviours |
27
+ # | dirt/tests/behaviours/support |
28
+ # | dirt/tests/behaviours/step_definitions |
29
+ # | dirt/tests/isolations |
30
+ # | faces |
31
+ # Examples:
32
+ # | parent_path | project_directory | project_name |
33
+ # | | my_project | My Project |
34
+ # | a_path/to/the project | my_project | My Project |
35
+ # | | my_other_project | My Other Project |
36
+ # | some/other/path | my_other_project | My Other Project |
37
+ #
38
+ # Scenario: it should require a project name
39
+ # When I run dirt generate with no args
40
+ # Then it should say "Usage: samling [options] arguments"
@@ -0,0 +1,53 @@
1
+ Feature: it should create new face with its default contents
2
+ # === Happy cases ====
3
+ Scenario Outline: dirt generate face PLATFORM
4
+ Given this feature is unimplemented
5
+ Examples:
6
+ | nope |
7
+
8
+ Scenario Outline: dirt generate face PLATFORM/ENGINE
9
+ Given this feature is unimplemented
10
+ Examples:
11
+ | nope |
12
+
13
+ # === Unhappy cases ====
14
+ # dirt generate project --name test --face
15
+ Scenario: Generate project with name and face but no face arg
16
+ Given this feature is unimplemented
17
+
18
+ # dirt generate face no_platform
19
+ Scenario: Generate face but platform does not exist
20
+ Given this feature is unimplemented
21
+
22
+ # dirt generate face platform/no_engine
23
+ Scenario: Generate face but engine does not exist
24
+ Given this feature is unimplemented
25
+
26
+ # Scenario Outline: Running with just project flag
27
+ # Given I am in "<parent_path>"
28
+ # When I run dirt generate with:
29
+ # | flag | value |
30
+ # | project | <project_name> |
31
+ # Then it should say "Time to grow, little <project_name>..."
32
+ # And it should say "Created project structure in <parent_path>/<project_directory>."
33
+ # And ls should show the following files in "<parent_path>/<project_directory>":
34
+ # | path |
35
+ # | config |
36
+ # | dirt/contexts |
37
+ # | dirt/contexts/roles |
38
+ # | dirt/models |
39
+ # | dirt/tests/behaviours |
40
+ # | dirt/tests/behaviours/support |
41
+ # | dirt/tests/behaviours/step_definitions |
42
+ # | dirt/tests/isolations |
43
+ # | faces |
44
+ # Examples:
45
+ # | parent_path | project_directory | project_name |
46
+ # | | my_project | My Project |
47
+ # | a_path/to/the project | my_project | My Project |
48
+ # | | my_other_project | My Other Project |
49
+ # | some/other/path | my_other_project | My Other Project |
50
+ #
51
+ # Scenario: it should require a project name
52
+ # When I run dirt generate with no args
53
+ # Then it should say "Usage: samling [options] arguments"
@@ -0,0 +1,11 @@
1
+ Feature: it should create new Dirt model in the models directory
2
+
3
+ Scenario:
4
+ Given this feature is unimplemented
5
+
6
+ # Happy cases:
7
+ # dirt generate model CLASSNAME
8
+
9
+ # Unhappy cases:
10
+ # dirt generate model
11
+
@@ -0,0 +1,143 @@
1
+ Feature: it should create new project with its default contents and an accompanying git repo
2
+
3
+ # === Happy cases ====
4
+ # dirt generate project --name NAME --bare-path PATH
5
+ Scenario Outline: generate project with just name, assume location is CWD
6
+ Given I am in "<parent path>"
7
+ When I generate a project with:
8
+ | flag | value |
9
+ | name | <given name> |
10
+ | bare-path | <bare path> |
11
+ Then it should say "Time to grow, little <displayed name>..."
12
+ And it should have called "git init --bare <bare path>/<project directory>.git"
13
+ And ls should show the following files in "<parent path>/<project directory>":
14
+ | path |
15
+ | core/contexts |
16
+ | core/contexts/roles |
17
+ | core/models |
18
+ | core/tests/behaviours |
19
+ | core/tests/behaviours/support |
20
+ | core/tests/behaviours/step_definitions |
21
+ | core/tests/isolations |
22
+ | faces |
23
+ | persist |
24
+ And it should say "Created project structure in <parent path>/<project directory>."
25
+ And it should say "Comitting and pushing..."
26
+ And it should have called "git --git-dir "<parent path>/<project directory>/.git" --work-tree "<parent path>/<project directory>" push origin master"
27
+ Examples:
28
+ | given name | displayed name | parent path | project directory | bare path |
29
+ | my project | My Project | /a_path/to/the project | my_project | some/git |
30
+ | my other project | My Other Project | /some/other/path | my_other_project | different/bares |
31
+
32
+ # dirt generate project --name NAME --location PATH --bare-path PATH
33
+ Scenario Outline: generate project with location
34
+ Given I am in "/"
35
+ When I generate a project with:
36
+ | flag | value |
37
+ | name | my project |
38
+ | bare-path | some/git |
39
+ | location | <parent path> |
40
+ And it should have called "git init --bare some/git/my_project.git"
41
+ And it should say "Created project structure in <parent path>/my_project." somewhere
42
+ And it should have called "git --git-dir "<parent path>/my_project/.git" --work-tree "<parent path>/my_project" push origin master"
43
+ Examples:
44
+ | parent path |
45
+ | /a_path/to/the project |
46
+ | /some/other/path |
47
+
48
+ # dirt generate project --name NAME --bare-path PATH --host HOSTNAME
49
+ Scenario Outline: generate project with host name, assume user
50
+ Given I am in "<project path>"
51
+ And that I am logged in as "<user>" on <platform>
52
+ When I generate a project with:
53
+ | flag | value |
54
+ | name | my project |
55
+ | bare-path | <bare path> |
56
+ | host | <host> |
57
+ And it should have called "ssh <user>\@<host> "git init --bare <bare path>/my_project.git""
58
+ And it should say "Created project structure in <project path>/my_project." somewhere
59
+ And it should have called "git --git-dir "<project path>/my_project/.git" --work-tree "<project path>/my_project" push origin master"
60
+ Examples:
61
+ | platform | host | user | bare path | project path |
62
+ | linux | machine1 | userA | some/git | /a_path/to/the project |
63
+ | windows | machine1 | userA | some/git | /a_path/to/the project |
64
+ | linux | machine2 | userB | different/bares | /some/other/path |
65
+ | windows | machine2 | userB | different/bares | /some/other/path |
66
+
67
+ # dirt generate project --name NAME --bare-path PATH --host HOSTNAME --user USER
68
+ Scenario Outline: generate project with host name and user
69
+ Given I am in "<project path>"
70
+ When I generate a project with:
71
+ | flag | value |
72
+ | name | my project |
73
+ | bare-path | <bare path> |
74
+ | host | <host> |
75
+ | user | <user> |
76
+ And it should have called "ssh <user>\@<host> "git init --bare <bare path>/my_project.git""
77
+ And it should say "Created project structure in <project path>/my_project." somewhere
78
+ And it should have called "git --git-dir "<project path>/my_project/.git" --work-tree "<project path>/my_project" push origin master"
79
+ Examples:
80
+ | host | user | bare path | project path |
81
+ | machine1 | userA | some/git | /a_path/to/the project |
82
+ | machine2 | userB | different/bares | /some/other/path |
83
+
84
+ # dirt generate project --name NAME --face PLATFORM/ENGINE
85
+ Scenario Outline: Generate project with face
86
+ Given this feature is unimplemented
87
+ Examples:
88
+ | nope |
89
+ | |
90
+
91
+ # dirt generate project --name NAME --location PATH --face PLATFORM/ENGINE
92
+ Scenario Outline: Generate project with location and face
93
+ Given this feature is unimplemented
94
+ Examples:
95
+ | nope |
96
+ | |
97
+
98
+ # === Unhappy cases ====
99
+ # dirt generate project
100
+ Scenario: Generate project without name
101
+ When I generate a project with:
102
+ | flag | value |
103
+ | bare-path | anything |
104
+ Then it should say the usage
105
+ And it should exit with an error
106
+
107
+ # dirt generate project
108
+ Scenario: Generate project without bare path
109
+ When I generate a project with:
110
+ | flag | value |
111
+ | name | anything |
112
+ Then it should say the usage
113
+ And it should exit with an error
114
+
115
+
116
+ # Scenario Outline: Running with just project flag
117
+ # Given I am in "<parent_path>"
118
+ # When I run dirt generate with:
119
+ # | flag | value |
120
+ # | project | <project_name> |
121
+ # Then it should say "Time to grow, little <project_name>..."
122
+ # And it should say "Created project structure in <parent_path>/<project_directory>."
123
+ # And ls should show the following files in "<parent_path>/<project_directory>":
124
+ # | path |
125
+ # | config |
126
+ # | core/contexts |
127
+ # | core/contexts/roles |
128
+ # | core/models |
129
+ # | core/tests/behaviours |
130
+ # | core/tests/behaviours/support |
131
+ # | core/tests/behaviours/step_definitions |
132
+ # | core/tests/isolations |
133
+ # | faces |
134
+ # Examples:
135
+ # | parent_path | project_directory | project_name |
136
+ # | | my_project | My Project |
137
+ # | a_path/to/the project | my_project | My Project |
138
+ # | | my_other_project | My Other Project |
139
+ # | some/other/path | my_other_project | My Other Project |
140
+ #
141
+ # Scenario: it should require a project name
142
+ # When I run dirt generate with no args
143
+ # Then it should say "Usage: samling [options] arguments"
@@ -0,0 +1,12 @@
1
+ Feature: it should create Dirt role in roles directory
2
+
3
+ Scenario:
4
+ Given this feature is unimplemented
5
+
6
+ # Happy cases:
7
+ # dirt generate role CLASSNAME
8
+
9
+ # Unhappy cases:
10
+ # dirt generate role
11
+
12
+
@@ -0,0 +1,16 @@
1
+ Given(/^this feature is unimplemented$/) do
2
+ pending 'This feature is yet to be fleshed out.'
3
+ end
4
+
5
+ Given(/^I am in "(.*?)"$/) do |path|
6
+ FileUtils.mkdir_p(path)
7
+ @run_dir = path
8
+ end
9
+
10
+ Given(/^that I am logged in as "(.*?)" on (windows|linux)$/) do |username, platform|
11
+ if platform == 'linux'
12
+ ENV['USER'] = username
13
+ else
14
+ ENV['USERNAME'] = username
15
+ end
16
+ end
@@ -0,0 +1,48 @@
1
+ Then(/^it should say "(.*?)"$/) do |msg|
2
+ @output.readline.strip.should == msg
3
+ end
4
+
5
+ Then(/^it should say "(.*?)" somewhere$/) do |msg|
6
+ pos = @output.pos
7
+
8
+ @output.rewind
9
+ @output.read.split("\n").should include(msg)
10
+
11
+ @output.seek(pos)
12
+ end
13
+
14
+ Then(/^it should say the usage$/) do
15
+ pos = @output.pos
16
+
17
+ @output.rewind
18
+ (@output.read || '').should include 'Usage:'
19
+
20
+ @output.seek(pos)
21
+ end
22
+
23
+ Then(/^ls should show the following files in "(.*?)":$/) do |location, table|
24
+ Dir.chdir(location) do
25
+
26
+ # ideally use `tree -ifd` instead
27
+
28
+ paths = Dir[location + '/**/*']
29
+
30
+ table.hashes.collect do |h|
31
+ paths.should include h[:path]
32
+ end
33
+ end
34
+ end
35
+
36
+ Then(/^there should( not)? be a( central)? git repository in "(.*?)"$/) do |exists, central, location|
37
+ pending 'use ls to check if there is a .git repo in that file'
38
+ end
39
+
40
+ Then(/^it should have called "(.*?)"$/) do |command|
41
+ FakeFS.deactivate!
42
+ history.should include command.shellsplit
43
+ FakeFS.activate!
44
+ end
45
+
46
+ Then(/^it should exit with an error$/) do
47
+ @exited.should be_true
48
+ end
@@ -0,0 +1,28 @@
1
+ When(/^I generate a project with:$/) do |table|
2
+ Dir.chdir(@run_dir || Dir.pwd) do
3
+ options = table.hashes.collect do |h|
4
+ ["--#{h[:flag]}", "#{h[:value]}"]
5
+ end.flatten
6
+
7
+ input = StringIO.new
8
+ @output = StringIO.new
9
+ err = StringIO.new
10
+ kernel = double('kernel')
11
+
12
+ kernel.stub(:exit) do
13
+ raise KernelExited
14
+ end
15
+
16
+ begin
17
+ Samling::Cli::Main.new(input, @output, err, kernel).execute!(['generate'] + options)
18
+
19
+ @output.rewind
20
+ rescue KernelExited
21
+ @exited = true
22
+ end
23
+ end
24
+ end
25
+
26
+ When(/^I run dirt generate with no args$/) do
27
+ expect { step('I run dirt generate with:', table([%w{flag value}])) }.to raise_error(SystemExit)
28
+ end
@@ -0,0 +1,21 @@
1
+ require './faces/cli/optparse/main.rb'
2
+
3
+ require './core/tests/behaviours/support/env'
4
+
5
+ require 'cucumber/rspec/doubles'
6
+
7
+ Before do
8
+ @env_user = ENV['USER']
9
+ @env_username = ENV['USERNAME']
10
+
11
+ @exited = false
12
+ end
13
+
14
+ After do
15
+ ENV['USER']= @env_user
16
+ ENV['USERNAME'] = @env_username
17
+ end
18
+
19
+ class KernelExited < Exception
20
+
21
+ end
@@ -0,0 +1,143 @@
1
+ #--
2
+ # Copyright (c) 2014 Tenjin Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ src_dir = File.expand_path('../../../../core', __FILE__)
25
+ $LOAD_PATH.unshift(src_dir) unless $LOAD_PATH.include?(src_dir)
26
+
27
+ require 'dirt'
28
+
29
+ require 'optparse'
30
+ require 'yaml'
31
+
32
+ module Samling
33
+ module Cli
34
+ # Main command line interface (CLI) controller. Handles standard CLI input.
35
+ class Main
36
+ # Defines each of the standard OS interfaces to default values, unless
37
+ # otherwise specified.
38
+ def initialize(stdin=STDIN, stdout=STDOUT, stderr=STDERR, kernel=Kernel)
39
+ $stdin, $stdout, $stderr = stdin, stdout, stderr
40
+
41
+ @kernel = kernel
42
+ end
43
+
44
+ # The primary invocation method for the application.
45
+ # It sets up the components of the application as
46
+ # required by the input arguments, then runs the Contexts.
47
+ def execute!(argv)
48
+ options = parse_args(argv)
49
+
50
+ select_and_run_context(options)
51
+ end
52
+
53
+ # Parses the argument array as received from the CLI.
54
+ def parse_args(args)
55
+ options = {}
56
+ args ||= []
57
+
58
+ parser = OptionParser.new do |opts|
59
+ opts.banner = 'Usage: dirt generate [options]'
60
+
61
+ opts.separator ''
62
+ opts.separator 'Specific options:'
63
+
64
+ # ===================================
65
+ # Add option recognisers here
66
+ # ===================================
67
+
68
+ opts.on('-n', '--name NAME',
69
+ 'The human-readable name of the new project. Put it in quotes if you want spaces.') do |name|
70
+ options[:project_name] = name.titlecase
71
+ end
72
+
73
+ opts.on('-l', '--location PATH',
74
+ 'The parent directory of the new project on the local machine.') do |path|
75
+ options[:project_parent] = Pathname.new(path)
76
+ end
77
+
78
+ opts.on('-b', '--bare-path PATH',
79
+ 'The parent directory of the new git bare on the host machine. See --host.') do |path|
80
+ options[:bare_path] = Pathname.new(path)
81
+ end
82
+
83
+ opts.on('-h', '--host ADDRESS',
84
+ 'The IP address or name of the machine where the bare repository will be kept. Defaults to localhost.') do |host|
85
+ options[:vcs_host] = host
86
+ end
87
+
88
+ opts.on('-u', '--user NAME',
89
+ 'The username to be used to log into the host device. Defaults to the name of the user running this script. See --host.') do |name|
90
+ options[:vcs_user] = name
91
+ end
92
+
93
+ # opts.on('-n', '--no-git',
94
+ # 'Skip the git steps.') do |use_git|
95
+ # options[:use_vcs] = use_git
96
+ # end
97
+
98
+ # opts.on('--version',
99
+ # 'Print program version and exit.') do |version|
100
+ # options[:version] = version
101
+ # end
102
+ end
103
+
104
+ parser.parse!(args)
105
+
106
+ # config_options = YAML.load_file(options[:config_path] || './persist/persist.yml')
107
+ #
108
+ # options = config_options.merge(options)
109
+
110
+ options[:project_parent] ||= Pathname.new(Dir.pwd)
111
+ options[:vcs_user] ||= ENV['USERNAME'] || ENV['USER']
112
+
113
+ # Capture remaining, non-flag normal arguments
114
+ # options[:arguments] = args
115
+
116
+ assert_required!(options, parser)
117
+
118
+ return options
119
+ end
120
+
121
+ def assert_required!(options, parser)
122
+ unless options[:project_name] && options[:bare_path]
123
+ puts parser
124
+ @kernel.exit
125
+ end
126
+ end
127
+
128
+ def select_and_run_context(options)
129
+ project_directory = options[:project_name].gsub(' ', '').underscore
130
+ project_directory = options[:project_parent].expand_path + project_directory
131
+
132
+ puts "Time to grow, little #{options[:project_name]}..."
133
+
134
+ # puts 'Skipping git steps.'
135
+ CreateGitRepository.run(project_directory, options[:bare_path], options[:vcs_host], options[:vcs_user])
136
+
137
+ puts CreateDefaultStructure.run(project_directory)
138
+
139
+ puts CommitGitRepository.run(project_directory)
140
+ end
141
+ end
142
+ end
143
+ end