puppet-library 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +8 -4
- data/CHANGELOG.yml +31 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/bin/puppet-library +1 -1
- data/lib/puppet_library.rb +3 -2
- data/lib/puppet_library/forge.rb +15 -3
- data/lib/puppet_library/http/{cache.rb → cache/in_memory.rb} +17 -5
- data/lib/puppet_library/http/cache/noop.rb +28 -0
- data/lib/puppet_library/module_repo/directory.rb +1 -1
- data/lib/puppet_library/module_repo/multi.rb +1 -1
- data/lib/puppet_library/module_repo/proxy.rb +11 -3
- data/lib/puppet_library/server.rb +2 -1
- data/lib/puppet_library/util.rb +13 -0
- data/lib/puppet_library/version.rb +2 -2
- data/spec/forge_spec.rb +114 -41
- data/spec/http/{cache_spec.rb → cache/in_memory_spec.rb} +4 -4
- data/spec/http/cache/noop_spec.rb +32 -0
- data/spec/module_repo/directory_spec.rb +1 -1
- data/spec/module_repo/multi_spec.rb +1 -1
- data/spec/module_repo/proxy_spec.rb +13 -3
- data/spec/module_spec_helper.rb +1 -1
- data/spec/server_spec.rb +10 -2
- data/spec/spec_helper.rb +1 -1
- data/spec/util_spec.rb +1 -1
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c1ea499735a82bacf4051bd1b4ea24f2003d613
|
4
|
+
data.tar.gz: ad4e79023760adaf7bc96becfa61d9403f2c60be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebe0288bdc97d3df601dc7f1d523d49d3884662af2b756aac2a7634219175a7b7f6035b3a3ffd0bafcfd87f0c9c3c5eb847ff12409a9aca7daf4de24da4b1141
|
7
|
+
data.tar.gz: 81466a2f9550252a75f7f6d98d941df618eb0b611a52a2d7df0fb30e85b825dcdd0399ed3876889189417e07e14b650cb219f31d0cdb2e33b8d22cf597ce32e5
|
data/.travis.yml
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Puppet Library
|
2
|
-
# Copyright (C)
|
2
|
+
# Copyright (C) 2014 drrb
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -19,6 +19,10 @@ before_install:
|
|
19
19
|
- gem update --system 2.1.11
|
20
20
|
- gem --version
|
21
21
|
rvm:
|
22
|
-
-
|
23
|
-
-
|
24
|
-
-
|
22
|
+
- 1.8.7
|
23
|
+
- 1.9.3
|
24
|
+
- 2.0.0
|
25
|
+
- 2.1.0
|
26
|
+
matrix:
|
27
|
+
allow_failures:
|
28
|
+
- rvm: 2.1.0
|
data/CHANGELOG.yml
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Puppet Library
|
2
|
+
# Copyright (C) 2014 drrb
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
- tag: v0.0.1
|
18
|
+
changes:
|
19
|
+
- Support for serving modules from a directory on disk
|
20
|
+
- tag: v0.0.2
|
21
|
+
changes:
|
22
|
+
- Support for serving multiple module sources
|
23
|
+
- Bug fixes for Ruby 1.8.7
|
24
|
+
- tag: v0.1.0
|
25
|
+
changes:
|
26
|
+
- Support for proxying a remote forge
|
27
|
+
- tag: v0.2.0
|
28
|
+
changes:
|
29
|
+
- Support more specific module version queries using 'version' parameter
|
30
|
+
- Fixed bug on older versions of RubyGems
|
31
|
+
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/bin/puppet-library
CHANGED
data/lib/puppet_library.rb
CHANGED
@@ -19,10 +19,11 @@ require 'puppet_library/version'
|
|
19
19
|
|
20
20
|
require 'puppet_library/puppet_library'
|
21
21
|
require 'puppet_library/server'
|
22
|
-
require 'puppet_library/
|
22
|
+
require 'puppet_library/module_metadata'
|
23
23
|
require 'puppet_library/http/http_client'
|
24
24
|
require 'puppet_library/http/url'
|
25
|
-
require 'puppet_library/
|
25
|
+
require 'puppet_library/http/cache/in_memory'
|
26
|
+
require 'puppet_library/http/cache/noop'
|
26
27
|
require 'puppet_library/module_repo/directory'
|
27
28
|
require 'puppet_library/module_repo/multi'
|
28
29
|
require 'puppet_library/module_repo/proxy'
|
data/lib/puppet_library/forge.rb
CHANGED
@@ -69,12 +69,24 @@ module PuppetLibrary
|
|
69
69
|
module_infos.deep_merge
|
70
70
|
end
|
71
71
|
|
72
|
-
def get_module_metadata_with_dependencies(author, name)
|
72
|
+
def get_module_metadata_with_dependencies(author, name, version)
|
73
|
+
raise ModuleNotFound if get_metadata(author, name).empty?
|
74
|
+
|
73
75
|
full_name = "#{author}/#{name}"
|
76
|
+
versions = collect_dependencies_versions(full_name)
|
77
|
+
return versions if version.nil?
|
74
78
|
|
75
|
-
|
76
|
-
|
79
|
+
versions[full_name] = versions[full_name].select do |v|
|
80
|
+
v["version"].start_with?(version)
|
77
81
|
end
|
82
|
+
|
83
|
+
dependencies = versions[full_name].map do |v|
|
84
|
+
v["dependencies"].map {|(name, spec)| name}
|
85
|
+
end.flatten
|
86
|
+
versions = Hash[versions.select do |name, info|
|
87
|
+
name == full_name || dependencies.include?(name)
|
88
|
+
end]
|
89
|
+
return versions
|
78
90
|
end
|
79
91
|
|
80
92
|
def collect_dependencies_versions(module_full_name, metadata = {})
|
@@ -15,25 +15,37 @@
|
|
15
15
|
# You should have received a copy of the GNU General Public License
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
|
-
module PuppetLibrary::Http
|
19
|
-
class
|
18
|
+
module PuppetLibrary::Http::Cache
|
19
|
+
class InMemory
|
20
20
|
ARBITRARY_CACHE_TTL_MILLIS = 10 * 1000
|
21
21
|
def initialize(millis_to_live = ARBITRARY_CACHE_TTL_MILLIS)
|
22
22
|
@reaper = Reaper.new(millis_to_live)
|
23
|
-
@cache = {}
|
24
23
|
end
|
25
24
|
|
26
25
|
def get(key)
|
27
|
-
entry =
|
26
|
+
entry = retrieve(key)
|
28
27
|
if entry
|
29
28
|
return entry.value unless @reaper.wants_to_kill? entry
|
30
29
|
end
|
31
30
|
|
32
31
|
value = yield
|
33
|
-
|
32
|
+
save(key, Entry.new(value))
|
34
33
|
return value
|
35
34
|
end
|
36
35
|
|
36
|
+
def retrieve(key)
|
37
|
+
cache[key]
|
38
|
+
end
|
39
|
+
|
40
|
+
def save(key, entry)
|
41
|
+
cache[key] = entry
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def cache
|
46
|
+
@cache ||= {}
|
47
|
+
end
|
48
|
+
|
37
49
|
class Entry
|
38
50
|
attr_accessor :value
|
39
51
|
|
@@ -0,0 +1,28 @@
|
|
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/http/cache/in_memory'
|
19
|
+
|
20
|
+
module PuppetLibrary::Http::Cache
|
21
|
+
class NoOp < PuppetLibrary::Http::Cache::InMemory
|
22
|
+
def save(key, entry)
|
23
|
+
end
|
24
|
+
|
25
|
+
def retrieve(key)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -16,15 +16,21 @@
|
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
require 'puppet_library/http/http_client'
|
19
|
-
require 'puppet_library/http/cache'
|
19
|
+
require 'puppet_library/http/cache/in_memory'
|
20
|
+
require 'puppet_library/http/cache/noop'
|
20
21
|
require 'puppet_library/http/url'
|
21
22
|
|
22
23
|
module PuppetLibrary::ModuleRepo
|
24
|
+
#include PuppetLibrary::Http
|
23
25
|
class Proxy
|
24
|
-
def initialize(url,
|
26
|
+
def initialize(url,
|
27
|
+
query_cache = PuppetLibrary::Http::Cache::InMemory.new,
|
28
|
+
download_cache = PuppetLibrary::Http::Cache::NoOp.new,
|
29
|
+
http_client = PuppetLibrary::Http::HttpClient.new)
|
25
30
|
@url = PuppetLibrary::Http::Url.normalize(url)
|
26
31
|
@http_client = http_client
|
27
32
|
@query_cache = query_cache
|
33
|
+
@download_cache = download_cache
|
28
34
|
end
|
29
35
|
|
30
36
|
def get_module(author, name, version)
|
@@ -71,7 +77,9 @@ module PuppetLibrary::ModuleRepo
|
|
71
77
|
end
|
72
78
|
|
73
79
|
def download_file(file)
|
74
|
-
@
|
80
|
+
@download_cache.get(file) do
|
81
|
+
@http_client.download(url(file))
|
82
|
+
end
|
75
83
|
end
|
76
84
|
|
77
85
|
def get(relative_url)
|
@@ -50,8 +50,9 @@ module PuppetLibrary
|
|
50
50
|
|
51
51
|
get "/api/v1/releases.json" do
|
52
52
|
author, module_name = params[:module].split "/"
|
53
|
+
version = params[:version]
|
53
54
|
begin
|
54
|
-
@forge.get_module_metadata_with_dependencies(author, module_name).to_json
|
55
|
+
@forge.get_module_metadata_with_dependencies(author, module_name, version).to_json
|
55
56
|
rescue ModuleNotFound
|
56
57
|
status 410
|
57
58
|
{"error" => "Module #{author}/#{module_name} not found"}.to_json
|
data/lib/puppet_library/util.rb
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
# You should have received a copy of the GNU General Public License
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
|
+
require 'rubygems/package'
|
19
|
+
|
18
20
|
class Array
|
19
21
|
# Like 'uniq' with a block, but also works on Ruby < 1.9
|
20
22
|
def unique_by
|
@@ -29,3 +31,14 @@ class Array
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
34
|
+
|
35
|
+
class Gem::Package::TarReader
|
36
|
+
# Old versions of RubyGems don't include Enumerable in here
|
37
|
+
def find
|
38
|
+
each do |entry|
|
39
|
+
if yield(entry)
|
40
|
+
return entry
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
# Puppet Library
|
3
|
-
# Copyright (C)
|
3
|
+
# Copyright (C) 2014 drrb
|
4
4
|
#
|
5
5
|
# This program is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
@@ -16,5 +16,5 @@
|
|
16
16
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
17
|
|
18
18
|
module PuppetLibrary
|
19
|
-
VERSION = "0.
|
19
|
+
VERSION = "0.2.0"
|
20
20
|
end
|
data/spec/forge_spec.rb
CHANGED
@@ -90,56 +90,129 @@ module PuppetLibrary
|
|
90
90
|
expect(module_repo).to receive(:get_metadata).with("nonexistant", "nonexistant").and_return([])
|
91
91
|
|
92
92
|
expect {
|
93
|
-
forge.get_module_metadata_with_dependencies("nonexistant", "nonexistant")
|
93
|
+
forge.get_module_metadata_with_dependencies("nonexistant", "nonexistant", "1.0.0")
|
94
94
|
}.to raise_error ModuleNotFound
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
context "when module versions found" do
|
99
|
-
it "returns
|
100
|
-
|
98
|
+
context "when only different module versions found" do
|
99
|
+
it "returns an empty array" do
|
100
|
+
metadata = [ {
|
101
101
|
"author" => "puppetlabs",
|
102
102
|
"name" => "puppetlabs-apache",
|
103
103
|
"description" => "Apache module",
|
104
104
|
"version" => "1.0.0",
|
105
|
-
"dependencies" => [
|
106
|
-
{ "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
|
107
|
-
{ "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }
|
108
|
-
]
|
109
|
-
}, {
|
110
|
-
"author" => "puppetlabs",
|
111
|
-
"name" => "puppetlabs-apache",
|
112
|
-
"description" => "Apache module",
|
113
|
-
"version" => "1.1.0",
|
114
|
-
"dependencies" => [
|
115
|
-
{ "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
|
116
|
-
{ "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }
|
117
|
-
]
|
118
|
-
} ]
|
119
|
-
stdlib_metadata = [ {
|
120
|
-
"author" => "puppetlabs",
|
121
|
-
"name" => "puppetlabs-stdlib",
|
122
|
-
"description" => "Stdlib module",
|
123
|
-
"version" => "2.0.0",
|
124
|
-
"dependencies" => [ ]
|
105
|
+
"dependencies" => []
|
125
106
|
} ]
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
107
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "apache").at_least(:once).and_return(metadata)
|
108
|
+
|
109
|
+
result = forge.get_module_metadata_with_dependencies("puppetlabs", "apache", "2.0.0")
|
110
|
+
expect(result).to eq({"puppetlabs/apache" => []})
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "when module versions found" do
|
115
|
+
context "when a version specified" do
|
116
|
+
it "returns metadata for that module version and its dependencies" do
|
117
|
+
apache_metadata = [ {
|
118
|
+
"author" => "puppetlabs",
|
119
|
+
"name" => "puppetlabs-apache",
|
120
|
+
"description" => "Apache module",
|
121
|
+
"version" => "1.0.0",
|
122
|
+
"dependencies" => [
|
123
|
+
{ "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
|
124
|
+
{ "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }
|
125
|
+
]
|
126
|
+
}, {
|
127
|
+
"author" => "puppetlabs",
|
128
|
+
"name" => "puppetlabs-apache",
|
129
|
+
"description" => "Apache module",
|
130
|
+
"version" => "1.1.0",
|
131
|
+
"dependencies" => [
|
132
|
+
{ "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
|
133
|
+
{ "name" => "puppetlabs/newthing", "version_requirement" => ">= 1.0.0" }
|
134
|
+
]
|
135
|
+
} ]
|
136
|
+
stdlib_metadata = [ {
|
137
|
+
"author" => "puppetlabs",
|
138
|
+
"name" => "puppetlabs-stdlib",
|
139
|
+
"description" => "Stdlib module",
|
140
|
+
"version" => "2.4.0",
|
141
|
+
"dependencies" => [ ]
|
142
|
+
} ]
|
143
|
+
concat_metadata = [ {
|
144
|
+
"author" => "puppetlabs",
|
145
|
+
"name" => "puppetlabs-concat",
|
146
|
+
"description" => "Concat module",
|
147
|
+
"version" => "1.0.0",
|
148
|
+
"dependencies" => [ ]
|
149
|
+
} ]
|
150
|
+
newthing_metadata = [ {
|
151
|
+
"author" => "puppetlabs",
|
152
|
+
"name" => "puppetlabs-newthing",
|
153
|
+
"description" => "New module",
|
154
|
+
"version" => "1.0.0",
|
155
|
+
"dependencies" => [ ]
|
156
|
+
} ]
|
157
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "apache").at_least(:once).and_return(apache_metadata)
|
158
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "stdlib").and_return(stdlib_metadata)
|
159
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "concat").and_return(concat_metadata)
|
160
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "newthing").and_return(newthing_metadata)
|
161
|
+
|
162
|
+
result = forge.get_module_metadata_with_dependencies("puppetlabs", "apache", "1.0.0")
|
163
|
+
expect(result.keys.sort).to eq(["puppetlabs/apache", "puppetlabs/concat", "puppetlabs/stdlib"])
|
164
|
+
expect(result["puppetlabs/apache"].size).to eq(1)
|
165
|
+
expect(result["puppetlabs/apache"][0]["file"]).to eq("/modules/puppetlabs-apache-1.0.0.tar.gz")
|
166
|
+
expect(result["puppetlabs/apache"][0]["version"]).to eq("1.0.0")
|
167
|
+
expect(result["puppetlabs/apache"][0]["version"]).to eq("1.0.0")
|
168
|
+
end
|
169
|
+
end
|
170
|
+
context "when no version specified" do
|
171
|
+
it "returns metadata for all module versions and their dependencies" do
|
172
|
+
apache_metadata = [ {
|
173
|
+
"author" => "puppetlabs",
|
174
|
+
"name" => "puppetlabs-apache",
|
175
|
+
"description" => "Apache module",
|
176
|
+
"version" => "1.0.0",
|
177
|
+
"dependencies" => [
|
178
|
+
{ "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
|
179
|
+
{ "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }
|
180
|
+
]
|
181
|
+
}, {
|
182
|
+
"author" => "puppetlabs",
|
183
|
+
"name" => "puppetlabs-apache",
|
184
|
+
"description" => "Apache module",
|
185
|
+
"version" => "1.1.0",
|
186
|
+
"dependencies" => [
|
187
|
+
{ "name" => "puppetlabs/stdlib", "version_requirement" => ">= 2.4.0" },
|
188
|
+
{ "name" => "puppetlabs/concat", "version_requirement" => ">= 1.0.0" }
|
189
|
+
]
|
190
|
+
} ]
|
191
|
+
stdlib_metadata = [ {
|
192
|
+
"author" => "puppetlabs",
|
193
|
+
"name" => "puppetlabs-stdlib",
|
194
|
+
"description" => "Stdlib module",
|
195
|
+
"version" => "2.0.0",
|
196
|
+
"dependencies" => [ ]
|
197
|
+
} ]
|
198
|
+
concat_metadata = [ {
|
199
|
+
"author" => "puppetlabs",
|
200
|
+
"name" => "puppetlabs-concat",
|
201
|
+
"description" => "Concat module",
|
202
|
+
"version" => "1.0.0",
|
203
|
+
"dependencies" => [ ]
|
204
|
+
} ]
|
205
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "apache").at_least(:once).and_return(apache_metadata)
|
206
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "stdlib").and_return(stdlib_metadata)
|
207
|
+
expect(module_repo).to receive(:get_metadata).with("puppetlabs", "concat").and_return(concat_metadata)
|
208
|
+
|
209
|
+
result = forge.get_module_metadata_with_dependencies("puppetlabs", "apache", nil)
|
210
|
+
expect(result.keys.sort).to eq(["puppetlabs/apache", "puppetlabs/concat", "puppetlabs/stdlib"])
|
211
|
+
expect(result["puppetlabs/apache"].size).to eq(2)
|
212
|
+
expect(result["puppetlabs/apache"][0]["file"]).to eq("/modules/puppetlabs-apache-1.0.0.tar.gz")
|
213
|
+
expect(result["puppetlabs/apache"][0]["version"]).to eq("1.0.0")
|
214
|
+
expect(result["puppetlabs/apache"][0]["version"]).to eq("1.0.0")
|
215
|
+
end
|
143
216
|
end
|
144
217
|
end
|
145
218
|
end
|
@@ -17,10 +17,10 @@
|
|
17
17
|
|
18
18
|
require 'spec_helper'
|
19
19
|
|
20
|
-
module PuppetLibrary::Http
|
21
|
-
describe
|
20
|
+
module PuppetLibrary::Http::Cache
|
21
|
+
describe InMemory do
|
22
22
|
|
23
|
-
let(:cache) {
|
23
|
+
let(:cache) { InMemory.new }
|
24
24
|
|
25
25
|
describe "#get" do
|
26
26
|
context "the first time it's called" do
|
@@ -51,7 +51,7 @@ module PuppetLibrary::Http
|
|
51
51
|
|
52
52
|
context "when the time limit has expired" do
|
53
53
|
it "looks up the value again" do
|
54
|
-
cache =
|
54
|
+
cache = InMemory.new(0)
|
55
55
|
|
56
56
|
greeting = cache.get("greeting") { "hi" }
|
57
57
|
greeting = cache.get("greeting") { "bye" }
|
@@ -0,0 +1,32 @@
|
|
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 'spec_helper'
|
19
|
+
|
20
|
+
module PuppetLibrary::Http::Cache
|
21
|
+
describe NoOp do
|
22
|
+
let(:cache) { NoOp.new }
|
23
|
+
|
24
|
+
describe "#get" do
|
25
|
+
it "never caches the content" do
|
26
|
+
name = cache.get("name") { "joe" }
|
27
|
+
name = cache.get("name") { "james" }
|
28
|
+
expect(name).to eq "james"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -20,11 +20,13 @@ require 'spec_helper'
|
|
20
20
|
module PuppetLibrary::ModuleRepo
|
21
21
|
describe Proxy do
|
22
22
|
let(:http_client) { double('http_client') }
|
23
|
-
let(:
|
23
|
+
let(:query_cache) { PuppetLibrary::Http::Cache::InMemory.new }
|
24
|
+
let(:download_cache) { PuppetLibrary::Http::Cache::InMemory.new }
|
25
|
+
let(:repo) { Proxy.new("http://puppetforge.example.com", query_cache, download_cache, http_client) }
|
24
26
|
|
25
27
|
describe "url" do
|
26
28
|
it "defaults to HTTP, when protocol not specified" do
|
27
|
-
repo = Proxy.new("forge.puppetlabs.com", http_client)
|
29
|
+
repo = Proxy.new("forge.puppetlabs.com", query_cache, download_cache, http_client)
|
28
30
|
|
29
31
|
expect(http_client).to receive(:get).with(/http:\/\/forge.puppetlabs.com/).and_return('{"puppetlabs/apache":[]}')
|
30
32
|
|
@@ -32,7 +34,7 @@ module PuppetLibrary::ModuleRepo
|
|
32
34
|
end
|
33
35
|
|
34
36
|
it "copes with a trailing slash" do
|
35
|
-
repo = Proxy.new("forge.puppetlabs.com/", http_client)
|
37
|
+
repo = Proxy.new("forge.puppetlabs.com/", query_cache, download_cache, http_client)
|
36
38
|
|
37
39
|
expect(http_client).to receive(:get).with(/http:\/\/forge.puppetlabs.com\/api/).and_return('{"puppetlabs/apache":[]}')
|
38
40
|
|
@@ -53,6 +55,14 @@ module PuppetLibrary::ModuleRepo
|
|
53
55
|
module_buffer = repo.get_module("puppetlabs", "apache", "1.2.3")
|
54
56
|
expect(module_buffer).to eq "module buffer"
|
55
57
|
end
|
58
|
+
|
59
|
+
it "caches the download" do
|
60
|
+
expect(http_client).to receive(:get).at_least(1).times.and_return('{"puppetlabs/apache":[{"version": "1", "file":"/module.tar.gz"}]}')
|
61
|
+
expect(http_client).to receive(:download).once
|
62
|
+
|
63
|
+
repo.get_module("puppetlabs", "apache", "1")
|
64
|
+
repo.get_module("puppetlabs", "apache", "1")
|
65
|
+
end
|
56
66
|
end
|
57
67
|
|
58
68
|
context "when the module doesn't exist" do
|
data/spec/module_spec_helper.rb
CHANGED
data/spec/server_spec.rb
CHANGED
@@ -115,7 +115,7 @@ module PuppetLibrary
|
|
115
115
|
}
|
116
116
|
]
|
117
117
|
}
|
118
|
-
expect(forge).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache").and_return(metadata)
|
118
|
+
expect(forge).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", nil).and_return(metadata)
|
119
119
|
|
120
120
|
get "/api/v1/releases.json?module=puppetlabs/apache"
|
121
121
|
|
@@ -125,7 +125,7 @@ module PuppetLibrary
|
|
125
125
|
|
126
126
|
context "when the module can't be found" do
|
127
127
|
it "returns an error" do
|
128
|
-
expect(forge).to receive(:get_module_metadata_with_dependencies).with("nonexistant", "nonexistant").and_raise(ModuleNotFound)
|
128
|
+
expect(forge).to receive(:get_module_metadata_with_dependencies).with("nonexistant", "nonexistant", nil).and_raise(ModuleNotFound)
|
129
129
|
|
130
130
|
get "/api/v1/releases.json?module=nonexistant/nonexistant"
|
131
131
|
|
@@ -133,6 +133,14 @@ module PuppetLibrary
|
|
133
133
|
expect(last_response.status).to eq(410)
|
134
134
|
end
|
135
135
|
end
|
136
|
+
|
137
|
+
context "when a version is specified" do
|
138
|
+
it "looks up the specified version" do
|
139
|
+
expect(forge).to receive(:get_module_metadata_with_dependencies).with("puppetlabs", "apache", "1.0.0")
|
140
|
+
|
141
|
+
get "/api/v1/releases.json?module=puppetlabs/apache&version=1.0.0"
|
142
|
+
end
|
143
|
+
end
|
136
144
|
end
|
137
145
|
end
|
138
146
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/util_spec.rb
CHANGED
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.2.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-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -190,6 +190,7 @@ files:
|
|
190
190
|
- .licenseignore
|
191
191
|
- .simplecov
|
192
192
|
- .travis.yml
|
193
|
+
- CHANGELOG.yml
|
193
194
|
- Gemfile
|
194
195
|
- LICENSE.txt
|
195
196
|
- README.md
|
@@ -199,7 +200,8 @@ files:
|
|
199
200
|
- config.ru
|
200
201
|
- lib/puppet_library.rb
|
201
202
|
- lib/puppet_library/forge.rb
|
202
|
-
- lib/puppet_library/http/cache.rb
|
203
|
+
- lib/puppet_library/http/cache/in_memory.rb
|
204
|
+
- lib/puppet_library/http/cache/noop.rb
|
203
205
|
- lib/puppet_library/http/http_client.rb
|
204
206
|
- lib/puppet_library/http/url.rb
|
205
207
|
- lib/puppet_library/module_metadata.rb
|
@@ -212,7 +214,8 @@ files:
|
|
212
214
|
- lib/puppet_library/version.rb
|
213
215
|
- puppet-library.gemspec
|
214
216
|
- spec/forge_spec.rb
|
215
|
-
- spec/http/
|
217
|
+
- spec/http/cache/in_memory_spec.rb
|
218
|
+
- spec/http/cache/noop_spec.rb
|
216
219
|
- spec/http/http_client_spec.rb
|
217
220
|
- spec/http/url_spec.rb
|
218
221
|
- spec/module_repo/directory_spec.rb
|
@@ -250,7 +253,8 @@ specification_version: 4
|
|
250
253
|
summary: Puppet Library is a private Puppet module server that's compatible with librarian-puppet.
|
251
254
|
test_files:
|
252
255
|
- spec/forge_spec.rb
|
253
|
-
- spec/http/
|
256
|
+
- spec/http/cache/in_memory_spec.rb
|
257
|
+
- spec/http/cache/noop_spec.rb
|
254
258
|
- spec/http/http_client_spec.rb
|
255
259
|
- spec/http/url_spec.rb
|
256
260
|
- spec/module_repo/directory_spec.rb
|