codestrap 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.travis.yml +4 -0
  4. data/.yardopts +3 -0
  5. data/BOILERPLATE.md +151 -0
  6. data/CODESTRAPFILE.md +28 -0
  7. data/Gemfile +6 -0
  8. data/LICENSE.txt +13 -0
  9. data/README.md +69 -0
  10. data/Rakefile +51 -0
  11. data/bin/strap +8 -0
  12. data/bin/upstrap +8 -0
  13. data/codestrap.gemspec +37 -0
  14. data/config/projects/codestrap.rb +22 -0
  15. data/config/software/codestrap.rb +20 -0
  16. data/config/software/ruby.rb +247 -0
  17. data/config/software/zlib.rb +86 -0
  18. data/features/client.feature +99 -0
  19. data/features/fixtures/client/home/codestrap/bin/.empty +0 -0
  20. data/features/fixtures/client/home/codestrap/content/bash.erb +3 -0
  21. data/features/fixtures/client/home/codestrap/content/gem/dir/file +0 -0
  22. data/features/fixtures/client/home/codestrap/content/gem/dir/template +3 -0
  23. data/features/fixtures/client/home/codestrap/content/gem/file +1 -0
  24. data/features/fixtures/client/home/codestrap/content/gem/template +3 -0
  25. data/features/fixtures/client/home/codestrap/content/local_remote.erb +1 -0
  26. data/features/fixtures/client/home/codestrap/content/local_remote/dir/file +0 -0
  27. data/features/fixtures/client/home/codestrap/content/local_remote/dir/template +3 -0
  28. data/features/fixtures/client/home/codestrap/content/local_remote/file +1 -0
  29. data/features/fixtures/client/home/codestrap/content/local_remote/template +3 -0
  30. data/features/fixtures/client/home/codestrap/objects/local.json +3 -0
  31. data/features/fixtures/client/output/.empty +0 -0
  32. data/features/fixtures/client/var/lib/codestrap/bin/.empty +0 -0
  33. data/features/fixtures/client/var/lib/codestrap/content/bashremote.erb +3 -0
  34. data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/file +0 -0
  35. data/features/fixtures/client/var/lib/codestrap/content/gemremote/dir/template +3 -0
  36. data/features/fixtures/client/var/lib/codestrap/content/gemremote/file +0 -0
  37. data/features/fixtures/client/var/lib/codestrap/content/gemremote/template +3 -0
  38. data/features/fixtures/client/var/lib/codestrap/content/remote_local.erb +1 -0
  39. data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/file +0 -0
  40. data/features/fixtures/client/var/lib/codestrap/content/remote_local/dir/template +3 -0
  41. data/features/fixtures/client/var/lib/codestrap/content/remote_local/file +1 -0
  42. data/features/fixtures/client/var/lib/codestrap/content/remote_local/template +3 -0
  43. data/features/fixtures/client/var/lib/codestrap/content/remote_remote.erb +1 -0
  44. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/file +0 -0
  45. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/dir/template +3 -0
  46. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/file +0 -0
  47. data/features/fixtures/client/var/lib/codestrap/content/remote_remote/template +3 -0
  48. data/features/fixtures/client/var/lib/codestrap/objects/remote.json +3 -0
  49. data/features/fixtures/logging/home/logging/codestrap/bin/stubdirectory/.empty +0 -0
  50. data/features/fixtures/logging/home/logging/codestrap/bin/stubnotlink +0 -0
  51. data/features/fixtures/logging/home/logging/codestrap/content/.empty +0 -0
  52. data/features/fixtures/logging/home/logging/codestrap/objects/.empty +0 -0
  53. data/features/fixtures/server/mixed/var/lib/stub/content/address.erb +3 -0
  54. data/features/fixtures/server/mixed/var/lib/stub/content/cell.erb +3 -0
  55. data/features/fixtures/server/mixed/var/lib/stub/content/email.erb +3 -0
  56. data/features/fixtures/server/mixed/var/lib/stub/content/mobile.erb +3 -0
  57. data/features/fixtures/server/mixed/var/lib/stub/content/name.erb +3 -0
  58. data/features/fixtures/server/mixed/var/lib/stub/content/phone.erb +3 -0
  59. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/Modulefile +12 -0
  60. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/README +17 -0
  61. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/manifests/init.pp +42 -0
  62. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/spec/spec_helper.rb +18 -0
  63. data/features/fixtures/server/mixed/var/lib/stub/content/puppetmodule/tests/init.pp +13 -0
  64. data/features/fixtures/server/mixed/var/lib/stub/objects/contact.json +8 -0
  65. data/features/fixtures/server/mixed/var/lib/stub/objects/shadow/contact.json +8 -0
  66. data/features/fixtures/strap/projects/etc/.empty +0 -0
  67. data/features/fixtures/strap/projects/home/user/dir/bin/.empty +0 -0
  68. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/Modulefile +12 -0
  69. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/README +17 -0
  70. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/:stub:project.name:/subclass.pp +3 -0
  71. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/manifests/init.pp +42 -0
  72. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/spec/spec_helper.rb +18 -0
  73. data/features/fixtures/strap/projects/home/user/dir/content/puppetmodule/tests/init.pp +13 -0
  74. data/features/fixtures/strap/projects/home/user/dir/objects/contact.json +8 -0
  75. data/features/fixtures/strap/projects/home/user/dir/objects/shadow/contact.json +8 -0
  76. data/features/fixtures/strap/projects/output/.empty +0 -0
  77. data/features/fixtures/stub/contact/etc/.empty +0 -0
  78. data/features/fixtures/stub/contact/home/user/dir/bin/.empty +0 -0
  79. data/features/fixtures/stub/contact/home/user/dir/content/address.erb +3 -0
  80. data/features/fixtures/stub/contact/home/user/dir/content/cell.erb +3 -0
  81. data/features/fixtures/stub/contact/home/user/dir/content/email.erb +3 -0
  82. data/features/fixtures/stub/contact/home/user/dir/content/mobile.erb +3 -0
  83. data/features/fixtures/stub/contact/home/user/dir/content/name.erb +3 -0
  84. data/features/fixtures/stub/contact/home/user/dir/content/phone.erb +3 -0
  85. data/features/fixtures/stub/contact/home/user/dir/objects/contact.json +8 -0
  86. data/features/fixtures/stub/contact/home/user/dir/objects/shadow/contact.json +8 -0
  87. data/features/fixtures/stub/contact/output/.empty +0 -0
  88. data/features/fixtures/stub/date/etc/.empty +0 -0
  89. data/features/fixtures/stub/date/home/user/stub/bin/.empty +0 -0
  90. data/features/fixtures/stub/date/home/user/stub/content/day.erb +3 -0
  91. data/features/fixtures/stub/date/home/user/stub/content/hour.erb +3 -0
  92. data/features/fixtures/stub/date/home/user/stub/content/minute.erb +3 -0
  93. data/features/fixtures/stub/date/home/user/stub/content/month.erb +3 -0
  94. data/features/fixtures/stub/date/home/user/stub/content/second.erb +3 -0
  95. data/features/fixtures/stub/date/home/user/stub/content/year.erb +3 -0
  96. data/features/fixtures/stub/date/home/user/stub/objects/.empty +0 -0
  97. data/features/fixtures/stub/date/output/.empty +0 -0
  98. data/features/fixtures/stub/script/etc/.empty +0 -0
  99. data/features/fixtures/stub/script/home/user/stub/bin/.empty +0 -0
  100. data/features/fixtures/stub/script/home/user/stub/content/credentials.erb +6 -0
  101. data/features/fixtures/stub/script/home/user/stub/objects/credentials.rb +11 -0
  102. data/features/fixtures/stub/script/output/.empty +0 -0
  103. data/features/logging.feature +39 -0
  104. data/features/object_scripts.feature +13 -0
  105. data/features/server.feature +36 -0
  106. data/features/step_definitions/client_steps.rb +99 -0
  107. data/features/step_definitions/logging_steps.rb +65 -0
  108. data/features/step_definitions/object_scripts_steps.rb +26 -0
  109. data/features/step_definitions/server_steps.rb +112 -0
  110. data/features/step_definitions/strap_steps.rb +69 -0
  111. data/features/step_definitions/stub_option_simple_steps.rb +31 -0
  112. data/features/step_definitions/stub_steps.rb +94 -0
  113. data/features/strap.feature +34 -0
  114. data/features/stub.feature +157 -0
  115. data/features/stub_option_simple.feature +14 -0
  116. data/features/stub_packages.feature +15 -0
  117. data/features/support/env.rb +197 -0
  118. data/lib/codestrap.rb +415 -0
  119. data/lib/codestrap/cli.rb +76 -0
  120. data/lib/codestrap/client.rb +179 -0
  121. data/lib/codestrap/config.rb +199 -0
  122. data/lib/codestrap/log.rb +56 -0
  123. data/lib/codestrap/mixin.rb +20 -0
  124. data/lib/codestrap/namespace.rb +19 -0
  125. data/lib/codestrap/object/abstract.rb +33 -0
  126. data/lib/codestrap/object/factory.rb +86 -0
  127. data/lib/codestrap/object/standard/datetime.rb +24 -0
  128. data/lib/codestrap/object/standard/files.rb +40 -0
  129. data/lib/codestrap/object/standard/project.rb +33 -0
  130. data/lib/codestrap/object/standard/rest.rb +30 -0
  131. data/lib/codestrap/patch.rb +122 -0
  132. data/lib/codestrap/server/rest.rb +177 -0
  133. data/lib/codestrap/server/version.rb +5 -0
  134. data/lib/codestrap/strap/abstract.rb +135 -0
  135. data/lib/codestrap/strap/factory.rb +85 -0
  136. data/lib/codestrap/strap/standard.rb +95 -0
  137. data/lib/codestrap/stub/abstract.rb +156 -0
  138. data/lib/codestrap/stub/factory.rb +87 -0
  139. data/lib/codestrap/stub/standard.rb +23 -0
  140. data/lib/codestrap/version.rb +3 -0
  141. data/omnibus.rb +53 -0
  142. data/package-scripts/codestrap/postinst +25 -0
  143. data/package-scripts/codestrap/postrm +17 -0
  144. data/package-scripts/codestrap/preinst +7 -0
  145. data/package-scripts/codestrap/prerm +15 -0
  146. data/resources/codestrap/pkg/background.png +0 -0
  147. data/resources/codestrap/pkg/distribution.xml.erb +22 -0
  148. data/resources/codestrap/pkg/license.html.erb +202 -0
  149. data/resources/codestrap/pkg/welcome.html.erb +7 -0
  150. metadata +466 -0
