143 lines
4.5 KiB
Ruby
143 lines
4.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Copyright (c) [2024] 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 "agama/autoyast/profile_description"
|
|
|
|
module Agama
|
|
module Tasks
|
|
# Generates the AutoYaST compatibility reference
|
|
#
|
|
# The document describes which elements are supported, unsupported or planned to be supported.
|
|
# It uses markdown to make it easier to integrate the document in Agama's website.
|
|
class AutoYaSTCompatGenerator
|
|
attr_reader :description
|
|
|
|
INTRO = <<~INTRO
|
|
# AutoYaST compatibility reference
|
|
|
|
Let's describe which sections and elements from an AutoYaST profile are (or will be) supported in
|
|
Agama. In some cases, you might find a table with the following columns:
|
|
|
|
- AutoYaST: name of the AutoYaST element.
|
|
- Supported: whether it is (or will be) supported. The meaning of each value is:
|
|
- Yes: fully supported.
|
|
- Planned: not supported yet, but there are plans to support it.
|
|
- Undecided: no decision about whether it should be supported.
|
|
- No: there are no plans for supporting that element.
|
|
- Agama: name of the Agama element.
|
|
- Comment: any comment or reason about the element.
|
|
|
|
INTRO
|
|
|
|
def initialize
|
|
@description = Agama::AutoYaST::ProfileDescription.load
|
|
end
|
|
|
|
# Generates the document in Markdown format
|
|
def generate
|
|
lines = [INTRO]
|
|
|
|
top_level = description.elements.select(&:top_level?)
|
|
.sort_by(&:short_key)
|
|
unsupported, rest = top_level.partition { |e| e.support == :no }
|
|
|
|
rest.each do |e|
|
|
lines.concat(section(e))
|
|
end
|
|
|
|
lines.concat(unsupported_elements(unsupported))
|
|
end
|
|
|
|
private
|
|
|
|
def section(element, level = 1)
|
|
title = "#" * (level + 1)
|
|
lines = ["#{title} #{element.key}"]
|
|
|
|
lines << ""
|
|
lines << notes_for(element)
|
|
lines << ""
|
|
|
|
scalar, complex = element.children.partition do |e|
|
|
e.children.empty?
|
|
end
|
|
|
|
lines.concat(elements_table(scalar))
|
|
|
|
complex.each_with_object(lines) do |e, all|
|
|
all.concat(section(e, level + 1))
|
|
end
|
|
end
|
|
|
|
# Generates a table describing the support level of the elements.
|
|
#
|
|
# @param elements [Array<ProfileElement>] Elements to describe.
|
|
def elements_table(elements)
|
|
return [] if elements.empty?
|
|
|
|
lines = [
|
|
"| AutoYaST | Supported | Agama | Notes |",
|
|
"|----------|-----------|-------|-------|"
|
|
]
|
|
elements.each do |e|
|
|
agama_key = e.agama ? "`#{e.agama}`" : ""
|
|
lines << "| `#{e.short_key}` | #{e.support} | #{agama_key} | #{e.notes} |"
|
|
end
|
|
lines << ""
|
|
lines
|
|
end
|
|
|
|
def unsupported_elements(elements)
|
|
lines = []
|
|
lines << "## Unsupported sections"
|
|
lines << ""
|
|
lines << "The following sections are not supported and there are no plans to " \
|
|
"support them in the future."
|
|
lines << ""
|
|
elements.each_with_object(lines) do |e, all|
|
|
line = "* `#{e.short_key}`"
|
|
line << ": #{e.notes}" if e.notes
|
|
all << line
|
|
end
|
|
end
|
|
|
|
# Generates the notes for a given element.
|
|
#
|
|
# @param element [ProfileElement] Profile element to generate the notes for
|
|
def notes_for(element)
|
|
content = case element.support
|
|
when :yes
|
|
"This section is supported."
|
|
when :no
|
|
"This section is not supported."
|
|
when :planned
|
|
"There are plans to support this section in the future."
|
|
when :partial
|
|
"There is partial support for this section."
|
|
else
|
|
"Support for this element is still undecided."
|
|
end
|
|
|
|
element.notes ? "#{content} #{element.notes}" : content
|
|
end
|
|
end
|
|
end
|
|
end
|