Skip to content

Commit

Permalink
Add a method to PackagesUI to show libzypp's update messages
Browse files Browse the repository at this point in the history
  • Loading branch information
imobachgs committed Feb 22, 2016
1 parent 56d9078 commit 8101344
Show file tree
Hide file tree
Showing 9 changed files with 218 additions and 2 deletions.
5 changes: 4 additions & 1 deletion library/packages/src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ ynclude_DATA = \

ylibdir = "${yast2dir}/lib/packages"
ylib_DATA = \
lib/packages/dummy_callbacks.rb
lib/packages/commit_result.rb \
lib/packages/dummy_callbacks.rb \
lib/packages/update_message.rb \
lib/packages/update_messages_view.rb

EXTRA_DIST = $(module_DATA) $(ynclude_DATA) $(ylib_DATA)

Expand Down
60 changes: 60 additions & 0 deletions library/packages/src/lib/packages/commit_result.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
require "packages/update_message"

module Packages
class CommitResult
# Commit results coming from libzypp
attr_reader :committed, :successful, :failed, :remaining, :srcremaining, :update_messages

# Constructor
#
# @param successful [Integer] Number of commited resolvables
# @param failed [Array] List of resolvables with error
# @param remaining [Array] List of remaining resolvables (due to wrong media)
# @param srcremaining [Array] List of kind:source remaining resolvables (due to wrong media)
# @param update_messages [Array<Hash>] List of libzypp update messages.
# Check .build_update_messages for more details.
#
# @see build_update_messages
def initialize(successful, failed, remaining, srcremaining, update_messages)
@successful = successful
@failed = failed
@remaining = remaining
@srcremaining = srcremaining
@update_messages = update_messages
end

# Construct an instance taking as input the Pkg.Commit or Pkg.PkgCommit output
#
# Pkg.Commit and Pkg.PkcCommit return an array with the following
# elements: [successful, failed, remaining, srcremaining, update_messages].
#
# @param result [Array] Result as returned by Pkg.Commit and Pkg.PkgCommit
def self.from_result(result)
messages = build_update_messages(result[4])
new(result[0], result[1], result[2], result[3], messages)
end

private

# Convert an array of hash into an array of UpdateMessage objects
#
# Each hash contains the following keys/values:
#
# * solvable: solvable name (usually package names).
# * text: message text.
# * installationPath: path to the libzypp's file containing the message
# after installation.
# * currentPath: path to the libzypp's file containing the message
# currently. It will differ from installationPath
# when running inst-sys.
#
# @param messages [Array<Hash>] Hash representing a message from libzypp.
# @return [Array<Packager::UpdateMessage>] List of update messages
def self.build_update_messages(messages)
messages.map do |msg|
Packages::UpdateMessage.new(msg["solvable"], msg["text"],
msg["installationPath"], msg["currentPath"])
end
end
end
end
17 changes: 17 additions & 0 deletions library/packages/src/lib/packages/update_message.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module Packages
# Represents an update message from libzypp.
#
#
# @see https://doc.opensuse.org/projects/libzypp/HEAD/classzypp_1_1ZYppCommitResult.html#ae6883415d94d4728e3de0dc9c7c58fd5
class UpdateMessage < Struct.new(:solvable, :text, :installation_path, :current_path)
# @!attribute [r] solvable
# @return [String] Name of the solvable libzypp element (usually the package's name).
# @!attribute [r] text
# @return [String] Message's text.
# @!attribute [r] installation_path
# @return [String] Path to the file which contains the message in the installed system.
# @!attribute [r] current_path
# @return [String] Path to the file which contains the message in the running system.
# While running inst-sys, it will differ from installation_path.
end
end
33 changes: 33 additions & 0 deletions library/packages/src/lib/packages/update_messages_view.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
require "yast"

module Packages
class UpdateMessagesView
include Yast::I18n
extend Yast::I18n

def initialize(commit_results)
textdomain "base"
@commit_results = commit_results
end

# Convert a list of messages into richtext
#
# @param messages [Array<UpdateMessage>] List of messages
# @return [String] Richtext representation of the list of messages
def richtext
text = "<h1>#{_("Packages messages")}</h1>"
text << @commit_results.map { |m| message_to_richtext(m) }.join("<hr>")
end

private

# Convert one message to richtext
#
# @return [String] Message converted to richtext
def message_to_richtext(message)
location = format(_("This message will be available at %s"), message.installation_path)
"<h2>#{message.solvable}</h2><p><em>#{location}</em></p>" \
"<br>#{message.text.strip.gsub("\n", "<br>")}"
end
end
end
19 changes: 19 additions & 0 deletions library/packages/src/modules/PackagesUI.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
# $Id$
require "yast"
require "cgi"
require "packages/commit_result"
require "packages/update_messages_view"

