Class: Paquette::GemServer::ReadGatedRepository

Inherits:
SimpleDelegator
  • Object
show all
Defined in:
lib/paquette/gem_server/read_gated_repository.rb

Overview

Wraps a gem repository and filters every read through an entitler block. The block receives ‘name:` (and optionally `version:`) and returns truthy when the caller is allowed to see that gem/version. Non-entitled gems disappear from listings, return nil paths, and report as non-existent.

Writes (add_gem, yank_gem) always raise WriteNotAllowed. Gating a read path implies the caller is not the right party to mutate the corpus —if you want a more nuanced story (e.g. read-gated but write-allowed for authenticated admins), write a different wrapper with its own policy. This one is deliberately opinionated: gating reads blocks writes, full stop.

Defined Under Namespace

Classes: WriteNotAllowed

Instance Method Summary collapse

Constructor Details

#initialize(repository, &entitler) ⇒ ReadGatedRepository

Returns a new instance of ReadGatedRepository.



19
20
21
22
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 19

def initialize(repository, &entitler)
  super(repository)
  @entitler = entitler
end

Instance Method Details

#add_gemObject

Raises:



65
66
67
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 65

def add_gem(*)
  raise WriteNotAllowed, "Writes are not allowed through a read-gated repository"
end

#compact_info(gem_name) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 47

def compact_info(gem_name)
  return nil unless @entitler.call(name: gem_name)

  all_info = super
  return all_info unless all_info.is_a?(Array)

  all_info.select do |line|
    version = line.split(" ")[0]
    @entitler.call(name: gem_name, version: version)
  end
end

#gem_exists?(gem_name, version) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
62
63
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 59

def gem_exists?(gem_name, version)
  if @entitler.call(name: gem_name, version: version)
    super
  end
end

#gem_file_path(gem_name, version) ⇒ Object



41
42
43
44
45
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 41

def gem_file_path(gem_name, version)
  if @entitler.call(name: gem_name, version: version)
    super
  end
end

#gem_namesObject



24
25
26
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 24

def gem_names
  super.select { |name| @entitler.call(name: name) }
end

#gem_versionsObject



28
29
30
31
32
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 28

def gem_versions
  super.select do |gem_name, version|
    @entitler.call(name: gem_name, version: version)
  end
end

#versions_for_gem(gem_name) ⇒ Object



34
35
36
37
38
39
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 34

def versions_for_gem(gem_name)
  return [] unless @entitler.call(name: gem_name)
  super.select do |version|
    @entitler.call(name: gem_name, version: version)
  end
end

#yank_gemObject

Raises:



69
70
71
# File 'lib/paquette/gem_server/read_gated_repository.rb', line 69

def yank_gem(*)
  raise WriteNotAllowed, "Writes are not allowed through a read-gated repository"
end