gemstash 2.0.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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