lib/geminabox.rb
# frozen_string_literal: true
require 'rubygems'
require 'digest/md5'
require 'builder'
require 'sinatra/base'
require 'rubygems/user_interaction'
require 'rubygems/indexer'
require 'rubygems/package'
require 'tempfile'
require 'json'
require 'tilt/erb'
require 'rack/protection'
module Geminabox
class Error < StandardError ; end
require_relative 'geminabox/version'
require_relative 'geminabox/proxy'
require_relative 'geminabox/http_adapter'
def self.geminabox_path(file)
File.join File.dirname(__FILE__), 'geminabox', file
end
autoload :Hostess, geminabox_path('hostess')
autoload :GemStore, geminabox_path('gem_store')
autoload :GemStoreError, geminabox_path('gem_store_error')
autoload :RubygemsDependency, geminabox_path('rubygems_dependency')
autoload :GemListMerge, geminabox_path('gem_list_merge')
autoload :GemVersion, geminabox_path('gem_version')
autoload :GemVersionCollection, geminabox_path('gem_version_collection')
autoload :Server, geminabox_path('server')
autoload :DiskCache, geminabox_path('disk_cache')
autoload :IncomingGem, geminabox_path('incoming_gem')
class << self
attr_accessor(
:data,
:public_folder,
:incremental_updates,
:views,
:allow_replace,
:gem_permissions,
:allow_delete,
:rubygems_proxy,
:rubygems_proxy_merge_strategy,
:http_adapter,
:lockfile,
:retry_interval,
:allow_remote_failure,
:ruby_gems_url,
:bundler_ruby_gems_url,
:allow_upload,
:on_gem_received
)
attr_reader :build_legacy
def build_legacy=(value)
warn "Setting `Geminabox.build_legacy` is deprecated and will be removed in the future. Geminbox will always build modern indices"
@build_legacy = value
end
def set_defaults(defaults)
defaults.each do |method, default|
variable = "@#{method}"
instance_variable_set(variable, default) unless instance_variable_get(variable)
end
end
def settings
Server.settings
end
def call(env)
Server.call env
end
end
set_defaults(
data: File.join(File.dirname(__FILE__), *%w[.. data]),
public_folder: File.join(File.dirname(__FILE__), *%w[.. public]),
build_legacy: false,
incremental_updates: true,
views: File.join(File.dirname(__FILE__), *%w[.. views]),
allow_replace: false,
gem_permissions: 0644,
rubygems_proxy: (ENV['RUBYGEMS_PROXY'] == 'true'),
rubygems_proxy_merge_strategy: ENV.fetch('RUBYGEMS_PROXY_MERGE_STRATEGY') { :local_gems_take_precedence_over_remote_gems }.to_sym,
allow_delete: true,
http_adapter: HttpClientAdapter.new,
lockfile: File.join(ENV.fetch('TMPDIR', Dir.tmpdir), 'geminabox.lockfile'),
retry_interval: 60,
allow_remote_failure: false,
ruby_gems_url: 'https://rubygems.org/',
bundler_ruby_gems_url: 'https://bundler.rubygems.org/',
allow_upload: true,
on_gem_received: nil
)
end