File: hatch_build.py

package info (click to toggle)
offpunk 3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,012 kB
  • sloc: python: 6,263; sh: 117; makefile: 2
file content (59 lines) | stat: -rw-r--r-- 1,919 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import shutil
import subprocess
from pathlib import Path
from hatchling.builders.hooks.plugin.interface import BuildHookInterface


class TranslationFilesHook(BuildHookInterface):
    """Compile the GNU gettext translation files from their po-format into
    their binary representating mo-format using 'msgfmt'.
    """

    # Command used to compile po into mo files.
    COMPILE_COMMAND = 'msgfmt'

    def _check_compile_command(self):
        """Check if "msgfmt" is available."""

        if not shutil.which(type(self).COMPILE_COMMAND):
            raise OSError(
                'Executable "{cmd}" (from GNU gettext tools) is not '
                'available. Please install it via a package manager of '
                'your trust. In most cases "{cmd}" is part of "gettext".'
                .format(cmd=type(self).COMPILE_COMMAND)
            )

    def _compile_po_to_mo(self, po_file: Path, mo_file: Path):
        """ Compile po-file to mo-file using "msgfmt".
        """

        # Build command
        cmd = [
            type(self).COMPILE_COMMAND,
            '--output-file={}'.format(mo_file),
            po_file
        ]

        # Execute command
        rc = subprocess.run(cmd, check=False, text=True, capture_output=True)

        # Validate output
        if rc.stderr:
            raise RuntimeError(rc.stderr)

    def initialize(self, version, build_data):
        print('|==-- Preparing translation files. --==|')

        self._check_compile_command()

        pkg_path = Path.cwd()

        for in_file in pkg_path.glob('po/*.po'):
            print(f'Processing "{in_file.name}"')
            out_file = pkg_path / 'share/locale' / in_file.stem  / 'LC_MESSAGES' / 'offpunk.mo'
            # Create folder for output file
            out_file.parent.mkdir(parents=True, exist_ok=True)
            self._compile_po_to_mo(in_file, out_file)

        print('|==-- Completed. --==|')