codestrap 0.1.0

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.
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