Skip to content

Commit

Permalink
Check <meta name="category">
Browse files Browse the repository at this point in the history
  • Loading branch information
tomschr committed Jun 13, 2024
1 parent 3afed36 commit 78f3d3a
Show file tree
Hide file tree
Showing 12 changed files with 187 additions and 7 deletions.
4 changes: 4 additions & 0 deletions python-scripts/metadatavalidator/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,7 @@ recognized:
* :var:`require_meta_architecture`: Requires a ``<meta name="architecture">`` tag or not.

* :var:`valid_meta_architecture`: Lists the valid architecture names for ``<meta name="architecture">/<phrase>``.

* :var:`require_meta_category`: Requires a ``<meta name="category">`` tag or not.

* :var:`valid_meta_category`: Lists the valid category names for ``<meta name="category">/<phrase>``.
6 changes: 5 additions & 1 deletion python-scripts/metadatavalidator/metadatavalidator.ini
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,8 @@ require_meta_platform = off

# <meta name="architecture">
require_meta_architecture = off
valid_meta_architecture = Arm, AMD64/Intel\u00a064, POWER, IBM LinuxONE
valid_meta_architecture = Arm, AMD64/Intel\u00a064, POWER, IBM LinuxONE

# <meta name="category">
require_meta_category = off
valid_meta_category = 3rd Party, Cloud, Containerization, Developer Tools, High Availability, Tuning & Performance, SAP, Security, Storage, Systems Management, Virtualization
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
check_meta_techpartner,
check_meta_platform,
check_meta_architecture,
check_meta_category,
)

# Keep the order. The next item is dependent on the previous item.
Expand All @@ -36,5 +37,6 @@
"check_meta_techpartner",
"check_meta_platform",
"check_meta_architecture",
"check_meta_category",
]

Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,48 @@ def check_meta_architecture(tree: etree._ElementTree,
f"Unknown architecture(s) {wrong_items}. "
f"Allowed are {valid_archs}."
)
print(">>>", wrong_items, valid_archs, archs)


def check_meta_category(tree: etree._ElementTree,
config: dict[t.Any, t.Any]):
"""Checks for a <meta name="category"> element"""
root = tree.getroot()
meta = root.find("./d:info/d:meta[@name='category']",
namespaces=NAMESPACES)
required = config.get("metadata", {}).get("require_meta_category", False)
if meta is None:
if required:
raise InvalidValueError(
f"Couldn't find required meta[@name='category'] element "
f"in {root.tag}."
)
return

valid_cats = [
x.strip() for x in config.get("metadata", {}
).get("valid_meta_category", [])
if x
]

# Do we have children?
cats = [tag.text.strip() for tag in meta.iterchildren()]
if not cats:
raise InvalidValueError(
f"Couldn't find any child elements in meta[@name='category'] "
f"(line {meta.sourceline})."
)

# Are they unique?
if len(cats) != len(set(cats)):
raise InvalidValueError(
f"Duplicate categories found in meta[@name='category'] "
f"(line {meta.sourceline})."
)

# Do we have items that don't conform to our predefined list?
wrong_items = set(cats) - set(valid_cats)
if wrong_items:
raise InvalidValueError(
f"Unknown category(ies) {wrong_items}. "
f"Allowed are {valid_cats}."
)
24 changes: 24 additions & 0 deletions python-scripts/metadatavalidator/src/metadatavalidator/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,30 @@ def validate_and_convert_config(config: configparser.ConfigParser) -> dict[t.Any
)
theconfig.setdefault("metadata", {})["require_meta_series"] = require_meta_series

# architectures
require_meta_architecture = truefalse(
theconfig.get("metadata", {}).get("require_meta_architecture", False)
)
theconfig.setdefault("metadata", {})["require_meta_architecture"] = require_meta_architecture
try:
architectures = split.split(theconfig.get("metadata", {}).get("valid_meta_architecture", []))
theconfig.setdefault("metadata", {})["valid_meta_architecture"] = architectures
except TypeError:
raise MissingKeyError("metadata.valid_meta_architecture")


# categories
require_meta_category = truefalse(
theconfig.get("metadata", {}).get("require_meta_category", False)
)
theconfig.setdefault("metadata", {})["require_meta_category"] = require_meta_category
try:
categories = split.split(theconfig.get("metadata", {}).get("valid_meta_category", []))
theconfig.setdefault("metadata", {})["valid_meta_category"] = categories
except TypeError:
raise MissingKeyError("metadata.valid_meta_category")


# Store the configfiles
theconfig["configfiles"] = getattr(config, "configfiles")
return theconfig
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<article xmlns="http://docbook.org/ns/docbook" version="5.2">
<info>
<title>Test</title>
<meta name="title">The very long, long, long long SEO title</meta>
</info>
<para/>
</article>
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[validator]
file_extension = .xml
check_root_elements = book article topic
valid_languages = en-us

