gemstash 2.0.0 → 2.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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -0
  3. data/exe/gemstash +3 -0
  4. data/lib/gemstash/api_key_authorization.rb +3 -0
  5. data/lib/gemstash/authorization.rb +7 -3
  6. data/lib/gemstash/cache.rb +42 -2
  7. data/lib/gemstash/cli/authorize.rb +5 -5
  8. data/lib/gemstash/cli/base.rb +4 -1
  9. data/lib/gemstash/cli/setup.rb +19 -4
  10. data/lib/gemstash/cli/start.rb +4 -1
  11. data/lib/gemstash/cli/status.rb +2 -0
  12. data/lib/gemstash/cli/stop.rb +2 -0
  13. data/lib/gemstash/cli.rb +2 -0
  14. data/lib/gemstash/config.ru +3 -3
  15. data/lib/gemstash/configuration.rb +8 -2
  16. data/lib/gemstash/db/authorization.rb +2 -0
  17. data/lib/gemstash/db/cached_rubygem.rb +3 -0
  18. data/lib/gemstash/db/dependency.rb +2 -0
  19. data/lib/gemstash/db/rubygem.rb +3 -0
  20. data/lib/gemstash/db/upstream.rb +3 -0
  21. data/lib/gemstash/db/version.rb +3 -0
  22. data/lib/gemstash/db.rb +3 -0
  23. data/lib/gemstash/dependencies.rb +6 -2
  24. data/lib/gemstash/env.rb +24 -4
  25. data/lib/gemstash/gem_fetcher.rb +4 -2
  26. data/lib/gemstash/gem_pusher.rb +7 -5
  27. data/lib/gemstash/gem_source/dependency_caching.rb +4 -4
  28. data/lib/gemstash/gem_source/private_source.rb +6 -3
  29. data/lib/gemstash/gem_source/rack_middleware.rb +3 -0
  30. data/lib/gemstash/gem_source/upstream_source.rb +9 -3
  31. data/lib/gemstash/gem_source.rb +4 -2
  32. data/lib/gemstash/gem_yanker.rb +4 -0
  33. data/lib/gemstash/health.rb +2 -0
  34. data/lib/gemstash/http_client.rb +12 -4
  35. data/lib/gemstash/logging.rb +3 -1
  36. data/lib/gemstash/man/gemstash-authorize.1.txt +0 -65
  37. data/lib/gemstash/man/gemstash-configuration.5.txt +0 -65
  38. data/lib/gemstash/man/gemstash-customize.7.txt +0 -65
  39. data/lib/gemstash/man/gemstash-debugging.7.txt +0 -65
  40. data/lib/gemstash/man/gemstash-deploy.7.txt +0 -65
  41. data/lib/gemstash/man/gemstash-mirror.7.txt +0 -65
  42. data/lib/gemstash/man/gemstash-multiple-sources.7.txt +0 -65
  43. data/lib/gemstash/man/gemstash-private-gems.7.txt +0 -65
  44. data/lib/gemstash/man/gemstash-readme.7.txt +0 -65
  45. data/lib/gemstash/man/gemstash-setup.1.txt +0 -65
  46. data/lib/gemstash/man/gemstash-start.1.txt +0 -65
  47. data/lib/gemstash/man/gemstash-status.1.txt +0 -65
  48. data/lib/gemstash/man/gemstash-stop.1.txt +0 -65
  49. data/lib/gemstash/man/gemstash-version.1.txt +0 -65
  50. data/lib/gemstash/migrations/01_gem_dependencies.rb +2 -0
  51. data/lib/gemstash/migrations/02_authorizations.rb +2 -0
  52. data/lib/gemstash/migrations/03_cached_gems.rb +2 -0
  53. data/lib/gemstash/migrations/04_health_tests.rb +2 -0
  54. data/lib/gemstash/puma.rb +2 -0
  55. data/lib/gemstash/rack_env_rewriter.rb +11 -2
  56. data/lib/gemstash/specs_builder.rb +5 -1
  57. data/lib/gemstash/storage.rb +17 -7
  58. data/lib/gemstash/upstream.rb +8 -5
  59. data/lib/gemstash/version.rb +4 -2
  60. data/lib/gemstash/web.rb +8 -4
  61. data/lib/gemstash.rb +3 -1
  62. metadata +40 -133
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Sequel.migration do
2
4
  change do
3
5
  create_table :rubygems do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Sequel.migration do
2
4
  change do
3
5
  create_table :authorizations do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Sequel.migration do
2
4
  change do
3
5
  create_table :upstreams do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Sequel.migration do
2
4
  change do
3
5
  create_table :health_tests do
data/lib/gemstash/puma.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "gemstash"
2
4
 
3
5
  threads 0, Gemstash::Env.current.config[:puma_threads].to_i
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "gemstash"
2
4
  require "forwardable"
3
5
 
@@ -33,8 +35,15 @@ module Gemstash
33
35
  def rewrite
34
36
  check_match
35
37
  log_start = "Rewriting '#{@rack_env["REQUEST_URI"]}'"
