#7 Replace hardcoded "modular" support with generic "dist" support
Merged 3 years ago by adamwill. Opened 3 years ago by adamwill.

file modified
+24 -37
@@ -44,14 +44,17 @@ 

      appropriate access rights for any actions to be performed (i.e.

      things instantiating an Event are expected to do site.login

      themselves if needed). Required attributes: shortver,

-     category_page. If modular is True, the event will be for a

-     Fedora-Modular compose, with 'Modular' in the page names, category

-     names and so on.

+     category_page. "dist" lets us create multiple event streams for

+     different compose streams: it defaults to "Fedora", which gives

+     us event and page names for the main stream of composes and Fedora

+     releases, but can be set to e.g. "Fedora IoT" for a validation

+     event for an IoT compose. The provided string is simply included

+     in page names, category names and so on.

      """

  

      __metaclass__ = abc.ABCMeta

  

-     def __init__(self, site, release, milestone="", compose="", modular=False):

+     def __init__(self, site, release, milestone="", compose="", dist="Fedora"):

          self.site = site

          self.release = release

          self.milestone = str(milestone)
@@ -59,7 +62,7 @@ 

              self.compose = fedfind.helpers.date_check(compose, fail_raise=True, out="str")

          except ValueError:

              self.compose = str(compose)

-         self.modular = modular

+         self.dist = wikitcms.helpers.validate_dist(dist)

          self.version = f"{self.release} {self.milestone} {self.compose}"

          # Sorting helpers. sortname is a string, sorttuple is a

          # 4-tuple. sorttuple is more reliable. See the function docs.
@@ -90,10 +93,7 @@ 

          pages that are a part of this test event, according to the

          naming convention.

          """

-         _dist = "Fedora"

-         if self.modular:

-             _dist = "Fedora Modular"

-         pages = self.site.allresults(prefix=f"{_dist} {self.version} ")

+         pages = self.site.allresults(prefix=f"{self.dist} {self.version} ")

          return [p for p in pages if isinstance(p, wikitcms.page.ValidationPage)]

  

      @property
@@ -101,21 +101,21 @@ 

          """The DownloadPage for this event. Is a property because page

          instantiation requires a remote trip.

          """

-         return wikitcms.page.DownloadPage(self.site, self, modular=self.modular)

+         return wikitcms.page.DownloadPage(self.site, self, dist=self.dist)

  

      @property

      def ami_page(self):

          """The AMIPage for this event. Is a property because page

          instantiation requires a remote trip.

          """

-         return wikitcms.page.AMIPage(self.site, self, modular=self.modular)

+         return wikitcms.page.AMIPage(self.site, self, dist=self.dist)

  

      @property

      def parent_category_page(self):

          """The parent category page for this event. Is a property for

          the same reason as download_page.

          """

-         return wikitcms.listing.ValidationCategory(self.site, self.release, modular=self.modular)

+         return wikitcms.listing.ValidationCategory(self.site, self.release, dist=self.dist)

  

      @property

      def valid_pages(self):
@@ -123,10 +123,7 @@ 

          page.ValidationPage objects) for this test event, derived from

          the available test types and the naming convention.

          """

-         if self.modular:

-             types = self.site.modular_testtypes

-         else:

-             types = self.site.testtypes

+         types = self.site.get_testtypes(dist=self.dist)

          return [

              self._pagetype(

                  self.site,
@@ -134,7 +131,7 @@ 

                  typ,

                  milestone=self.milestone,

                  compose=self.compose,

-                 modular=self.modular,

+                 dist=self.dist,

              )

              for typ in types

          ]
@@ -145,7 +142,7 @@ 

          page. Very simple property, but not set in __init__ as the

          summary page object does (slow) wiki roundtrips in  __init__.

          """

-         return wikitcms.page.SummaryPage(self.site, self, modular=self.modular)

+         return wikitcms.page.SummaryPage(self.site, self, dist=self.dist)

  

      @cached_property

      def ff_release(self):
@@ -153,12 +150,9 @@ 

          # note: fedfind has a hack that parses date and respin out

          # of a dot-separated compose, since wikitcms smooshes them

          # into the compose value.

-         dist = "Fedora"

-         if self.modular:

-             dist = "Fedora-Modular"

          try:

              return fedfind.release.get_release(

-                 release=self.release, milestone=self.milestone, compose=self.compose, dist=dist

+                 release=self.release, milestone=self.milestone, compose=self.compose, dist=self.dist

              )

          except ValueError as err:

              try:
@@ -191,10 +185,7 @@ 

          content = "{{tempdoc}}\n<onlyinclude>{{#switch: {{{1|full}}}\n"

          content += self._current_content

          content += "}}</onlyinclude>\n[[Category: Fedora Templates]]"

-         if self.modular:

-             curr = self.site.pages["Template:CurrentFedoraModularCompose"]

-         else:

-             curr = self.site.pages["Template:CurrentFedoraCompose"]

+         curr = self.site.pages[f"Template:Current{self.dist}Compose"]

          curr.save(content, "relval: update to current event", createonly=None)

  

      def create(self, testtypes=None, force=False, current=True, check=False):
@@ -289,11 +280,7 @@ 

          object.

          """

          return cls(

-             pageobj.site,

-             pageobj.release,

-             pageobj.milestone,

-             pageobj.compose,

-             modular=pageobj.modular,

+             pageobj.site, pageobj.release, pageobj.milestone, pageobj.compose, dist=pageobj.dist,

          )

  

  
@@ -303,9 +290,9 @@ 

      candidate build.

      """

  

-     def __init__(self, site, release, milestone, compose, modular=False, cid=""):

+     def __init__(self, site, release, milestone, compose, dist="Fedora", cid=""):

          super(ComposeEvent, self).__init__(

-             site, release, milestone=milestone, compose=compose, modular=modular

+             site, release, milestone=milestone, compose=compose, dist=dist

          )

          # this is a little hint that gets set via get_validation_event

          # when getting a page or event by cid; it helps us find the
@@ -320,7 +307,7 @@ 

          page instantiation requires a remote trip.

          """

          return wikitcms.listing.ValidationCategory(

-             self.site, self.release, self.milestone, modular=self.modular

+             self.site, self.release, self.milestone, dist=self.dist

          )

  

      @property
@@ -389,9 +376,9 @@ 

      of the release validation testing for that future release.

      """

  

-     def __init__(self, site, release, milestone, compose, modular=False):

+     def __init__(self, site, release, milestone, compose, dist="Fedora"):

          super(NightlyEvent, self).__init__(

-             site, release, milestone=milestone, compose=compose, modular=modular

+             site, release, milestone=milestone, compose=compose, dist=dist

          )

          self.shortver = self.compose

          self.creation_date = compose.split(".")[0]
@@ -402,7 +389,7 @@ 

          page instantiation requires a remote trip.

          """

          return wikitcms.listing.ValidationCategory(

-             self.site, self.release, nightly=True, modular=self.modular

+             self.site, self.release, nightly=True, dist=self.dist

          )

  

      @property

file modified
+11 -3
@@ -192,9 +192,9 @@ 

      date = parsed["date"]

      typ = parsed["compose_type"]

      respin = parsed["respin"]

-     if dist not in ("Fedora", "Fedora-Modular"):

-         # we only have validation events for Fedora and Modular

-         # composes ATM - not e.g. FedoraRespin or Fedora-Atomic ones

+     if dist not in ("Fedora", "Fedora-Modular", "Fedora-IoT"):

+         # we only have validation events for these composes ATM -

+         # not e.g. FedoraRespin or Fedora-Atomic ones

          raise ValueError(f"No validation events for {dist} composes!")

      if vertype != "ga":

          # this ensures we don't create events for updates/u-t composes
@@ -229,4 +229,12 @@ 

      return (dist, release, milestone, compose)

  

  

+ def validate_dist(dist):

+     """Just a quick check that dist names match the expected form."""

+     distpatt = re.compile(r"^Fedora(-\w+)?$")

+     if distpatt.match(dist):

+         return dist

+     raise ValueError("%s is not a valid dist!" % dist)

+ 

+ 

  # vim: set textwidth=100 ts=8 et sw=4:

file modified
+47 -32
@@ -103,17 +103,18 @@ 

          _get_tcms when it finds a Test Results page.

          """

          nightly_patt = re.compile(

-             r"Test Results:Fedora (Modular )?(\d{1,3}) "

+             r"Test Results:Fedora(-\w+)? (\d{1,3}) "

              r"(Rawhide|Nightly|Branched) "

              r"(\d{8,8}(\.n\.\d+)?|\d{4,4} \d{2,2}) "

              r"(.+)$"

          )

+         # IoT pages are slightly weird, as IoT composes are production

+         # but we treat them as nightlies

+         iot_nightly_patt = re.compile(r"Test Results:Fedora-IoT (\d{1,3}) RC (\d{8,8}\.\d+) (.+)$")

          accept_patt = re.compile(

-             r"Test Results:Fedora (\d{1,3}) " r"([^ ]+?) (Rawhide |)Acceptance Test " r"(\d{1,2})$"

-         )

-         ms_patt = re.compile(

-             r"Test Results:Fedora (Modular )?(\d{1,3}) " r"([^ ]+?) ([^ ]+?) (.+)$"

+             r"Test Results:Fedora (\d{1,3}) ([^ ]+?) (Rawhide |)Acceptance Test " r"(\d{1,2})$"

          )

+         ms_patt = re.compile(r"Test Results:Fedora(-\w+)? (\d{1,3}) ([^ ]+?) ([^ ]+?) (.+)$")

  

          # Modern standard nightly compose event pages, and F21-era

          # monthly Rawhide/Branched test pages
@@ -124,9 +125,9 @@ 

                  # summary pages, and instantiating one from here is kinda

                  # gross, so just fall through

                  raise NoPageWarning(name)

-             modular = False

+             dist = "Fedora"

              if match.group(1):

-                 modular = True

+                 dist += match.group(1)

              page = wikitcms.page.NightlyPage(

                  self.site,

                  release=match.group(2),
@@ -134,7 +135,25 @@ 

                  milestone=match.group(3),

                  compose=match.group(4),

                  info=info,

-                 modular=modular,

+                 dist=dist,

+             )

+             return _check_page(name, page)

+ 

+         match = iot_nightly_patt.match(name)

+         if match:

+             if match.group(3) == "Summary":

+                 # we don't really ever need to do anything to existing

+                 # summary pages, and instantiating one from here is kinda

+                 # gross, so just fall through

+                 raise NoPageWarning(name)

+             page = wikitcms.page.NightlyPage(

+                 self.site,

+                 release=match.group(1),

+                 testtype=match.group(3),

+                 milestone="RC",

+                 compose=match.group(2),

+                 info=info,

+                 dist="Fedora-IoT",

              )

              return _check_page(name, page)

  
@@ -148,9 +167,9 @@ 

          if match:

              if match.group(5) == "Summary":

                  raise NoPageWarning(name)

-             modular = False

