class Geminabox::GemStore

Attributes

gem[RW]
overwrite[RW]

Public Class Methods

create(gem, overwrite = false) click to toggle source
# File lib/geminabox/gem_store.rb, line 6
def self.create(gem, overwrite = false)
  gem_store = new(gem, overwrite)
  gem_store.save
end
new(gem, overwrite = false) click to toggle source
# File lib/geminabox/gem_store.rb, line 11
def initialize(gem, overwrite = false)
  @gem = gem
  @overwrite = overwrite && overwrite == 'true'
end

Public Instance Methods

check_replacement_status() click to toggle source
# File lib/geminabox/gem_store.rb, line 35
def check_replacement_status
  if !overwrite and Geminabox::Server.disallow_replace? and File.exist?(gem.dest_filename)
    if existing_file_digest != gem.hexdigest
      raise GemStoreError.new(409, "Updating an existing gem is not permitted.\nYou should either delete the existing version, or change your version number.")
    else
      raise GemStoreError.new(200, "Ignoring upload, you uploaded the same thing previously.\nPlease use -o to ovewrite.")
    end
  end
end
ensure_gem_valid() click to toggle source
# File lib/geminabox/gem_store.rb, line 45
def ensure_gem_valid
  raise GemStoreError.new(400, "Cannot process gem") unless gem.valid?
end
prepare_data_folders() click to toggle source
# File lib/geminabox/gem_store.rb, line 23
def prepare_data_folders
  ensure_existing_data_folder_compatible
  begin
    FileUtils.mkdir_p(File.join(Geminabox.data, "gems"))
  rescue
    raise GemStoreError.new(
      500,
      "Could not create #{File.expand_path(Geminabox.data)}."
    )
  end
end
save() click to toggle source
# File lib/geminabox/gem_store.rb, line 16
def save
  ensure_gem_valid
  prepare_data_folders
  check_replacement_status
  write_and_index
end

Private Instance Methods

atomic_write(file_name) { |temp_file| ... } click to toggle source

based on as.rubyonrails.org/classes/File.html

# File lib/geminabox/gem_store.rb, line 86
def atomic_write(file_name)
  temp_dir = File.join(Geminabox.data, "_temp")
  FileUtils.mkdir_p(temp_dir)
  temp_file = Tempfile.new("." + File.basename(file_name), temp_dir)
  temp_file.binmode
  yield temp_file
  temp_file.close
  File.rename(temp_file.path, file_name)
  File.chmod(Geminabox::Server.gem_permissions, file_name)
end
ensure_data_folder_is_directory() click to toggle source
# File lib/geminabox/gem_store.rb, line 57
def ensure_data_folder_is_directory
  raise GemStoreError.new(
    500,
    "Please ensure #{File.expand_path(Geminabox.data)} is a directory."
  ) unless File.directory? Geminabox.data
end
ensure_data_folder_is_writable() click to toggle source
# File lib/geminabox/gem_store.rb, line 64
def ensure_data_folder_is_writable
  raise GemStoreError.new(
    500,
    "Please ensure #{File.expand_path(Geminabox.data)} is writable by the geminabox web server."
  ) unless File.writable? Geminabox.data
end
ensure_existing_data_folder_compatible() click to toggle source
# File lib/geminabox/gem_store.rb, line 50
def ensure_existing_data_folder_compatible
  if File.exists? Geminabox.data
    ensure_data_folder_is_directory
    ensure_data_folder_is_writable
  end
end
existing_file_digest() click to toggle source
# File lib/geminabox/gem_store.rb, line 71
def existing_file_digest
  Digest::SHA1.file(gem.dest_filename).hexdigest
end
write_and_index() click to toggle source
# File lib/geminabox/gem_store.rb, line 75
def write_and_index
  tmpfile = gem.gem_data
  atomic_write(gem.dest_filename) do |f|
    while blk = tmpfile.read(65536)
      f << blk
    end
  end
  Geminabox::Server.reindex
end