Class: Gemkeeper::CompactIndexServer

Inherits:
Object
  • Object
show all
Defined in:
lib/gemkeeper/compact_index_server.rb,
lib/gemkeeper/compact_index_server/response.rb,
lib/gemkeeper/compact_index_server/gem_cache.rb,
lib/gemkeeper/compact_index_server/gem_index.rb,
lib/gemkeeper/compact_index_server/cache_meta.rb,
lib/gemkeeper/compact_index_server/cache_store.rb,
lib/gemkeeper/compact_index_server/spec_mapper.rb,
lib/gemkeeper/compact_index_server/index_merger.rb,
lib/gemkeeper/compact_index_server/upload_handler.rb,
lib/gemkeeper/compact_index_server/upstream_cache.rb,
lib/gemkeeper/compact_index_server/rubygems_client.rb,
lib/gemkeeper/compact_index_server/response_builder.rb

Overview

Rack application implementing the Bundler compact index protocol. Delegates private gem state to GemIndex and upstream caching to UpstreamCache.

Defined Under Namespace

Modules: SpecMapper Classes: CacheMeta, CacheStore, GemCache, GemIndex, IndexMerger, Response, ResponseBuilder, RubygemsClient, UploadHandler, UpstreamCache

Constant Summary collapse

VALID_NAME =
/\A[a-zA-Z0-9._-]+\z/
RESOURCE_ROUTES =
{
  info: %r{\A/info/([^/]+)\z},
  gem: %r{\A/gems/([^/]+\.gem)\z}
}.freeze
PRESENCE_ROUTE =

Private-store presence check for ‘gemkeeper sync`; reads the index only, never the upstream proxy (unlike /info), so it can’t be fooled by a public gem.

%r{\A/gemkeeper/has/([^/]+)/([^/]+)\z}

Instance Method Summary collapse

Constructor Details

#initialize(gems_path:, cache_dir:) ⇒ CompactIndexServer

Returns a new instance of CompactIndexServer.



26
27
28
29
30
# File 'lib/gemkeeper/compact_index_server.rb', line 26

def initialize(gems_path:, cache_dir:)
  @index  = GemIndex.new(File.join(gems_path, "gems"))
  @cache  = UpstreamCache.new(cache_dir)
  @upload = UploadHandler.new(@index)
end

Instance Method Details

#call(env) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/gemkeeper/compact_index_server.rb', line 32

def call(env)
  req  = Rack::Request.new(env)
  path = req.path_info
  case [req.request_method, path]
  in ["GET", "/"]         then health
  in ["GET", "/names"]    then serve_names(req)
  in ["GET", "/versions"] then serve_versions(req)
  in ["POST", "/upload"]  then @upload.call(req)
  in ["GET", String => p] if p.start_with?("/gemkeeper/") then serve_presence(p)
  in ["GET", _]           then serve_resource(path, req)
  else not_found
  end
end