+             dist = "Fedora"

              if match.group(1):

-                 modular = True

+                 dist += match.group(1)

              page = wikitcms.page.ComposePage(

                  self.site,

                  release=match.group(2),
@@ -158,7 +177,7 @@ 

                  milestone=match.group(3),

                  compose=match.group(4),

                  info=info,

-                 modular=modular,

+                 dist=dist,

              )

              return _check_page(name, page)

  
@@ -169,28 +188,28 @@ 

          """The main match logic for Category pages. Call by _get_tcms

          when it finds a Category page.

          """

-         cat_patt = re.compile(r"Category:Fedora (Modular )?(\d{1,3}) " r"(.*?) *?Test Results$")

+         cat_patt = re.compile(r"Category:Fedora(-\w+)? (\d{1,3}) " r"(.*?) *?Test Results$")

          tdcat_patt = re.compile(r"Category:Fedora (\d{1,3}) Test Days$")

  

          # test result categories

          match = cat_patt.match(name)

          if match:

-             modular = False

+             dist = "Fedora"

              if match.group(1):

-                 modular = True

+                 dist += match.group(1)

              if not match.group(3):

-                 page = ValidationCategory(self.site, match.group(2), info=info, modular=modular)

+                 page = ValidationCategory(self.site, match.group(2), info=info, dist=dist)

                  return _check_page(name, page)

  

              if match.group(3) == "Nightly":

                  page = ValidationCategory(

-                     self.site, match.group(2), nightly=True, info=info, modular=modular

+                     self.site, match.group(2), nightly=True, info=info, dist=dist

                  )

                  return _check_page(name, page)

  

              # otherwise...

              page = ValidationCategory(

-                 self.site, match.group(2), match.group(3), info=info, modular=modular

+                 self.site, match.group(2), match.group(3), info=info, dist=dist

              )

              return _check_page(name, page)

  
@@ -296,40 +315,36 @@ 

  

      # no, pylint, this is just the right number of arguments

      # pylint: disable=too-many-arguments

-     def __init__(self, site, release, milestone=None, nightly=False, info=None, modular=False):

-         _dist = "Fedora"

-         modtext = ""

-         if modular:

-             _dist = "Fedora Modular"

-             modtext = "|modular=true"

+     def __init__(self, site, release, milestone=None, nightly=False, info=None, dist="Fedora"):

+         shortdist = dist[7:]

          if nightly is True:

-             wikiname = f"Category:{_dist} {release} Nightly Test Results"

+             wikiname = f"Category:{dist} {release} Nightly Test Results"

              self.seedtext = (

                  "{{Validation results milestone category"

-                 f"|release={release}|nightly=true{modtext}}}}}"

+                 f"|release={release}|nightly=true|dist={shortdist}}}}}"

              )

  

              self.summary = (

                  "Relval bot-created validation result category "

-                 f"page for {_dist} {release} nightly results"

+                 f"page for {dist} {release} nightly results"

              )

          elif milestone:

-             wikiname = f"Category:{_dist} {release} {milestone} Test Results"

+             wikiname = f"Category:{dist} {release} {milestone} Test Results"

              self.seedtext = (

                  f"{{{{Validation results milestone category|release={release}"

-                 f"|milestone={milestone}{modtext}}}}}"

+                 f"|milestone={milestone}|dist={shortdist}}}}}"

              )

              self.summary = (

-                 f"Relval bot-created validation result category page for {_dist} "

+                 f"Relval bot-created validation result category page for {dist} "

                  f"{release} {milestone}"

              )

          else:

-             wikiname = f"Category:{_dist} {release} Test Results"

+             wikiname = f"Category:{dist} {release} Test Results"

              self.seedtext = (

-                 "{{Validation results milestone category" f"|release={release}{modtext}}}}}"

+                 "{{Validation results milestone category" f"|release={release}|dist={shortdist}}}}}"

              )

              self.summary = (

-                 "Relval bot-created validation result category page for " f"{_dist} {release}"

+                 "Relval bot-created validation result category page for " f"{dist} {release}"

              )

  

          super(ValidationCategory, self).__init__(site, wikiname, info=info)

file modified
+40 -48
@@ -151,15 +151,17 @@ 

  class ValidationPage(Page):

      """A parent class for different types of release validation event

      pages, containing common properties and methods. Required

-     attributes: version, shortver, seedtext. If modular is True, the

-     page will be for a Fedora-Modular compose, with 'Modular' in the

-     page name, using the appropriate templates and template values,

-     etc.

+     attributes: version, shortver, seedtext. "dist" lets us create

+     multiple event streams for different compose streams: it defaults

+     to "Fedora", which gives us page names for the main stream of

+     composes and Fedora releases, but can be set to e.g. "Fedora IoT"

+     for a validation page for an IoT compose. The provided string is

+     simply included in page names, category names and so on.

      """

  

      # I like this number, pylint

      # pylint: disable=too-many-instance-attributes, too-many-arguments

-     def __init__(self, site, release, testtype, milestone="", compose="", info=None, modular=False):

+     def __init__(self, site, release, testtype, milestone="", compose="", info=None, dist="Fedora"):

          self.release = release

          self.milestone = str(milestone)

          try:
@@ -168,19 +170,19 @@ 

              self.compose = str(compose)

          self.version = f"{self.release} {self.milestone} {self.compose}"

          self.testtype = testtype

-         self.modular = modular

+         self.dist = dist

+         # dist without "Fedora-", used in various wiki templates;

+         # for the main "Fedora" composes, this will be ""

+         self.shortdist = dist[7:]

  

          # Wiki name the page should have, according to the naming

          # convention.

-         _dist = "Fedora"

-         if modular:

-             _dist = "Fedora Modular"

-         wikiname = f"Test Results:{_dist} {self.version} {self.testtype}"

