puppet-library 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.travis.yml +2 -1
- data/CHANGELOG.yml +5 -0
- data/README.md +42 -0
- data/Rakefile +65 -21
- data/TODO.yml +3 -2
- data/features/module_list.feature +38 -0
- data/features/module_page.feature +35 -0
- data/features/step_definitions/sinatra_steps.rb +82 -0
- data/features/support/env.rb +37 -0
- data/lib/puppet_library/app/views/index.haml +26 -0
- data/lib/puppet_library/app/views/layout.haml +54 -0
- data/lib/puppet_library/app/views/module.haml +25 -0
- data/lib/puppet_library/app/views/module_not_found.haml +19 -0
- data/lib/puppet_library/forge/abstract.rb +1 -0
- data/lib/puppet_library/puppet_library.rb +23 -7
- data/lib/puppet_library/server.rb +22 -0
- data/lib/puppet_library/version.rb +1 -1
- data/puppet-library.gemspec +7 -0
- data/spec/forge/abstract_spec.rb +3 -3
- data/spec/module_spec_helper.rb +36 -24
- data/spec/puppet_library_spec.rb +21 -1
- data/spec/server_spec.rb +60 -0
- metadata +84 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZTgwMTJmOWUxMDllNDMyMjFjNTgyZmI2ZmQ2NDc0NmM0NDEwYjRlNQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MmYzYzNiN2MxMTBhYTc1NzRlZGQ4OTExN2QyNzhmY2RhYjBlZDcyMw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Njk2ZmJmM2JmNDlhNzRmYzA3NDcyYWFmNjAwYTBmODQ2MzFmYmIxZmZmMGVh
|
10
|
+
MWFiNGRiOTM1NGYyMjQzY2NjNGFhMDdmOWUxNmM1YWVkOTRjMzhjNzVkMmE5
|
11
|
+
ZTA3ZWU0NDZiNTVlMjZjYzYzMjI5MDU2YzcxYmRmMzI5YmYwZDg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZWUzODAwZTRmOTNlY2U1MjRkZGI5NGY2YzAyOTJhMTFhNTc1N2U0MjJlMGUy
|
14
|
+
Yjc0MzQyN2FkNTRmOWY2ZTBlNmRmODhlY2ExMjk4MDIzYjJjNWFkMTJiZGI1
|
15
|
+
YWY1MTYxZTQ1ZmJhOWQ1NWZmOGU3YWVlZGM5MTJhNDUxODUxYjU=
|
data/.travis.yml
CHANGED
@@ -25,7 +25,8 @@ rvm:
|
|
25
25
|
- 2.1.0
|
26
26
|
env:
|
27
27
|
- RUBYGEMS_VERSION=2.1.11
|
28
|
-
|
28
|
+
#- RUBYGEMS_VERSION=1.8.5 # What Ubuntu 12.4 has
|
29
|
+
- RUBYGEMS_VERSION=1.8.28 # Earlier versions of Rubygems 1.8.x, when used with Ruby 2.0 fail to install nokogiri properly (Seen on R 2.0.0 / RG 1.8.24)
|
29
30
|
#matrix:
|
30
31
|
# allow_failures:
|
31
32
|
# - rvm: 2.1.0
|
data/CHANGELOG.yml
CHANGED
data/README.md
CHANGED
@@ -89,6 +89,48 @@ Puppet Library currently supports:
|
|
89
89
|
- dependency resolution and installation with [librarian-puppet](http://librarian-puppet.com)
|
90
90
|
- installation with [r10k](https://github.com/adrienthebo/r10k)
|
91
91
|
|
92
|
+
Puppet Library is tested against Ruby versions:
|
93
|
+
- 1.8.7
|
94
|
+
- 1.9.3
|
95
|
+
- 2.0.0
|
96
|
+
- 2.1.0
|
97
|
+
|
98
|
+
## Running with Phusion Passenger
|
99
|
+
|
100
|
+
To run Puppet Library with [Phusion Passenger](https://www.phusionpassenger.com):
|
101
|
+
|
102
|
+
```sh
|
103
|
+
# Create a Passenger-compatible directory structure
|
104
|
+
mkdir -p /webapps/puppet-library/{public,tmp}
|
105
|
+
|
106
|
+
# Create a Rack config file to point Puppet Library to your modules
|
107
|
+
cat > /webapps/puppet-library/config.ru <<EOF
|
108
|
+
require "rubygems"
|
109
|
+
require "puppet_library"
|
110
|
+
|
111
|
+
server = PuppetLibrary::Server.set_up do |library|
|
112
|
+
# Serve our private modules
|
113
|
+
library.forge PuppetLibrary::Forge::Directory.new("/var/lib/modules")
|
114
|
+
# Download all other moduls from the Puppet Forge
|
115
|
+
library.forge PuppetLibrary::Forge::Proxy.new("http://forge.puppetlabs.com")
|
116
|
+
end
|
117
|
+
|
118
|
+
run server
|
119
|
+
EOF
|
120
|
+
|
121
|
+
# Create an Apache virtual host pointing at Puppet Library
|
122
|
+
cat > /etc/httpd/conf.d/puppetlibrary.conf <<EOF
|
123
|
+
<VirtualHost *:80>
|
124
|
+
ServerName privateforge.example.com
|
125
|
+
DocumentRoot /webapps/puppet-library/public
|
126
|
+
<Directory /webapps/puppet-library/public>
|
127
|
+
Allow from all
|
128
|
+
Options -MultiViews
|
129
|
+
</Directory>
|
130
|
+
</VirtualHost>
|
131
|
+
EOF
|
132
|
+
```
|
133
|
+
|
92
134
|
## Contributing
|
93
135
|
|
94
136
|
1. Fork it
|
data/Rakefile
CHANGED
@@ -19,6 +19,12 @@ require 'bundler/gem_tasks'
|
|
19
19
|
require 'rspec/core/rake_task'
|
20
20
|
require 'coveralls/rake/task'
|
21
21
|
|
22
|
+
SUPPORTED_VERSIONS = %w[1.8 1.9 2.0 2.1]
|
23
|
+
# The integration test doesn't work on Ruby 1.8, and Puppet doesn't work on 2.1
|
24
|
+
INTEGRATION_TEST_INCOMPATIBLE_VERSIONS = %w[1.8 2.1]
|
25
|
+
# Capybara needs Nokogiri, which needs 1.9+
|
26
|
+
ACCEPTANCE_TEST_INCOMPATIBLE_VERSIONS = %w[1.8]
|
27
|
+
|
22
28
|
class String
|
23
29
|
def green
|
24
30
|
"\e[32m#{self}\e[0m"
|
@@ -27,17 +33,22 @@ class String
|
|
27
33
|
def red
|
28
34
|
"\e[31m#{self}\e[0m"
|
29
35
|
end
|
36
|
+
|
37
|
+
def yellow
|
38
|
+
"\e[33m#{self}\e[0m"
|
39
|
+
end
|
30
40
|
end
|
31
41
|
|
32
42
|
def ruby_version_supports_integration_test?(version = RUBY_VERSION)
|
33
|
-
|
34
|
-
|
43
|
+
! INTEGRATION_TEST_INCOMPATIBLE_VERSIONS.find do |bad_version|
|
44
|
+
version.start_with? bad_version
|
45
|
+
end
|
35
46
|
end
|
36
47
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
48
|
+
def ruby_version_supports_acceptance_tests?(version = RUBY_VERSION)
|
49
|
+
! ACCEPTANCE_TEST_INCOMPATIBLE_VERSIONS.find do |bad_version|
|
50
|
+
version.start_with? bad_version
|
51
|
+
end
|
41
52
|
end
|
42
53
|
|
43
54
|
Coveralls::RakeTask.new
|
@@ -45,17 +56,34 @@ Coveralls::RakeTask.new
|
|
45
56
|
desc "Run the specs"
|
46
57
|
RSpec::Core::RakeTask.new(:spec)
|
47
58
|
|
48
|
-
|
49
|
-
|
50
|
-
|
59
|
+
if ruby_version_supports_acceptance_tests?
|
60
|
+
require 'cucumber/rake/task'
|
61
|
+
Cucumber::Rake::Task.new(:features)
|
62
|
+
else
|
63
|
+
task :features do
|
64
|
+
puts "Skipping acceptance tests because this version of Ruby doesn't support them"
|
65
|
+
end
|
51
66
|
end
|
52
67
|
|
53
|
-
|
54
|
-
|
55
|
-
|
68
|
+
if ruby_version_supports_integration_test?
|
69
|
+
desc "Run all the tests"
|
70
|
+
RSpec::Core::RakeTask.new(:test) do |rspec|
|
71
|
+
rspec.pattern = "{spec,test}/**/*_{spec,integration_test}.rb"
|
72
|
+
end
|
73
|
+
task :test => :features
|
74
|
+
|
75
|
+
desc "Run the integration tests"
|
76
|
+
RSpec::Core::RakeTask.new(:integration_test) do |rspec|
|
77
|
+
rspec.pattern = "test/**/*_integration_test.rb"
|
78
|
+
end
|
79
|
+
else
|
80
|
+
task :integration_test do
|
81
|
+
puts "Skipping integration tests because this version of Ruby doesn't support them"
|
82
|
+
end
|
83
|
+
task :test => [:features, :spec]
|
56
84
|
end
|
57
85
|
|
58
|
-
task :default => [
|
86
|
+
task :default => [:test, 'coveralls:push']
|
59
87
|
|
60
88
|
desc "Check it works on all local rubies"
|
61
89
|
task :verify do
|
@@ -72,18 +100,34 @@ task :verify do
|
|
72
100
|
system "rvm #{ruby_version} do rake integration_test"
|
73
101
|
end
|
74
102
|
|
103
|
+
puts "\nRunning Acceptance Tests".green
|
104
|
+
acceptance_test_results = versions.map do |ruby_version|
|
105
|
+
puts "\n- Ruby #{ruby_version}".green
|
106
|
+
system "rvm #{ruby_version} do rake features"
|
107
|
+
end
|
108
|
+
|
75
109
|
puts "\nResults:\n".green
|
76
|
-
results = spec_results.
|
77
|
-
puts "
|
78
|
-
puts "| Version | Specs |
|
79
|
-
puts "
|
80
|
-
versions.zip(results).each do |(version, (spec_result, integration_test_result))|
|
110
|
+
results = [ spec_results, integration_test_results, acceptance_test_results ].transpose
|
111
|
+
puts "+---------+-------+-------+-------+"
|
112
|
+
puts "| Version | Specs | ITs | ATs |"
|
113
|
+
puts "+---------+-------+-------+-------+"
|
114
|
+
versions.zip(results).each do |(version, (spec_result, integration_test_result, acceptance_test_result))|
|
81
115
|
v = version
|
82
116
|
s = spec_result ? "pass".green : "fail".red
|
83
|
-
|
84
|
-
|
117
|
+
if ruby_version_supports_integration_test? version
|
118
|
+
i = integration_test_result ? "pass".green : "fail".red
|
119
|
+
else
|
120
|
+
i = "skip".yellow
|
121
|
+
end
|
122
|
+
|
123
|
+
if ruby_version_supports_acceptance_tests? version
|
124
|
+
a = acceptance_test_result ? "pass".green : "fail".red
|
125
|
+
else
|
126
|
+
a = "skip".yellow
|
127
|
+
end
|
128
|
+
puts "| #{v} | #{s} | #{i} | #{a} |"
|
85
129
|
end
|
86
|
-
puts "
|
130
|
+
puts "+---------+-------+-------+-------+"
|
87
131
|
|
88
132
|
versions.zip(results).each do |(version, (spec_result, integration_test_result))|
|
89
133
|
unless spec_result
|
data/TODO.yml
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
bugs:
|
2
|
+
- Using captialised Author name to create full module name
|
1
3
|
features:
|
2
4
|
- Use config from a config file
|
3
5
|
- Allow proxy to cache downloaded modules/API calls on disk
|
@@ -6,8 +8,7 @@ features:
|
|
6
8
|
will need to embed the server or use a config file for more control)
|
7
9
|
- Validate repo dirs (make sure they're readable)
|
8
10
|
- Allow failover between module repositories
|
9
|
-
-
|
10
|
-
- Web UI
|
11
|
+
- Web UI: asynchronous
|
11
12
|
- Authentication
|
12
13
|
|
13
14
|
dubious_features:
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# Puppet Library
|
3
|
+
# Copyright (C) 2014 drrb
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
Feature: Module list page
|
19
|
+
As a user
|
20
|
+
I want to see a list of available modules
|
21
|
+
So that I can quickly tell what's on the server
|
22
|
+
|
23
|
+
Scenario: Visit the module list page
|
24
|
+
When I visit the module list page
|
25
|
+
Then I should see "Modules"
|
26
|
+
|
27
|
+
Scenario: See module versions
|
28
|
+
Given the "puppetlabs/apache" module is available at version "1.0.0"
|
29
|
+
And the "puppetlabs/apache" module is available at version "1.1.0"
|
30
|
+
When I visit the module list page
|
31
|
+
Then I should see module "puppetlabs/apache" with versions 1.0.0 and 1.1.0
|
32
|
+
|
33
|
+
Scenario: Follow link to module page
|
34
|
+
Given the "puppetlabs/apache" module is available at version "1.0.0"
|
35
|
+
And the "puppetlabs/apache" module is available at version "1.1.0"
|
36
|
+
When I visit the module list page
|
37
|
+
And I click on "puppetlabs/apache"
|
38
|
+
Then I should be on the module page for "puppetlabs/apache"
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# Puppet Library
|
3
|
+
# Copyright (C) 2014 drrb
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
Feature: Module page
|
19
|
+
As a user
|
20
|
+
I want to see a list of available modules
|
21
|
+
So that I can quickly tell what's on the server
|
22
|
+
|
23
|
+
Scenario: Visit the module page
|
24
|
+
Given the "puppetlabs/apache" module is available at version "1.0.0"
|
25
|
+
And the "puppetlabs/apache" module is available at version "1.1.0"
|
26
|
+
When I visit the module page for "puppetlabs/apache"
|
27
|
+
Then I should see "Author: puppetlabs"
|
28
|
+
Then I should see "Name: apache"
|
29
|
+
And I should see "1.0.0"
|
30
|
+
And I should see "1.1.0"
|
31
|
+
And I should see "puppetlabs/apache module, version 1.1.0"
|
32
|
+
|
33
|
+
Scenario: Visit a nonexistant module page
|
34
|
+
When I visit the module page for "nonexistant/nonexistant"
|
35
|
+
Then I should see 'Module "nonexistant/nonexistant" not found'
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# Puppet Library
|
3
|
+
# Copyright (C) 2014 drrb
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
spec_path = File.expand_path("../../spec", File.dirname(__FILE__))
|
19
|
+
$LOAD_PATH.unshift spec_path unless $LOAD_PATH.include? spec_path
|
20
|
+
|
21
|
+
require 'module_spec_helper'
|
22
|
+
require 'fileutils'
|
23
|
+
|
24
|
+
include FileUtils
|
25
|
+
|
26
|
+
def module_dir
|
27
|
+
unless @module_dir
|
28
|
+
file = Tempfile.new("module_dir")
|
29
|
+
@module_dir = file.path
|
30
|
+
file.delete
|
31
|
+
end
|
32
|
+
@module_dir
|
33
|
+
end
|
34
|
+
|
35
|
+
def module_writer
|
36
|
+
@module_writer ||= ModuleSpecHelper::ModuleWriter.new(module_dir)
|
37
|
+
end
|
38
|
+
|
39
|
+
Before do
|
40
|
+
mkdir_p module_dir
|
41
|
+
forge.add_forge PuppetLibrary::Forge::Directory.new(module_dir)
|
42
|
+
end
|
43
|
+
|
44
|
+
After do
|
45
|
+
rm_rf module_dir
|
46
|
+
end
|
47
|
+
|
48
|
+
Given /^the "(.*?)" module is available at version "(.*?)"$/ do |full_name, version|
|
49
|
+
author, name = full_name.split "/"
|
50
|
+
module_writer.write_module(author, name, version)
|
51
|
+
end
|
52
|
+
|
53
|
+
When /^I visit the module list page$/ do
|
54
|
+
visit "/"
|
55
|
+
end
|
56
|
+
|
57
|
+
When /^I visit the module page for "(.*?)"$/ do |module_name|
|
58
|
+
visit "/#{module_name}"
|
59
|
+
end
|
60
|
+
|
61
|
+
When /^I click on "(.*?)"$/ do |link_text|
|
62
|
+
click_link link_text
|
63
|
+
end
|
64
|
+
|
65
|
+
Then /^I should be on the module page for "(.*?)"$/ do |module_name|
|
66
|
+
expect(URI.parse(current_url).path).to eq "/#{module_name}"
|
67
|
+
end
|
68
|
+
|
69
|
+
Then /^I should see "(.*?)"$/ do |text|
|
70
|
+
expect(page).to have_content text
|
71
|
+
end
|
72
|
+
|
73
|
+
Then /^I should see '(.*?)'$/ do |text|
|
74
|
+
expect(page).to have_content text
|
75
|
+
end
|
76
|
+
|
77
|
+
Then /^I should see module "(.*?)" with versions? (.*)$/ do |full_name, versions|
|
78
|
+
versions = versions.split /\s*,\s*|\s*,?\s*and\s*/
|
79
|
+
versions.each do |version|
|
80
|
+
find(:xpath, "//li[contains(.,'#{full_name}')]").should have_content version
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# Puppet Library
|
3
|
+
# Copyright (C) 2014 drrb
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
require 'puppet_library'
|
19
|
+
require 'capybara/cucumber'
|
20
|
+
|
21
|
+
class ServerWorld
|
22
|
+
def server
|
23
|
+
@server ||= PuppetLibrary::Server.new(forge)
|
24
|
+
end
|
25
|
+
|
26
|
+
def forge
|
27
|
+
@forge ||= PuppetLibrary::Forge::Multi.new
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
world = ServerWorld.new
|
32
|
+
Capybara.app = world.server
|
33
|
+
|
34
|
+
World do
|
35
|
+
world
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
-# -*- encoding: utf-8 -*-
|
2
|
+
-# Puppet Library
|
3
|
+
-# Copyright (C) 2014 drrb
|
4
|
+
-#
|
5
|
+
-# This program is free software: you can redistribute it and/or modify
|
6
|
+
-# it under the terms of the GNU General Public License as published by
|
7
|
+
-# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
-# (at your option) any later version.
|
9
|
+
-#
|
10
|
+
-# This program is distributed in the hope that it will be useful,
|
11
|
+
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
-# GNU General Public License for more details.
|
14
|
+
-#
|
15
|
+
-# You should have received a copy of the GNU General Public License
|
16
|
+
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
%h1 Modules
|
19
|
+
%ul
|
20
|
+
- modules.each do |mod|
|
21
|
+
%li
|
22
|
+
%b
|
23
|
+
%a{:href => mod["full_name"]}= mod["full_name"]
|
24
|
+
%ul
|
25
|
+
- mod["releases"].each do |release|
|
26
|
+
%li= release["version"]
|
@@ -0,0 +1,54 @@
|
|
1
|
+
-# -*- encoding: utf-8 -*-
|
2
|
+
-# Puppet Library
|
3
|
+
-# Copyright (C) 2014 drrb
|
4
|
+
-#
|
5
|
+
-# This program is free software: you can redistribute it and/or modify
|
6
|
+
-# it under the terms of the GNU General Public License as published by
|
7
|
+
-# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
-# (at your option) any later version.
|
9
|
+
-#
|
10
|
+
-# This program is distributed in the hope that it will be useful,
|
11
|
+
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
-# GNU General Public License for more details.
|
14
|
+
-#
|
15
|
+
-# You should have received a copy of the GNU General Public License
|
16
|
+
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
!!!
|
18
|
+
%html
|
19
|
+
%head
|
20
|
+
%meta{ :charset => "utf-8" }
|
21
|
+
%title Puppet Library
|
22
|
+
%link{ :href => "https://netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css", :type => "text/css", :rel => "stylesheet" }
|
23
|
+
/[if lt IE 9]
|
24
|
+
%script{:src => "https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"}
|
25
|
+
%script{:src => "https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"}
|
26
|
+
%style
|
27
|
+
:plain
|
28
|
+
body {
|
29
|
+
padding-top: 50px;
|
30
|
+
}
|
31
|
+
.starter-template {
|
32
|
+
padding: 40px 15px;
|
33
|
+
text-align: center;
|
34
|
+
}
|
35
|
+
%body
|
36
|
+
.navbar.navbar-inverse.navbar-fixed-top{ :role => "navigation" }
|
37
|
+
.container
|
38
|
+
.navbar-header
|
39
|
+
%button.navbar-toggle{ :type => "button", "data-toggle" => "collapse", "data-target" => ".navbar-collapse"}
|
40
|
+
%span.sr-only Toggle Navigation
|
41
|
+
%span.icon-bar
|
42
|
+
%span.icon-bar
|
43
|
+
%span.icon-bar
|
44
|
+
%a.navbar-brand{:href => '/'} Puppet Library
|
45
|
+
.collapse.navbar-collapse
|
46
|
+
%ul.nav.navbar-nav
|
47
|
+
%li.active
|
48
|
+
%a{:href => '/'} Modules
|
49
|
+
%li
|
50
|
+
%a{:href => 'https://github.com/drrb/puppet-library', :target => "puppet-library"} Help
|
51
|
+
.container
|
52
|
+
= yield
|
53
|
+
%script{ :src => "https://code.jquery.com/jquery-2.1.0.min.js" }
|
54
|
+
%script{ :src => "https://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js" }
|
@@ -0,0 +1,25 @@
|
|
1
|
+
-# -*- encoding: utf-8 -*-
|
2
|
+
-# Puppet Library
|
3
|
+
-# Copyright (C) 2014 drrb
|
4
|
+
-#
|
5
|
+
-# This program is free software: you can redistribute it and/or modify
|
6
|
+
-# it under the terms of the GNU General Public License as published by
|
7
|
+
-# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
-# (at your option) any later version.
|
9
|
+
-#
|
10
|
+
-# This program is distributed in the hope that it will be useful,
|
11
|
+
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
-# GNU General Public License for more details.
|
14
|
+
-#
|
15
|
+
-# You should have received a copy of the GNU General Public License
|
16
|
+
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
%h1= "Module #{metadata["full_name"]}"
|
19
|
+
%div= "Author: #{metadata["author"]}"
|
20
|
+
%div= "Name: #{metadata["name"]}"
|
21
|
+
%div= "Description: #{metadata["desc"]}"
|
22
|
+
%div= "Versions:"
|
23
|
+
%ul
|
24
|
+
- metadata["releases"].each do |release|
|
25
|
+
%li= release["version"]
|
@@ -0,0 +1,19 @@
|
|
1
|
+
-# -*- encoding: utf-8 -*-
|
2
|
+
-# Puppet Library
|
3
|
+
-# Copyright (C) 2014 drrb
|
4
|
+
-#
|
5
|
+
-# This program is free software: you can redistribute it and/or modify
|
6
|
+
-# it under the terms of the GNU General Public License as published by
|
7
|
+
-# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
-# (at your option) any later version.
|
9
|
+
-#
|
10
|
+
-# This program is distributed in the hope that it will be useful,
|
11
|
+
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
-# GNU General Public License for more details.
|
14
|
+
-#
|
15
|
+
-# You should have received a copy of the GNU General Public License
|
16
|
+
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
|
18
|
+
%h1 Not Found
|
19
|
+
%div= "Module \"#{author}/#{name}\" not found"
|
@@ -18,6 +18,7 @@
|
|
18
18
|
require 'rack'
|
19
19
|
require 'puppet_library/forge/directory'
|
20
20
|
require 'puppet_library/forge/multi'
|
21
|
+
require 'puppet_library/version'
|
21
22
|
|
22
23
|
module PuppetLibrary
|
23
24
|
class PuppetLibrary
|
@@ -41,23 +42,34 @@ module PuppetLibrary
|
|
41
42
|
option_parser = OptionParser.new do |opts|
|
42
43
|
opts.banner = "Usage: #{File.basename $0} [options]"
|
43
44
|
|
44
|
-
opts.on("-p", "--port
|
45
|
+
opts.on("-p", "--port PORT", "Port to listen on (defaults to whatever Rack wants to use)") do |port|
|
45
46
|
options[:port] = port
|
46
47
|
end
|
47
48
|
|
48
|
-
opts.on("-s", "--server
|
49
|
+
opts.on("-s", "--server SERVER", "Server to use (defaults to whatever Rack wants to use)") do |server|
|
49
50
|
options[:server] = server
|
50
51
|
end
|
51
52
|
|
52
|
-
opts.on("-b", "--bind-host
|
53
|
+
opts.on("-b", "--bind-host HOSTNAME", "Host name to bind to (defaults to whatever Rack wants to use)") do |hostname|
|
53
54
|
options[:hostname] = hostname
|
54
55
|
end
|
55
56
|
|
57
|
+
options[:daemonize] = false
|
58
|
+
opts.on("--daemonize", "Run the server in the background") do
|
59
|
+
options[:daemonize] = true
|
60
|
+
end
|
61
|
+
|
62
|
+
options[:pidfile] = nil
|
63
|
+
opts.on("--pidfile FILE", "Write a pidfile to this location after starting (implies --daemonize)") do |pidfile|
|
64
|
+
options[:daemonize] = true
|
65
|
+
options[:pidfile] = File.expand_path pidfile
|
66
|
+
end
|
67
|
+
|
56
68
|
options[:forges] = []
|
57
|
-
opts.on("-m", "--module-dir
|
69
|
+
opts.on("-m", "--module-dir DIR", "Directory containing the modules (can be specified multiple times)") do |module_dir|
|
58
70
|
options[:forges] << [Forge::Directory, module_dir]
|
59
71
|
end
|
60
|
-
opts.on("-x", "--proxy
|
72
|
+
opts.on("-x", "--proxy URL", "Remote forge to proxy (can be specified multiple times)") do |url|
|
61
73
|
options[:forges] << [Forge::Proxy, url]
|
62
74
|
end
|
63
75
|
end
|
@@ -86,9 +98,11 @@ module PuppetLibrary
|
|
86
98
|
def announce_server_start(options)
|
87
99
|
options = options.clone
|
88
100
|
options.default = "default"
|
89
|
-
|
101
|
+
action = options[:daemonize] ? "Daemonizing" : "Starting"
|
102
|
+
@log.puts "#{action} Puppet Library server:"
|
90
103
|
@log.puts " |- Port: #{options[:port]}"
|
91
104
|
@log.puts " |- Host: #{options[:hostname]}"
|
105
|
+
@log.puts " |- Pidfile: #{options[:pidfile]}" if options[:pidfile]
|
92
106
|
@log.puts " |- Server: #{options[:server]}"
|
93
107
|
@log.puts " `- Forges:"
|
94
108
|
options[:forges].each do |(forge_type, config)|
|
@@ -101,7 +115,9 @@ module PuppetLibrary
|
|
101
115
|
:app => server,
|
102
116
|
:Host => options[:hostname],
|
103
117
|
:Port => options[:port],
|
104
|
-
:server => options[:server]
|
118
|
+
:server => options[:server],
|
119
|
+
:daemonize => options[:daemonize],
|
120
|
+
:pid => options[:pidfile]
|
105
121
|
)
|
106
122
|
end
|
107
123
|
end
|
@@ -16,6 +16,7 @@
|
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
require 'sinatra/base'
|
19
|
+
require 'haml'
|
19
20
|
|
20
21
|
require 'puppet_library/forge/multi'
|
21
22
|
|
@@ -44,6 +45,14 @@ module PuppetLibrary
|
|
44
45
|
|
45
46
|
configure do
|
46
47
|
enable :logging
|
48
|
+
set :haml, :format => :html5
|
49
|
+
set :root, File.expand_path("app", File.dirname(__FILE__))
|
50
|
+
end
|
51
|
+
|
52
|
+
get "/" do
|
53
|
+
modules = @forge.search_modules(nil)
|
54
|
+
|
55
|
+
haml :index, { :locals => { "modules" => modules } }
|
47
56
|
end
|
48
57
|
|
49
58
|
get "/modules.json" do
|
@@ -89,5 +98,18 @@ module PuppetLibrary
|
|
89
98
|
status 404
|
90
99
|
end
|
91
100
|
end
|
101
|
+
|
102
|
+
get "/:author/:module" do
|
103
|
+
author = params[:author]
|
104
|
+
module_name = params[:module]
|
105
|
+
|
106
|
+
begin
|
107
|
+
metadata = @forge.get_module_metadata(author, module_name)
|
108
|
+
haml :module, { :locals => { "metadata" => metadata } }
|
109
|
+
rescue Forge::ModuleNotFound
|
110
|
+
status 404
|
111
|
+
haml :module_not_found, { :locals => { "author" => author, "name" => module_name } }
|
112
|
+
end
|
113
|
+
end
|
92
114
|
end
|
93
115
|
end
|
data/puppet-library.gemspec
CHANGED
@@ -38,9 +38,11 @@ Gem::Specification.new do |spec|
|
|
38
38
|
|
39
39
|
spec.add_dependency "sinatra"
|
40
40
|
spec.add_dependency "json"
|
41
|
+
spec.add_dependency "haml"
|
41
42
|
|
42
43
|
spec.add_development_dependency "bundler", "~> 1.3"
|
43
44
|
spec.add_development_dependency "coveralls"
|
45
|
+
spec.add_development_dependency "gitsu"
|
44
46
|
spec.add_development_dependency "librarian-puppet"
|
45
47
|
spec.add_development_dependency "mime-types", "< 2"
|
46
48
|
spec.add_development_dependency "pry"
|
@@ -55,5 +57,10 @@ Gem::Specification.new do |spec|
|
|
55
57
|
spec.add_development_dependency "guard"
|
56
58
|
spec.add_development_dependency "guard-rspec"
|
57
59
|
spec.add_development_dependency "terminal-notifier-guard"
|
60
|
+
|
61
|
+
# Capybara needs Nokogiri, which needs 1.9+
|
62
|
+
spec.add_development_dependency "capybara"
|
63
|
+
spec.add_development_dependency "nokogiri" # Rubygems 1.8 fails to resolve this on Ruby 2.0.0
|
64
|
+
spec.add_development_dependency "cucumber"
|
58
65
|
end
|
59
66
|
end
|
data/spec/forge/abstract_spec.rb
CHANGED
@@ -178,12 +178,12 @@ module PuppetLibrary::Forge
|
|
178
178
|
"author" => "puppetlabs",
|
179
179
|
"name" => "puppetlabs-apache",
|
180
180
|
"description" => "Apache module",
|
181
|
-
"version" => "1.
|
181
|
+
"version" => "1.1.0"
|
182
182
|
}, {
|
183
183
|
"author" => "puppetlabs",
|
184
184
|
"name" => "puppetlabs-apache",
|
185
|
-
"description" => "Apache module",
|
186
|
-
"version" => "1.
|
185
|
+
"description" => "Old Apache module",
|
186
|
+
"version" => "1.0.0"
|
187
187
|
} ]
|
188
188
|
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "apache").and_return(metadata)
|
189
189
|
|
data/spec/module_spec_helper.rb
CHANGED
@@ -19,35 +19,47 @@ require 'zlib'
|
|
19
19
|
require 'rubygems/package'
|
20
20
|
|
21
21
|
module ModuleSpecHelper
|
22
|
-
|
23
|
-
|
22
|
+
class ModuleWriter
|
23
|
+
def initialize(module_dir)
|
24
|
+
@module_dir = module_dir
|
25
|
+
end
|
26
|
+
|
27
|
+
def write_module(author, name, version)
|
28
|
+
full_name = "#{author}-#{name}"
|
29
|
+
fqn = "#{full_name}-#{version}"
|
30
|
+
module_file = File.join(@module_dir, "#{fqn}.tar.gz")
|
24
31
|
|
25
|
-
|
26
|
-
|
32
|
+
write_tar_gzip(module_file) do |archive|
|
33
|
+
archive.add_file("#{fqn}/metadata.json", 0644) do |file|
|
34
|
+
content = {
|
35
|
+
"name" => full_name,
|
36
|
+
"version" => version,
|
37
|
+
"description" => "#{author}/#{name} module, version #{version}",
|
38
|
+
"dependencies" => []
|
39
|
+
}
|
40
|
+
yield(content) if block_given?
|
41
|
+
file.write content.to_json
|
42
|
+
end
|
43
|
+
end
|
27
44
|
end
|
28
|
-
tar.seek(0)
|
29
45
|
|
30
|
-
|
31
|
-
|
32
|
-
tar.close
|
33
|
-
gz.close
|
34
|
-
end
|
46
|
+
def write_tar_gzip(file_name)
|
47
|
+
tar = StringIO.new
|
35
48
|
|
36
|
-
|
37
|
-
|
38
|
-
fqn = "#{full_name}-#{version}"
|
39
|
-
module_file = File.join(module_dir, "#{fqn}.tar.gz")
|
40
|
-
|
41
|
-
write_tar_gzip(module_file) do |archive|
|
42
|
-
archive.add_file("#{fqn}/metadata.json", 0644) do |file|
|
43
|
-
content = {
|
44
|
-
"name" => full_name,
|
45
|
-
"version" => version,
|
46
|
-
"dependencies" => []
|
47
|
-
}
|
48
|
-
yield(content) if block_given?
|
49
|
-
file.write content.to_json
|
49
|
+
Gem::Package::TarWriter.new(tar) do |writer|
|
50
|
+
yield(writer)
|
50
51
|
end
|
52
|
+
tar.seek(0)
|
53
|
+
|
54
|
+
gz = Zlib::GzipWriter.new(File.new(file_name, 'wb'))
|
55
|
+
gz.write(tar.read)
|
56
|
+
tar.close
|
57
|
+
gz.close
|
51
58
|
end
|
52
59
|
end
|
60
|
+
|
61
|
+
def add_module(author, name, version, &block)
|
62
|
+
writer = ModuleWriter.new(module_dir)
|
63
|
+
writer.write_module(author, name, version, &block)
|
64
|
+
end
|
53
65
|
end
|
data/spec/puppet_library_spec.rb
CHANGED
@@ -31,7 +31,8 @@ module PuppetLibrary
|
|
31
31
|
end
|
32
32
|
let(:log) { double('log').as_null_object }
|
33
33
|
let(:library) { PuppetLibrary.new(log) }
|
34
|
-
let(:default_options) {{ :app => server, :Host => nil, :Port => nil, :server => nil }}
|
34
|
+
let(:default_options) {{ :app => server, :Host => nil, :Port => nil, :server => nil, :daemonize => false, :pid => nil }}
|
35
|
+
|
35
36
|
before do
|
36
37
|
allow(Rack::Server).to receive(:start)
|
37
38
|
end
|
@@ -85,6 +86,25 @@ module PuppetLibrary
|
|
85
86
|
end
|
86
87
|
end
|
87
88
|
|
89
|
+
context "when using --daemonize option" do
|
90
|
+
it "daemonizes the server" do
|
91
|
+
expect(Rack::Server).to receive(:start).with(default_options_with(:daemonize => true))
|
92
|
+
expect(log).to receive(:puts).with(/Daemonizing/)
|
93
|
+
|
94
|
+
library.go(["--daemonize"])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "when using --pidfile option" do
|
99
|
+
it "daemonizes and writes a pidfile to the specified location" do
|
100
|
+
expect(Rack::Server).to receive(:start).with(default_options_with(:daemonize => true, :pid => "/var/run/puppet-library.pid"))
|
101
|
+
expect(log).to receive(:puts).with(/Daemonizing/)
|
102
|
+
expect(log).to receive(:puts).with(/Pidfile: \/var\/run\/puppet-library.pid/)
|
103
|
+
|
104
|
+
library.go(["--pidfile", "/var/run/puppet-library.pid"])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
88
108
|
context "when using --proxy option" do
|
89
109
|
it "adds a proxy module forge for each option specified" do
|
90
110
|
proxy1 = double('proxy1')
|
data/spec/server_spec.rb
CHANGED
@@ -28,6 +28,31 @@ module PuppetLibrary
|
|
28
28
|
Server.new(forge)
|
29
29
|
end
|
30
30
|
|
31
|
+
describe "GET /" do
|
32
|
+
it "lists all the modules" do
|
33
|
+
modules = [
|
34
|
+
{
|
35
|
+
"author" => "puppetlabs",
|
36
|
+
"name" => "apache",
|
37
|
+
"tag_list" => ["apache", "httpd"],
|
38
|
+
"releases" => [{"version"=>"0.0.1"}, {"version"=>"0.0.2"}],
|
39
|
+
"full_name" => "puppetlabs/apache",
|
40
|
+
"version" => "0.0.2",
|
41
|
+
"project_url" => "http://github.com/puppetlabs/puppetlabs-apache",
|
42
|
+
"desc" => "Puppet module for Apache"
|
43
|
+
}
|
44
|
+
]
|
45
|
+
expect(forge).to receive(:search_modules).with(nil).and_return(modules)
|
46
|
+
|
47
|
+
get "/"
|
48
|
+
|
49
|
+
expect(last_response.body).to include "Modules"
|
50
|
+
expect(last_response.body).to include "puppetlabs/apache"
|
51
|
+
expect(last_response.body).to include "0.0.1"
|
52
|
+
expect(last_response.body).to include "0.0.2"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
31
56
|
describe "GET /modules.json" do
|
32
57
|
it "renders the search result as JSON" do
|
33
58
|
search_results = [
|
@@ -78,6 +103,41 @@ module PuppetLibrary
|
|
78
103
|
end
|
79
104
|
end
|
80
105
|
|
106
|
+
describe "GET /<author>/<module>" do
|
107
|
+
it "displays module metadata" do
|
108
|
+
metadata = {
|
109
|
+
"author" => "puppetlabs",
|
110
|
+
"full_name" => "puppetlabs/apache",
|
111
|
+
"name" => "apache",
|
112
|
+
"desc" => "Puppet module for Apache",
|
113
|
+
"releases" => [
|
114
|
+
{ "version" => "0.10.0" },
|
115
|
+
{ "version" => "0.9.0" },
|
116
|
+
]
|
117
|
+
}
|
118
|
+
expect(forge).to receive(:get_module_metadata).with("puppetlabs", "apache").and_return(metadata)
|
119
|
+
|
120
|
+
get "/puppetlabs/apache"
|
121
|
+
|
122
|
+
expect(last_response.body).to include "Author: puppetlabs"
|
123
|
+
expect(last_response.body).to include "Name: apache"
|
124
|
+
expect(last_response.body).to include "0.10.0"
|
125
|
+
expect(last_response.body).to include "0.9.0"
|
126
|
+
expect(last_response).to be_ok
|
127
|
+
end
|
128
|
+
|
129
|
+
context "when no modules found" do
|
130
|
+
it "returns an error" do
|
131
|
+
expect(forge).to receive(:get_module_metadata).with("nonexistant", "nonexistant").and_raise(Forge::ModuleNotFound)
|
132
|
+
|
133
|
+
get "/nonexistant/nonexistant"
|
134
|
+
|
135
|
+
expect(last_response.body).to include 'Module "nonexistant/nonexistant" not found'
|
136
|
+
expect(last_response.status).to eq(404)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
81
141
|
describe "GET /<author>/<module>.json" do
|
82
142
|
it "gets module metadata for all versions" do
|
83
143
|
metadata = {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-library
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- drrb
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ! '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: haml
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +80,20 @@ dependencies:
|
|
66
80
|
- - ! '>='
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: gitsu
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: librarian-puppet
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,6 +248,48 @@ dependencies:
|
|
220
248
|
- - ! '>='
|
221
249
|
- !ruby/object:Gem::Version
|
222
250
|
version: '0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: capybara
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - ! '>='
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '0'
|
258
|
+
type: :development
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - ! '>='
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '0'
|
265
|
+
- !ruby/object:Gem::Dependency
|
266
|
+
name: nokogiri
|
267
|
+
requirement: !ruby/object:Gem::Requirement
|
268
|
+
requirements:
|
269
|
+
- - ! '>='
|
270
|
+
- !ruby/object:Gem::Version
|
271
|
+
version: '0'
|
272
|
+
type: :development
|
273
|
+
prerelease: false
|
274
|
+
version_requirements: !ruby/object:Gem::Requirement
|
275
|
+
requirements:
|
276
|
+
- - ! '>='
|
277
|
+
- !ruby/object:Gem::Version
|
278
|
+
version: '0'
|
279
|
+
- !ruby/object:Gem::Dependency
|
280
|
+
name: cucumber
|
281
|
+
requirement: !ruby/object:Gem::Requirement
|
282
|
+
requirements:
|
283
|
+
- - ! '>='
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: '0'
|
286
|
+
type: :development
|
287
|
+
prerelease: false
|
288
|
+
version_requirements: !ruby/object:Gem::Requirement
|
289
|
+
requirements:
|
290
|
+
- - ! '>='
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: '0'
|
223
293
|
description: A Puppet module server
|
224
294
|
email:
|
225
295
|
- drrrrrrrrrrrb@gmail.com
|
@@ -241,7 +311,15 @@ files:
|
|
241
311
|
- TODO.yml
|
242
312
|
- bin/puppet-library
|
243
313
|
- config.ru
|
314
|
+
- features/module_list.feature
|
315
|
+
- features/module_page.feature
|
316
|
+
- features/step_definitions/sinatra_steps.rb
|
317
|
+
- features/support/env.rb
|
244
318
|
- lib/puppet_library.rb
|
319
|
+
- lib/puppet_library/app/views/index.haml
|
320
|
+
- lib/puppet_library/app/views/layout.haml
|
321
|
+
- lib/puppet_library/app/views/module.haml
|
322
|
+
- lib/puppet_library/app/views/module_not_found.haml
|
245
323
|
- lib/puppet_library/forge.rb
|
246
324
|
- lib/puppet_library/forge/abstract.rb
|
247
325
|
- lib/puppet_library/forge/directory.rb
|
@@ -298,6 +376,10 @@ signing_key:
|
|
298
376
|
specification_version: 4
|
299
377
|
summary: Puppet Library is a private Puppet module server that's compatible with librarian-puppet.
|
300
378
|
test_files:
|
379
|
+
- features/module_list.feature
|
380
|
+
- features/module_page.feature
|
381
|
+
- features/step_definitions/sinatra_steps.rb
|
382
|
+
- features/support/env.rb
|
301
383
|
- spec/forge/abstract_spec.rb
|
302
384
|
- spec/forge/directory_spec.rb
|
303
385
|
- spec/forge/multi_spec.rb
|