36
- @rack_env["REQUEST_URI"][@request_uri_match.begin(0)...@request_uri_match.end(0)] = ""
37
- @rack_env["PATH_INFO"][@path_info_match.begin(0)...@path_info_match.end(0)] = ""
38
+
39
+ new_request_uri = @rack_env["REQUEST_URI"].dup
40
+ new_request_uri[@request_uri_match.begin(0)...@request_uri_match.end(0)] = ""
41
+
42
+ new_path_info = @rack_env["PATH_INFO"].dup
43
+ new_path_info[@path_info_match.begin(0)...@path_info_match.end(0)] = ""
44
+
45
+ @rack_env["REQUEST_URI"] = new_request_uri
46
+ @rack_env["PATH_INFO"] = new_path_info
38
47
  log.info "#{log_start} to '#{@rack_env["REQUEST_URI"]}'"
39
48
  end
40
49
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "gemstash"
2
4
  require "stringio"
3
5
  require "zlib"
@@ -33,6 +35,7 @@ module Gemstash
33
35
  check_auth if gemstash_env.config[:protected_fetch]
34
36
  fetch_from_storage
35
37
  return result if result
38
+
36
39
  fetch_versions
37
40
  marshal
38
41
  gzip
@@ -59,8 +62,9 @@ module Gemstash
59
62
  def fetch_from_storage
60
63
  specs = fetch_resource
61
64
  return unless specs.exist?(:specs)
65
+
62
66
  @result = specs.load(:specs).content(:specs)
63
- rescue
67
+ rescue StandardError
64
68
  # On the off-chance of a race condition between specs.exist? and specs.load
65
69
  @result = nil
66
70
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "gemstash"
2
4
  require "digest"
3
5
  require "fileutils"
@@ -66,7 +68,7 @@ module Gemstash
66
68
  end
67
69
  end
68
70
 
69
- YAML.load_file(file)
71
+ YAML.safe_load_file(file, permitted_classes: [Symbol])
70
72
  end
71
73
 
72
74
  private
@@ -74,12 +76,14 @@ module Gemstash
74
76
  def check_storage_version
75
77
  version = Gemstash::Storage.metadata[:storage_version]
76
78
  return if version <= Gemstash::Storage::VERSION
79
+
77
80
  raise Gemstash::Storage::VersionTooNew.new(@folder, version)
78
81
  end
79
82
 
80
83
  def path_valid?(path)
81
84
  return false if path.nil?
82
85
  return false unless File.writable?(path)
86
+
83
87
  true
84
88
  end
85
89
  end
@@ -90,6 +94,7 @@ module Gemstash
90
94
  include Gemstash::Env::Helper
91
95
  include Gemstash::Logging
92
96
  attr_reader :name, :folder
97
+
93
98
  VERSION = 1
94
99
 
95
100
  # If the storage engine detects a resource was originally saved from a newer
@@ -191,7 +196,7 @@ module Gemstash
191
196
  # @param props [Hash] the properties to add
192
197
  # @return [Gemstash::Resource] self for chaining purposes
193
198
  def update_properties(props)
194
- load_properties(true)
199
+ load_properties(force: true)
195
200
 
196
201
  deep_merge = proc do |_, old_value, new_value|
197
202
  if old_value.is_a?(Hash) && new_value.is_a?(Hash)
@@ -247,17 +252,17 @@ module Gemstash
247
252
 
248
253
  begin
249
254
  File.delete(content_filename(key))
250
- rescue => e
255
+ rescue StandardError => e
251
256
  log_error "Failed to delete stored content at #{content_filename(key)}", e, level: :warn
252
257
  end
253
258
 
254
259
  begin
255
260
  File.delete(properties_filename) unless content?
256
- rescue => e
261
+ rescue StandardError => e
257
262
  log_error "Failed to delete stored properties at #{properties_filename}", e, level: :warn
258
263
  end
259
264
 
260
- return self
265
+ self
261
266
  ensure
262
267
  reset
263
268
  end
@@ -266,21 +271,24 @@ module Gemstash
266
271
 
267
272
  def load(key)
268
273
  raise "Resource #{@name} has no #{key.inspect} content to load" unless exist?(key)
274
+
269
275
  load_properties # Ensures storage version is checked
270
276
  @content ||= {}
271
277
  @content[key] = read_file(content_filename(key))
272
278
  end
273
279
 
274
- def load_properties(force = false)
280
+ def load_properties(force: false)
275
281
  return if @properties && !force
276
282
  return unless File.exist?(properties_filename)
277
- @properties = YAML.load_file(properties_filename) || {}
283
+
284
+ @properties = YAML.safe_load_file(properties_filename, permitted_classes: [Symbol]) || {}
278
285
  check_resource_version
279
286
  end
280
287
 
281
288
  def check_resource_version
282
289
  version = @properties[:gemstash_resource_version]
283
290
  return if version <= Gemstash::Resource::VERSION
291
+
284
292
  reset
285
293
  raise Gemstash::Resource::VersionTooNew.new(name, folder, version)
286
294
  end
@@ -292,6 +300,7 @@ module Gemstash
292
300
 
293
301
  def content?
294
302
  return false unless Dir.exist?(@folder)
303
+
295
304
  entries = Dir.entries(@folder).reject {|file| file =~ /\A\.\.?\z/ || file == "properties.yaml" }
296
305
  !entries.empty?
297
306
  end
@@ -330,6 +339,7 @@ module Gemstash
330
339
  def content_filename(key)
331
340
  name = sanitize(key.to_s)
332
341
  raise "Invalid content key #{key.inspect}" if name.empty?
342
+
333
343
  File.join(@folder, name)
334
344
  end
335
345