+         wikiname = f"Test Results:{dist} {self.version} {self.testtype}"

          super(ValidationPage, self).__init__(site, wikiname, info)

  

          # Edit summary to be used for clean page creation.

          self.summary = (

-             f"Relval bot-created {testtype} validation results page for {_dist} " f"{self.version}"

+             f"Relval bot-created {testtype} validation results page for {dist} " f"{self.version}"

          )

          self.results_separators = (

              "Test Matri",
@@ -292,10 +294,10 @@ 

          """Make the Current convenience redirect page on the wiki for

          the given test type point to this page.

          """

-         if self.modular:

-             curr = self.site.pages[f"Test Results:Current Modular {self.testtype} Test"]

-         else:

-             curr = self.site.pages[f"Test Results:Current {self.testtype} Test"]

+         short = self.shortdist

+         if short:

+             short = f" {short}"

+         curr = self.site.pages[f"Test Results:Current{short} {self.testtype} Test"]

          curr.save(f"#REDIRECT [[{self.name}]]", "relval: update to current event", createonly=None)

  

      def add_results(self, resultsdict, allowdupe=False):
@@ -417,7 +419,7 @@ 

  

      # I like this number, pylint

      # pylint: disable=too-many-arguments

-     def __init__(self, site, release, testtype, milestone, compose, info=None, modular=False):

+     def __init__(self, site, release, testtype, milestone, compose, info=None, dist="Fedora"):

          super(ComposePage, self).__init__(

              site,

              release=release,
@@ -425,14 +427,14 @@ 

              compose=compose,

              testtype=testtype,

              info=info,

-             modular=modular,

+             dist=dist,

          )

          self.shortver = f"{self.milestone} {self.compose}"

  

          # String that will generate a clean copy of the page using the

          # test page generation template system.

-         if self.modular:

-             tmpl = "Modular validation results"

+         if self.shortdist:

+             tmpl = f"{self.shortdist} validation results"

          else:

              tmpl = "Validation results"

          self.seedtext = (
@@ -448,7 +450,7 @@ 

  

      # I like this number, pylint

      # pylint: disable=too-many-arguments

-     def __init__(self, site, release, testtype, milestone, compose, info=None, modular=False):

+     def __init__(self, site, release, testtype, milestone, compose, info=None, dist="Fedora"):

          super(NightlyPage, self).__init__(

              site,

              release=release,
@@ -456,7 +458,7 @@ 

              compose=compose,

              testtype=testtype,

              info=info,

-             modular=modular,

+             dist=dist,

          )

          self.shortver = self.compose

          # overridden for nightlies to avoid expensive roundtrips
@@ -467,8 +469,8 @@ 

  

          # String that will generate a clean copy of the page using the

          # test page generation template system.

-         if self.modular:

-             tmpl = "Modular validation results"

+         if self.shortdist:

+             tmpl = f"{self.shortdist} validation results"

          else:

              tmpl = "Validation results"

          self.seedtext = (
@@ -483,18 +485,14 @@ 

      always considered to be a part of an Event.

      """

  

-     def __init__(self, site, event, info=None, modular=False):

-         self.modular = modular

-         wikiname = f"Test Results:Fedora {event.version} Summary"

-         if modular:

-             wikiname = f"Test Results:Fedora Modular {event.version} Summary"

+     def __init__(self, site, event, info=None, dist="Fedora"):

+         self.dist = dist

+         wikiname = f"Test Results:{dist} {event.version} Summary"

+         self.shortdist = self.dist[7:]

          super(SummaryPage, self).__init__(site, wikiname, info)

-         _dist = "Fedora"

-         if modular:

-             _dist = "Fedora Modular"

-         self.summary = f"Relval bot-created validation results summary for {_dist} {event.version}"

+         self.summary = f"Relval bot-created validation results summary for {dist} {event.version}"

          self.seedtext = (

-             f"{_dist} {event.version} [[QA:Release validation test plan|release "

+             f"{dist} {event.version} [[QA:Release validation test plan|release "

              "validation]] summary. This page shows the results from all the "

              "individual result pages for this compose together. You can file "

              "results directly from this page and they will be saved into the "
@@ -503,7 +501,7 @@ 

              "can find download links below.\n\n"

          )

          self.seedtext += "__TOC__\n\n"

-         self.seedtext += "== Downloads ==\n{{" + _dist + " " + event.version + " Download}}"

+         self.seedtext += "== Downloads ==\n{{" + dist + " " + event.version + " Download}}"

          for testpage in event.valid_pages:

              self.seedtext += "\n\n== [[" + testpage.name + "|"

              self.seedtext += testpage.testtype + "]] ==\n{{"
@@ -513,8 +511,8 @@ 

          """Make the Current convenience redirect page on the wiki for the

          event point to this page.

          """

-         if self.modular:

-             curr = self.site.pages["Test Results:Current Modular Summary"]

+         if self.shortdist:

+             curr = self.site.pages[f"Test Results:Current {self.shortdist} Summary"]

          else:

              curr = self.site.pages["Test Results:Current Summary"]

          curr.save(f"#REDIRECT [[{self.name}]]", "relval: update to current event", createonly=None)
@@ -525,12 +523,9 @@ 

      As with SummaryPage, is always associated with a specific event.

      """

  

-     def __init__(self, site, event, info=None, modular=False):

-         _dist = "Fedora"

-         if modular:

-             _dist = "Fedora Modular"

-         wikiname = f"Template:{_dist} {event.version} Download"

-         self.summary = f"Relval bot-created download page for {_dist} {event.version}"

+     def __init__(self, site, event, info=None, dist="Fedora"):

+         wikiname = f"Template:{dist} {event.version} Download"

+         self.summary = f"Relval bot-created download page for {dist} {event.version}"

          super(DownloadPage, self).__init__(site, wikiname, info)

          self.event = event

  
@@ -634,12 +629,9 @@ 

      the correct AMIs.

      """

  

-     def __init__(self, site, event, info=None, modular=False):

-         _dist = "Fedora"

-         if modular:

-             _dist = "Fedora Modular"

-         wikiname = f"Template:{_dist} {event.version} AMI"

-         self.summary = f"Relval bot-created AMI page for {_dist} {event.version}"

+     def __init__(self, site, event, info=None, dist="Fedora"):

+         wikiname = f"Template:{dist} {event.version} AMI"

+         self.summary = f"Relval bot-created AMI page for {dist} {event.version}"

          super(AMIPage, self).__init__(site, wikiname, info)

          self.event = event

  

file modified
+4 -7
@@ -28,13 +28,10 @@ 

      Release is a string containing a Fedora release version (e.g. 21).

      """

  

-     def __init__(self, release, wiki, modular=False):

+     def __init__(self, release, wiki, dist="Fedora"):

          self.release = release

-         self.modular = modular

-         dist = "Fedora"

-         if modular:

-             dist = "Fedora Modular"

-         self.category_name = f"Category:{dist} {self.release} Test Results"

+         self.dist = dist

+         self.category_name = f"Category:{self.dist} {self.release} Test Results"

          self.site = wiki

  

      @property
@@ -51,7 +48,7 @@ 

          using page name prefixes.

          """

          cat = wikitcms.listing.ValidationCategory(

-             self.site, self.release, milestone, modular=self.modular

+             self.site, self.release, milestone, dist=self.dist

          )

          pgs = self.site.walk_category(cat)

          return (p for p in pgs if isinstance(p, wikitcms.page.ValidationPage))

file modified
+105 -74
@@ -94,7 +94,7 @@ 

          "ResTuple",

          "testtype release milestone compose "

          "testcase section testname env status user bugs "

-         "comment bot cid modular",

+         "comment bot cid dist",

      )

  ):

      """namedtuple (with default values) used for report_validation_
@@ -118,7 +118,7 @@ 

          comment="",

          bot=False,

          cid="",

-         modular=False,

+         dist="Fedora",

      ):

          return super(ResTuple, cls).__new__(

              cls,
@@ -136,7 +136,7 @@ 

              comment,

              bot,

              cid,

-             modular,

+             dist,

          )

  

  
@@ -162,25 +162,13 @@ 

          keys full, release, date, milestone, and compose. The page is

          normally written by ValidationEvent.update_current().

          """

-         currdict = dict()

-         valpatt = re.compile(r"^\| *?(\w+?) *?= *([\w .]*?) *$", re.M)

-         page = self.pages["Template:CurrentFedoraCompose"]

-         for match in valpatt.finditer(page.text()):

-             currdict[match.group(1)] = match.group(2)

-         return currdict

+         return self.get_current_compose(dist="Fedora")

  

      @property

      def current_event(self):

          """The current event, as a ValidationEvent instance. Will be a

          ComposeEvent or a NightlyEvent."""

-         curr = self.current_compose

-         # Use of 'max' plus get_validation_event handles getting us

-         # the right kind of event.

-         return self.get_validation_event(

-             release=curr["release"],

-             milestone=curr["milestone"],

-             compose=max(curr["date"], curr["compose"]),

-         )

+         return self.get_current_event(dist="Fedora")

  

      @property

      def current_modular_compose(self):
@@ -191,26 +179,13 @@ 

          compose. The page is normally written by

          ValidationEvent.update_current().

          """

-         currdict = dict()

-         valpatt = re.compile(r"^\| *?(\w+?) *?= *([\w .]*?) *$", re.M)

-         page = self.pages["Template:CurrentFedoraModularCompose"]

-         for match in valpatt.finditer(page.text()):

-             currdict[match.group(1)] = match.group(2)

-         return currdict

+         return self.get_current_compose(dist="Fedora-Modular")

  

      @property

      def current_modular_event(self):

          """The current modular event, as a ValidationEvent instance.

          Will be a ComposeEvent or a NightlyEvent."""

-         curr = self.current_modular_compose

-         # Use of 'max' plus get_validation_event handles getting us

-         # the right kind of event.

-         return self.get_validation_event(

-             release=curr["release"],

-             milestone=curr["milestone"],

-             compose=max(curr["date"], curr["compose"]),

-             modular=True,

-         )

+         return self.get_current_event(dist="Fedora-Modular")

  

      @property

      def matrices(self):
@@ -222,17 +197,14 @@ 

          the member pages, whereas the other does not. The sort order is

          used in creating the overview summary page.

          """

-         category = self.pages["Category:QA test matrix templates"]

-         return category.members(generator=False)

+         return self.get_matrices(dist="Fedora")

  

      @property

      def testtypes(self):

          """Test types, derived from the matrix page names according to

          a naming convention. A list of strings.

          """

-         return [

-             m["title"].replace("Template:", "").replace(" test matrix", "") for m in self.matrices

-         ]

+         return self.get_testtypes(dist="Fedora")

  

      @property

      def modular_matrices(self):
@@ -244,17 +216,83 @@ 

          the member pages, whereas the other does not. The sort order is

          used in creating the overview summary page.

          """

-         category = self.pages["Category:QA modular test matrix templates"]

-         return category.members(generator=False)

+         return self.get_matrices(dist="Fedora-Modular")

  

      @property

      def modular_testtypes(self):

          """Test types, derived from the matrix page names according to

          a naming convention. A list of strings.

          """

+         return self.get_testtypes(dist="Fedora-Modular")

+ 

+     def get_current_compose(self, dist="Fedora"):

+         """A dict of the key / value pairs from the Current{dist}

+         Compose page which is the canonical definition of the 'current'

+         primary arch validation testing compose. You can usually expect

+         keys full, release, date, milestone, and compose. The page is

+         normally written by ValidationEvent.update_current().

+         """

+         wikitcms.helpers.validate_dist(dist)

+         currdict = dict()

+         valpatt = re.compile(r"^\| *?(\w+?) *?= *([\w .]*?) *$", re.M)

+         page = self.pages[f"Template:Current{dist}Compose"]

+         for match in valpatt.finditer(page.text()):

+             currdict[match.group(1)] = match.group(2)

+         return currdict

+ 

+     def get_current_event(self, dist="Fedora"):

+         """Returns the current event for the given dist as a

+         ValidationEvent instance. May return None if there is no

+         current event for the given dist (e.g. none has yet been

+         created for that dist).

+         """

+         wikitcms.helpers.validate_dist(dist)

+         curr = self.get_current_compose(dist=dist)

+         if not curr:

+             return None

+         # Use of 'max' plus get_validation_event handles getting us

+         # the right kind of event.

+         return self.get_validation_event(

+             release=curr["release"],

+             milestone=curr["milestone"],

+             compose=max(curr["date"], curr["compose"]),

+             dist=dist,

+         )

+ 

+     def get_matrices(self, dist="Fedora"):

+         """A list of dicts representing pages in the test matrix

+         template category for the specified dist. These are the

+         canonical definition of 'existing' test types. Done this way -

+         rather than using the category object's ability to act as an

+         iterator over its member page objects - because this method

+         respects the sort order of the member pages, whereas the other

+         does not. The sort order is used in creating the overview

+         summary page.

+         """

+         wikitcms.helpers.validate_dist(dist)

+         # dist names have a specific form, we expect a category derived

+         # from the name to exist. If dist is "Fedora", we know the name

+         if dist == "Fedora":

+             catname = "Category:QA test matrix templates"

+         else:

+             # drop "Fedora-"

+             dstring = dist[7:]

+             catname = f"Category:QA {dstring} test matrix templates"

+         category = self.pages[catname]

+         return category.members(generator=False)

+ 

+     def get_testtypes(self, dist="Fedora"):

+         """Returns test types (as a list of strings) for a given dist,

+         derived from the matrix page names for that dist.

+         """

+         wikitcms.helpers.validate_dist(dist)

+         # drop "Fedora-"

+         dstring = dist[7:]

+         if dstring:

+             dstring = f"{dstring} "

          return [

-             m["title"].replace("Template:", "").replace(" modular test matrix", "")

-             for m in self.modular_matrices

+             m["title"].replace("Template:", "").replace(f" {dstring}test matrix", "")

+             for m in self.get_matrices(dist=dist)

          ]

  

      def login(self, *args, **kwargs):  # pylint: disable=signature-differs
@@ -351,7 +389,7 @@ 

          )

          return gen

  

-     def get_validation_event(self, release="", milestone="", compose="", cid="", modular=False):

+     def get_validation_event(self, release="", milestone="", compose="", cid="", dist="Fedora"):

          # we could factor this out but I think it's fine

          # pylint: disable=too-many-arguments, too-many-branches

          """Get an appropriate ValidationEvent object for the values
@@ -362,10 +400,10 @@ 

          if what you give it is impossible to interpret or if it

          tries and comes up with an inconsistent-seeming result.

  

-         If modular is True, it will look for a Fedora Modular event

-         with the relevant version attributes. If you pass a compose ID

-         as cid, any value you pass for modular will be ignored; we'll

-         instead parse the modular value out of the compose ID.

+         dist specifies a 'dist' (compose shortname) other than the

+         default "Fedora" to find an event for. If you pass a compose

+         ID as cid, any value you pass for dist will be ignored; we'll

+         instead parse the dist value out of the compose ID.

  

          If you pass a numeric release, a milestone, and a valid

          compose (TC/RC or date), it will give you the appropriate
@@ -399,15 +437,11 @@ 

          """

          if cid:

              (dist, release, milestone, compose) = wikitcms.helpers.cid_to_event(cid)

-             modular = bool(dist == "Fedora-Modular")

          if not compose or not release:

              # Can't really make an educated guess without a compose

              # and release, so just get the current event and return it

              # if it matches any other values passed.

-             if modular:

-                 event = self.current_modular_event

-             else:

-                 event = self.current_event

+             event = self.get_current_event(dist=dist)

              if release and event.release != release:

                  raise ValueError(

                      f"get_validation_event(): Guessed event release {event.release} does "
@@ -424,7 +458,7 @@ 

          if _check_compose(compose) == "date":

              if milestone:

                  return wikitcms.event.NightlyEvent(

-                     self, release=release, milestone=milestone, compose=compose, modular=modular

+                     self, release=release, milestone=milestone, compose=compose, dist=dist

                  )

  

              # we have a date and no milestone. Try both and return
@@ -433,11 +467,11 @@ 

              # creates the wrong event, we can clean up by blanking

              # the pages, rather than by getting an admin to

              # actually *delete* them.

-             rawev = wikitcms.event.NightlyEvent(self, release, "Rawhide", compose, modular=modular)

+             rawev = wikitcms.event.NightlyEvent(self, release, "Rawhide", compose, dist=dist)

              pgs = rawev.result_pages

              if pgs and pgs[0].text():

                  return rawev

-             brev = wikitcms.event.NightlyEvent(self, release, "Branched", compose, modular=modular)

+             brev = wikitcms.event.NightlyEvent(self, release, "Branched", compose, dist=dist)

              pgs = brev.result_pages

              if pgs and pgs[0].text():

                  return brev
@@ -459,14 +493,14 @@ 

              if int(release) > 23 and milestone.lower() == "final":

                  milestone = "RC"

              return wikitcms.event.ComposeEvent(

-                 self, release, milestone, compose, modular=modular, cid=cid

+                 self, release, milestone, compose, dist=dist, cid=cid

              )

  

          # We should never get here, but just in case.

          raise ValueError("get_validation_event(): Something very strange happened.")

  

      def get_validation_page(

-         self, testtype, release="", milestone="", compose="", cid="", modular=False

+         self, testtype, release="", milestone="", compose="", cid="", dist="Fedora"

      ):

          # we could factor this out but I think it's fine

          # pylint: disable=too-many-arguments
@@ -478,10 +512,10 @@ 

          raise errors if what you give it is impossible to interpret or

          if it tries and comes up with an inconsistent-seeming result.

  

-         If modular is True, it will look for a Fedora Modular page

-         with the relevant version attributes. If you pass a compose ID

-         as cid, any value you pass for modular will be ignored; we'll

-         instead parse the modular value out of the compose ID.

+         dist specifies a 'dist' (compose shortname) other than the

+         default "Fedora" to find a page for. If you pass a compose ID

+         as cid, any value you pass for dist will be ignored; we'll

+         instead parse the dist value out of the compose ID.

  

          If you pass a numeric release, a milestone, and a valid

          compose (TC/RC or date), it will give you the appropriate
@@ -516,18 +550,17 @@ 

          """

          if cid:

              (dist, release, milestone, compose) = wikitcms.helpers.cid_to_event(cid)

-             modular = bool(dist == "Fedora-Modular")

          if not compose or not release:

              # Can't really make an educated guess without a compose

              # and release, so just get the current event and return it

              # if it matches any other values passed.

-             curr = self.current_compose

+             curr = self.get_current_compose(dist=dist)

              page = self.get_validation_page(

                  testtype,

                  release=curr["release"],

                  milestone=curr["milestone"],

                  compose=max(curr["compose"], curr["date"]),

-                 modular=modular,

+                 dist=dist,

              )

              if release and page.release != release:

                  raise ValueError(
@@ -544,17 +577,17 @@ 

          if _check_compose(compose) == "date":

              if milestone:

                  return wikitcms.page.NightlyPage(

-                     self, release, testtype, milestone, compose, modular=modular

+                     self, release, testtype, milestone, compose, dist=dist

                  )

  

              # date, but no milestone

              rawpg = wikitcms.page.NightlyPage(

-                 self, release, testtype, "Rawhide", compose, modular=modular

+                 self, release, testtype, "Rawhide", compose, dist=dist

              )

              if rawpg.exists:

                  return rawpg

              brpg = wikitcms.page.NightlyPage(

-                 self, release, testtype, "Branched", compose, modular=modular

+                 self, release, testtype, "Branched", compose, dist=dist

              )

              if brpg.exists:

                  return brpg
@@ -574,9 +607,7 @@ 

              # be nice and convert it

              if int(release) > 23 and milestone.lower() == "final":

                  milestone = "RC"

-             return wikitcms.page.ComposePage(

-                 self, release, testtype, milestone, compose, modular=modular

-             )

+             return wikitcms.page.ComposePage(self, release, testtype, milestone, compose, dist=dist)

  

          # We should never get here, but just in case.

          raise ValueError("get_validation_page(): Something very strange happened.")
@@ -588,7 +619,7 @@ 

          what these can be. They can be any kind of sequence or

          iterable containing up to 15 values in the following order:

          (testtype, release, milestone, compose, testcase, section,

-         testname, env, status, user, bugs, comment, bot, cid, modular).

+         testname, env, status, user, bugs, comment, bot, cid, dist).

          They can also be any mapping type (e.g. a dict) with enough of

          the 15 keys set (see below for requirements).

  
@@ -603,7 +634,7 @@ 

          something empty or falsey. However, to be successfully

          reported, each item must meet these conditions:

  

-         * 'testtype', 'release', 'milestone', 'compose', 'modular' and

+         * 'testtype', 'release', 'milestone', 'compose', 'dist' and

          'cid' must identify a single validation page

          using get_validation_page() (at least 'testtype' must always

          be set).
@@ -643,7 +674,7 @@ 

          constructs a result dict to pass to the ValidationPage

          add_results() method.

          """

-         pagedict = dict()  # KEY: (testtype, release, milestone, compose, cid, modular)

+         pagedict = dict()  # KEY: (testtype, release, milestone, compose, cid, dist)

          insufficients = list()

          dupes = list()

  
@@ -669,7 +700,7 @@ 

                  restup.milestone,

                  restup.compose,

                  restup.cid,

-                 restup.modular,

+                 restup.dist,

              )

              # We construct a dict to sort the results by page. The

              # value for each page is a 2-tuple containing the actual
@@ -761,7 +792,7 @@ 

                              result.comment,

                              result.bot,

                              "",

-                             page.modular,

+                             page.dist,

                          )

                      )

  

