Class: Rip::PackageManager

Inherits:
Object
  • Object
show all
Defined in:
lib/rip/package_manager.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(env = nil) ⇒ PackageManager

Returns a new instance of PackageManager.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rip/package_manager.rb', line 36

def initialize(env = nil)
  @env = env || Rip::Env.active
  load

  # key is the package name, value is the current
  # installed version
  @versions ||= {}

  # key is the package name, value is an array of
  # libraries it depend on
  @dependents ||= {}

  # key is the package name, value is an array of
  # libraries that depend on it
  @dependencies ||= {}

  # key is the package name, value is the source
  @sources ||= {}

  # key is the package name, value is the installed
  # files
  @files ||= {}
end

Instance Attribute Details

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



34
35
36
# File 'lib/rip/package_manager.rb', line 34

def dependencies
  @dependencies
end

#dependentsObject (readonly)

Returns the value of attribute dependents.



34
35
36
# File 'lib/rip/package_manager.rb', line 34

def dependents
  @dependents
end

#envObject (readonly)

Returns the value of attribute env.



34
35
36
# File 'lib/rip/package_manager.rb', line 34

def env
  @env
end

#sourcesObject (readonly)

Returns the value of attribute sources.



34
35
36
# File 'lib/rip/package_manager.rb', line 34

def sources
  @sources
end

#versionsObject (readonly)

Returns the value of attribute versions.



34
35
36
# File 'lib/rip/package_manager.rb', line 34

def versions
  @versions
end

Instance Method Details

#add_files(name, file_list = []) ⇒ Object



121
122
123
124
125
# File 'lib/rip/package_manager.rb', line 121

def add_files(name, file_list = [])
  @files[name] ||= []
  @files[name].concat file_list
  save
end

#add_package(package, parent = nil) ⇒ Object



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/rip/package_manager.rb', line 93

def add_package(package, parent = nil)
  name = package.name
  version = package.version

  if @versions.has_key?(name) && @versions[name] != version
    raise VersionConflict.new(name, version, parent, @versions[name], @dependents[name].to_a)
  end

  if parent && !parent.meta_package?
    @dependents[name] ||= Set.new
    @dependents[name].add(parent.name)
    @dependencies[parent.name] ||= Set.new
    @dependencies[parent.name].add(name)
  end

  # already installed?
  if @versions.has_key? name
    false
  else
    @versions[name] = version
    @sources[name] = package.source
    @files[name] = package.files
    true
  end
ensure
  save
end

#dirObject



144
145
146
# File 'lib/rip/package_manager.rb', line 144

def dir
  File.join(Rip.dir, @env)
end

#files(name) ⇒ Object



81
82
83
# File 'lib/rip/package_manager.rb', line 81

def files(name)
  Array(@files[name])
end

#inspectObject



60
61
62
# File 'lib/rip/package_manager.rb', line 60

def inspect
  "(#{self.class} dependencies=#{dependencies.inspect} dependents=#{dependents.inspect} sources=#{sources.inspect} versions=#{versions.inspect})"
end

#installed?(name) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/rip/package_manager.rb', line 85

def installed?(name)
  @versions.has_key? name
end

#loadObject



155
156
157
# File 'lib/rip/package_manager.rb', line 155

def load
  marshal_read unzip(File.read(path)) if File.exists? path
end

#marshal_payloadObject



167
168
169
# File 'lib/rip/package_manager.rb', line 167

def marshal_payload
  Marshal.dump [ @versions, @dependents, @dependencies, @sources, @files ]
end

#marshal_read(data) ⇒ Object



171
172
173
# File 'lib/rip/package_manager.rb', line 171

def marshal_read(data)
  @versions, @dependents, @dependencies, @sources, @files = Marshal.load(data)
end

#package(name) ⇒ Object



72
73
74
75
# File 'lib/rip/package_manager.rb', line 72

def package(name)
  return unless @versions[name]
  Package.for(@sources[name], @versions[name], @files[name])
end

#package_namesObject



68
69
70
# File 'lib/rip/package_manager.rb', line 68

def package_names
  @versions.keys
end

#package_version(name) ⇒ Object



89
90
91
# File 'lib/rip/package_manager.rb', line 89

def package_version(name)
  @versions[name]
end

#packagesObject



64
65
66
# File 'lib/rip/package_manager.rb', line 64

def packages
  @versions.keys.map { |name| package(name) }
end

#packages_that_depend_on(name) ⇒ Object



77
78
79
# File 'lib/rip/package_manager.rb', line 77

def packages_that_depend_on(name)
  (@dependents[name] || []).map { |name| package(name) }
end

#pathObject



140
141
142
# File 'lib/rip/package_manager.rb', line 140

def path
  File.join(dir, "#{@env}.ripenv")
end

#remove_package(package) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/rip/package_manager.rb', line 127

def remove_package(package)
  name = package.name

  Array(@dependencies[name]).each do |dep|
    @dependents[dep].delete(name) if @dependents[dep].respond_to? :delete
  end

  @dependents.delete(name)
  @dependencies.delete(name)
  @versions.delete(name)
  save
end

#saveObject



148
149
150
151
152
153
# File 'lib/rip/package_manager.rb', line 148

def save
  File.open(path, 'w') do |f|
    f.puts zip(marshal_payload)
    f.flush
  end
end

#unzip(data) ⇒ Object



163
164
165
# File 'lib/rip/package_manager.rb', line 163

def unzip(data)
  Zlib::Inflate.inflate(data)
end

#zip(data) ⇒ Object



159
160
161
# File 'lib/rip/package_manager.rb', line 159

def zip(data)
  Zlib::Deflate.deflate(data)
end