minimart 0.0.1
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.
- checksums.yaml +15 -0
- data/.gitignore +21 -0
- data/.rspec +3 -0
- data/.travis.yml +13 -0
- data/Gemfile +3 -0
- data/README.md +198 -0
- data/Rakefile +45 -0
- data/bin/minimart +4 -0
- data/lib/minimart.rb +15 -0
- data/lib/minimart/cli.rb +93 -0
- data/lib/minimart/commands/mirror.rb +30 -0
- data/lib/minimart/commands/web.rb +91 -0
- data/lib/minimart/configuration.rb +46 -0
- data/lib/minimart/cookbook.rb +173 -0
- data/lib/minimart/download/cookbook.rb +70 -0
- data/lib/minimart/download/git_cache.rb +60 -0
- data/lib/minimart/download/git_repository.rb +41 -0
- data/lib/minimart/error.rb +32 -0
- data/lib/minimart/inventory_requirement/base_requirement.rb +81 -0
- data/lib/minimart/inventory_requirement/git_requirement.rb +87 -0
- data/lib/minimart/inventory_requirement/git_requirements_builder.rb +101 -0
- data/lib/minimart/inventory_requirement/local_path_requirement.rb +45 -0
- data/lib/minimart/inventory_requirement/local_requirements_builder.rb +31 -0
- data/lib/minimart/inventory_requirement/supermarket_requirements_builder.rb +35 -0
- data/lib/minimart/mirror.rb +12 -0
- data/lib/minimart/mirror/dependency_graph.rb +73 -0
- data/lib/minimart/mirror/download_metadata.rb +57 -0
- data/lib/minimart/mirror/inventory_builder.rb +143 -0
- data/lib/minimart/mirror/inventory_configuration.rb +74 -0
- data/lib/minimart/mirror/inventory_requirements.rb +104 -0
- data/lib/minimart/mirror/local_store.rb +107 -0
- data/lib/minimart/mirror/source.rb +57 -0
- data/lib/minimart/mirror/source_cookbook.rb +77 -0
- data/lib/minimart/mirror/sources.rb +37 -0
- data/lib/minimart/output.rb +34 -0
- data/lib/minimart/utils/archive.rb +39 -0
- data/lib/minimart/utils/file_helper.rb +34 -0
- data/lib/minimart/utils/http.rb +60 -0
- data/lib/minimart/version.rb +3 -0
- data/lib/minimart/web.rb +10 -0
- data/lib/minimart/web/cookbook_show_page_generator.rb +78 -0
- data/lib/minimart/web/cookbooks.rb +83 -0
- data/lib/minimart/web/dashboard_generator.rb +46 -0
- data/lib/minimart/web/html_generator.rb +52 -0
- data/lib/minimart/web/markdown_parser.rb +47 -0
- data/lib/minimart/web/template_helper.rb +132 -0
- data/lib/minimart/web/universe_generator.rb +109 -0
- data/minimart.gemspec +36 -0
- data/spec/fixtures/sample_cookbook.tar.gz +0 -0
- data/spec/fixtures/sample_cookbook/Berksfile +3 -0
- data/spec/fixtures/sample_cookbook/CHANGELOG.md +3 -0
- data/spec/fixtures/sample_cookbook/Gemfile +16 -0
- data/spec/fixtures/sample_cookbook/LICENSE +3 -0
- data/spec/fixtures/sample_cookbook/README.md +42 -0
- data/spec/fixtures/sample_cookbook/Thorfile +5 -0
- data/spec/fixtures/sample_cookbook/Vagrantfile +90 -0
- data/spec/fixtures/sample_cookbook/chefignore +94 -0
- data/spec/fixtures/sample_cookbook/metadata.rb +9 -0
- data/spec/fixtures/sample_cookbook/recipes/default.rb +8 -0
- data/spec/fixtures/sample_inventory.yml +16 -0
- data/spec/fixtures/simple_git_inventory.yml +8 -0
- data/spec/fixtures/simple_inventory.yml +6 -0
- data/spec/fixtures/simple_local_path_inventory.yml +5 -0
- data/spec/fixtures/universe.json +42 -0
- data/spec/fixtures/vcr_cassettes/local_path_cookbooks.yml +3316 -0
- data/spec/fixtures/vcr_cassettes/location_specific_cookbooks.yml +3316 -0
- data/spec/fixtures/vcr_cassettes/supermarket_cookbooks_graph.yml +905 -0
- data/spec/fixtures/vcr_cassettes/supermarket_cookbooks_installing_cookbooks.yml +4218 -0
- data/spec/lib/minimart/cli_spec.rb +104 -0
- data/spec/lib/minimart/commands/mirror_spec.rb +37 -0
- data/spec/lib/minimart/commands/web_spec.rb +75 -0
- data/spec/lib/minimart/configuration_spec.rb +54 -0
- data/spec/lib/minimart/cookbook_spec.rb +137 -0
- data/spec/lib/minimart/download/cookbook_spec.rb +135 -0
- data/spec/lib/minimart/download/git_cache_spec.rb +69 -0
- data/spec/lib/minimart/download/git_repository_spec.rb +39 -0
- data/spec/lib/minimart/error_spec.rb +18 -0
- data/spec/lib/minimart/inventory_requirement/base_requirement_spec.rb +38 -0
- data/spec/lib/minimart/inventory_requirement/git_requirement_spec.rb +92 -0
- data/spec/lib/minimart/inventory_requirement/git_requirements_builder_spec.rb +130 -0
- data/spec/lib/minimart/inventory_requirement/local_path_requirement_spec.rb +35 -0
- data/spec/lib/minimart/inventory_requirement/local_requirements_builder_spec.rb +33 -0
- data/spec/lib/minimart/inventory_requirement/supermarket_requirements_builder_spec.rb +69 -0
- data/spec/lib/minimart/mirror/dependency_graph_spec.rb +123 -0
- data/spec/lib/minimart/mirror/download_metadata_spec.rb +73 -0
- data/spec/lib/minimart/mirror/inventory_builder_spec.rb +195 -0
- data/spec/lib/minimart/mirror/inventory_configuration_spec.rb +86 -0
- data/spec/lib/minimart/mirror/inventory_requirements_spec.rb +78 -0
- data/spec/lib/minimart/mirror/local_store_spec.rb +64 -0
- data/spec/lib/minimart/mirror/source_spec.rb +54 -0
- data/spec/lib/minimart/mirror/sources_spec.rb +50 -0
- data/spec/lib/minimart/output_spec.rb +29 -0
- data/spec/lib/minimart/utils/archive_spec.rb +38 -0
- data/spec/lib/minimart/utils/file_helper_spec.rb +43 -0
- data/spec/lib/minimart/utils/http_spec.rb +37 -0
- data/spec/lib/minimart/web/cookbook_show_page_generator_spec.rb +101 -0
- data/spec/lib/minimart/web/cookbooks_spec.rb +70 -0
- data/spec/lib/minimart/web/dashboard_generator_spec.rb +33 -0
- data/spec/lib/minimart/web/html_generator_spec.rb +34 -0
- data/spec/lib/minimart/web/markdown_parser_spec.rb +54 -0
- data/spec/lib/minimart/web/template_helper_spec.rb +86 -0
- data/spec/lib/minimart/web/universe_generator_spec.rb +125 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/support/file_system.rb +22 -0
- data/web/_assets/javascripts/app.js +164 -0
- data/web/_assets/javascripts/backbone.min.js +6 -0
- data/web/_assets/javascripts/jquery.min.js +4 -0
- data/web/_assets/javascripts/jquery.tabslet.min.js +9 -0
- data/web/_assets/javascripts/manifest.js +5 -0
- data/web/_assets/javascripts/underscore.min.js +5 -0
- data/web/_assets/stylesheets/font-awesome.min.css +4 -0
- data/web/_assets/stylesheets/font-mfizz.css +318 -0
- data/web/_assets/stylesheets/main.css +720 -0
- data/web/_assets/stylesheets/manifest.css +4 -0
- data/web/_assets/stylesheets/normalize.css +427 -0
- data/web/assets/fonts/FontAwesome.otf +0 -0
- data/web/assets/fonts/font-mfizz.eot +0 -0
- data/web/assets/fonts/font-mfizz.svg +1344 -0
- data/web/assets/fonts/font-mfizz.ttf +0 -0
- data/web/assets/fonts/font-mfizz.woff +0 -0
- data/web/assets/fonts/fontawesome-webfont.eot +0 -0
- data/web/assets/fonts/fontawesome-webfont.svg +520 -0
- data/web/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/web/assets/fonts/fontawesome-webfont.woff +0 -0
- data/web/assets/images/header-slim.jpg +0 -0
- data/web/assets/images/icon-search.png +0 -0
- data/web/assets/images/mad-glory-logo.png +0 -0
- data/web/assets/images/main-gradient.png +0 -0
- data/web/assets/images/top-bar-logo.png +0 -0
- data/web/assets/javascripts/application.min.js +5 -0
- data/web/assets/stylesheets/application.min.css +4 -0
- data/web/templates/cookbook_show.erb +96 -0
- data/web/templates/dashboard.erb +81 -0
- data/web/templates/layout.erb +38 -0
- metadata +433 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Minimart::Utils::Http do
|
|
4
|
+
describe '::get_json' do
|
|
5
|
+
pending
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe '::get' do
|
|
9
|
+
pending
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe '::get_binary' do
|
|
13
|
+
pending
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe '::build_url' do
|
|
17
|
+
context 'when no protocol is provided' do
|
|
18
|
+
subject { described_class.build_url('example.com') }
|
|
19
|
+
it { is_expected.to eq 'http://example.com' }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context 'when a protocol is provided' do
|
|
23
|
+
subject { described_class.build_url('git://example.com') }
|
|
24
|
+
it { is_expected.to eq 'git://example.com' }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context 'when a sub url is provided' do
|
|
28
|
+
subject { described_class.build_url('http://example.com', 'path') }
|
|
29
|
+
it { is_expected.to eq 'http://example.com/path' }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'when the path has a leading slash' do
|
|
33
|
+
subject { described_class.build_url('http://example.com/', '/path') }
|
|
34
|
+
it { is_expected.to eq 'http://example.com/path' }
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'minimart/web/cookbook_show_page_generator'
|
|
3
|
+
|
|
4
|
+
describe Minimart::Web::CookbookShowPageGenerator do
|
|
5
|
+
let(:cookbooks) do
|
|
6
|
+
Minimart::Web::Cookbooks.new(inventory_directory: 'spec/fixtures')
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
let(:web_directory) { test_directory }
|
|
10
|
+
|
|
11
|
+
subject do
|
|
12
|
+
Minimart::Web::CookbookShowPageGenerator.new(
|
|
13
|
+
web_directory: web_directory,
|
|
14
|
+
cookbooks: cookbooks)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#generate' do
|
|
18
|
+
let(:cookbooks_directory) { File.join(web_directory, 'cookbooks') }
|
|
19
|
+
let(:cookbook_directory) { File.join(cookbooks_directory, 'sample_cookbook') }
|
|
20
|
+
let(:cookbook_file) { File.join(cookbook_directory, '1.2.3.html') }
|
|
21
|
+
let(:view_content) { File.open(cookbook_file).read }
|
|
22
|
+
|
|
23
|
+
it 'should generate a directory for the cookbook provided' do
|
|
24
|
+
subject.generate
|
|
25
|
+
expect(Dir.exists?(cookbook_directory)).to eq true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context 'when the web command was previously run' do
|
|
29
|
+
let(:cookbook_directory) { File.join(cookbooks_directory, 'existing-cookbook') }
|
|
30
|
+
|
|
31
|
+
before(:each) do
|
|
32
|
+
FileUtils.mkdir_p(cookbooks_directory)
|
|
33
|
+
FileUtils.mkdir_p(cookbook_directory)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'should remove any existing files' do
|
|
37
|
+
subject.generate
|
|
38
|
+
expect(Dir.exists?(cookbook_directory)).to eq false
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'should generate an html file for the cookbook version' do
|
|
43
|
+
subject.generate
|
|
44
|
+
expect(File.exists?(cookbook_file)).to eq true
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'should have a proper link back to the home page' do
|
|
48
|
+
subject.generate
|
|
49
|
+
expect(view_content).to match(%{href="../../index.html"})
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'should have a form for the search action with the proper path' do
|
|
53
|
+
subject.generate
|
|
54
|
+
expect(view_content).to match(%{action="../../index.html#search/"})
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'should have the proper relative path to any loaded assets' do
|
|
58
|
+
subject.generate
|
|
59
|
+
expect(view_content).to match %{href="../../assets/}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'should display the name of the cookbook' do
|
|
63
|
+
subject.generate
|
|
64
|
+
expect(view_content).to match 'sample_cookbook'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'should display the version of the cookbook' do
|
|
68
|
+
subject.generate
|
|
69
|
+
expect(view_content).to match '1.2.3'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'should display a link to download the cookbook' do
|
|
73
|
+
subject.generate
|
|
74
|
+
expect(view_content).to match %{href="../../cookbook_files/sample_cookbook/1_2_3/sample_cookbook-1.2.3.tar.gz"}
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'should display any dependencies the cookbook has' do
|
|
78
|
+
subject.generate
|
|
79
|
+
expect(view_content).to match 'yum > 3.0.0'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context 'when minimart has the dependent cookbook' do
|
|
83
|
+
let(:yum) do
|
|
84
|
+
res = cookbooks.individual_cookbooks.first.dup
|
|
85
|
+
allow(res).to receive(:name).and_return('yum')
|
|
86
|
+
allow(res).to receive(:version).and_return('3.2.0')
|
|
87
|
+
res
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
before(:each) do
|
|
91
|
+
cookbooks.add(yum)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'should build a link for the dependent cookbook' do
|
|
95
|
+
subject.generate
|
|
96
|
+
expect(view_content).to match %{href="../../cookbooks/yum/3.2.0.html"}
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'minimart/web/cookbooks'
|
|
3
|
+
|
|
4
|
+
describe Minimart::Web::Cookbooks do
|
|
5
|
+
|
|
6
|
+
let(:inventory_directory) { 'spec/fixtures/' }
|
|
7
|
+
let(:data_path) { File.join(directory, 'data.json') }
|
|
8
|
+
|
|
9
|
+
subject do
|
|
10
|
+
Minimart::Web::Cookbooks.new(inventory_directory: inventory_directory)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe '::new' do
|
|
14
|
+
it 'should set the #inventory_directory' do
|
|
15
|
+
expect(subject.inventory_directory).to eq inventory_directory
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should build a data structure with the proper cookbooks' do
|
|
19
|
+
expect(subject.keys).to include 'sample_cookbook'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should load the cookbooks provided' do
|
|
23
|
+
expect(subject['sample_cookbook'].first).to be_a Minimart::Cookbook
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'when there are multiple versions of the same cookbook' do
|
|
27
|
+
let(:cookbook_one) do
|
|
28
|
+
c = Minimart::Cookbook.new(nil)
|
|
29
|
+
allow(c).to receive(:name).and_return 'test-book'
|
|
30
|
+
allow(c).to receive(:version).and_return '1.9.0'
|
|
31
|
+
c
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
let(:cookbook_two) do
|
|
35
|
+
c = Minimart::Cookbook.new(nil)
|
|
36
|
+
allow(c).to receive(:name).and_return 'test-book'
|
|
37
|
+
allow(c).to receive(:version).and_return '1.19.0'
|
|
38
|
+
c
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
let(:cookbooks) { [cookbook_one, cookbook_two] }
|
|
42
|
+
|
|
43
|
+
before(:each) do
|
|
44
|
+
allow_any_instance_of(Minimart::Web::Cookbooks).to receive(:cookbooks).and_return cookbooks
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'should load both cookbooks' do
|
|
48
|
+
expect(subject['test-book'].size).to eq 2
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'should properly sort them in version descending order' do
|
|
52
|
+
expect(subject['test-book'][0].version).to eq '1.19.0'
|
|
53
|
+
expect(subject['test-book'][1].version).to eq '1.9.0'
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe '::to_json' do
|
|
59
|
+
let(:result) { JSON.parse(subject.to_json) }
|
|
60
|
+
|
|
61
|
+
it 'should return the proper data structure as JSON' do
|
|
62
|
+
expect(result.first['name']).to eq 'sample_cookbook'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should include the number of versions available' do
|
|
66
|
+
expect(result.first['available_versions']).to eq 1
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'minimart/web/dashboard_generator'
|
|
3
|
+
|
|
4
|
+
describe Minimart::Web::DashboardGenerator do
|
|
5
|
+
let(:cookbooks) do
|
|
6
|
+
Minimart::Web::Cookbooks.new(inventory_directory: 'spec/fixtures')
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
let(:web_directory) { test_directory }
|
|
10
|
+
|
|
11
|
+
subject do
|
|
12
|
+
Minimart::Web::DashboardGenerator.new(
|
|
13
|
+
web_directory: web_directory,
|
|
14
|
+
cookbooks: cookbooks)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#generate' do
|
|
18
|
+
it 'should create an index.html file in the web directory' do
|
|
19
|
+
subject.generate
|
|
20
|
+
expect(File.exists?(File.join(web_directory, 'index.html'))).to eq true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'should have a proper link back to the home page' do
|
|
24
|
+
subject.generate
|
|
25
|
+
expect(subject.template_content).to match(%{href="index.html"})
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should have the proper relative path to any loaded assets' do
|
|
29
|
+
subject.generate
|
|
30
|
+
expect(subject.template_content).to match %{href="assets/}
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'minimart/web/html_generator'
|
|
3
|
+
|
|
4
|
+
describe Minimart::Web::HtmlGenerator do
|
|
5
|
+
let(:cookbooks) do
|
|
6
|
+
Minimart::Web::Cookbooks.new(inventory_directory: 'spec/fixtures')
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
let(:web_directory) { test_directory }
|
|
10
|
+
|
|
11
|
+
subject do
|
|
12
|
+
Minimart::Web::HtmlGenerator.new(
|
|
13
|
+
web_directory: web_directory,
|
|
14
|
+
cookbooks: cookbooks)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe '#generate' do
|
|
18
|
+
it 'should copy any available assets' do
|
|
19
|
+
subject.generate
|
|
20
|
+
expect(Dir.exists?(File.join(web_directory, 'assets'))).to eq true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'should generate the dashboard page' do
|
|
24
|
+
expect_any_instance_of(Minimart::Web::DashboardGenerator).to receive(:generate)
|
|
25
|
+
subject.generate
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should generate show pages for any of the cookbooks' do
|
|
29
|
+
expect_any_instance_of(Minimart::Web::CookbookShowPageGenerator).to receive(:generate)
|
|
30
|
+
subject.generate
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Minimart::Web::MarkdownParser do
|
|
4
|
+
|
|
5
|
+
describe '::parse' do
|
|
6
|
+
context 'when the file does not have a markdown extension' do
|
|
7
|
+
let(:contents) { 'file contents here' }
|
|
8
|
+
|
|
9
|
+
let(:file) do
|
|
10
|
+
File.join(test_directory, 'readme.rdoc').tap do |file_name|
|
|
11
|
+
File.open(file_name, 'w+') { |f| f.write(contents) }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should return the file contents' do
|
|
16
|
+
expect(Minimart::Web::MarkdownParser.parse(file)).to eq contents
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'should not attempt to parse the file' do
|
|
20
|
+
expect(Minimart::Web::MarkdownParser).to_not receive(:new)
|
|
21
|
+
Minimart::Web::MarkdownParser.parse(file)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context 'when the file has a .md extension' do
|
|
26
|
+
let(:contents) { '# Title' }
|
|
27
|
+
|
|
28
|
+
let(:file) do
|
|
29
|
+
File.join(test_directory, 'readme.md').tap do |file_name|
|
|
30
|
+
File.open(file_name, 'w+') { |f| f.write(contents) }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'should parse the contents as markdown' do
|
|
35
|
+
expect(Minimart::Web::MarkdownParser.parse(file)).to match '<h1>Title</h1>'
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context 'when the file has a .markdown extension' do
|
|
40
|
+
let(:contents) { '# Title' }
|
|
41
|
+
|
|
42
|
+
let(:file) do
|
|
43
|
+
File.join(test_directory, 'readme.markdown').tap do |file_name|
|
|
44
|
+
File.open(file_name, 'w+') { |f| f.write(contents) }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should parse the contents as markdown' do
|
|
49
|
+
expect(Minimart::Web::MarkdownParser.parse(file)).to match '<h1>Title</h1>'
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Minimart::Web::TemplateHelper do
|
|
4
|
+
let(:klass) do
|
|
5
|
+
k = Class.new
|
|
6
|
+
k.extend(Minimart::Web::TemplateHelper)
|
|
7
|
+
k
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe '#platform_icon' do
|
|
11
|
+
describe 'amazon' do
|
|
12
|
+
subject { klass.platform_icon('amazon') }
|
|
13
|
+
it { is_expected.to eq 'aws' }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe 'centos' do
|
|
17
|
+
subject { klass.platform_icon('centos') }
|
|
18
|
+
it { is_expected.to eq 'centos' }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe 'debian' do
|
|
22
|
+
subject { klass.platform_icon('debian') }
|
|
23
|
+
it { is_expected.to eq 'debian' }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe 'fedora' do
|
|
27
|
+
subject { klass.platform_icon('fedora') }
|
|
28
|
+
it { is_expected.to eq 'fedora' }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'freebsd' do
|
|
32
|
+
subject { klass.platform_icon('freebsd') }
|
|
33
|
+
it { is_expected.to eq 'freebsd' }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe 'linuxmint' do
|
|
37
|
+
subject { klass.platform_icon('linuxmint') }
|
|
38
|
+
it { is_expected.to eq 'linux-mint' }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe 'mac_os_x' do
|
|
42
|
+
subject { klass.platform_icon('mac_os_x') }
|
|
43
|
+
it { is_expected.to eq 'apple' }
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe 'oracle' do
|
|
47
|
+
subject { klass.platform_icon('oracle') }
|
|
48
|
+
it { is_expected.to eq 'oracle' }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe 'raspbian' do
|
|
52
|
+
subject { klass.platform_icon('raspbian') }
|
|
53
|
+
it { is_expected.to eq 'raspberrypi' }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe 'redhat' do
|
|
57
|
+
subject { klass.platform_icon('redhat') }
|
|
58
|
+
it { is_expected.to eq 'redhat' }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe 'solaris' do
|
|
62
|
+
subject { klass.platform_icon('solaris') }
|
|
63
|
+
it { is_expected.to eq 'solaris' }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe 'suse' do
|
|
67
|
+
subject { klass.platform_icon('suse') }
|
|
68
|
+
it { is_expected.to eq 'suse' }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe 'ubuntu' do
|
|
72
|
+
subject { klass.platform_icon('ubuntu') }
|
|
73
|
+
it { is_expected.to eq 'ubuntu' }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
describe 'windows' do
|
|
77
|
+
subject { klass.platform_icon('windows') }
|
|
78
|
+
it { is_expected.to eq 'windows' }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe 'unknown' do
|
|
82
|
+
subject { klass.platform_icon('made-up-os') }
|
|
83
|
+
it { is_expected.to eq 'laptop' }
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'minimart/web/universe_generator'
|
|
3
|
+
require 'minimart/web/cookbooks'
|
|
4
|
+
require 'minimart/cookbook'
|
|
5
|
+
|
|
6
|
+
describe Minimart::Web::UniverseGenerator do
|
|
7
|
+
|
|
8
|
+
let(:web_directory) { test_directory }
|
|
9
|
+
let(:endpoint) { 'example.com' }
|
|
10
|
+
|
|
11
|
+
let(:cookbook) do
|
|
12
|
+
instance_double(Minimart::Cookbook,
|
|
13
|
+
name: 'sample_cookbook',
|
|
14
|
+
version: '1.2.3',
|
|
15
|
+
web_friendly_version: '1_2_3',
|
|
16
|
+
dependencies: {'mysql' => '> 0.0'},
|
|
17
|
+
path: Pathname.new('/spec/fixtures/sample_cookbook'),
|
|
18
|
+
to_s: 'sample_cookbook-1.2.3')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
let(:cookbooks) do
|
|
22
|
+
instance_double(Minimart::Web::Cookbooks, individual_cookbooks: [cookbook])
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
subject do
|
|
26
|
+
Minimart::Web::UniverseGenerator.new(
|
|
27
|
+
web_directory: web_directory,
|
|
28
|
+
endpoint: endpoint,
|
|
29
|
+
cookbooks: cookbooks)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '::new' do
|
|
33
|
+
it 'should assign #web_directory' do
|
|
34
|
+
expect(subject.web_directory).to eq web_directory
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'should assign #endpoint' do
|
|
38
|
+
expect(subject.endpoint).to eq endpoint
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'should assign #cookbooks' do
|
|
42
|
+
expect(subject.cookbooks).to eq cookbooks
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'should build an empty universe' do
|
|
46
|
+
expect(subject.universe.empty?).to eq true
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe '#generate' do
|
|
51
|
+
let(:cookbook_files_dir) { File.join(web_directory, 'cookbook_files') }
|
|
52
|
+
let(:cookbook_dir) { File.join(cookbook_files_dir, 'sample_cookbook') }
|
|
53
|
+
let(:universe_file) { File.join(web_directory, 'universe') }
|
|
54
|
+
|
|
55
|
+
before(:each) do
|
|
56
|
+
allow(Minimart::Utils::Archive).to receive(:pack_archive)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'should make a cookbook_files directory in the web directory' do
|
|
60
|
+
subject.generate
|
|
61
|
+
expect(Dir.exists?(cookbook_files_dir)).to eq true
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context 'when a cookbook files directory already exists' do
|
|
65
|
+
let(:cookbook_dir) { File.join(cookbook_files_dir, 'existing-cookbook') }
|
|
66
|
+
|
|
67
|
+
before(:each) do
|
|
68
|
+
FileUtils.mkdir_p(cookbook_files_dir)
|
|
69
|
+
FileUtils.mkdir_p(cookbook_dir)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'should remove the contents' do
|
|
73
|
+
subject.generate
|
|
74
|
+
expect(Dir.exists?(cookbook_dir)).to eq false
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it 'should make a sub-directory for any cookbooks provided' do
|
|
79
|
+
subject.generate
|
|
80
|
+
expect(Dir.exists?(cookbook_dir)).to eq true
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'should make a sub-directory for any versions of cookbooks provided' do
|
|
84
|
+
subject.generate
|
|
85
|
+
expect(Dir.exists?(File.join(cookbook_dir, '1_2_3'))).to eq true
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'should generate an archive for the cookbook in the correct path' do
|
|
89
|
+
expect(Minimart::Utils::Archive).to receive(:pack_archive).with(
|
|
90
|
+
cookbook,
|
|
91
|
+
File.join(cookbook_dir, '1_2_3/sample_cookbook-1.2.3.tar.gz'))
|
|
92
|
+
|
|
93
|
+
subject.generate
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it 'should write a universe file in the proper directory' do
|
|
97
|
+
subject.generate
|
|
98
|
+
expect(File.exists?(universe_file)).to eq true
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe 'universe contents' do
|
|
102
|
+
let(:universe_contents) { JSON.parse(File.open(universe_file).read) }
|
|
103
|
+
let(:cookbook_info) { universe_contents['sample_cookbook']['1.2.3'] }
|
|
104
|
+
|
|
105
|
+
before(:each) { subject.generate }
|
|
106
|
+
|
|
107
|
+
it 'should give the cookbook the proper location type' do
|
|
108
|
+
expect(cookbook_info['location_type']).to eq 'uri'
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'should give the cookbook the proper location path' do
|
|
112
|
+
expect(cookbook_info['location_path']).to eq 'http://example.com/cookbook_files/sample_cookbook/1_2_3/sample_cookbook-1.2.3.tar.gz'
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'should give the cookbook the proper download url' do
|
|
116
|
+
expect(cookbook_info['download_url']).to eq 'http://example.com/cookbook_files/sample_cookbook/1_2_3/sample_cookbook-1.2.3.tar.gz'
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it 'should include any dependencies' do
|
|
120
|
+
expect(cookbook_info['dependencies']).to eq('mysql' => '> 0.0')
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|