Skip to content

Commit

Permalink
feat(ruby): implement the ScriptProblem callback
Browse files Browse the repository at this point in the history
  • Loading branch information
imobachgs committed Jan 22, 2025
1 parent f779668 commit 0c2678d
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 0 deletions.
1 change: 1 addition & 0 deletions service/lib/agama/software/callbacks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ module Callbacks
require "agama/software/callbacks/media"
require "agama/software/callbacks/progress"
require "agama/software/callbacks/provide"
require "agama/software/callbacks/script"
require "agama/software/callbacks/signature"
require "agama/software/callbacks/source"
81 changes: 81 additions & 0 deletions service/lib/agama/software/callbacks/script.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# frozen_string_literal: true

# Copyright (c) [2025] SUSE LLC
#
# All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, contact SUSE LLC.
#
# To contact SUSE LLC about this file by physical or electronic mail, you may
# find current contact information at www.suse.com.

require "yast"
require "agama/question"

Yast.import "Pkg"

module Agama
module Software
module Callbacks
# Script callbacks
class Script
include Yast::I18n

# Constructor
#
# @param questions_client [Agama::DBus::Clients::Questions]
# @param logger [Logger]
def initialize(questions_client, logger)
@questions_client = questions_client
@logger = logger
end

# Register the callbacks
def setup
Pkg.CallbackScriptProblem(
fun_ref(method(:ScriptProblem), "string (string)")
)
end

# DoneProvide callback
#
# @param description [String] Problem description
# @return [String] "I" for ignore, "R" for retry and "C" for abort (not implemented)
# @see https://github.com/yast/yast-yast2/blob/19180445ab935a25edd4ae0243aa7a3bcd09c9de/library/packages/src/modules/PackageCallbacks.rb#L620
def script_problem(description)
logger.debug "ScriptProblem callback: description: #{description}"

message = _("There was a problem running a package script.")
question = Agama::Question.new(
qclass: "software.script_problem",
text: message,
options: [:Retry, :Ignore],
default_option: :Retry,
data: { "details" => description }
)
questions_client.ask(question) do |question_client|
(question_client.answer == :Retry) ? "R" : "I"
end
end

private

# @return [Agama::DBus::Clients::Questions]
attr_reader :questions_client

# @return [Logger]
attr_reader :logger
end
end
end
end
74 changes: 74 additions & 0 deletions service/test/agama/software/callbacks/script_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# frozen_string_literal: true

# Copyright (c) [2022-2023] SUSE LLC
#
# All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as published
# by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, contact SUSE LLC.
#
# To contact SUSE LLC about this file by physical or electronic mail, you may
# find current contact information at www.suse.com.

require_relative "../../../test_helper"
require "agama/software/callbacks/script"
require "agama/dbus/clients/questions"
require "agama/dbus/clients/question"

describe Agama::Software::Callbacks::Script do
subject { described_class.new(questions_client, logger) }

let(:questions_client) { instance_double(Agama::DBus::Clients::Questions) }

let(:logger) { Logger.new($stdout, level: :warn) }

let(:answer) { :Retry }

let(:description) { "Some description" }

describe "#script_problem" do
before do
allow(questions_client).to receive(:ask).and_yield(question_client)
allow(question_client).to receive(:answer).and_return(answer)
end

let(:question_client) { instance_double(Agama::DBus::Clients::Question) }

it "registers a question with the details" do
expect(questions_client).to receive(:ask) do |q|
expect(q.text).to include("running a package script")
expect(q.data).to include(
"details" => description
)
end
subject.script_problem(description)
end

context "when the user answers :Retry" do
let(:answer) { :Retry }

it "returns 'R'" do
ret = subject.script_problem(description)
expect(ret).to eq("R")
end
end

context "when the user answers :Ignore" do
let(:answer) { :Ignore }

it "returns 'I'" do
ret = subject.script_problem(description)
expect(ret).to eq("I")
end
end
end
end

0 comments on commit 0c2678d

Please sign in to comment.