docker_registry2 1.18.0 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 396635930a86cd9f517fe62ec5d697162800ceed5da3209b56c9951529c48acd
4
- data.tar.gz: aa924fcb85dedc352020b686ecae75d2b755ee1d4d87ab4cc7f27991a0a3e84b
3
+ metadata.gz: 3210236b320a090f2886dca3102073b9c128ffd9ce6ec39e7623f2299a77c428
4
+ data.tar.gz: 67fb86e3c93a888f3e9f8a7fa327379bc97a56afe284cb8c64a71bc73618ecfb
5
5
  SHA512:
6
- metadata.gz: 2dfbaa1a8e21b917363855a5f31c57dbd08517d0f58fc1faf43520d6e321074d4b6083246ee3863a4e6a886d5f5dc9ba239eeef7deda747536db69a77f08a480
7
- data.tar.gz: 6b034ef24e2f306d8a4a5047e03a101307c55698e0ce3295eefc15481abbc64034b07bc61b5c0651aad41bd03f2a6920f0cf98b81c733c845353d1e784db8aad
6
+ metadata.gz: 1917a3edf585627022223123e7eefe254aa84d9ad91243ea029bd81cbf3272364c5a881f1b20df95203336085dda67dc5ade26e29c5bf0da3b08c9b5cf520a56
7
+ data.tar.gz: 76e2f9676f2ff888a2a42d2f02814f7ef521b1ab0bc1b92a32dfae7fe94699aa548359ada17ea898ddce27b67ba38d3cc888c6f2cea76fe6cea83c0baad2b55c
@@ -22,15 +22,15 @@ Gem::Specification.new do |spec|
22
22
  File.directory?(f)
23
23
  end
24
24
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
26
25
  spec.require_paths = ['lib']
27
26
 
28
27
  spec.add_development_dependency 'bundler'
29
28
  spec.add_development_dependency 'rake', '~> 10.0'
30
29
  spec.add_development_dependency 'rspec', '~> 3'
31
- spec.add_development_dependency 'rubocop', '>= 0.26.0'
30
+ spec.add_development_dependency 'rubocop', '>= 1.63.0'
32
31
  spec.add_development_dependency 'vcr', '~> 6'
33
32
  spec.add_development_dependency 'webmock'
34
33
 
35
34
  spec.add_dependency 'rest-client', '>= 1.8.0'
35
+ spec.metadata['rubygems_mfa_required'] = 'true'
36
36
  end
@@ -17,7 +17,9 @@ module DockerRegistry2
17
17
  # @option options [Hash] :http_options Extra options for RestClient::Request.execute.
18
18
  def initialize(uri, options = {})
19
19
  @uri = URI.parse(uri)
20
- @base_uri = "#{@uri.scheme}://#{@uri.host}:#{@uri.port}#{@uri.path}"
20
+ @base_uri = +"#{@uri.scheme}://#{@uri.host}:#{@uri.port}#{@uri.path}"
21
+ # `URI.join("https://example.com/foo/bar", "v2")` drops `bar` in the base URL. A trailing slash prevents that.
22
+ @base_uri << '/' unless @base_uri.end_with? '/'
21
23
  @user = options[:user]
22
24
  @password = options[:password]
23
25
  @http_options = options[:http_options] || {}
@@ -49,16 +51,18 @@ module DockerRegistry2
49
51
  response = doget(url)
50
52
  yield response
51
53
 
52
- link_header = response.headers[:link]
53
- break unless link_header
54
+ link_header = response.headers[:link] or break
55
+ next_url = parse_link_header(link_header)[:next] or break
54
56
 
55
- url = parse_link_header(link_header)[:next]
57
+ # The next URL in the Link header may be relative to the request URL, or absolute.
58
+ # URI.join handles both cases nicely.
59
+ url = URI.join(response.request.url, next_url)
56
60
  end
57
61
  end
58
62
 
59
63
  def search(query = '')
