puppet_forge 2.3.0 → 3.0.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/.github/workflows/ruby-rspec.yml +30 -0
- data/CHANGELOG.md +36 -0
- data/CODEOWNERS +1 -0
- data/README.md +1 -1
- data/lib/puppet_forge.rb +1 -1
- data/lib/puppet_forge/connection.rb +2 -4
- data/lib/puppet_forge/connection/connection_failure.rb +1 -1
- data/lib/puppet_forge/v3/base.rb +1 -1
- data/lib/puppet_forge/version.rb +1 -1
- data/puppet_forge.gemspec +6 -7
- data/spec/spec_helper.rb +1 -2
- data/spec/unit/forge/connection/connection_failure_spec.rb +7 -0
- data/spec/unit/forge/connection_spec.rb +3 -3
- data/spec/unit/forge/v3/metadata_spec.rb +0 -40
- metadata +14 -50
- data/.travis.yml +0 -22
- data/MAINTAINERS +0 -13
- data/lib/puppet_forge/middleware/symbolify_json.rb +0 -72
- data/spec/integration/forge/v3/module_spec.rb +0 -119
- data/spec/integration/forge/v3/release_spec.rb +0 -75
- data/spec/integration/forge/v3/user_spec.rb +0 -70
- data/spec/unit/forge/middleware/symbolify_json_spec.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04e64600a52c57a9fef2dce82516632a77e196b1778b2082c925def0ecdbf734
|
4
|
+
data.tar.gz: 660cb79c76d923bbe6f101f68f01d913800625688ba59f61152d697054f967bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2199cd27949a3de2c7869bcffea4b489b03aee703b5a1fdb9cac4b9447a90160ecf731cd549b1c8edcfeeb560a6352c0df3836daf2e22d2fdf5290f95f6f9f0b
|
7
|
+
data.tar.gz: 2a0053e71e9bccd6cb9cb2168618344426ca9e829f1328f5ff97b1d7d644a164e2a3077f483f2bc0ce2a41078e7daeefaf2d3016730ded51fd24a6cca9b82750
|
@@ -0,0 +1,30 @@
|
|
1
|
+
name: ruby-rspec
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- main
|
7
|
+
pull_request:
|
8
|
+
branches:
|
9
|
+
- main
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
test:
|
13
|
+
name: Test with Ruby ${{ matrix.ruby_version }}
|
14
|
+
runs-on: ubuntu-latest
|
15
|
+
strategy:
|
16
|
+
matrix:
|
17
|
+
ruby_version: ['2.7.x', '2.6.x', '2.5.x', '2.4.x']
|
18
|
+
|
19
|
+
steps:
|
20
|
+
- uses: actions/checkout@v1
|
21
|
+
- name: Set up Ruby ${{ matrix.ruby_version }}
|
22
|
+
uses: actions/setup-ruby@v1
|
23
|
+
with:
|
24
|
+
ruby-version: ${{ matrix.ruby_version }}
|
25
|
+
|
26
|
+
- name: Build and test with Rspec
|
27
|
+
run: |
|
28
|
+
gem install bundler
|
29
|
+
bundle install --jobs 4 --retry 3
|
30
|
+
bundle exec rspec
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,42 @@
|
|
3
3
|
Starting with v2.0.0, all notable changes to this project will be documented in this file.
|
4
4
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
5
5
|
|
6
|
+
## v3.0.0 - 2021-01-28
|
7
|
+
|
8
|
+
* Breaking: The `puppet_forge` gem now requires at least Ruby 2.4.0.
|
9
|
+
* Update `faraday` and `faraday_middleware` gem dependencies to 1.x series.
|
10
|
+
* Update optional `typhoeus` dependency to `>= 1.4` to maintain compatibility with `faraday`.
|
11
|
+
|
12
|
+
## v2.3.4 - 2020-03-31
|
13
|
+
|
14
|
+
* Update the forge API url to `forgeapi.puppet.com` (instead of using the older puppetlabs.com domain).
|
15
|
+
* Allow versions of the `faraday_middleware` dependency up to 0.15.
|
16
|
+
|
17
|
+
## v2.3.3 - 2020-02-20
|
18
|
+
|
19
|
+
### Changed
|
20
|
+
|
21
|
+
* Allow versions of faraday up to 0.18
|
22
|
+
|
23
|
+
## v2.3.2 - 2020-02-05
|
24
|
+
|
25
|
+
### Fixed
|
26
|
+
|
27
|
+
* Catch and handle the new `Faraday::TimeoutError`s which are occasionally
|
28
|
+
surfaced by the the typheous adapter with more recent verions of libcurl, and
|
29
|
+
log them the same way that `Faraday::ConnectionFailed` errors are already
|
30
|
+
logged.
|
31
|
+
|
32
|
+
### Changed
|
33
|
+
|
34
|
+
* Allow for using `faraday_middleware` versions in the 0.13.x series.
|
35
|
+
|
36
|
+
## v2.3.1 - 2019-11-15
|
37
|
+
|
38
|
+
### Fixed
|
39
|
+
|
40
|
+
* Fixed an issue where proxy configurations were being ignored by expanding the range of acceptable versions of the `faraday` gem dependency and specifically excluding the version that was ignoring proxy configuration options.
|
41
|
+
|
6
42
|
## v2.3.0 - 2019-07-09
|
7
43
|
|
8
44
|
### Changed
|
data/CODEOWNERS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* @puppetlabs/forge-team
|
data/README.md
CHANGED
data/lib/puppet_forge.rb
CHANGED
@@ -17,7 +17,7 @@ module PuppetForge
|
|
17
17
|
|
18
18
|
GettextSetup.initialize(File.absolute_path('../locales', File.dirname(__FILE__)))
|
19
19
|
|
20
|
-
DEFAULT_FORGE_HOST = 'https://forgeapi.
|
20
|
+
DEFAULT_FORGE_HOST = 'https://forgeapi.puppet.com/'
|
21
21
|
|
22
22
|
self.host = DEFAULT_FORGE_HOST
|
23
23
|
|
@@ -2,7 +2,6 @@ require 'puppet_forge/connection/connection_failure'
|
|
2
2
|
|
3
3
|
require 'faraday'
|
4
4
|
require 'faraday_middleware'
|
5
|
-
require 'puppet_forge/middleware/symbolify_json'
|
6
5
|
|
7
6
|
module PuppetForge
|
8
7
|
# Provide a common mixin for adding a HTTP connection to classes.
|
@@ -81,7 +80,7 @@ module PuppetForge
|
|
81
80
|
|
82
81
|
begin
|
83
82
|
# Use Typhoeus if available.
|
84
|
-
Gem::Specification.find_by_name('typhoeus', '~> 1.
|
83
|
+
Gem::Specification.find_by_name('typhoeus', '~> 1.4')
|
85
84
|
require 'typhoeus/adapters/faraday'
|
86
85
|
adapter = :typhoeus
|
87
86
|
rescue Gem::LoadError
|
@@ -114,8 +113,7 @@ module PuppetForge
|
|
114
113
|
end
|
115
114
|
|
116
115
|
Faraday.new(url, options) do |builder|
|
117
|
-
builder.
|
118
|
-
builder.response(:json, :content_type => /\bjson$/)
|
116
|
+
builder.response(:json, :content_type => /\bjson$/, :parser_options => { :symbolize_names => true })
|
119
117
|
builder.response(:raise_error)
|
120
118
|
builder.use(:connection_failure)
|
121
119
|
|
@@ -7,7 +7,7 @@ module PuppetForge
|
|
7
7
|
class ConnectionFailure < Faraday::Middleware
|
8
8
|
def call(env)
|
9
9
|
@app.call(env)
|
10
|
-
rescue Faraday::ConnectionFailed => e
|
10
|
+
rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
|
11
11
|
baseurl = env[:url].dup
|
12
12
|
if proxy = env[:request][:proxy]
|
13
13
|
errmsg = _("Unable to connect to %{scheme}://%{host} (using proxy %{proxy}) (for request %{path_query})") % {
|
data/lib/puppet_forge/v3/base.rb
CHANGED
@@ -56,7 +56,7 @@ module PuppetForge
|
|
56
56
|
# @private
|
57
57
|
def request(resource, item = nil, params = {}, reset_connection = false, conn_opts = {})
|
58
58
|
conn(reset_connection, conn_opts) if reset_connection
|
59
|
-
unless conn.url_prefix =~ /^#{PuppetForge.host}/
|
59
|
+
unless conn.url_prefix.to_s =~ /^#{PuppetForge.host}/
|
60
60
|
conn.url_prefix = "#{PuppetForge.host}"
|
61
61
|
end
|
62
62
|
|
data/lib/puppet_forge/version.rb
CHANGED
data/puppet_forge.gemspec
CHANGED
@@ -18,15 +18,14 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.required_ruby_version = '>=
|
21
|
+
spec.required_ruby_version = '>= 2.4.0'
|
22
22
|
|
23
|
-
spec.add_runtime_dependency "faraday",
|
24
|
-
spec.add_runtime_dependency "faraday_middleware",
|
25
|
-
spec.add_dependency
|
26
|
-
spec.add_dependency
|
27
|
-
spec.add_dependency
|
23
|
+
spec.add_runtime_dependency "faraday", "~> 1.3"
|
24
|
+
spec.add_runtime_dependency "faraday_middleware", "~> 1.0"
|
25
|
+
spec.add_dependency "semantic_puppet", "~> 1.0"
|
26
|
+
spec.add_dependency "minitar"
|
27
|
+
spec.add_dependency "gettext-setup", "~> 0.11"
|
28
28
|
|
29
|
-
spec.add_development_dependency "bundler", "~> 1.6"
|
30
29
|
spec.add_development_dependency "rake"
|
31
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
32
31
|
spec.add_development_dependency "simplecov"
|
data/spec/spec_helper.rb
CHANGED
@@ -15,8 +15,7 @@ module StubbingFaraday
|
|
15
15
|
def stub_api_for(klass, base_url = "http://api.example.com")
|
16
16
|
allow(klass).to receive(:conn) do
|
17
17
|
Faraday.new :url => base_url do |builder|
|
18
|
-
builder.
|
19
|
-
builder.response(:json, :content_type => /\bjson$/)
|
18
|
+
builder.response(:json, :content_type => /\bjson$/, :parser_options => { :symbolize_names => true })
|
20
19
|
builder.response(:raise_error)
|
21
20
|
builder.use(:connection_failure)
|
22
21
|
|
@@ -11,6 +11,7 @@ describe PuppetForge::Connection::ConnectionFailure do
|
|
11
11
|
|
12
12
|
builder.adapter :test do |stub|
|
13
13
|
stub.get('/connectfail') { raise Faraday::ConnectionFailed.new(SocketError.new("getaddrinfo: Name or service not known"), :hi) }
|
14
|
+
stub.get('/timeout') { raise Faraday::TimeoutError, "request timed out" }
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -21,6 +22,12 @@ describe PuppetForge::Connection::ConnectionFailure do
|
|
21
22
|
}.to raise_error(Faraday::ConnectionFailed, /unable to connect to.*\/connectfail.*name or service not known/i)
|
22
23
|
end
|
23
24
|
|
25
|
+
it "logs for timeout errors" do
|
26
|
+
expect {
|
27
|
+
subject.get('/timeout')
|
28
|
+
}.to raise_error(Faraday::ConnectionFailed, /unable to connect to.*\/timeout.*request timed out/i)
|
29
|
+
end
|
30
|
+
|
24
31
|
it "includes the proxy host in the error message when set" do
|
25
32
|
if subject.respond_to?(:proxy=)
|
26
33
|
subject.proxy = 'https://some-unreachable.proxy:3128'
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe PuppetForge::Connection do
|
4
4
|
before(:each) do
|
5
|
-
PuppetForge.host = "https://forgeapi.
|
5
|
+
PuppetForge.host = "https://forgeapi.puppet.com"
|
6
6
|
end
|
7
7
|
|
8
8
|
let(:test_conn) do
|
@@ -88,7 +88,7 @@ describe PuppetForge::Connection do
|
|
88
88
|
|
89
89
|
expect {
|
90
90
|
subject.get('/error')
|
91
|
-
}.to raise_error(Faraday::
|
91
|
+
}.to raise_error(Faraday::ServerError, "the server responded with status 503")
|
92
92
|
end
|
93
93
|
|
94
94
|
context 'when an authorization value is provided' do
|
@@ -115,7 +115,7 @@ describe PuppetForge::Connection do
|
|
115
115
|
describe 'creating a default connection' do
|
116
116
|
it 'creates a connection with the PuppetForge host' do
|
117
117
|
conn = test_conn.default_connection
|
118
|
-
expect(conn.url_prefix.to_s).to eq 'https://forgeapi.
|
118
|
+
expect(conn.url_prefix.to_s).to eq 'https://forgeapi.puppet.com/'
|
119
119
|
end
|
120
120
|
end
|
121
121
|
end
|
@@ -168,14 +168,6 @@ describe PuppetForge::Metadata do
|
|
168
168
|
|
169
169
|
end
|
170
170
|
|
171
|
-
context "with a valid dependency", :pending => "dependency resolution is not yet in scope" do
|
172
|
-
let(:data) { {'dependencies' => [{'name' => 'puppetlabs-goodmodule'}] }}
|
173
|
-
|
174
|
-
it "adds the dependency" do
|
175
|
-
expect(subject.dependencies.size).to eq(1)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
171
|
context "with a invalid dependency name" do
|
180
172
|
let(:data) { {'dependencies' => [{'name' => 'puppetlabsbadmodule'}] }}
|
181
173
|
|
@@ -184,14 +176,6 @@ describe PuppetForge::Metadata do
|
|
184
176
|
end
|
185
177
|
end
|
186
178
|
|
187
|
-
context "with a valid dependency version range", :pending => "dependency resolution is not yet in scope" do
|
188
|
-
let(:data) { {'dependencies' => [{'name' => 'puppetlabs-badmodule', 'version_requirement' => '>= 2.0.0'}] }}
|
189
|
-
|
190
|
-
it "adds the dependency" do
|
191
|
-
expect(subject.dependencies.size).to eq(1)
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
179
|
context "with a invalid version range" do
|
196
180
|
let(:data) { {'dependencies' => [{'name' => 'puppetlabsbadmodule', 'version_requirement' => '>= banana'}] }}
|
197
181
|
|
@@ -199,30 +183,6 @@ describe PuppetForge::Metadata do
|
|
199
183
|
expect { subject }.to raise_error(ArgumentError)
|
200
184
|
end
|
201
185
|
end
|
202
|
-
|
203
|
-
context "with duplicate dependencies", :pending => "dependency resolution is not yet in scope" do
|
204
|
-
let(:data) { {'dependencies' => [{'name' => 'puppetlabs-dupmodule', 'version_requirement' => '1.0.0'},
|
205
|
-
{'name' => 'puppetlabs-dupmodule', 'version_requirement' => '0.0.1'}] }
|
206
|
-
}
|
207
|
-
|
208
|
-
it "raises an exception" do
|
209
|
-
expect { subject }.to raise_error(ArgumentError)
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
context "adding a duplicate dependency", :pending => "dependency resolution is not yet in scope" do
|
214
|
-
let(:data) { {'dependencies' => [{'name' => 'puppetlabs-origmodule', 'version_requirement' => '1.0.0'}] }}
|
215
|
-
|
216
|
-
it "with a different version raises an exception" do
|
217
|
-
metadata.add_dependency('puppetlabs-origmodule', '>= 0.0.1')
|
218
|
-
expect { subject }.to raise_error(ArgumentError)
|
219
|
-
end
|
220
|
-
|
221
|
-
it "with the same version does not add another dependency" do
|
222
|
-
metadata.add_dependency('puppetlabs-origmodule', '1.0.0')
|
223
|
-
expect(subject.dependencies.size).to eq(1)
|
224
|
-
end
|
225
|
-
end
|
226
186
|
end
|
227
187
|
|
228
188
|
describe '#dashed_name' do
|
metadata
CHANGED
@@ -1,55 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet_forge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet Labs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.9.0
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
19
|
+
version: '1.3'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.9.0
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: '1.3'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: faraday_middleware
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
36
30
|
requirements:
|
37
|
-
- - "
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: 0.9.0
|
40
|
-
- - "<"
|
31
|
+
- - "~>"
|
41
32
|
- !ruby/object:Gem::Version
|
42
|
-
version:
|
33
|
+
version: '1.0'
|
43
34
|
type: :runtime
|
44
35
|
prerelease: false
|
45
36
|
version_requirements: !ruby/object:Gem::Requirement
|
46
37
|
requirements:
|
47
|
-
- - "
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: 0.9.0
|
50
|
-
- - "<"
|
38
|
+
- - "~>"
|
51
39
|
- !ruby/object:Gem::Version
|
52
|
-
version:
|
40
|
+
version: '1.0'
|
53
41
|
- !ruby/object:Gem::Dependency
|
54
42
|
name: semantic_puppet
|
55
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,20 +80,6 @@ dependencies:
|
|
92
80
|
- - "~>"
|
93
81
|
- !ruby/object:Gem::Version
|
94
82
|
version: '0.11'
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: bundler
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
requirements:
|
99
|
-
- - "~>"
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '1.6'
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
requirements:
|
106
|
-
- - "~>"
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version: '1.6'
|
109
83
|
- !ruby/object:Gem::Dependency
|
110
84
|
name: rake
|
111
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -212,12 +186,12 @@ executables: []
|
|
212
186
|
extensions: []
|
213
187
|
extra_rdoc_files: []
|
214
188
|
files:
|
189
|
+
- ".github/workflows/ruby-rspec.yml"
|
215
190
|
- ".gitignore"
|
216
|
-
- ".travis.yml"
|
217
191
|
- CHANGELOG.md
|
192
|
+
- CODEOWNERS
|
218
193
|
- Gemfile
|
219
194
|
- LICENSE.txt
|
220
|
-
- MAINTAINERS
|
221
195
|
- README.md
|
222
196
|
- Rakefile
|
223
197
|
- lib/puppet_forge.rb
|
@@ -226,7 +200,6 @@ files:
|
|
226
200
|
- lib/puppet_forge/error.rb
|
227
201
|
- lib/puppet_forge/lazy_accessors.rb
|
228
202
|
- lib/puppet_forge/lazy_relations.rb
|
229
|
-
- lib/puppet_forge/middleware/symbolify_json.rb
|
230
203
|
- lib/puppet_forge/tar.rb
|
231
204
|
- lib/puppet_forge/tar/mini.rb
|
232
205
|
- lib/puppet_forge/unpacker.rb
|
@@ -271,16 +244,12 @@ files:
|
|
271
244
|
- spec/fixtures/v3/releases__module=puppetlabs-apache.json
|
272
245
|
- spec/fixtures/v3/users/puppetlabs.headers
|
273
246
|
- spec/fixtures/v3/users/puppetlabs.json
|
274
|
-
- spec/integration/forge/v3/module_spec.rb
|
275
|
-
- spec/integration/forge/v3/release_spec.rb
|
276
|
-
- spec/integration/forge/v3/user_spec.rb
|
277
247
|
- spec/spec_helper.rb
|
278
248
|
- spec/tmp/.gitkeep
|
279
249
|
- spec/unit/forge/connection/connection_failure_spec.rb
|
280
250
|
- spec/unit/forge/connection_spec.rb
|
281
251
|
- spec/unit/forge/lazy_accessors_spec.rb
|
282
252
|
- spec/unit/forge/lazy_relations_spec.rb
|
283
|
-
- spec/unit/forge/middleware/symbolify_json_spec.rb
|
284
253
|
- spec/unit/forge/tar/mini_spec.rb
|
285
254
|
- spec/unit/forge/tar_spec.rb
|
286
255
|
- spec/unit/forge/unpacker_spec.rb
|
@@ -304,15 +273,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
304
273
|
requirements:
|
305
274
|
- - ">="
|
306
275
|
- !ruby/object:Gem::Version
|
307
|
-
version:
|
276
|
+
version: 2.4.0
|
308
277
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
309
278
|
requirements:
|
310
279
|
- - ">="
|
311
280
|
- !ruby/object:Gem::Version
|
312
281
|
version: '0'
|
313
282
|
requirements: []
|
314
|
-
|
315
|
-
rubygems_version: 2.7.7
|
283
|
+
rubygems_version: 3.0.8
|
316
284
|
signing_key:
|
317
285
|
specification_version: 4
|
318
286
|
summary: Access the Puppet Forge API from Ruby for resource information and to download
|
@@ -348,16 +316,12 @@ test_files:
|
|
348
316
|
- spec/fixtures/v3/releases__module=puppetlabs-apache.json
|
349
317
|
- spec/fixtures/v3/users/puppetlabs.headers
|
350
318
|
- spec/fixtures/v3/users/puppetlabs.json
|
351
|
-
- spec/integration/forge/v3/module_spec.rb
|
352
|
-
- spec/integration/forge/v3/release_spec.rb
|
353
|
-
- spec/integration/forge/v3/user_spec.rb
|
354
319
|
- spec/spec_helper.rb
|
355
320
|
- spec/tmp/.gitkeep
|
356
321
|
- spec/unit/forge/connection/connection_failure_spec.rb
|
357
322
|
- spec/unit/forge/connection_spec.rb
|
358
323
|
- spec/unit/forge/lazy_accessors_spec.rb
|
359
324
|
- spec/unit/forge/lazy_relations_spec.rb
|
360
|
-
- spec/unit/forge/middleware/symbolify_json_spec.rb
|
361
325
|
- spec/unit/forge/tar/mini_spec.rb
|
362
326
|
- spec/unit/forge/tar_spec.rb
|
363
327
|
- spec/unit/forge/unpacker_spec.rb
|
data/.travis.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
dist: xenial
|
2
|
-
language: ruby
|
3
|
-
rvm:
|
4
|
-
- 2.6
|
5
|
-
- 2.5
|
6
|
-
- 2.3
|
7
|
-
- 2.1
|
8
|
-
# TODO: enable integration testing
|
9
|
-
script: bundle exec rspec spec/unit
|
10
|
-
jobs:
|
11
|
-
include:
|
12
|
-
- stage: deploy
|
13
|
-
if: tag IS present
|
14
|
-
rvm: 2.6
|
15
|
-
script: echo "Deploying to rubygems.org..."
|
16
|
-
deploy:
|
17
|
-
on:
|
18
|
-
all_branches: true
|
19
|
-
provider: rubygems
|
20
|
-
gem: puppet_forge
|
21
|
-
api_key:
|
22
|
-
secure: 066s1nJoYzCPzujfTAZ1OiDbbHghLIfW2SxZ/xTom7SbtYlb4SVOUkzOr6dLMysUBAWLQRwiFvgNij+iWwHoNEPqNA+JeGZIiL32ShQI0NW+lTcjPzeAe8Ppy/1pxgXFSJAPHLzdpdgiK91eM4vMWHIaOqPeT/4+X2+kmWbg71E=
|
data/MAINTAINERS
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
If you'd like to make a change to this library, you should contact at least one
|
2
|
-
of the maintainers listed below. They will be able to discuss the change with
|
3
|
-
you and decide the next best step. The maintainers will also be notified of pull
|
4
|
-
requests as described in the README. This maintainers file should be kept up to
|
5
|
-
date with the current maintainers of the project.
|
6
|
-
|
7
|
-
If you need to contact the maintainers of this project you should email
|
8
|
-
info@puppetlabs.com.
|
9
|
-
|
10
|
-
Alex Dreyer, Puppet Labs
|
11
|
-
Anderson Mills, Puppet Labs
|
12
|
-
Jesse Scott, Puppet Labs
|
13
|
-
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module PuppetForge
|
2
|
-
module Middleware
|
3
|
-
|
4
|
-
# SymbolifyJson is a Faraday Middleware that will process any response formatted as a hash
|
5
|
-
# and change all the keys into symbols (as long as they respond to the method #to_sym.
|
6
|
-
#
|
7
|
-
# This middleware makes no changes to the values of the hash.
|
8
|
-
# If the response is not a hash, no changes will be made.
|
9
|
-
class SymbolifyJson < Faraday::Middleware
|
10
|
-
|
11
|
-
# Processes an array
|
12
|
-
#
|
13
|
-
# @return an array with any hash's keys turned into symbols if possible
|
14
|
-
def process_array(array)
|
15
|
-
array.map do |arg|
|
16
|
-
# Search any arrays and hashes for hash keys
|
17
|
-
if arg.is_a? Hash
|
18
|
-
process_hash(arg)
|
19
|
-
elsif arg.is_a? Array
|
20
|
-
process_array(arg)
|
21
|
-
else
|
22
|
-
arg
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Processes a hash
|
28
|
-
#
|
29
|
-
# @return a hash with all keys turned into symbols if possible
|
30
|
-
def process_hash(hash)
|
31
|
-
|
32
|
-
# hash.map returns an array in the format
|
33
|
-
# [ [key, value], [key2, value2], ... ]
|
34
|
-
# Hash[] converts that into a hash in the format
|
35
|
-
# { key => value, key2 => value2, ... }
|
36
|
-
Hash[hash.map do |key, val|
|
37
|
-
# Convert to a symbol if possible
|
38
|
-
if key.respond_to? :to_sym
|
39
|
-
new_key = key.to_sym
|
40
|
-
else
|
41
|
-
new_key = key
|
42
|
-
end
|
43
|
-
|
44
|
-
# If value is a hash or array look for more hash keys inside.
|
45
|
-
if val.is_a?(Hash)
|
46
|
-
[new_key, process_hash(val)]
|
47
|
-
elsif val.is_a?(Array)
|
48
|
-
[new_key, process_array(val)]
|
49
|
-
else
|
50
|
-
[new_key, val]
|
51
|
-
end
|
52
|
-
end]
|
53
|
-
end
|
54
|
-
|
55
|
-
def process_response(env)
|
56
|
-
if !env["body"].nil? && env["body"].is_a?(Hash)
|
57
|
-
process_hash(env.body)
|
58
|
-
else
|
59
|
-
env.body
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def call(environment)
|
64
|
-
@app.call(environment).on_complete do |env|
|
65
|
-
env.body = process_response(env)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
@@ -1,119 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe PuppetForge::V3::Module do
|
4
|
-
before do
|
5
|
-
PuppetForge.host = "https://forge-aio01-petest.puppetlabs.com/"
|
6
|
-
PuppetForge::V3::Base.conn = PuppetForge::Connection.make_connection(PuppetForge.host, nil, {:ssl => {:verify => false} })
|
7
|
-
end
|
8
|
-
|
9
|
-
context "::find" do
|
10
|
-
context "gets information on an existing module and" do
|
11
|
-
let (:mod) { PuppetForge::V3::Module.find('puppetforgegemtesting-thorin') }
|
12
|
-
let (:mod_stateless) { PuppetForge::V3::Module.find_stateless('puppetforgegemtesting-thorin') }
|
13
|
-
|
14
|
-
it "returns a PuppetForge::V3::Module." do
|
15
|
-
expect(mod).to be_a(PuppetForge::V3::Module)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "returns a PuppetForge::V3::Module from a stateless call." do
|
19
|
-
expect(mod_stateless).to be_a(PuppetForge::V3::Module)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "exposes the API information." do
|
23
|
-
expect(mod).to respond_to(:uri)
|
24
|
-
expect(mod).to respond_to(:owner)
|
25
|
-
expect(mod).to respond_to(:current_release)
|
26
|
-
expect(mod).to respond_to(:releases)
|
27
|
-
|
28
|
-
expect(mod.uri).to be_a(String)
|
29
|
-
expect(mod.owner).to be_a(PuppetForge::V3::User)
|
30
|
-
expect(mod.current_release).to be_a(PuppetForge::V3::Release)
|
31
|
-
expect(mod.releases.first).to be_a(PuppetForge::V3::Release)
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
context "raises Faraday::ResourceNotFound when" do
|
37
|
-
let (:mod) { PuppetForge::V3::Module.find('puppetforgegemtesting-bilbo') }
|
38
|
-
|
39
|
-
it "the module does not exist" do
|
40
|
-
expect { mod }.to raise_error(Faraday::ResourceNotFound)
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
context "::where" do
|
48
|
-
context "finds matching resources" do
|
49
|
-
|
50
|
-
it "only returns modules that match the query" do
|
51
|
-
modules = PuppetForge::V3::Module.where(:owner => 'puppetforgegemtesting')
|
52
|
-
|
53
|
-
expect(modules).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
54
|
-
modules.each do |mod|
|
55
|
-
expect(mod.owner.username).to eq('puppetforgegemtesting')
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
it "returns a paginated response" do
|
61
|
-
modules = PuppetForge::V3::Module.where(:owner => 'puppetforgegemtesting', :limit => 1)
|
62
|
-
|
63
|
-
expect(modules.limit).to eq(1)
|
64
|
-
expect(modules.total).to eq(2)
|
65
|
-
|
66
|
-
expect(modules.next).not_to be_nil
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
context "does not find matching resources" do
|
72
|
-
it "returns an empty PaginatedCollection" do
|
73
|
-
modules = PuppetForge::V3::Module.where(:owner => 'absentuser')
|
74
|
-
|
75
|
-
expect(modules).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
76
|
-
|
77
|
-
expect(modules.size).to eq(0)
|
78
|
-
expect(modules.empty?).to be(true)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
context "::where_stateless" do
|
84
|
-
context "finds matching resources" do
|
85
|
-
|
86
|
-
it "only returns modules that match the query" do
|
87
|
-
modules = PuppetForge::V3::Module.where_stateless(:owner => 'puppetforgegemtesting')
|
88
|
-
|
89
|
-
expect(modules).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
90
|
-
modules.each do |mod|
|
91
|
-
expect(mod.owner.username).to eq('puppetforgegemtesting')
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
it "returns a paginated response" do
|
97
|
-
modules = PuppetForge::V3::Module.where_stateless(:owner => 'puppetforgegemtesting', :limit => 1)
|
98
|
-
|
99
|
-
expect(modules.limit).to eq(1)
|
100
|
-
expect(modules.total).to eq(2)
|
101
|
-
|
102
|
-
expect(modules.next).not_to be_nil
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
context "does not find matching resources" do
|
108
|
-
it "returns an empty PaginatedCollection" do
|
109
|
-
modules = PuppetForge::V3::Module.where_stateless(:owner => 'absentuser')
|
110
|
-
|
111
|
-
expect(modules).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
112
|
-
|
113
|
-
expect(modules.size).to eq(0)
|
114
|
-
expect(modules.empty?).to be(true)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
@@ -1,75 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe PuppetForge::V3::Release do
|
4
|
-
before do
|
5
|
-
PuppetForge.host = "https://forge-aio01-petest.puppetlabs.com/"
|
6
|
-
PuppetForge::V3::Base.conn = PuppetForge::Connection.make_connection(PuppetForge.host, nil, {:ssl => {:verify => false} })
|
7
|
-
end
|
8
|
-
|
9
|
-
context "#find" do
|
10
|
-
context "when the release exists," do
|
11
|
-
|
12
|
-
it "find returns a PuppetForge::V3::Release." do
|
13
|
-
release = PuppetForge::V3::Release.find('puppetforgegemtesting-thorin-0.0.1')
|
14
|
-
|
15
|
-
expect(release).to be_a(PuppetForge::V3::Release)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "it exposes the API information." do
|
19
|
-
release = PuppetForge::V3::Release.find('puppetforgegemtesting-thorin-0.0.1')
|
20
|
-
|
21
|
-
expect(release).to respond_to(:uri)
|
22
|
-
|
23
|
-
expect(release.uri).to be_a(String)
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
context "when the release doesn't exist," do
|
29
|
-
let (:release) { PuppetForge::V3::Release.find('puppetforgegemtesting-bilbo-0.0.1') }
|
30
|
-
|
31
|
-
it "find returns nil." do
|
32
|
-
expect { release }.to raise_error(Faraday::ResourceNotFound)
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
context "::where" do
|
40
|
-
context "finds matching resources" do
|
41
|
-
|
42
|
-
it "only returns releases that match the query" do
|
43
|
-
releases = PuppetForge::V3::Release.where(:module => 'puppetforgegemtesting-thorin')
|
44
|
-
|
45
|
-
expect(releases).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
46
|
-
|
47
|
-
expect(releases.first.version).to eq("0.0.2")
|
48
|
-
expect(releases[1].version).to eq("0.0.1")
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
it "returns a paginated response" do
|
53
|
-
releases = PuppetForge::V3::Release.where(:module => 'puppetforgegemtesting-thorin', :limit => 1)
|
54
|
-
|
55
|
-
expect(releases.limit).to eq(1)
|
56
|
-
expect(releases.total).to eq(2)
|
57
|
-
|
58
|
-
expect(releases.next).not_to be_nil
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
context "does not find matching resources" do
|
64
|
-
it "returns an empty PaginatedCollection" do
|
65
|
-
releases = PuppetForge::V3::Release.where(:module => 'puppetforgegemtesting-notamodule')
|
66
|
-
|
67
|
-
expect(releases).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
68
|
-
|
69
|
-
expect(releases.size).to eq(0)
|
70
|
-
expect(releases.empty?).to be(true)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe PuppetForge::V3::User do
|
4
|
-
before do
|
5
|
-
PuppetForge.host = "https://forge-aio01-petest.puppetlabs.com/"
|
6
|
-
PuppetForge::V3::Base.conn = PuppetForge::Connection.make_connection(PuppetForge.host, nil, {:ssl => {:verify => false} })
|
7
|
-
end
|
8
|
-
|
9
|
-
context "#find" do
|
10
|
-
context "when the user exists," do
|
11
|
-
|
12
|
-
it "find returns a PuppetForge::V3::User." do
|
13
|
-
user = PuppetForge::V3::User.find('puppetforgegemtesting')
|
14
|
-
expect(user).to be_a(PuppetForge::V3::User)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "it exposes the API information." do
|
18
|
-
user = PuppetForge::V3::User.find('puppetforgegemtesting')
|
19
|
-
|
20
|
-
expect(user).to respond_to(:uri)
|
21
|
-
expect(user).to respond_to(:modules)
|
22
|
-
|
23
|
-
expect(user.uri).to be_a(String)
|
24
|
-
expect(user.modules).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
context "when the user doesn't exists," do
|
30
|
-
let (:user) { PuppetForge::V3::User.find('notauser') }
|
31
|
-
|
32
|
-
it "find returns nil." do
|
33
|
-
expect { user }.to raise_error(Faraday::ResourceNotFound)
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context "::where" do
|
40
|
-
context "finds matching resources" do
|
41
|
-
|
42
|
-
it "returns sorted users" do
|
43
|
-
users = PuppetForge::V3::User.where(:sort_by => 'releases')
|
44
|
-
|
45
|
-
expect(users).to be_a(PuppetForge::V3::Base::PaginatedCollection)
|
46
|
-
|
47
|
-
previous_releases = users.first.release_count
|
48
|
-
users.each do |user|
|
49
|
-
expect(user.release_count).to be <= previous_releases
|
50
|
-
previous_releases = user.release_count
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
it "returns a paginated response" do
|
56
|
-
users = PuppetForge::V3::User.where(:limit => 1)
|
57
|
-
|
58
|
-
expect(users.limit).to eq(1)
|
59
|
-
|
60
|
-
2.times do
|
61
|
-
expect(users).not_to be_nil
|
62
|
-
users = users.next
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe PuppetForge::Middleware::SymbolifyJson do
|
4
|
-
let(:basic_array) { [1, "two", 3] }
|
5
|
-
let(:basic_hash) { { "id" => 1, "data" => "x" } }
|
6
|
-
let(:symbolified_hash) { { :id => 1, :data => "x" } }
|
7
|
-
let(:internal_hash) { { :id => 2, :data => basic_hash } }
|
8
|
-
|
9
|
-
let(:hash_with_array) { { "id" => 3, "data" => basic_array } }
|
10
|
-
let(:array_with_hash) { [1, "two", basic_hash] }
|
11
|
-
|
12
|
-
let(:complex_array) { [array_with_hash, hash_with_array] }
|
13
|
-
let(:complex_hash) { { "id" => 4, "data" => [complex_array, basic_array], "more_data" => hash_with_array } }
|
14
|
-
let(:complex_request) { { "id" => 5, "data" => complex_hash } }
|
15
|
-
|
16
|
-
let(:middleware) { described_class.new() }
|
17
|
-
|
18
|
-
context "#process_array" do
|
19
|
-
it "doesn't change an array with no array or hash inside" do
|
20
|
-
processed_array = middleware.process_array(basic_array)
|
21
|
-
expect(processed_array).to eql( [1, "two", 3] )
|
22
|
-
end
|
23
|
-
|
24
|
-
it "changes all keys of a hash inside the array" do
|
25
|
-
processed_array = middleware.process_array(array_with_hash)
|
26
|
-
expect(processed_array).to eql( [ 1, "two", { :id => 1, :data => "x" } ] )
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context "#process_hash" do
|
31
|
-
it "changes all keys that respond to :to_sym into Symbols and doesn't change values." do
|
32
|
-
processed_hash = middleware.process_hash(basic_hash)
|
33
|
-
expect(processed_hash).to eql( { :id => 1, :data => "x" } )
|
34
|
-
end
|
35
|
-
|
36
|
-
it "doesn't change keys that don't respond to :to_sym" do
|
37
|
-
processed_hash = middleware.process_hash(basic_hash.merge({ 1 => 2 }))
|
38
|
-
expect(processed_hash).to eql( { :id => 1, :data => "x", 1 => 2 } )
|
39
|
-
end
|
40
|
-
|
41
|
-
it "can process a hash that is already symbolified" do
|
42
|
-
processed_hash = middleware.process_hash(symbolified_hash)
|
43
|
-
expect(processed_hash).to eql( { :id => 1, :data => "x" })
|
44
|
-
end
|
45
|
-
|
46
|
-
it "can process a hash with a hash inside of it" do
|
47
|
-
processed_hash = middleware.process_hash(internal_hash)
|
48
|
-
expect(processed_hash).to eql( {:id => 2, :data => { :id => 1, :data => "x" } })
|
49
|
-
end
|
50
|
-
|
51
|
-
it "can process a hash with an array inside of it" do
|
52
|
-
processed_hash = middleware.process_hash(hash_with_array)
|
53
|
-
expect(processed_hash).to eql( { :id => 3, :data => [1, "two", 3] } )
|
54
|
-
end
|
55
|
-
|
56
|
-
it "can handle extensively nested arrays and hashes" do
|
57
|
-
processed_hash = middleware.process_hash(complex_request)
|
58
|
-
expect(processed_hash).to eql( { :id => 5, :data => { :id => 4 , :data=>[ [ [1, "two", { :id => 1, :data => "x" } ], { :id=>3, :data => [1, "two", 3] } ], [1, "two", 3] ], :more_data => { :id => 3, :data => [1, "two", 3] } } } )
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|