[metadata]
revhistory = 0
require_xmlid_on_revision = 0

# <meta name="title">
require_meta_title = on
meta_title_length = 55

# <meta name="description">
require_meta_description = off
meta_description_length = 150

require_meta_architecture = off
valid_meta_architecture = Arm, AMD64/Intel\u00a064, POWER, IBM LinuxONE

# <meta name="category">
require_meta_category = off
valid_meta_category = 3rd Party, Cloud, Containerization, Developer Tools, High Availability, Tuning & Performance, SAP, Security, Storage, Systems Management, Virtualization
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import os.path
import json
import pytest

from metadatavalidator.cli import main


BASEDIR = os.path.dirname(os.path.realpath(__file__))
RELATIVE_PATH = os.path.relpath(BASEDIR, os.getcwd())


def test_case1_integration(capsys):
cli = ["--config", f"{BASEDIR}/config-test.ini",
"--format", "json", # needed to avoid formatting issues
f"{RELATIVE_PATH}/article.xml"]

result = main(cli)
captured = capsys.readouterr()
assert result == 0
result = json.loads(captured.out)
assert result[0]['errors'] == []
assert result[0]['xmlfile'] == f"{RELATIVE_PATH}/article.xml"

Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,10 @@ meta_title_length = 55
# <meta name="description">
require_meta_description = off
meta_description_length = 150

require_meta_architecture = off
valid_meta_architecture = Arm, AMD64/Intel\u00a064, POWER, IBM LinuxONE

# <meta name="category">
require_meta_category = off
valid_meta_category = 3rd Party, Cloud, Containerization, Developer Tools, High Availability, Tuning & Performance, SAP, Security, Storage, Systems Management, Virtualization
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
check_meta_techpartner,
check_meta_platform,
check_meta_architecture,
check_meta_category,
)
from metadatavalidator.exceptions import InvalidValueError

Expand Down Expand Up @@ -406,3 +407,19 @@ def test_check_unknown_child_meta_architecture(xmlparser):
with pytest.raises(InvalidValueError,
match=r".*Unknown architecture.*"):
check_meta_architecture(tree, config)


def test_meta_category(xmlparser):
xmlcontent = """<article xmlns="http://docbook.org/ns/docbook" version="5.2">
<info>
<title>Test</title>
<meta name="category">
<phrase>Systems Management</phrase>
</meta>
</info>
<para/>
</article>"""
tree = etree.ElementTree(etree.fromstring(xmlcontent, parser=xmlparser))
config = dict(metadata=dict(require_meta_category=True,
valid_meta_category=["Systems Management"]))
assert check_meta_category(tree, config) is None
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,20 @@ meta_title_length = 55
# <meta name="description">
require_meta_description = off
meta_description_length = 150
#

# <meta name="series">
require_meta_series = off
valid_meta_series = Products & Solutions, Best Practices, Technical References
valid_meta_series = Products & Solutions, Best Practices, Technical References

# <meta name="techpartner">
require_meta_techpartner = off

# <meta name="platform">
require_meta_platform = off

# <meta name="architecture">
require_meta_architecture = off
valid_meta_architecture = Arm, AMD64/Intel\u00a064, POWER, IBM LinuxONE

require_meta_category = off
valid_meta_category = 3rd Party, Cloud, Containerization, Developer Tools, High Availability, Tuning & Performance, SAP, Security, Storage, Systems Management, Virtualization
17 changes: 14 additions & 3 deletions python-scripts/metadatavalidator/tests/unit/test_script_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,16 @@

import pytest

from metadatavalidator.config import readconfig, validate_and_convert_config, truefalse
from metadatavalidator.exceptions import MissingKeyError, MissingSectionError, NoConfigFilesFoundError
from metadatavalidator.config import (
readconfig,
validate_and_convert_config,
truefalse,
)
from metadatavalidator.exceptions import (
MissingKeyError,
MissingSectionError,
NoConfigFilesFoundError,
)

def create_config():
config = ConfigParser()
Expand All @@ -19,6 +27,8 @@ def create_config():
config.set("metadata", "meta_title_length", "50")
config.set("metadata", "meta_description_length", "150")
#
config.set("metadata", "valid_meta_architecture", "A, B, C")
config.set("metadata", "valid_meta_category", "D, E, F")
setattr(config, "configfiles", None)
return config

Expand Down Expand Up @@ -49,7 +59,8 @@ def test_valid_validate_and_convert_config():
assert result.get("validator") == {
"check_root_elements": ["book", "article"],
"file_extension": ".xml",
"valid_languages": ["en-us", "de-de",]
"valid_languages": ["en-us", "de-de",],
# ""
}


Expand Down

0 comments on commit 78f3d3a

Please sign in to comment.