file modified
+75 -25
@@ -155,21 +155,39 @@ 

          candidate compose which is properly synced to stage.

          """

          event = wikitcms.event.ComposeEvent(

-             self.site, "27", "Beta", "1.5", modular=True, cid="Fedora-Modular-27-20171108.2"

+             self.site,

+             "27",

+             "Beta",

+             "1.5",

+             dist="Fedora-Modular",

+             cid="Fedora-Modular-27-20171108.2",

          )

          assert isinstance(event.ff_release, fedfind.release.ModularCompose)

          assert isinstance(event.ff_release_images, fedfind.release.ModularCompose)

-         event = wikitcms.event.ComposeEvent(self.site, "27", "Beta", "1.5", modular=True)

+         event = wikitcms.event.ComposeEvent(self.site, "27", "Beta", "1.5", dist="Fedora-Modular")

          assert isinstance(event.ff_release, fedfind.release.ModularCompose)

          assert isinstance(event.ff_release_images, fedfind.release.ModularCompose)

  

+     @mock.patch("fedfind.release.IoTNightly.exists", True)

+     @mock.patch("fedfind.release.IoTNightly.all_images", ["foo"])

+     def test_candidate_ff_release_iot(self):

+         """Straightforward ff_release test case for an IoT 'nightly'

+         compose.

+         """

+         event = wikitcms.event.NightlyEvent(self.site, "33", "RC", "20200513.0", dist="Fedora-IoT")

+         assert isinstance(event.ff_release, fedfind.release.IoTNightly)

+         assert isinstance(event.ff_release_images, fedfind.release.IoTNightly)

+ 

  

  @pytest.mark.usefixtures("fakemwp")

  @mock.patch("wikitcms.page.Page.save", autospec=True)

  @mock.patch("wikitcms.page.SummaryPage.update_current", autospec=True)

  @mock.patch("wikitcms.page.ValidationPage.update_current", autospec=True)

  @mock.patch("wikitcms.event.ValidationEvent.update_current", autospec=True)

- @mock.patch("test_event.wk.Wiki.testtypes", ["Installation", "Base", "Server", "Cloud", "Desktop"])

+ @mock.patch(

+     "test_event.wk.Wiki.get_testtypes",

+     return_value=["Installation", "Base", "Server", "Cloud", "Desktop"],

+ )

  @mock.patch("fedfind.release.BranchedNightly.cid", "Fedora-27-20171104.n.0")

  @mock.patch(

      "fedfind.helpers.download_json",
@@ -219,7 +237,7 @@ 

              }

          ],

      )

-     def test_event_create(self, fakejson, fakeevup, fakepageup, fakesumup, fakepagesave):

+     def test_event_create(self, fakejson, faketypes, fakeevup, fakepageup, fakesumup, fakepagesave):

          """Test normal event creation."""

          event = wikitcms.event.NightlyEvent(self.site, "27", "Branched", "20171104.n.0")

          event.create()
@@ -238,7 +256,9 @@ 

  

      @mock.patch("fedfind.release.BranchedNightly.exists", False)

      @mock.patch("fedfind.release.BranchedNightly.all_images", [])

-     def test_event_create_no_images(self, fakejson, fakeevup, fakepageup, fakesumup, fakepagesave):

+     def test_event_create_no_images(

+         self, fakejson, faketypes, fakeevup, fakepageup, fakesumup, fakepagesave

+     ):

          """Test event creation where no images are available. This

          should succeed, but not create a download page.

          """
@@ -254,7 +274,9 @@ 

  

      @mock.patch("fedfind.release.BranchedNightly.exists", False)

      @mock.patch("fedfind.release.BranchedNightly.all_images", [])

-     def test_event_create_check(self, fakejson, fakeevup, fakepageup, fakesumup, fakepagesave):

+     def test_event_create_check(

+         self, fakejson, faketypes, fakeevup, fakepageup, fakesumup, fakepagesave

+     ):

          """Test event creation with check=True."""

          event = wikitcms.event.NightlyEvent(self.site, "27", "Branched", "20171104.n.0")

          # first, let's say the pages had no content, so creation
@@ -274,7 +296,9 @@ 

  

      @mock.patch("fedfind.release.BranchedNightly.exists", False)

      @mock.patch("fedfind.release.BranchedNightly.all_images", [])

-     def test_event_create_testtypes(self, fakejson, fakeevup, fakepageup, fakesumup, fakepagesave):

+     def test_event_create_testtypes(

+         self, fakejson, faketypes, fakeevup, fakepageup, fakesumup, fakepagesave

+     ):

          """Test event creation for a specified set of test types."""

          event = wikitcms.event.NightlyEvent(self.site, "27", "Branched", "20171104.n.0")

          event.create(testtypes=["Installation", "Server"])
@@ -291,7 +315,9 @@ 

  

      @mock.patch("fedfind.release.BranchedNightly.exists", False)

      @mock.patch("fedfind.release.BranchedNightly.all_images", [])

-     def test_event_create_force(self, fakejson, fakeevup, fakepageup, fakesumup, fakepagesave):

+     def test_event_create_force(

+         self, fakejson, faketypes, fakeevup, fakepageup, fakesumup, fakepagesave

+     ):

          """Test event creation with force=True."""

          # we only need to test that we properly set createonly=None

          # here, we don't need to confirm or mock its effects
@@ -302,7 +328,9 @@ 

  

      @mock.patch("fedfind.release.BranchedNightly.exists", False)

      @mock.patch("fedfind.release.BranchedNightly.all_images", [])

-     def test_event_create_existing(self, fakejson, fakeevup, fakepageup, fakesumup, fakepagesave):

+     def test_event_create_existing(

+         self, fakejson, faketypes, fakeevup, fakepageup, fakesumup, fakepagesave

+     ):

          """Test the handling when a page we try to create during

          event creation already exists. The expected behaviour is that

          we just log the issue and continue.
