diff --git a/bikeshed/Spec.py b/bikeshed/Spec.py index 74e798cb26..7ce609e39f 100644 --- a/bikeshed/Spec.py +++ b/bikeshed/Spec.py @@ -146,6 +146,7 @@ def initMetadata(self, inputContent: InputSource.InputContent) -> None: # Combine the data so far, and compute the doctype # (the other md sources need the doctype in order to be found) self.md = metadata.join(self.mdBaseline, self.mdDocument, self.mdCommandLine) + rawDoctype = (self.md.rawOrg, self.md.rawGroup, self.md.rawStatus) self.doctype = self.doctypes.getDoctype(self.md.rawOrg, self.md.rawGroup, self.md.rawStatus) self.mdDefaults = metadata.fromJson( @@ -153,6 +154,9 @@ def initMetadata(self, inputContent: InputSource.InputContent) -> None: source="defaults", ) self.md = metadata.join(self.mdBaseline, self.mdDefaults, self.mdDocument, self.mdCommandLine) + if rawDoctype != (self.md.rawOrg, self.md.rawGroup, self.md.rawStatus): + # recompute doctype + self.doctype = self.doctypes.getDoctype(self.md.rawOrg, self.md.rawGroup, self.md.rawStatus) # Using all of that, load up the text macros so I can sub them into the computed-metadata file. self.md.fillTextMacros(self.macros, doc=self) diff --git a/bikeshed/doctypes/manager.py b/bikeshed/doctypes/manager.py index f9ecc73d59..1c7d522362 100644 --- a/bikeshed/doctypes/manager.py +++ b/bikeshed/doctypes/manager.py @@ -166,7 +166,7 @@ def looselyMatch(self, rawStatus: str) -> bool: orgName, statusName = utils.splitOrg(rawStatus) if statusName and self.name.upper() != statusName.upper(): return False - if orgName and self.org.name != orgName.lower(): + if orgName and self.org.name != orgName.upper(): return False return True diff --git a/bikeshed/doctypes/utils.py b/bikeshed/doctypes/utils.py index a02f2f06d4..00e40b0d4f 100644 --- a/bikeshed/doctypes/utils.py +++ b/bikeshed/doctypes/utils.py @@ -102,7 +102,7 @@ def canonicalize( f"Your Group ({group.name}) is in the '{group.org.name}' Org, but your Status ({status.name}) is only usable in the '{status.org.name}' Org. Allowed Status values for '{group.org.name}' are {config.englishFromList(sorted(possibleStatusNames))}", ) - if group and group.type is not None and status and status.groupTypes and group.type not in status.groupTypes: + if group and group.type is not None and status and status.groupTypes and group.type not in status.groupTypes: allowedStatuses = [s.name for s in group.org.statuses.values() if group.type in s.groupTypes] if allowedStatuses: m.warn( @@ -115,7 +115,7 @@ def canonicalize( if group and status and group.org.name == "W3C": # Apply the special w3c rules - validateW3CStatus(group, status) + validateW3CStatus(status) # Reconciliation done, return everything if Status exists. if status: @@ -200,7 +200,7 @@ def reconcileOrgs(fromRaw: str | None, fromStatus: str | None, fromGroup: str | return orgName -def validateW3CStatus(group: Group, status: Status) -> None: +def validateW3CStatus(status: Status) -> None: if status.name == "DREAM": m.warn("You used Status:DREAM for a W3C document. Consider Status:UD instead.") @@ -208,5 +208,3 @@ def validateW3CStatus(group: Group, status: Status) -> None: m.die( f"Under Process2021, {status.name} is no longer a valid status. Use NOTE (or one of its variants NOTE-ED, NOTE-FPWD, NOTE-WD) instead.", ) - - diff --git a/bikeshed/headings.py b/bikeshed/headings.py index 3e75d4eac9..1cd7f3300b 100644 --- a/bikeshed/headings.py +++ b/bikeshed/headings.py @@ -23,7 +23,7 @@ def processHeadings(doc: t.SpecT, scope: str = "doc") -> None: for el in headings: h.addClass(doc, el, "settled") if scope == "all" and doc.doctype.group.privSec: - checkPrivacySecurityHeadings(h.findAll(".heading", doc)) + checkPrivacySecurityHeadings(doc, h.findAll(".heading", doc)) def resetHeadings(headings: list[t.ElementT]) -> None: @@ -56,7 +56,7 @@ def addHeadingIds(doc: t.SpecT, headings: list[t.ElementT]) -> None: ) -def checkPrivacySecurityHeadings(headings: list[t.ElementT]) -> None: +def checkPrivacySecurityHeadings(doc: t.SpecT, headings: list[t.ElementT]) -> None: security = False privacy = False for header in headings: @@ -66,7 +66,7 @@ def checkPrivacySecurityHeadings(headings: list[t.ElementT]) -> None: security = True if "privacy" in text and "considerations" in text: privacy = True - if "security" in text and "privacy" in text and "considerations" in text: + if "security" in text and "privacy" in text and "considerations" in text and doc.doctype.org.name == "W3C": m.warn( "W3C policy requires Privacy Considerations and Security Considerations to be separate sections, but you appear to have them combined into one.", el=header, diff --git a/bikeshed/metadata.py b/bikeshed/metadata.py index f5da5cbdd2..539eda7621 100644 --- a/bikeshed/metadata.py +++ b/bikeshed/metadata.py @@ -279,8 +279,10 @@ def fillTextMacros(self, macros: t.DefaultDict[str, str], doc: t.SpecT) -> None: macros["level"] = str(self.level) if self.displayVshortname: macros["vshortname"] = self.displayVshortname - if doc.doctype.status.fullName() == "FINDING" and doc.doctype.group: + if doc.doctype.status.name == "FINDING" and doc.doctype.group: macros["longstatus"] = f"Finding of the {doc.doctype.group.name}" + elif doc.doctype.status.name == "DRAFT-FINDING" and doc.doctype.group: + macros["longstatus"] = f"Draft Finding of the {doc.doctype.group.name}" elif doc.doctype.status: macros["longstatus"] = doc.doctype.status.longName else: diff --git a/bikeshed/spec-data/readonly/boilerplate/doctypes.kdl b/bikeshed/spec-data/readonly/boilerplate/doctypes.kdl index 3e9f705f72..0b475de73a 100644 --- a/bikeshed/spec-data/readonly/boilerplate/doctypes.kdl +++ b/bikeshed/spec-data/readonly/boilerplate/doctypes.kdl @@ -49,9 +49,11 @@ status "LS-COMMIT" "Commit Snapshot" status "LS-BRANCH" "Branch Snapshot" status "LS-PR" "PR Preview" status "LD" "Living Document" +status "DRAFT-FINDING" "Draft Finding" +status "FINDING" "Finding" org "whatwg" { - group "whatwg" priv-sec=true + group "whatwg" priv-sec=false status "RD" "Review Draft" { requires "Date" } @@ -126,7 +128,7 @@ org "w3c" { group "webml" type="cg" group "webmlwg" type="wg" group "webperf" type="wg" - group "webplatform" type="cg" priv-sec=true + group "webplatform" type="wg" priv-sec=true group "webrtc" type="wg" group "webspecs" type="wg" priv-sec=true group "webtransport" type="wg" @@ -162,7 +164,7 @@ org "w3c" { group-types "wg" } status "CR" "W3C Candidate Recommendation Snapshot" { - requires "Level" "ED" "TR" "Issue Tracking" "Date" "Implentation Report" + requires "Level" "ED" "TR" "Issue Tracking" "Date" "Implementation Report" group-types "wg" } status "CRD" "W3C Candidate Recommendation Draft" { diff --git a/tests/github/WICG/container-queries/index.html b/tests/github/WICG/container-queries/index.html index 0679d356d4..8a6463c850 100644 --- a/tests/github/WICG/container-queries/index.html +++ b/tests/github/WICG/container-queries/index.html @@ -3,7 +3,7 @@ Container Queries - + diff --git a/tests/github/WICG/content-index/spec/index.console.txt b/tests/github/WICG/content-index/spec/index.console.txt index 7433e54ac9..1e4817e6cb 100644 --- a/tests/github/WICG/content-index/spec/index.console.txt +++ b/tests/github/WICG/content-index/spec/index.console.txt @@ -1,4 +1,4 @@ -WARNING: You used Status: ED, but W3C Community and Business Groups are limited to these statuses: CG-DRAFT, CG-FINAL, UD. +WARNING: You used Status ED, but your Group (WICG) is limited to the statuses CG-DRAFT, CG-FINAL, or UD. LINE ~76: Multiple possible 'service worker' dfn refs. Arbitrarily chose https://w3c.github.io/ServiceWorker/#dfn-service-worker To auto-select one of the following refs, insert one of these lines into a