Class: RosettAi::PackageManager::GemBackend

Inherits:
Base
  • Object
show all
Defined in:
lib/rosett_ai/package_manager/gem_backend.rb

Overview

RubyGems package manager backend.

Does NOT require privilege escalation. Installs gems into the user's gem directory or the system gem path.

Author:

  • hugo

  • claude

Constant Summary collapse

GEM_COMMAND =
'gem'

Instance Method Summary collapse

Instance Method Details

#available?Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/rosett_ai/package_manager/gem_backend.rb', line 24

def available?
  defined?(::Gem) == 'constant'
end

#available_packages(pattern) ⇒ Array<Hash>

Search for available gems matching a pattern.

Parameters:

  • pattern (String)

Returns:

  • (Array<Hash>)


61
62
63
64
65
66
67
# File 'lib/rosett_ai/package_manager/gem_backend.rb', line 61

def available_packages(pattern)
  validate_gem_name!(pattern)
  specs = Gem::Specification.find_all_by_name(/#{Regexp.escape(pattern)}/)
  specs.map { |s| { name: s.name, version: s.version.to_s } }
rescue Gem::MissingSpecError
  []
end

#backend_nameString

Returns:

  • (String)


19
20
21
# File 'lib/rosett_ai/package_manager/gem_backend.rb', line 19

def backend_name
  'gem'
end

#install(package_name) ⇒ Boolean

Install a gem.

Parameters:

  • package_name (String)

Returns:

  • (Boolean)


32
33
34
35
# File 'lib/rosett_ai/package_manager/gem_backend.rb', line 32

def install(package_name)
  validate_gem_name!(package_name)
  system(GEM_COMMAND, 'install', package_name, '--no-document', out: File::NULL)
end

#installed?(package_name) ⇒ Boolean

Check if a gem is installed.

Parameters:

  • package_name (String)

Returns:

  • (Boolean)


50
51
52
53
54
55
# File 'lib/rosett_ai/package_manager/gem_backend.rb', line 50

def installed?(package_name)
  validate_gem_name!(package_name)
  !Gem::Specification.find_all_by_name(package_name).empty?
rescue Gem::MissingSpecError
  false
end

#remove(package_name) ⇒ Boolean

Remove a gem.

Parameters:

  • package_name (String)

Returns:

  • (Boolean)


41
42
43
44
# File 'lib/rosett_ai/package_manager/gem_backend.rb', line 41

def remove(package_name)
  validate_gem_name!(package_name)
  system(GEM_COMMAND, 'uninstall', package_name, '-x', out: File::NULL)
end

#update_indexBoolean

No-op for gems (no index to update).

Returns:

  • (Boolean)


72
73
74
# File 'lib/rosett_ai/package_manager/gem_backend.rb', line 72

def update_index # rubocop:disable Naming/PredicateMethod -- imperative action (Base interface), not a predicate
  true
end