@@ -318,7 +346,9 @@ 

  

      @mock.patch("fedfind.release.BranchedNightly.exists", False)

      @mock.patch("fedfind.release.BranchedNightly.all_images", [])

-     def test_event_create_nocurrent(self, fakejson, fakeevup, fakepageup, fakesumup, fakepagesave):

+     def test_event_create_nocurrent(

+         self, fakejson, faketypes, fakeevup, fakepageup, fakesumup, fakepagesave

+     ):

          """Test that setting current=False correctly skips current

          redirect updates.

          """
@@ -359,19 +389,19 @@ 

          assert isinstance(rp2, wikitcms.page.NightlyPage)

          assert rp1.testtype == "Base"

          assert rp2.testtype == "Cloud"

-         assert rp1.modular is rp2.modular is False

+         assert rp1.dist == rp2.dist == "Fedora"

          # modular

          event = wikitcms.event.NightlyEvent(

-             self.site, "27", "Branched", "20171123.n.1", modular=True

+             self.site, "27", "Branched", "20171123.n.1", dist="Fedora-Modular"

          )

          evp1 = mwclient.page.Page(

-             self.site, "Test Results:Fedora Modular 27 Branched 20171123.n.1 Base"

+             self.site, "Test Results:Fedora-Modular 27 Branched 20171123.n.1 Base"

          )

          evp2 = mwclient.page.Page(

-             self.site, "Test Results:Fedora Modular 27 Branched 20171123.n.1 Server"

+             self.site, "Test Results:Fedora-Modular 27 Branched 20171123.n.1 Server"

          )

          evs = mwclient.page.Page(

-             self.site, "Test Results:Fedora Modular 27 Branched 20171123.n.1 Summary"

+             self.site, "Test Results:Fedora-Modular 27 Branched 20171123.n.1 Summary"

          )

          fakenext.side_effect = [evp1, evp2, evs, StopIteration]

          rps = event.result_pages
@@ -381,7 +411,7 @@ 

          assert isinstance(rp2, wikitcms.page.NightlyPage)

          assert rp1.testtype == "Base"

          assert rp2.testtype == "Server"

-         assert rp1.modular is rp2.modular is True

+         assert rp1.dist == rp2.dist == "Fedora-Modular"

  

      @mock.patch("mwclient.page.Page.save", autospec=True)

      def test_event_update_current(self, fakesave, fakemwp):
@@ -397,7 +427,7 @@ 

          assert fakesave.call_args[1]["createonly"] is None

          assert fakesave.call_args[0][0].name == "Template:CurrentFedoraCompose"

          # modular, non-nightly

-         event = wikitcms.event.ComposeEvent(self.site, "27", "Beta", "1.5", modular=True)

+         event = wikitcms.event.ComposeEvent(self.site, "27", "Beta", "1.5", dist="Fedora-Modular")

          event.update_current()

          assert fakesave.call_args[0][1] == (

              "{{tempdoc}}\n<onlyinclude>{{#switch: {{{1|full}}}\n| full = 27 Beta 1.5"
@@ -406,19 +436,35 @@ 

          )

          assert fakesave.call_args[0][2] == "relval: update to current event"

          assert fakesave.call_args[1]["createonly"] is None

-         assert fakesave.call_args[0][0].name == "Template:CurrentFedoraModularCompose"

+         assert fakesave.call_args[0][0].name == "Template:CurrentFedora-ModularCompose"

+         # IoT 'nightly'

+         event = wikitcms.event.NightlyEvent(self.site, "33", "RC", "20200513.0", dist="Fedora-IoT")

+         event.update_current()

+         assert fakesave.call_args[0][1] == (

+             "{{tempdoc}}\n<onlyinclude>{{#switch: {{{1|full}}}\n| full = 33 RC 20200513.0"

+             "\n| release = 33\n| milestone = RC\n| compose =\n| date = 20200513.0\n"

+             "}}</onlyinclude>\n[[Category: Fedora Templates]]"

+         )

+         assert fakesave.call_args[0][2] == "relval: update to current event"

+         assert fakesave.call_args[1]["createonly"] is None

+         assert fakesave.call_args[0][0].name == "Template:CurrentFedora-IoTCompose"

  

      def test_event_from_page(self, fakemwp):

          """Test for from_page classmethod."""

          pg = self.site.pages["Test Results:Fedora 27 Branched 20171104.n.0 Base"]

          ev = wikitcms.event.NightlyEvent.from_page(pg)

          assert ev.version == "27 Branched 20171104.n.0"

-         assert ev.modular is False

+         assert ev.dist == "Fedora"

          # modular

-         pg = self.site.pages["Test Results:Fedora Modular 27 Branched 20171123.n.1 Base"]

+         pg = self.site.pages["Test Results:Fedora-Modular 27 Branched 20171123.n.1 Base"]

          ev = wikitcms.event.NightlyEvent.from_page(pg)

          assert ev.version == "27 Branched 20171123.n.1"

-         assert ev.modular is True

+         assert ev.dist == "Fedora-Modular"

+         # IoT

+         pg = self.site.pages["Test Results:Fedora-IoT 33 RC 20200513.0 General"]

+         ev = wikitcms.event.NightlyEvent.from_page(pg)

+         assert ev.version == "33 RC 20200513.0"

+         assert ev.dist == "Fedora-IoT"

  

      def test_event_category_page(self, fakemwp):

          """Test for category_page property."""
@@ -429,19 +475,23 @@ 

          # this is a sufficient proxy that we got the right thing

          assert cat.checkname == "Category:Fedora 27 Beta Test Results"

          # modular compose

-         event = wikitcms.event.ComposeEvent(self.site, "27", "Beta", "1.5", modular=True)

+         event = wikitcms.event.ComposeEvent(self.site, "27", "Beta", "1.5", dist="Fedora-Modular")

          cat = event.category_page

-         assert cat.checkname == "Category:Fedora Modular 27 Beta Test Results"

+         assert cat.checkname == "Category:Fedora-Modular 27 Beta Test Results"

          # nightly

          event = wikitcms.event.NightlyEvent(self.site, "27", "Branched", "20171104.n.0")

          cat = event.category_page

          assert cat.checkname == "Category:Fedora 27 Nightly Test Results"

          # modular nightly

          event = wikitcms.event.NightlyEvent(

-             self.site, "27", "Branched", "20171123.n.1", modular=True

+             self.site, "27", "Branched", "20171123.n.1", dist="Fedora-Modular"

          )

          cat = event.category_page

-         assert cat.checkname == "Category:Fedora Modular 27 Nightly Test Results"

+         assert cat.checkname == "Category:Fedora-Modular 27 Nightly Test Results"

+         # IoT

+         event = wikitcms.event.NightlyEvent(self.site, "33", "RC", "20200513.0", dist="Fedora-IoT")

+         cat = event.category_page

+         assert cat.checkname == "Category:Fedora-IoT 33 Nightly Test Results"

  

      # yes, I looked up the correct date. don't make fun of me!

      @mock.patch("wikitcms.page.ComposePage.creation_date", "20170922")

file modified
+44 -19
@@ -101,7 +101,7 @@ 

          assert pg.testtype == "Installation"

          assert pg.milestone == "Branched"

          assert pg.compose == "20200322.n.0"

-         assert pg.modular is False

+         assert pg.dist == "Fedora"

          # yeah, the _ vs. space thing is intentional, we ought to

          # handle both, may as well check it as we go

          pg = self.site.pages["Test Results:Fedora 32 Rawhide 20191030.n.1 Base"]
@@ -109,9 +109,13 @@ 

          assert pg.testtype == "Base"

          assert pg.milestone == "Rawhide"

          # modular

-         pg = self.site.pages["Test Results:Fedora Modular 27 Branched 20171123.n.1 Server"]

+         pg = self.site.pages["Test Results:Fedora-Modular 27 Branched 20171123.n.1 Server"]

          assert isinstance(pg, wikitcms.page.NightlyPage)

-         assert pg.modular is True

+         assert pg.dist == "Fedora-Modular"

+         # IoT

+         pg = self.site.pages["Test Results:Fedora-IoT 33 RC 20200513.0 General"]

+         assert isinstance(pg, wikitcms.page.NightlyPage)

+         assert pg.dist == "Fedora-IoT"

          # summary should fall through to an mwclient Page

          pg = self.site.pages["Test_Results:Fedora_32_Branched_20200322.n.0_Summary"]

          assert not isinstance(pg, wikitcms.page.Page)
@@ -161,7 +165,7 @@ 

          assert pg.milestone == "Alpha"

          assert pg.compose == "RC1"

          assert pg.testtype == "Install"

-         assert pg.modular is False

+         assert pg.dist == "Fedora"

          pg = self.site.pages["Test Results:Fedora 22 Beta TC1 Installation"]

          assert isinstance(pg, wikitcms.page.ComposePage)

          assert pg.release == "22"
@@ -179,7 +183,7 @@ 

          assert pg.milestone == "Alpha"

          assert pg.compose == "1.1"

          assert pg.testtype == "Cloud"

-         assert pg.modular is False

+         assert pg.dist == "Fedora"

          pg = self.site.pages["Test Results:Fedora 26 Beta 1.3 Security Lab"]

          assert isinstance(pg, wikitcms.page.ComposePage)

          assert pg.release == "26"
@@ -193,13 +197,13 @@ 

          assert pg.compose == "1.9"

          assert pg.testtype == "Cloud"

          # modular

-         pg = self.site.pages["Test Results:Fedora Modular 27 Beta 1.5 Installation"]

+         pg = self.site.pages["Test Results:Fedora-Modular 27 Beta 1.5 Installation"]

          assert isinstance(pg, wikitcms.page.ComposePage)

          assert pg.release == "27"

          assert pg.milestone == "Beta"

          assert pg.compose == "1.5"

          assert pg.testtype == "Installation"

-         assert pg.modular is True

+         assert pg.dist == "Fedora-Modular"

          # again, summary should fall through to an mwclient Page

          pg = self.site.pages["Test Results:Fedora 31 RC 1.9 Summary"]

          assert not isinstance(pg, wikitcms.page.Page)
@@ -242,48 +246,69 @@ 

          # top level

          pg = self.site.pages["Category:Fedora 32 Test Results"]

          assert isinstance(pg, wikitcms.listing.ValidationCategory)

-         assert pg.seedtext == "{{Validation results milestone category|release=32}}"

