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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
# SPDX-License-Identifier: Apache-2.0
# Copyright 2019 The Meson development team
from __future__ import annotations
import abc
import re
import typing as T
if T.TYPE_CHECKING:
from ..minit import Arguments
class SampleImpl(metaclass=abc.ABCMeta):
def __init__(self, args: Arguments):
self.name = args.name
self.version = args.version
self.lowercase_token = re.sub(r'[^a-z0-9]', '_', self.name.lower())
self.uppercase_token = self.lowercase_token.upper()
self.capitalized_token = self.lowercase_token.capitalize()
@abc.abstractmethod
def create_executable(self) -> None:
pass
@abc.abstractmethod
def create_library(self) -> None:
pass
@abc.abstractproperty
def exe_template(self) -> str:
pass
@abc.abstractproperty
def exe_meson_template(self) -> str:
pass
@abc.abstractproperty
def lib_template(self) -> str:
pass
@abc.abstractproperty
def lib_test_template(self) -> str:
pass
@abc.abstractproperty
def lib_meson_template(self) -> str:
pass
@abc.abstractproperty
def source_ext(self) -> str:
pass
class ClassImpl(SampleImpl):
"""For Class based languages, like Java and C#"""
def create_executable(self) -> None:
source_name = f'{self.capitalized_token}.{self.source_ext}'
with open(source_name, 'w', encoding='utf-8') as f:
f.write(self.exe_template.format(project_name=self.name,
class_name=self.capitalized_token))
with open('meson.build', 'w', encoding='utf-8') as f:
f.write(self.exe_meson_template.format(project_name=self.name,
exe_name=self.name,
source_name=source_name,
version=self.version))
def create_library(self) -> None:
lib_name = f'{self.capitalized_token}.{self.source_ext}'
test_name = f'{self.capitalized_token}_test.{self.source_ext}'
kwargs = {'utoken': self.uppercase_token,
'ltoken': self.lowercase_token,
'class_test': f'{self.capitalized_token}_test',
'class_name': self.capitalized_token,
'source_file': lib_name,
'test_source_file': test_name,
'test_exe_name': f'{self.lowercase_token}_test',
'project_name': self.name,
'lib_name': self.lowercase_token,
'test_name': self.lowercase_token,
'version': self.version,
}
with open(lib_name, 'w', encoding='utf-8') as f:
f.write(self.lib_template.format(**kwargs))
with open(test_name, 'w', encoding='utf-8') as f:
f.write(self.lib_test_template.format(**kwargs))
with open('meson.build', 'w', encoding='utf-8') as f:
f.write(self.lib_meson_template.format(**kwargs))
class FileImpl(SampleImpl):
"""File based languages without headers"""
def create_executable(self) -> None:
source_name = f'{self.lowercase_token}.{self.source_ext}'
with open(source_name, 'w', encoding='utf-8') as f:
f.write(self.exe_template.format(project_name=self.name))
with open('meson.build', 'w', encoding='utf-8') as f:
f.write(self.exe_meson_template.format(project_name=self.name,
exe_name=self.name,
source_name=source_name,
version=self.version))
def lib_kwargs(self) -> T.Dict[str, str]:
"""Get Language specific keyword arguments
:return: A dictionary of key: values to fill in the templates
"""
return {
'utoken': self.uppercase_token,
'ltoken': self.lowercase_token,
'header_dir': self.lowercase_token,
'class_name': self.capitalized_token,
'function_name': f'{self.lowercase_token[0:3]}_func',
'namespace': self.lowercase_token,
'source_file': f'{self.lowercase_token}.{self.source_ext}',
'test_source_file': f'{self.lowercase_token}_test.{self.source_ext}',
'test_exe_name': f'{self.lowercase_token}_test',
'project_name': self.name,
'lib_name': self.lowercase_token,
'test_name': self.lowercase_token,
'version': self.version,
}
def create_library(self) -> None:
lib_name = f'{self.lowercase_token}.{self.source_ext}'
test_name = f'{self.lowercase_token}_test.{self.source_ext}'
kwargs = self.lib_kwargs()
with open(lib_name, 'w', encoding='utf-8') as f:
f.write(self.lib_template.format(**kwargs))
with open(test_name, 'w', encoding='utf-8') as f:
f.write(self.lib_test_template.format(**kwargs))
with open('meson.build', 'w', encoding='utf-8') as f:
f.write(self.lib_meson_template.format(**kwargs))
class FileHeaderImpl(FileImpl):
@abc.abstractproperty
def header_ext(self) -> str:
pass
@abc.abstractproperty
def lib_header_template(self) -> str:
pass
def lib_kwargs(self) -> T.Dict[str, str]:
kwargs = super().lib_kwargs()
kwargs['header_file'] = f'{self.lowercase_token}.{self.header_ext}'
return kwargs
def create_library(self) -> None:
super().create_library()
kwargs = self.lib_kwargs()
with open(kwargs['header_file'], 'w', encoding='utf-8') as f:
f.write(self.lib_header_template.format_map(kwargs))
|