@@ -0,0 +1,69 @@
1
+ Given(/^a boilerplate path directory "([^"]*)"$/) do |path|
2
+ @testtools.path_reset
3
+ @testtools.path_unshift(path)
4
+ end
5
+
6
+ And(/^a boilerplate fixture (\d+)$/) do |num|
7
+ @fixture_idx = num.to_i
8
+ end
9
+
10
+ And(/^a boilerplate tmp directory$/) do
11
+ unless @strap_tmpdir
12
+ @strap_tmpdir = Dir.mktmpdir
13
+ end
14
+ end
15
+
16
+ And(/^a boilerplate codestrapfile named "([^"]*)" with:$/) do |codestrapfile, text|
17
+ codestrapfile_path = File.join(@strap_tmpdir, codestrapfile)
18
+ unless File.exist? codestrapfile_path
19
+ file = File.new(codestrapfile_path, 'w')
20
+ file.write(text)
21
+ file.close
22
+ end
23
+ ENV['CODESTRAPFILE']=codestrapfile_path
24
+ end
25
+
26
+ And(/^a boilerplate fixtures file named "([^"]*)" with:$/) do |json, text|
27
+ @fixtures = File.join(@strap_tmpdir, json)
28
+ unless File.exist? @fixtures
29
+ file = File.open(@fixtures, 'w')
30
+ file.write(text)
31
+ file.close
32
+ end
33
+ @fixture_hash = YAML.load(File.read(@fixtures))[@fixture_idx]
34
+ @clear = @fixture_hash['clear'] == 'true'
35
+ @command = @fixture_hash['command']
36
+ @output = @fixture_hash['output']
37
+ end
38
+
39
+ When(/^boilerplate generate command is executed$/) do
40
+ capture = Capture::Cli.inline do
41
+ args = %w(strap --generate)
42
+ Codestrap::Core.new(args).execute!
43
+ end
44
+ expect(capture.object_exit.status).to eql(0)
45
+ end
46
+
47
+ And(/^boilerplate command is run$/) do
48
+ if @clear
49
+ FileUtils.rm_rf @output
50
+ end
51
+ @capture = Capture::Cli.inline do
52
+ args = [@command, @output]
53
+ Codestrap::Core.new(args).execute!
54
+ end
55
+ expect(File.directory?(@output)).to be_truthy
56
+ end
57
+
58
+ Then(/^boilerplate contains interpolated values$/) do
59
+ Tools::Test.contents(@fixture_hash['test']) do |content, str, bool|
60
+ case bool
61
+ when 'true'
62
+ expect(content).to include(str)
63
+ when 'false'
64
+ expect(content).not_to include(str)
65
+ else
66
+ fail "Expecting boolean got #{bool.to_s}"
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,31 @@
1
+ When(/^the command "(strap)" with option "([^"]+)" is executed/) do |cmd, opt|
2
+ @testtools.path_reset
3
+ @testtools.path_unshift(BINDIR)
4
+ @cap_simple = Capture::Cli.inline do
5
+ args = [cmd, opt]
6
+ Codestrap::Core.new(args).execute!
7
+ end
8
+ end
9
+
10
+ Then(/^the option output is greater then (\d+) bytes$/) do |size|
11
+ expect(@cap_simple.stdout.length).to be > size.to_i
12
+ end
13
+
14
+ And(/^the option option exit status should be (\d+)$/) do |status|
15
+ expect(@cap_simple.object_exit.status.to_i).to eq(status.to_i)
16
+ end
17
+
18
+ When(/^the version is requested through the "(.*?)" option \-\-version is provided$/) do |cmd|
19
+ @cap_version = Capture::Cli.new(true, false).inline do
20
+ args = [cmd, '--version']
21
+ Codestrap::Core.new(args).execute!
22
+ end
23
+ end
24
+
25
+ Then(/^the version option exit status is (\d+)$/) do |status|
26
+ expect(@cap_version.object_exit.status).to eq(status.to_i)
27
+ end
28
+
29
+ And(/^a version number is outputed$/) do
30
+ expect(@cap_version.stdout.chomp).to eql(Codestrap::VERSION)
31
+ end
@@ -0,0 +1,94 @@
1
+ Given(/^a stub tmp directory$/) do
2
+ unless @codestrap_tmp
3
+ @codestrap_tmp = Dir.mktmpdir
4
+ end
5
+ end
6
+
7
+ And(/^a stub fixtures file "([^"]*)" with:$/) do |yaml, text|
8
+ @codestrap_fixtures = File.join(@codestrap_tmp, yaml)
9
+ file = File.open(@codestrap_fixtures, 'w')
10
+ file.write(text)
11
+ file.close
12
+ @fixture_hash = YAML.load(text)
13
+ end
14
+
15
+ And(/^a stub fixture "([^"]+)"$/) do |command|
16
+ @command = command
17
+ @fixture_cur = @fixture_hash[@command]
18
+ @links = @fixture_cur['links']
19
+ @clear = @fixture_cur['clear']
20
+ @output = @fixture_cur['output']
21
+ @test = @fixture_cur['test']
22
+ sf_content = @fixture_cur['codestrapfile']
23
+ sf_path = File.join(@codestrap_tmp, 'Codestrapfile')
24
+ sf_file = File.open(sf_path, 'w')
25
+ sf_file.write sf_content
26
+ sf_file.close
27
+ ENV['CODESTRAPFILE']=sf_path
28
+ end
29
+
30
+ And(/^stub env variable for PATH$/) do
31
+ @testtools.path_reset
32
+ @testtools.path_unshift(@links)
33
+ end
34
+
35
+ #And(/^codestrap env variable CODESTRAP_CONF="([^"]*)"$/) do |codestrapconf|
36
+ # ENV['CODESTRAP_CONF'] = codestrapconf
37
+ #end
38
+ #
39
+ #And(/^codestrap env variable CODESTRAP_ETC="([^"]+)"$/) do |codestrapetc|
40
+ # ENV['CODESTRAP_ETC'] = @codestrapetc = codestrapetc
41
+ #end
42
+ #
43
+ #And(/^codestrap env variable HOME="(codestrap\/contact\/home\/user)"$/) do |home|
44
+ # ENV['HOME'] = @codestraphome = home
45
+ #end
46
+ #
47
+ #And(/^a interpolation template named "([^"]*)"$/) do |templatefile|
48
+ # templatefile =~ /(.erb)$/
49
+ # suffix = $1 if $1
50
+ # @basename = File.basename(templatefile)
51
+ # FileUtils.install File.join(FIXTURES, templatefile), File.join(@codestrapetc, @basename)
52
+ # if suffix
53
+ # @cmd = 'codestrap' + File.basename(templatefile, suffix)
54
+ # else
55
+ # @cmd = 'codestrap' + File.basename(templatefile)
56
+ # end
57
+ #end
58
+
59
+ When(/^generate$/) do
60
+ @cap_generate_interpolate_links = Capture::Cli.inline do
61
+ args = %w(strap --generate)
62
+ Codestrap::Core.new(args).execute!
63
+ end
64
+ end
65
+
66
+ And(/^clear previous files$/) do
67
+ if @clear and File.exist? @output
68
+ File.unlink @output
69
+ end
70
+ end
71
+
72
+ And(/^template is run with output$/) do
73
+ @cap_interpolate_contact_output = Capture::Cli.inline do
74
+ args = [@command, @output]
75
+ Codestrap::Core.new(args).execute!
76
+ end
77
+ end
78
+
79
+ Then(/^contains interpolated values$/) do
80
+ @test.each_pair do |str, bool|
81
+ case bool
82
+ when true
83
+ expect(File.read(@output)).to include(str)
84
+ when false
85
+ expect(File.read(@output)).not_to include(str)
86
+ else
87
+ fail 'Invalid check'
88
+ end
89
+ end
90
+ end
91
+
92
+ And(/^the exit status is (\d+)$/) do |status|
93
+ expect(@cap_interpolate_contact_output.object_exit.status.to_i).to eq(status.to_i)
94
+ end
@@ -0,0 +1,34 @@
1
+ Feature: Supports straps
2
+ As a user I want a command that supports creation
3
+ of a software project structure containing template output
4
+ that has interpolated objects
5
+
6
+ Scenario Outline: create a new project
7
+ Given a boilerplate path directory "strap/projects/home/user/dir/bin"
8
+ And a boilerplate fixture <number>
9
+ And a boilerplate tmp directory
10
+ And a boilerplate codestrapfile named "Codestrapfile" with:
11
+ """
12
+ Codestrapfile.config do |conf|
13
+ conf.local.base = ['strap/projects/home/user/dir']
14
+ end
15
+ """
16
+ And a boilerplate fixtures file named "fixtures.yaml" with:
17
+ """
18
+ ---
19
+ - clear: 'true'
20
+ command: strappuppetmodule
21
+ output: strap/projects/output/newpuppet
22
+ test:
23
+ strap/projects/output/newpuppet/Modulefile:
24
+ Michonne: 'true'
25
+ strap/projects/output/newpuppet/manifests/init.pp:
26
+ Michonne: 'true'
27
+ dpgrps@gmail.com: 'true'
28
+ """
29
+ When boilerplate generate command is executed
30
+ And boilerplate command is run
31
+ Then boilerplate contains interpolated values
32
+ Examples:
33
+ | number |
34
+ | 0 |
@@ -0,0 +1,157 @@
1
+ Feature: Supports stubs
2
+ As a user I want a command that supports file stubs
3
+ of text files
4
+ that contain interpolated objects
5
+
6
+ Scenario Outline: stub creation
7
+ Given a stub tmp directory
8
+ And a stub fixtures file "fixtures.yaml" with:
9
+ """
10
+ stubaddress:
11
+ clear: true
12
+ links: stub/contact/home/user/dir/bin
13
+ output: stub/contact/output/address
14
+ codestrapfile: |
15
+ Codestrapfile.config do |conf|
16
+ conf.local.base = ['stub/contact/home/user/dir']
17
+ end
18
+ test:
19
+ '10 Downing Street': true
20
+ stubcell:
21
+ clear: true
22
+ links: stub/contact/home/user/dir/bin
23
+ output: stub/contact/output/cell
24
+ codestrapfile: |
25
+ Codestrapfile.config do |conf|
26
+ conf.local.base = ['stub/contact/home/user/dir']
27
+ end
28
+ test:
29
+ '0555 5555 5555': true
30
+ stubemail:
31
+ clear: true
32
+ links: stub/contact/home/user/dir/bin
33
+ output: stub/contact/output/email
34
+ codestrapfile: |
35
+ Codestrapfile.config do |conf|
36
+ conf.local.base = ['stub/contact/home/user/dir']
37
+ end
38
+ test:
39
+ 'dpgrps@gmail.com': true
40
+ stubmobile:
41
+ clear: true
42
+ links: stub/contact/home/user/dir/bin
43
+ output: stub/contact/output/mobile
44
+ codestrapfile: |
45
+ Codestrapfile.config do |conf|
46
+ conf.local.base = ['stub/contact/home/user/dir']
47
+ end
48
+ test:
49
+ '0444 4444 4444': true
50
+ stubname:
51
+ clear: true
52
+ links: stub/contact/home/user/dir/bin
53
+ output: stub/contact/output/name
54
+ codestrapfile: |
55
+ Codestrapfile.config do |conf|
56
+ conf.local.base = ['stub/contact/home/user/dir']
57
+ end
58
+ test:
59
+ 'Full Name': true
60
+ stubphone:
61
+ clear: true
62
+ links: stub/contact/home/user/dir/bin
63
+ output: stub/contact/output/phone
64
+ codestrapfile: |
65
+ Codestrapfile.config do |conf|
66
+ conf.local.base = ['stub/contact/home/user/dir']
67
+ end
68
+ test:
69
+ '7777 7777': true
70
+ stubyear:
71
+ clear: true
72
+ links: stub/date/home/user/stub/bin
73
+ output: stub/date/output/year
74
+ codestrapfile: |
75
+ Codestrapfile.config do |conf|
76
+ conf.local.base = ['stub/date/home/user/stub']
77
+ end
78
+ test: {}
79
+ stubmonth:
80
+ clear: true
81
+ links: stub/date/home/user/stub/bin
82
+ output: stub/date/output/month
83
+ codestrapfile: |
84
+ Codestrapfile.config do |conf|
85
+ conf.local.base = ['stub/date/home/user/stub']
86
+ end
87
+ test: {}
88
+ stubday:
89
+ clear: true
90
+ links: stub/date/home/user/stub/bin
91
+ output: stub/date/output/day
92
+ codestrapfile: |
93
+ Codestrapfile.config do |conf|
94
+ conf.local.base = ['stub/date/home/user/stub']
95
+ end
96
+ test: {}
97
+ stubhour:
98
+ clear: true
99
+ links: stub/date/home/user/stub/bin
100
+ output: stub/date/output/hour
101
+ codestrapfile: |
102
+ Codestrapfile.config do |conf|
103
+ conf.local.base = ['stub/date/home/user/stub']
104
+ end
105
+ test: {}
106
+ stubminute:
107
+ clear: true
108
+ links: stub/date/home/user/stub/bin
109
+ output: stub/date/output/minute
110
+ codestrapfile: |
111
+ Codestrapfile.config do |conf|
112
+ conf.local.base = ['stub/date/home/user/stub']
113
+ end
114
+ test: {}
115
+ stubsecond:
116
+ clear: true
117
+ links: stub/date/home/user/stub/bin
118
+ output: stub/date/output/second
119
+ codestrapfile: |
120
+ Codestrapfile.config do |conf|
121
+ conf.local.base = ['stub/date/home/user/stub']
122
+ end
123
+ test: {}
124
+ stubcredentials:
125
+ clear: true
126
+ links: stub/script/home/user/stub/bin
127
+ output: stub/script/output/credentials
128
+ codestrapfile: |
129
+ Codestrapfile.config do |conf|
130
+ conf.local.base = ['stub/script/home/user/stub']
131
+ end
132
+ test:
133
+ 'noreply@nodomain.com': true
134
+ 'secret': true
135
+ """
136
+ And a stub fixture "<command>"
137
+ And stub env variable for PATH
138
+ When generate
139
+ And clear previous files
140
+ And template is run with output
141
+ Then contains interpolated values
142
+ And the exit status is 0
143
+ Examples:
144
+ | command |
145
+ | stubaddress |
146
+ | stubcell |
147
+ | stubemail |
148
+ | stubmobile |
149
+ | stubname |
150
+ | stubphone |
151
+ | stubyear |
152
+ | stubmonth |
153
+ | stubday |
154
+ | stubhour |
155
+ | stubminute |
156
+ | stubsecond |
157
+ | stubcredentials |
@@ -0,0 +1,14 @@
1
+ Feature: strap --help and --version
2
+ Command supports the help and version options
3
+
4
+ Scenario Outline: Simple options
5
+ When the command "strap" with option "<simple_option>" is executed
6
+ Then the option output is greater then 0 bytes
7
+ And the option option exit status should be 0
8
+ Examples: help
9
+ | simple_option |
10
+ | --help |
11
+ | -h |
12
+ | -? |
13
+ | -v |
14
+ | --version |
@@ -0,0 +1,15 @@
1
+ Feature: Package management
2
+ As a user, I will utilize a package, codestrap, modules manager for templates
3
+ to download available packages from a package server(s).
4
+
5
+ Scenario Outline: Package management
6
+ Given test "<data>" set
7
+ And environment variables
8
+ When command "<command>" is executed
9
+ And input
10
+ Then a set of are created
11
+ And output has the right contents and format
12
+ And error has the right contents and format
13
+ And exit code has expected values
14
+ Examples:
15
+ | data | command |
@@ -0,0 +1,197 @@
1
+ require 'cucumber'
2
+ require 'find'
3
+ require 'fileutils'
4
+ require 'json'
5
+ require 'rack/test'
6
+ require 'rspec/expectations'
7
+ require 'codestrap'
8
+ require 'codestrap/version'
9
+ require 'codestrap/server/rest'
10
+ require 'stringio'
11
+ require 'tempfile'
12
+ require 'tmpdir'
13
+ require 'webmock/cucumber'
14
+ require 'yaml'
15
+
16
+ ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
17
+ FIXTURE_ROOT = File.join(ROOT, 'features', 'fixtures')
18
+ BINDIR = File.join(ROOT, 'bin')
19
+ TMPDIR = File.join(ROOT, 'tmp')
20
+ FIXTURES = %W[stub strap server client logging]
21
+
22
+ $LOAD_PATH.unshift File.join(ROOT, 'lib')
23
+
24
+ Codestrap::Server::Rest.set :environment => :development
25
+
26
+ class MyWorld
27
+ include Rack::Test::Methods
28
+
29
+ def app
30
+ @app = Rack::Builder.new do
31
+ run Codestrap::Server::Rest
32
+ end
33
+ end
34
+ end
35
+
36
+ World do
37
+ MyWorld.new
38
+ end
39
+
40
+ def diff_tree?(left, right)
41
+ left_tree = []
42
+ Dir.chdir(left) do
43
+ left_tree = Dir.glob('**').sort { |a,b| a.length <=> b.length }
44
+ end
45
+ right_tree = []
46
+ Dir.chdir(right) do
47
+ right_tree = Dir.glob('**').sort { |a,b| a.length <=> b.length }
48
+ end
49
+
50
+ if left_tree != right_tree
51
+ return 1
52
+ end
53
+
54
+ left_tree.each do |file|
55
+ left_file = File.join(left, file)
56
+ right_file = File.join(right, file)
57
+ left_stat = File::Stat.new(left_file)
58
+ right_stat = File::Stat.new(right_file)
59
+ if left_stat.ftype != right_stat.ftype
60
+ return 1
61
+ end
62
+ next if left_stat.directory?
63
+ unless FileUtils.compare_file(left_file, right_file)
64
+ return 1
65
+ end
66
+ end
67
+
68
+ 0
69
+ end
70
+
71
+ # Capture cli methods
72
+ module Capture
73
+ class Cli
74
+ # Get & Set
75
+ attr_reader :object_exit
76
+ attr_reader :stdout
77
+ attr_reader :stderr
78
+
79
+ def object_exit= object_exit
80
+ raise TypeError, %q[expecting type SystemExit] unless object_exit.is_a?(SystemExit)
81
+ @object_exit = object_exit
82
+ end
83
+
84
+ def initialize(divertstdout=true, divertstderr=false)
85
+ @stdout ||= String.new
86
+ @stderr ||= String.new
87
+ @divertstdout = divertstdout
88
+ @divertsterr = divertstderr
89
+ end
90
+
91
+ def inline
92
+ begin
93
+ if @divertstdout
94
+ @origstdout = $stdout
95
+ $stdout = StringIO.new(@stdout)
96
+ end
97
+ if @divertstderr
98
+ @origstderr = $stderr
99
+ $stderr = StringIO.new(@stderr)
100
+ end
101
+ yield
102
+ rescue SystemExit => e
103
+ self.object_exit = e
104
+ ensure
105
+ $stdout = @origstdout if @divertstdout
106
+ $stderr = @origstderr if @divertsterr
107
+ end
108
+ self
109
+ end
110
+
111
+ def self.inline
112
+ Capture::Cli.new().inline do
113
+ yield
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ module Tools
120
+ class Cli
121
+ def initialize
122
+ @env_original = ENV['PATH']
123
+ end
124
+
125
+ def path_unshift path
126
+ unless ENV['PATH'].split(':').include?(path.to_s)
127
+ ENV['PATH'] = "#{path}:#{ENV['PATH']}"
128
+ end
129
+ end
130
+
131
+ def path_reset
132
+ ENV['PATH'] = @env_original
133
+ end
134
+ end
135
+ class Test
136
+ def self.list_tree(project)
137
+ Find.find(project).map { |dir| dir.gsub(/#{Regexp.escape(project)}/, '') }
138
+ end
139
+
140
+ def self.contents(test_hash)
141
+ test_hash.each_pair do |file, tests|
142
+ content = File.read(File.join(file))
143
+ tests.each_pair do |str, bool|
144
+ yield content, str, bool
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+
151
+ module JSON
152
+ def self.is_json?(foo)
153
+ begin
154
+ return false unless foo.is_a?(String)
155
+ JSON.parse(foo).all?
156
+ rescue JSON::ParserError
157
+ false
158
+ end
159
+ end
160
+ end
161
+
162
+ Before do
163
+ # Web mock
164
+ WebMock.allow_net_connect!
165
+ stub_request(:any, /127.0.0.1/).to_rack(Codestrap::Server::Rest)
166
+
167
+ # Copy fixures to tmp/
168
+ FIXTURES.each do |dir|
169
+ fixture = File.join(FIXTURE_ROOT, dir)
170
+ newpath = File.join(TMPDIR, dir)
171
+ cmd = File.join(BINDIR, 'strap')
172
+ next unless File.exist? fixture
173
+ FileUtils.cp_r fixture, TMPDIR
174
+ Dir.glob("#{newpath}/**/bin").each do |path|
175
+ stub = File.join(path, 'stub')
176
+ strap = File.join(path, 'strap')
177
+ FileUtils.cp cmd, strap unless File.exist? strap
178
+ FileUtils.ln_s strap, stub unless File.exist? stub
179
+ end
180
+ end
181
+
182
+ # Set path
183
+ @testtools = Tools::Cli.new()
184
+
185
+ # Project temporary directory
186
+ @tmpdir = TMPDIR
187
+
188
+ # Current directory
189
+ @curdir = Dir.getwd
190
+
191
+ # Original environment variable
192
+ Dir.chdir @tmpdir
193
+ end
194
+
195
+ After do
196
+ Dir.chdir @curdir
197
+ end