+         assert pg.seedtext == "{{Validation results milestone category|release=32|dist=}}"

          assert pg.summary == "Relval bot-created validation result category page for Fedora 32"

          # top level, modular

-         pg = self.site.pages["Category:Fedora Modular 27 Test Results"]

+         pg = self.site.pages["Category:Fedora-Modular 27 Test Results"]

+         assert isinstance(pg, wikitcms.listing.ValidationCategory)

+         assert pg.seedtext == "{{Validation results milestone category|release=27|dist=Modular}}"

+         assert pg.summary == (

+             "Relval bot-created validation result category page for Fedora-Modular 27"

+         )

+         # top level, IoT

+         pg = self.site.pages["Category:Fedora-IoT 33 Test Results"]

          assert isinstance(pg, wikitcms.listing.ValidationCategory)

-         assert pg.seedtext == "{{Validation results milestone category|release=27|modular=true}}"

+         assert pg.seedtext == "{{Validation results milestone category|release=33|dist=IoT}}"

          assert pg.summary == (

-             "Relval bot-created validation result category page for Fedora Modular 27"

+             "Relval bot-created validation result category page for Fedora-IoT 33"

          )

          # milestone level

          pg = self.site.pages["Category:Fedora 32 Beta Test Results"]

          assert isinstance(pg, wikitcms.listing.ValidationCategory)

-         assert pg.seedtext == "{{Validation results milestone category|release=32|milestone=Beta}}"

+         assert pg.seedtext == (

+             "{{Validation results milestone category|release=32|milestone=Beta|dist=}}"

+         )

          assert pg.summary == (

              "Relval bot-created validation result category page for Fedora 32 Beta"

          )

          # milestone level, modular

-         pg = self.site.pages["Category:Fedora Modular 27 Beta Test Results"]

+         pg = self.site.pages["Category:Fedora-Modular 27 Beta Test Results"]

          assert isinstance(pg, wikitcms.listing.ValidationCategory)

          assert pg.seedtext == (

-             "{{Validation results milestone category|release=27|milestone=Beta|modular=true}}"

+             "{{Validation results milestone category|release=27|milestone=Beta|dist=Modular}}"

          )

          assert pg.summary == (

-             "Relval bot-created validation result category page for Fedora Modular 27 Beta"

+             "Relval bot-created validation result category page for Fedora-Modular 27 Beta"

          )

          # nightly level

          pg = self.site.pages["Category:Fedora 32 Nightly Test Results"]

          assert isinstance(pg, wikitcms.listing.ValidationCategory)

-         assert pg.seedtext == "{{Validation results milestone category|release=32|nightly=true}}"

+         assert pg.seedtext == (

+             "{{Validation results milestone category|release=32|nightly=true|dist=}}"

+         )

          assert pg.summary == (

              "Relval bot-created validation result category page for Fedora 32 nightly results"

          )

          # nightly level, modular

-         pg = self.site.pages["Category:Fedora Modular 27 Nightly Test Results"]

+         pg = self.site.pages["Category:Fedora-Modular 27 Nightly Test Results"]

          assert isinstance(pg, wikitcms.listing.ValidationCategory)

          assert pg.seedtext == (

-             "{{Validation results milestone category|release=27|nightly=true|modular=true}}"

+             "{{Validation results milestone category|release=27|nightly=true|dist=Modular}}"

          )

          assert pg.summary == (

-             "Relval bot-created validation result category page for Fedora "

+             "Relval bot-created validation result category page for Fedora-"

              "Modular 27 nightly results"

          )

+         # nightly level, IoT

+         pg = self.site.pages["Category:Fedora-IoT 33 Nightly Test Results"]

+         assert isinstance(pg, wikitcms.listing.ValidationCategory)

+         assert pg.seedtext == (

+             "{{Validation results milestone category|release=33|nightly=true|dist=IoT}}"

+         )

+         assert pg.summary == (

+             "Relval bot-created validation result category page for Fedora-"

+             "IoT 33 nightly results"

+         )

  

      @mock.patch("mwclient.listing.GeneratorList.__next__")

      def test_pages_testday_category(self, fakenext):

file modified
+89 -23
@@ -173,21 +173,26 @@ 

          # modular nightly page (based on the only nightly modular event

          # that ever existed...)

          modnightly = wikitcms.page.NightlyPage(

-             self.site, "27", "Base", "Branched", "20171123.n.1", modular=True

+             self.site, "27", "Base", "Branched", "20171123.n.1", dist="Fedora-Modular"

          )

          # typical candidate page (should *not* be modular)

          candidate = wikitcms.page.ComposePage(self.site, "32", "Desktop", "RC", "1.2")

          # modular candidate page (based on the only modular compose we

          # ever did...)

          modcandidate = wikitcms.page.ComposePage(

-             self.site, "27", "Server", "Beta", "1.5", modular=True

+             self.site, "27", "Server", "Beta", "1.5", dist="Fedora-Modular"

+         )

+ 

+         # IoT 'nightly'

+         iotnightly = wikitcms.page.NightlyPage(

+             self.site, "33", "General", "RC", "20200513.0", dist="Fedora-IoT"

          )

          assert nightly.release == "32"

          assert nightly.milestone == "Rawhide"

          assert nightly.compose == "20200122.n.0"

          assert nightly.version == "32 Rawhide 20200122.n.0"

          assert nightly.testtype == "Installation"

-         assert nightly.modular is False