60
64
  all_repos = []
61
- paginate_doget('/v2/_catalog') do |response|
65
+ paginate_doget('v2/_catalog') do |response|
62
66
  repos = JSON.parse(response)['repositories']
63
67
  repos.select! { |repo| repo.match?(/#{query}/) } unless query.empty?
64
68
  all_repos += repos
@@ -75,7 +79,7 @@ module DockerRegistry2
75
79
  query_vars = ''
76
80
  query_vars = "?#{URI.encode_www_form(params)}" if params.length.positive?
77
81
 
78
- response = doget "/v2/#{repo}/tags/list#{query_vars}"
82
+ response = doget "v2/#{repo}/tags/list#{query_vars}"
79
83
  # parse the response
80
84
  resp = JSON.parse response
81
85
  # parse out next page link if necessary
@@ -104,7 +108,7 @@ module DockerRegistry2
104
108
 
105
109
  def manifest(repo, tag)
106
110
  # first get the manifest
107
- response = doget "/v2/#{repo}/manifests/#{tag}"
111
+ response = doget "v2/#{repo}/manifests/#{tag}"
108
112
  parsed = JSON.parse response.body
109
113
  manifest = DockerRegistry2::Manifest[parsed]
110
114
  manifest.body = response.body
@@ -113,7 +117,7 @@ module DockerRegistry2
113
117
  end
114
118
 
115
119
  def blob(repo, digest, outpath = nil)
116
- blob_url = "/v2/#{repo}/blobs/#{digest}"
120
+ blob_url = "v2/#{repo}/blobs/#{digest}"
117
121
  if outpath.nil?
118
122
  response = doget(blob_url)
119
123
  DockerRegistry2::Blob.new(response.headers, response.body)
@@ -127,7 +131,7 @@ module DockerRegistry2
127
131
  end
128
132
 
129
133
  def manifest_digest(repo, tag)
130
- tag_path = "/v2/#{repo}/manifests/#{tag}"
134
+ tag_path = "v2/#{repo}/manifests/#{tag}"
131
135
  dohead(tag_path).headers[:docker_content_digest]
132
136
  rescue DockerRegistry2::InvalidMethod
133
137
  # Pre-2.3.0 registries didn't support manifest HEAD requests
@@ -161,9 +165,9 @@ module DockerRegistry2
161
165
 
162
166
  def rmtag(image, tag)
163
167
  # TODO: Need full response back. Rewrite other manifests() calls without JSON?
164
- reference = doget("/v2/#{image}/manifests/#{tag}").headers[:docker_content_digest]
168
+ reference = doget("v2/#{image}/manifests/#{tag}").headers[:docker_content_digest]
165
169
 
166
- dodelete("/v2/#{image}/manifests/#{reference}").code
170
+ dodelete("v2/#{image}/manifests/#{reference}").code
167
171
  end
168
172
 
169
173
  def pull(repo, tag, dir)
@@ -195,7 +199,6 @@ module DockerRegistry2
195
199
  # download layer
196
200
  # puts "getting layer (v2) #{layer['digest']}"
197
201
  blob(repo, layer['digest'], layer_file)
198
- layer_file
199
202
  end
200
203
  end
201
204
 
@@ -215,7 +218,6 @@ module DockerRegistry2
215
218
  # puts "getting layer (v1) #{layer['blobSum']}"
216
219
  blob(repo, layer['blobSum'], layer_file)
217
220
  # return layer file
218
- layer_file
219
221
  end
220
222
  end
221
223
 
@@ -226,7 +228,7 @@ module DockerRegistry2
226
228
 
227
229
  raise DockerRegistry2::RegistryVersionException unless manifest['schemaVersion'] == 2
228
230
 
229
- doput "/v2/#{newrepo}/manifests/#{newtag}", manifest.to_json
231
+ doput "v2/#{newrepo}/manifests/#{newtag}", manifest.to_json
230
232
  end
231
233
 
232
234
  def copy(repo, tag, newregistry, newrepo, newtag); end
@@ -234,14 +236,13 @@ module DockerRegistry2
234
236
  # gets the size of a particular blob, given the repo and the content-addressable hash
235
237
  # usually unneeded, since manifest includes it
236
238
  def blob_size(repo, blobSum)
237
- response = dohead "/v2/#{repo}/blobs/#{blobSum}"
239
+ response = dohead "v2/#{repo}/blobs/#{blobSum}"
238
240
  Integer(response.headers[:content_length], 10)
239
241
  end
240
242
 
241
243
  # Parse the value of the Link HTTP header and return a Hash whose keys are the rel values turned into symbols, and
242
244
  # the values are URLs. For example, `{ next: '/v2/_catalog?n=100&last=x' }`.
243
245
  def parse_link_header(header)
244
- last = ''
245
246
  parts = header.split(',')
246
247
  links = {}
247
248
 
@@ -290,7 +291,7 @@ module DockerRegistry2
290
291
  end
291
292
  response = RestClient::Request.execute(@http_options.merge(
292
293
  method: type,
293
- url: @base_uri + url,
294
+ url: URI.join(@base_uri, url).to_s,
294
295
  headers: headers(payload: payload),
295
296
  block_response: block,
296
297
  payload: payload
@@ -301,7 +302,7 @@ module DockerRegistry2
301
302
  raise DockerRegistry2::NotFound, "Image not found at #{@uri.host}"
302
303
  rescue RestClient::Unauthorized => e
303
304
  header = e.response.headers[:www_authenticate]
304
- method = header.to_s.downcase.split(' ')[0]
305
+ method = header.to_s.downcase.split[0]
305
306
  case method
306
307
  when 'basic'
307
308
  response = do_basic_req(type, url, stream, payload)
@@ -327,7 +328,7 @@ module DockerRegistry2
327
328
  end
328
329
  response = RestClient::Request.execute(@http_options.merge(
329
330
  method: type,
330
- url: @base_uri + url,
331
+ url: URI.join(@base_uri, url).to_s,
331
332
  user: @user,
332
333
  password: @password,
333
334
  headers: headers(payload: payload),
@@ -360,7 +361,7 @@ module DockerRegistry2
360
361
  end
361
362
  response = RestClient::Request.execute(@http_options.merge(
362
363
  method: type,
363
- url: @base_uri + url,
364
+ url: URI.join(@base_uri, url).to_s,
364
365
  headers: headers(payload: payload, bearer_token: token),
365
366
  block_response: block,
366
367
  payload: payload
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DockerRegistry2
4
- VERSION = '1.18.0'
4
+ VERSION = '1.18.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker_registry2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.18.0
4
+ version: 1.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Avi Deitcher https://github.com/deitch
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2023-07-28 00:00:00.000000000 Z
14
+ date: 2024-05-13 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -61,14 +61,14 @@ dependencies:
61
61
  requirements:
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: 0.26.0
64
+ version: 1.63.0
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
69
  - - ">="
70
70
  - !ruby/object:Gem::Version
71
- version: 0.26.0
71
+ version: 1.63.0
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: vcr
74
74
  requirement: !ruby/object:Gem::Requirement
@@ -128,7 +128,8 @@ files:
128
128
  homepage: https://github.com/deitch/docker_registry2
129
129
  licenses:
130
130
  - MIT
131
- metadata: {}
131
+ metadata:
132
+ rubygems_mfa_required: 'true'
132
133
  post_install_message:
133
134
  rdoc_options: []
134
135
  require_paths:
@@ -144,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
145
  - !ruby/object:Gem::Version
145
146
  version: '0'
146
147
  requirements: []
147
- rubygems_version: 3.3.26
148
+ rubygems_version: 3.5.9
148
149
  signing_key:
149
150
  specification_version: 4
150
151
  summary: Docker v2 registry HTTP API client