Replace named tuples with Data Classes

Use Data Classes instead of named tuples since the former is the
recommended approach for Python >= 3.7.

Test: atest --host atest_unittests
Bug: 1854327
Change-Id: I6014b72c75063d0a0990363ce846a53624e10bf5
diff --git a/atest/bazel_mode.py b/atest/bazel_mode.py
index cb77489..4aea3da 100644
--- a/atest/bazel_mode.py
+++ b/atest/bazel_mode.py
@@ -22,11 +22,12 @@
 # pylint: disable=missing-function-docstring
 # pylint: disable=missing-class-docstring
 
+import dataclasses
 import os
 import shutil
 
 from abc import ABC, abstractmethod
-from collections import defaultdict, namedtuple, OrderedDict
+from collections import defaultdict, OrderedDict
 from pathlib import Path
 from typing import Any, Dict, IO, List, Set
 
@@ -202,8 +203,8 @@
 
         self.name_to_target[target_name] = target
 
-        for bzl_package, symbol in target.required_imports():
-            self.imports[bzl_package].add(symbol)
+        for i in target.required_imports():
+            self.imports[i.bzl_package].add(i.symbol)
 
     def generate(self, workspace_out_path: Path):
         package_dir = workspace_out_path.joinpath(self.path)
@@ -230,8 +231,16 @@
                 target.write_to_build_file(f)
 
 
-Import = namedtuple('Import', ['bzl_package', 'symbol'])
-Config = namedtuple('Config', ['name', 'out_path'])
+@dataclasses.dataclass(frozen=True)
+class Import:
+    bzl_package: str
+    symbol: str
+
+
+@dataclasses.dataclass(frozen=True)
+class Config:
+    name: str
+    out_path: Path
 
 
 class Target(ABC):
@@ -330,7 +339,7 @@
         fprint(f'    name = "{self._name}",')
         fprint('    files = select({')
 
-        for config in sorted(self.config_files.keys()):
+        for config in sorted(self.config_files.keys(), key=lambda c: c.name):
             fprint(f'        "//bazel/rules:{config.name}":'
                    f' glob(["{self._name}/{config.name}/**/*"]),')