module Yast
class PackagesUIClass < Module
Expand All @@ -45,6 +47,7 @@ def main
Yast.import "HTML"
Yast.import "String"
Yast.import "Popup"
Yast.import "Report"

@package_summary = {}
end
Expand Down Expand Up @@ -774,6 +777,22 @@ def ShowInstallationSummary
ShowInstallationSummaryMap(@package_summary)
end

# Show messages coming from libzypp about installed packages
#
# This messages are retrieved from libzypp.
#
# @param [Array] result Result from package commit (as it comes from PkgCommit)
def show_update_messages(result)
commit_result = ::Packages::CommitResult.from_result(result)
if commit_result.update_messages.empty?
false
else
view = ::Packages::UpdateMessagesView.new(commit_result.update_messages)
Report.LongMessage(view.richtext)
true
end
end

publish function: :GetPackageSummary, type: "map <string, any> ()"
publish function: :SetPackageSummary, type: "void (map <string, any>)"
publish function: :ResetPackageSummary, type: "void ()"
Expand Down
4 changes: 3 additions & 1 deletion library/packages/test/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
TESTS = \
commit_result_test.rb \
dummy_callbacks_test.rb \
package_callbacks_test.rb \
packages_ui_test.rb \
product_test.rb \
signature_check_callbacks_test.rb \
slide_show_test.rb
slide_show_test.rb \
update_messages_view_test.rb

TEST_EXTENSIONS = .rb
RB_LOG_COMPILER = rspec
Expand Down
31 changes: 31 additions & 0 deletions library/packages/test/commit_result_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/usr/bin/env rspec

require_relative "test_helper"
require "packages/update_message"
require "packages/commit_result"

describe Packages::CommitResult do
let(:message) do
{ "solvable" => "package",
"text" => "Some cool message!",
"installationPath" => "/var/adm/update-messages/package-1.0",
"currentPath" => "/mnt/var/adm/update-messages/package-1.0"
}
end

let(:old_result) do
[1, ['pkg1'], ['pkg2'], ['pkg3'], [message]]
end

describe ".from_result" do
it "builds a new instance from Pkg.Commit/Pkg.PkgCommit return value" do
result = Packages::CommitResult.from_result(old_result)
expect(result.successful).to eq(1)
expect(result.failed).to eq(['pkg1'])
expect(result.remaining).to eq(['pkg2'])
expect(result.srcremaining).to eq(['pkg3'])
expect(result.update_messages)
.to eq([Packages::UpdateMessage.new(message["solvable"], message["text"], message["installationPath"], message["currentPath"])])
end
end
end
27 changes: 27 additions & 0 deletions library/packages/test/packages_ui_test.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
#!/usr/bin/env rspec

require_relative "test_helper"
require "packages/commit_result"
require "packages/update_message"

Yast.import "PackagesUI"

describe Yast::PackagesUI do
subject(:packages_ui) { Yast::PackagesUI }

describe "#format_license" do
it "returns a preformatted HTML license unchanged" do
license = "\n<!-- DT:Rich -->\n<h3>License Confirmation</h3>"
Expand All @@ -26,4 +30,27 @@
expect(Yast::PackagesUI.format_license(license)).to match(/\A<p>.*<\/p><p>.*<\/p>\z/)
end
end

describe "#show_update_messages" do
let(:result) { [1, [], [], [], [message]] }
let(:message) do
{ "solvable" => "mariadb", "text" => "message content",
"installationPath" => "/some/path1", "currentPath" => "/some/path2" }
end

it "opens a popup containing update messages" do
expect(Yast::Popup).to receive(:LongMessage)
.with(%r{<h2>mariadb</h2>})
packages_ui.show_update_messages(result)
end

context "when no messages exist" do
let(:result) { [0, [], [], [], []] }

it "does not open a popup" do
expect(Yast::Popup).to_not receive(:LongMessage)
packages_ui.show_update_messages(result)
end
end
end
end
24 changes: 24 additions & 0 deletions library/packages/test/update_messages_view_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env rspec

require_relative "test_helper"
require "packages/update_message"
require "packages/update_messages_view"

describe Packages::UpdateMessagesView do
subject(:view) { Packages::UpdateMessagesView.new(messages) }

let(:messages) {
[
Packages::UpdateMessage.new("pkg1", "message 1", "/var/adm/path-1", "/var/adm/path-1"),
Packages::UpdateMessage.new("pkg2", "message 2", "/var/adm/path-2", "/var/adm/path-2")
]
}

describe "#richtext" do
it "concatenates information of all messages in a richtext string" do
expect(view.richtext)
.to eq("<h1>Packages messages</h1><h2>pkg1</h2><p><em>This message will be available at /var/adm/path-1</em></p><br>message 1<hr>" \
"<h2>pkg2</h2><p><em>This message will be available at /var/adm/path-2</em></p><br>message 2")
end
end
end

0 comments on commit 8101344

Please sign in to comment.