+         assert nightly.dist == "Fedora"

          assert nightly.checkname == "Test Results:Fedora 32 Rawhide 20200122.n.0 Installation"

          assert nightly.summary == (

              "Relval bot-created Installation validation results page for "
@@ -210,11 +215,11 @@ 

          assert modnightly.compose == "20171123.n.1"

          assert modnightly.version == "27 Branched 20171123.n.1"

          assert modnightly.testtype == "Base"

-         assert modnightly.modular is True

-         assert modnightly.checkname == "Test Results:Fedora Modular 27 Branched 20171123.n.1 Base"

+         assert modnightly.dist == "Fedora-Modular"

+         assert modnightly.checkname == "Test Results:Fedora-Modular 27 Branched 20171123.n.1 Base"

          assert modnightly.summary == (

              "Relval bot-created Base validation results page for "

-             "Fedora Modular 27 Branched 20171123.n.1"

+             "Fedora-Modular 27 Branched 20171123.n.1"

          )

          assert modnightly.results_separators == (

              "Test Matri",
@@ -233,7 +238,7 @@ 

          assert candidate.compose == "1.2"

          assert candidate.version == "32 RC 1.2"

          assert candidate.testtype == "Desktop"

-         assert candidate.modular is False

+         assert candidate.dist == "Fedora"

          assert candidate.checkname == "Test Results:Fedora 32 RC 1.2 Desktop"

          assert candidate.summary == (

              "Relval bot-created Desktop validation results page for " "Fedora 32 RC 1.2"
@@ -258,10 +263,10 @@ 

          assert modcandidate.compose == "1.5"

          assert modcandidate.version == "27 Beta 1.5"

          assert modcandidate.testtype == "Server"

-         assert modcandidate.modular is True

-         assert modcandidate.checkname == "Test Results:Fedora Modular 27 Beta 1.5 Server"

+         assert modcandidate.dist == "Fedora-Modular"

+         assert modcandidate.checkname == "Test Results:Fedora-Modular 27 Beta 1.5 Server"

          assert modcandidate.summary == (

-             "Relval bot-created Server validation results page for " "Fedora Modular 27 Beta 1.5"

+             "Relval bot-created Server validation results page for " "Fedora-Modular 27 Beta 1.5"

          )

          assert modcandidate.results_separators == (

              "Test Matri",
@@ -275,6 +280,28 @@ 

              "|compose=1.5}}"

          )

  

+         assert iotnightly.release == "33"

+         assert iotnightly.milestone == "RC"

+         assert iotnightly.compose == "20200513.0"

+         assert iotnightly.version == "33 RC 20200513.0"

+         assert iotnightly.testtype == "General"

+         assert iotnightly.dist == "Fedora-IoT"

+         assert iotnightly.checkname == "Test Results:Fedora-IoT 33 RC 20200513.0 General"

+         assert iotnightly.summary == (

+             "Relval bot-created General validation results page for Fedora-IoT 33 RC 20200513.0"

+         )

+         assert iotnightly.results_separators == (

+             "Test Matri",

+             "Test Areas",

+             "An unsupported test or configuration.  No testing is required.",

+         )

+         assert iotnightly.sortname == "33 6000 20200513.0 General"

+         assert iotnightly.sorttuple == (33, 800, Decimal("20200513.0"), "General")

+         assert iotnightly.seedtext == (

+             "{{subst:IoT validation results|testtype=General|release=33|milestone=RC"

+             "|date=20200513.0}}"

+         )

+ 

      def test_results_sections(self, fakeapisections):

          """Test the results_sections property."""

          # we aren"t using fakepages here so this doesn"t really matter
@@ -369,13 +396,27 @@ 

          assert args[2] == "relval: update to current event"

  

          # now check modular case

-         page = wikitcms.page.ComposePage(self.site, "32", "Server", "Beta", "1.1", modular=True)

+         page = wikitcms.page.ComposePage(

+             self.site, "32", "Server", "Beta", "1.1", dist="Fedora-Modular"

+         )

          page.update_current()

          assert fakesave.call_count == 2

          args = fakesave.call_args[0]

          # this is the Page instance itself

          assert args[0].name == "Test Results:Current Modular Server Test"

-         assert args[1] == "#REDIRECT [[Test Results:Fedora Modular 32 Beta 1.1 Server]]"

+         assert args[1] == "#REDIRECT [[Test Results:Fedora-Modular 32 Beta 1.1 Server]]"

+         assert args[2] == "relval: update to current event"

+ 

+         # IoT case

+         page = wikitcms.page.NightlyPage(

+             self.site, "33", "General", "RC", "20200513.0", dist="Fedora-IoT"

+         )

+         page.update_current()

+         assert fakesave.call_count == 3

+         args = fakesave.call_args[0]

+         # this is the Page instance itself

+         assert args[0].name == "Test Results:Current IoT General Test"

+         assert args[1] == "#REDIRECT [[Test Results:Fedora-IoT 33 RC 20200513.0 General]]"

          assert args[2] == "relval: update to current event"

  

  
@@ -607,10 +648,9 @@ 

  

      @mock.patch("fedfind.release.Compose.exists", True)

      @mock.patch("fedfind.release.Compose.all_images", ["foo"])

-     @mock.patch("wikitcms.wiki.Wiki.testtypes", ["Installation", "Base"])

-     @mock.patch("wikitcms.wiki.Wiki.modular_testtypes", ["Installation", "Base"])

+     @mock.patch("wikitcms.wiki.Wiki.get_testtypes", return_value=["Installation", "Base"])

      @mock.patch("mwclient.page.Page.save", autospec=True)

-     def test_summary_page(self, fakesave):

+     def test_summary_page(self, fakesave, fakeget):

          """General tests for SummaryPage. It's a simple class."""

          site = wikitcms.wiki.Wiki("fjajah", do_init=False, force_login=False)

          event = wikitcms.event.ComposeEvent(site, "32", "Beta", "1.2", cid="Fedora-32-20200312.0")
@@ -645,22 +685,41 @@ 

  

          # modular checks

          modevent = wikitcms.event.ComposeEvent(

-             site, "27", "Beta", "1.5", cid="Fedora-Modular-27-20171108.2", modular=True

+             site, "27", "Beta", "1.5", cid="Fedora-Modular-27-20171108.2", dist="Fedora-Modular"

          )

          summ = modevent.summary_page

          assert isinstance(summ, wikitcms.page.SummaryPage)

-         assert summ.checkname == "Test Results:Fedora Modular 27 Beta 1.5 Summary"

+         assert summ.checkname == "Test Results:Fedora-Modular 27 Beta 1.5 Summary"

          assert summ.summary == (

-             "Relval bot-created validation results summary for " "Fedora Modular 27 Beta 1.5"

+             "Relval bot-created validation results summary for Fedora-Modular 27 Beta 1.5"

          )

          # let's not test the whole goddamned thing again

-         assert summ.seedtext.startswith("Fedora Modular 27 Beta 1.5 [[")

+         assert summ.seedtext.startswith("Fedora-Modular 27 Beta 1.5 [[")

          summ.update_current()

          assert fakesave.call_count == 1

          args = fakesave.call_args[0]

          # this is the Page instance itself

          assert args[0].name == "Test Results:Current Modular Summary"

-         assert args[1] == "#REDIRECT [[Test Results:Fedora Modular 27 Beta 1.5 Summary]]"

+         assert args[1] == "#REDIRECT [[Test Results:Fedora-Modular 27 Beta 1.5 Summary]]"

+         assert args[2] == "relval: update to current event"

+         fakesave.reset_mock()

+ 

+         # IoT checks

+         iotevent = wikitcms.event.NightlyEvent(site, "33", "RC", "20200513.0", dist="Fedora-IoT")

+         summ = iotevent.summary_page

+         assert isinstance(summ, wikitcms.page.SummaryPage)

+         assert summ.checkname == "Test Results:Fedora-IoT 33 RC 20200513.0 Summary"

+         assert summ.summary == (

+             "Relval bot-created validation results summary for Fedora-IoT 33 RC 20200513.0"

+         )

+         # let's not test the whole goddamned thing again

+         assert summ.seedtext.startswith("Fedora-IoT 33 RC 20200513.0 [[")

+         summ.update_current()

+         assert fakesave.call_count == 1

+         args = fakesave.call_args[0]

+         # this is the Page instance itself

+         assert args[0].name == "Test Results:Current IoT Summary"

+         assert args[1] == "#REDIRECT [[Test Results:Fedora-IoT 33 RC 20200513.0 Summary]]"

          assert args[2] == "relval: update to current event"

          fakesave.reset_mock()

  
@@ -693,13 +752,20 @@ 

  

          # modular checks

          modevent = wikitcms.event.ComposeEvent(

-             site, "27", "Beta", "1.5", cid="Fedora-Modular-27-20171108.2", modular=True

+             site, "27", "Beta", "1.5", cid="Fedora-Modular-27-20171108.2", dist="Fedora-Modular"

          )

          page = modevent.download_page

-         assert page.checkname == "Template:Fedora Modular 27 Beta 1.5 Download"

-         assert page.summary == "Relval bot-created download page for Fedora Modular 27 Beta 1.5"

+         assert page.checkname == "Template:Fedora-Modular 27 Beta 1.5 Download"

+         assert page.summary == "Relval bot-created download page for Fedora-Modular 27 Beta 1.5"

          # that's all we need to check for modular

  

+         # IoT checks

+         iotevent = wikitcms.event.NightlyEvent(site, "33", "RC", "20200513.0", dist="Fedora-IoT")

+         page = iotevent.download_page

+         assert page.checkname == "Template:Fedora-IoT 33 RC 20200513.0 Download"

+         assert page.summary == "Relval bot-created download page for Fedora-IoT 33 RC 20200513.0"

+         # that's all we need to check for IoT

+ 

  

  @pytest.mark.usefixtures("fakemwp", "fakepages", "fakeimages")

  class TestAMIPage:

file modified
+4 -4
@@ -42,13 +42,13 @@ 

          rl = wikitcms.release.Release("32", self.site)

          # __init__ stuff

          assert rl.release == "32"

-         assert rl.modular is False

+         assert rl.dist == "Fedora"

          assert rl.category_name == "Category:Fedora 32 Test Results"

          # modular

-         rl = wikitcms.release.Release("27", self.site, modular=True)

+         rl = wikitcms.release.Release("27", self.site, dist="Fedora-Modular")

          assert rl.release == "27"

-         assert rl.modular is True

-         assert rl.category_name == "Category:Fedora Modular 27 Test Results"

+         assert rl.dist == "Fedora-Modular"

+         assert rl.category_name == "Category:Fedora-Modular 27 Test Results"

  

      def test_testday_pages(self, fakemwp):

          """Test for Release.testday_pages. There is actually quite a

file modified
+67 -47
@@ -73,7 +73,7 @@ 

      return FakeRow(name)

  

  

- def fake_pginit1(self, site, release, testtype, milestone, compose, info=None, modular=False):

+ def fake_pginit1(self, site, release, testtype, milestone, compose, info=None, dist="Fedora"):

      """Fake page.__init__ for testing get_validation_page guessing.

      This one gives us pages that 'exist' if they're Rawhide and don't

      otherwise.
@@ -85,7 +85,7 @@ 

          self.exists = False

  

  

- def fake_pginit2(self, site, release, testtype, milestone, compose, info=None, modular=False):

+ def fake_pginit2(self, site, release, testtype, milestone, compose, info=None, dist="Fedora"):

      """Fake page.__init__ for testing get_validation_page guessing.

      This one gives us pages that 'exist' if they're Branched and don't

      otherwise.
@@ -97,7 +97,7 @@ 

          self.exists = False

  

  

- def fake_pginit3(self, site, release, testtype, milestone, compose, info=None, modular=False):

+ def fake_pginit3(self, site, release, testtype, milestone, compose, info=None, dist="Fedora"):

      """Fake page.__init__ for testing get_validation_page guessing.

      This one just never exists.

      """
@@ -137,11 +137,13 @@ 

      def test_current_event(self, fakeget, faketext, fakeinit):

          """Tests for current_event and current_modular_event."""

          _ = self.site.current_event

-         fakeget.assert_called_with(mock.ANY, compose="1.1", milestone="Alpha", release="24")

+         fakeget.assert_called_with(

+             mock.ANY, compose="1.1", milestone="Alpha", release="24", dist="Fedora"

+         )

          fakeget.reset_mock()

          _ = self.site.current_modular_event

          fakeget.assert_called_with(

-             mock.ANY, compose="1.1", milestone="Alpha", release="24", modular=True

+             mock.ANY, compose="1.1", milestone="Alpha", release="24", dist="Fedora-Modular"

          )

  

      @mock.patch("mwclient.page.Page.__init__", return_value=None)
@@ -180,6 +182,8 @@ 

              assert list(self.site.walk_category(fakecat1)) == [fakepg1, fakepg2, fakepg3]

  

      @mock.patch("fedfind.release.Compose.exists", return_value=True)

+     @mock.patch("fedfind.release.IoTNightly.label", "RC-20200513.0")

+     @mock.patch("fedfind.release.IoTNightly.cid", "Fedora-IoT-33-20200513.0")

      @mock.patch("fedfind.release.Production.label", "RC-1.6")

      @mock.patch("fedfind.release.Production.cid", "Fedora-27-20171105.0")

      @mock.patch("fedfind.helpers.get_current_release", autospec=True, return_value=27)
@@ -193,59 +197,71 @@ 

          """Various tests for get_validation_event."""

          # current event

          self.site.get_validation_event()

-         fakecompose.assert_called_with(self.site, "24", "Alpha", "1.1", modular=False, cid="")

-         self.site.get_validation_event(modular=True)

-         fakecompose.assert_called_with(self.site, "24", "Alpha", "1.1", modular=True, cid="")

+         fakecompose.assert_called_with(self.site, "24", "Alpha", "1.1", dist="Fedora", cid="")

+         self.site.get_validation_event(dist="Fedora-Modular")

+         fakecompose.assert_called_with(

+             self.site, "24", "Alpha", "1.1", dist="Fedora-Modular", cid=""

+         )

          # old-school TC/RC

          self.site.get_validation_event(23, "Final", "TC9")

-         fakecompose.assert_called_with(self.site, 23, "Final", "TC9", modular=False, cid="")

+         fakecompose.assert_called_with(self.site, 23, "Final", "TC9", dist="Fedora", cid="")

          self.site.get_validation_event(23, "Beta", "RC1")

-         fakecompose.assert_called_with(self.site, 23, "Beta", "RC1", modular=False, cid="")

+         fakecompose.assert_called_with(self.site, 23, "Beta", "RC1", dist="Fedora", cid="")

          # old-school nightly

          self.site.get_validation_event(23, "Rawhide", "20151112")

          fakenightly.assert_called_with(

-             self.site, release=23, milestone="Rawhide", compose="20151112", modular=False

+             self.site, release=23, milestone="Rawhide", compose="20151112", dist="Fedora"

          )

-         self.site.get_validation_event(23, "Branched", "20151211", modular=False)

+         self.site.get_validation_event(23, "Branched", "20151211", dist="Fedora")

          fakenightly.assert_called_with(

-             self.site, release=23, milestone="Branched", compose="20151211", modular=False

+             self.site, release=23, milestone="Branched", compose="20151211", dist="Fedora"

          )

          # Pungi 4 production/candidate

          self.site.get_validation_event(24, "Alpha", "1.1")

-         fakecompose.assert_called_with(self.site, 24, "Alpha", "1.1", modular=False, cid="")

-         self.site.get_validation_event(27, "Beta", "1.5", modular=True)

-         fakecompose.assert_called_with(self.site, 27, "Beta", "1.5", modular=True, cid="")

+         fakecompose.assert_called_with(self.site, 24, "Alpha", "1.1", dist="Fedora", cid="")

+         self.site.get_validation_event(27, "Beta", "1.5", dist="Fedora-Modular")

+         fakecompose.assert_called_with(self.site, 27, "Beta", "1.5", dist="Fedora-Modular", cid="")

          # Past 23, 'Final' milestone should be converted to 'RC'

          self.site.get_validation_event(25, "Final", "1.1")

-         fakecompose.assert_called_with(self.site, 25, "RC", "1.1", modular=False, cid="")

+         fakecompose.assert_called_with(self.site, 25, "RC", "1.1", dist="Fedora", cid="")

          # Pungi 4 nightly

          self.site.get_validation_event(24, "Rawhide", "20160222.n.0")

          fakenightly.assert_called_with(

-             self.site, release=24, milestone="Rawhide", compose="20160222.n.0", modular=False

+             self.site, release=24, milestone="Rawhide", compose="20160222.n.0", dist="Fedora"

          )

          self.site.get_validation_event(24, "Branched", "20160315.n.1")

          fakenightly.assert_called_with(

-             self.site, release=24, milestone="Branched", compose="20160315.n.1", modular=False

+             self.site, release=24, milestone="Branched", compose="20160315.n.1", dist="Fedora"

          )

-         self.site.get_validation_event(27, "Branched", "20171110.n.1", modular=True)

+         self.site.get_validation_event(27, "Branched", "20171110.n.1", dist="Fedora-Modular")

          fakenightly.assert_called_with(

-             self.site, release=27, milestone="Branched", compose="20171110.n.1", modular=True

+             self.site,

+             release=27,

+             milestone="Branched",

+             compose="20171110.n.1",

+             dist="Fedora-Modular",

          )

          # Rawhide nightly compose ID

-         self.site.get_validation_event(cid="Fedora-Rawhide-20180220.n.0", modular=False)

+         self.site.get_validation_event(cid="Fedora-Rawhide-20180220.n.0", dist="Fedora")

          fakenightly.assert_called_with(

-             self.site, release="28", milestone="Rawhide", compose="20180220.n.0", modular=False

+             self.site, release="28", milestone="Rawhide", compose="20180220.n.0", dist="Fedora"

          )

          # Branched nightly compose ID

-         self.site.get_validation_event(cid="Fedora-27-20171120.n.0", modular=False)

+         self.site.get_validation_event(cid="Fedora-27-20171120.n.0", dist="Fedora")

          fakenightly.assert_called_with(

-             self.site, release="27", milestone="Branched", compose="20171120.n.0", modular=False

+             self.site, release="27", milestone="Branched", compose="20171120.n.0", dist="Fedora"

          )

          # Candidate compose ID (note compose ID passthrough)

-         self.site.get_validation_event(cid="Fedora-27-20171105.0", modular=False)

+         self.site.get_validation_event(cid="Fedora-27-20171105.0", dist="Fedora")

          fakecompose.assert_called_with(

-             self.site, "27", "RC", "1.6", modular=False, cid="Fedora-27-20171105.0"

+             self.site, "27", "RC", "1.6", dist="Fedora", cid="Fedora-27-20171105.0"

          )

+         # IoT compose: these are technically productions but quack and

+         # walk like nightlies, with dates in the labels; we intend to

+         # treat them as nightlies and create nightly events

+         fakegetcurr.return_value = 32

+         self.site.get_validation_event(cid="Fedora-IoT-33-20200513.0", dist="Fedora-IoT")

+         fakenightly.assert_called_with(self.site, "33", "RC", "20200513.0", dist="Fedora-IoT")

  

          with pytest.raises(ValueError):

              # Non-nightly compose but no milestone
@@ -293,7 +309,7 @@ 

              assert "Could not find any event" in err

  

      @mock.patch("wikitcms.event.ComposeEvent.__init__", return_value=None, autospec=True)

-     @mock.patch("wikitcms.wiki.Wiki.current_event")

+     @mock.patch("wikitcms.wiki.Wiki.get_current_event")

      def test_get_validation_event_guess_nomatch(self, fakecurr, fakeevent, fakemwp):

          """Check that when we guess but specify a release or milestone

          and the guessed release doesn't match the requested release or
@@ -323,56 +339,60 @@ 

          # current event

          self.site.get_validation_page("Installation")

          fakecompose.assert_called_with(

-             self.site, "24", "Installation", "Alpha", "1.1", modular=False

+             self.site, "24", "Installation", "Alpha", "1.1", dist="Fedora"

          )

          # old-school TC/RC

          self.site.get_validation_page("Installation", 23, "Final", "TC9")

-         fakecompose.assert_called_with(self.site, 23, "Installation", "Final", "TC9", modular=False)

+         fakecompose.assert_called_with(self.site, 23, "Installation", "Final", "TC9", dist="Fedora")

          self.site.get_validation_page("Installation", 23, "Beta", "RC1")

-         fakecompose.assert_called_with(self.site, 23, "Installation", "Beta", "RC1", modular=False)

+         fakecompose.assert_called_with(self.site, 23, "Installation", "Beta", "RC1", dist="Fedora")

          # old-school nightly

          self.site.get_validation_page("Installation", 23, "Rawhide", "20151112")

          fakenightly.assert_called_with(

-             self.site, 23, "Installation", "Rawhide", "20151112", modular=False

+             self.site, 23, "Installation", "Rawhide", "20151112", dist="Fedora"

          )

          self.site.get_validation_page("Installation", 23, "Branched", "20151211")

          fakenightly.assert_called_with(

-             self.site, 23, "Installation", "Branched", "20151211", modular=False

+             self.site, 23, "Installation", "Branched", "20151211", dist="Fedora"

          )

          # Pungi 4 production/candidate

          self.site.get_validation_page("Installation", 24, "Alpha", "1.1")

-         fakecompose.assert_called_with(self.site, 24, "Installation", "Alpha", "1.1", modular=False)

-         self.site.get_validation_page("Installation", 27, "Beta", "1.5", modular=True)

-         fakecompose.assert_called_with(self.site, 27, "Installation", "Beta", "1.5", modular=True)

+         fakecompose.assert_called_with(self.site, 24, "Installation", "Alpha", "1.1", dist="Fedora")

+         self.site.get_validation_page("Installation", 27, "Beta", "1.5", dist="Fedora-Modular")

+         fakecompose.assert_called_with(

+             self.site, 27, "Installation", "Beta", "1.5", dist="Fedora-Modular"

+         )

          # Past 23, 'Final' milestone should be converted to 'RC'

          self.site.get_validation_page("Installation", 25, "Final", "1.1")

-         fakecompose.assert_called_with(self.site, 25, "Installation", "RC", "1.1", modular=False)

+         fakecompose.assert_called_with(self.site, 25, "Installation", "RC", "1.1", dist="Fedora")

          # Pungi 4 nightly

          self.site.get_validation_page("Installation", 24, "Rawhide", "20160222.n.0")

          fakenightly.assert_called_with(

-             self.site, 24, "Installation", "Rawhide", "20160222.n.0", modular=False

+             self.site, 24, "Installation", "Rawhide", "20160222.n.0", dist="Fedora"

          )

          self.site.get_validation_page("Installation", 24, "Branched", "20160315.n.1")

          fakenightly.assert_called_with(

-             self.site, 24, "Installation", "Branched", "20160315.n.1", modular=False

+             self.site, 24, "Installation", "Branched", "20160315.n.1", dist="Fedora"

+         )

+         self.site.get_validation_page(

+             "Installation", 27, "Branched", "20171110.n.1", dist="Fedora-Modular"

          )

-         self.site.get_validation_page("Installation", 27, "Branched", "20171110.n.1", modular=True)

          fakenightly.assert_called_with(

-             self.site, 27, "Installation", "Branched", "20171110.n.1", modular=True

+             self.site, 27, "Installation", "Branched", "20171110.n.1", dist="Fedora-Modular"

          )

          # Rawhide nightly compose ID

          self.site.get_validation_page("Installation", cid="Fedora-Rawhide-20180220.n.0")

          fakenightly.assert_called_with(

-             self.site, "28", "Installation", "Rawhide", "20180220.n.0", modular=False

+             self.site, "28", "Installation", "Rawhide", "20180220.n.0", dist="Fedora"

          )

          # Branched nightly compose ID

          self.site.get_validation_page("Installation", cid="Fedora-27-20171120.n.0")

          fakenightly.assert_called_with(

-             self.site, "27", "Installation", "Branched", "20171120.n.0", modular=False

+             self.site, "27", "Installation", "Branched", "20171120.n.0", dist="Fedora"

          )

          # Candidate compose ID

          self.site.get_validation_page("Installation", cid="Fedora-27-20171105.0")

-         fakecompose.assert_called_with(self.site, "27", "Installation", "RC", "1.6", modular=False)

+         fakecompose.assert_called_with(self.site, "27", "Installation", "RC", "1.6", dist="Fedora")

  

          with pytest.raises(ValueError):

              # Non-nightly compose but no milestone
@@ -425,7 +445,7 @@ 

              "compose": "",

              "date": "20200407.n.0",

          }

-         with mock.patch("wikitcms.wiki.Wiki.current_compose", fakecurr):

+         with mock.patch("wikitcms.wiki.Wiki.get_current_compose", return_value=fakecurr):

              with pytest.raises(ValueError) as err:

                  self.site.get_validation_page("Installation", release=23)

                  assert "does not match requested" in err
@@ -561,8 +581,8 @@ 

          # this is more or less what the return of

          # category.members(generator=False) looks like - it's an

          # mwclient 'List' instance

-         instmx = {"title": "Template:Installation modular test matrix", "pageid": 77036, "ns": 10}

-         servmx = {"title": "Template:Server modular test matrix", "pageid": 77040, "ns": 10}

+         instmx = {"title": "Template:Installation Modular test matrix", "pageid": 77036, "ns": 10}

+         servmx = {"title": "Template:Server Modular test matrix", "pageid": 77040, "ns": 10}

          fakemembers.return_value = [instmx, servmx]

          assert self.site.modular_testtypes == ["Installation", "Server"]

  

We only ever did two Fedora-Modular composes, in the end, so all
the effort I put into supporting a parallel set of events for
modular composes seemed wasted. BUT! We now want a parallel event
stream for IoT composes: https://pagure.io/fedora-qa/issue/623
So, we can achieve that by making all this code to handle modular
composes more generic. Instead of hardcoding the concept of a
"modular event" for modular composes, we just kinda allow for
the existence of event streams for any given "dist", where a
"dist" is a Pungi compose shortname like "Fedora" (which gives
all the current page names and texts and category names and so
on), "Fedora-IoT" or "Fedora-Cloud" (which will give page names
and category names and texts based on those strings), or
"Fedora-Modular" (which will give the names and texts I hardcoded
before, via some ugly grandfathering hacks, where the new generic
dist name handling code would give something different).

We will need to tweak some of the actual wiki templates a bit
for this, too, and adjust relval and relvalconsumer to the new
way of doing things.

Signed-off-by: Adam Williamson awilliam@redhat.com

This is WIP, I need to add tests for IoT, and co-ordinate landing it with landing the wiki template changes and relval/relvalconsumer changes.

Build failed.

rebased onto c2f41ae

3 years ago

Build failed.

rebased onto a9b4aee

3 years ago

Build succeeded.

rebased onto cc6c899

3 years ago

Build failed.

rebased onto f96f400

3 years ago

Build succeeded.

rebased onto 893d1d6

3 years ago

Build succeeded.

2 new commits added

  • Add various IoT tests (v. similar to modular)
  • listing: handle IoT pages
3 years ago

Build succeeded.

Pull-Request has been merged by adamwill

3 years ago