summaryrefslogtreecommitdiffstats
path: root/cligen/cligen/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'cligen/cligen/package.py')
-rw-r--r--cligen/cligen/package.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/cligen/cligen/package.py b/cligen/cligen/package.py
new file mode 100644
index 0000000..75adf14
--- /dev/null
+++ b/cligen/cligen/package.py
@@ -0,0 +1,104 @@
+# Copyright (C) 2021-2022 Daiki Ueno
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+from typing import NamedTuple, Optional, Sequence
+from cligen.types import Desc
+import datetime
+import io
+import os
+import textwrap
+
+
+try:
+ import pwd
+
+ def get_default_copyright_holder():
+ return pwd.getpwuid(os.getuid()).pw_gecos
+except ImportError:
+ def get_default_copyright_holder():
+ return 'COPYRIGHT HOLDER'
+
+
+class Info(NamedTuple):
+ name: str
+ version: str
+ license: str = 'gpl3+'
+ copyright_year: str = str(datetime.date.today().year)
+ copyright_holder: str = get_default_copyright_holder()
+ bug_email: Optional[str] = None
+ authors: Sequence[str] = list()
+
+
+BRIEF_LICENSES = {
+ 'gpl3+': textwrap.dedent('''\
+ This program is released under the terms of
+ the GNU General Public License, version 3 or later
+ ''')
+}
+SHORT_LICENSES = {
+ 'gpl3+': textwrap.dedent('''\
+ This is free software. It is licensed for use, modification and
+ redistribution under the terms of the GNU General Public License,
+ version 3 or later <http://gnu.org/licenses/gpl.html>
+ ''')
+}
+FULL_LICENSES = {
+ 'gpl3+': textwrap.dedent('''\
+ This is free software. It is licensed for use, modification and
+ redistribution under the terms of the GNU General Public License,
+ version 3 or later <http://gnu.org/licenses/gpl.html>
+
+ @PACKAGE_NAME@ is free software: you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation,
+ either version 3 of the License, or (at your option) any later version.
+
+ @PACKAGE_NAME@ is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ ''')
+}
+
+
+def license(desc: Desc, info: Info, what='short') -> str:
+ if what == 'brief':
+ license_text = BRIEF_LICENSES[info.license]
+ elif what == 'short':
+ license_text = SHORT_LICENSES[info.license]
+ elif what == 'full':
+ license_text = FULL_LICENSES[info.license]
+ return license_text.replace('@PACKAGE_NAME@', info.name)
+
+
+def version(desc: Desc, info: Info, what='c') -> str:
+ out = io.StringIO()
+
+ if what == 'v':
+ out.write(f'{desc.tool.name} {info.version}')
+ elif what == 'c':
+ out.write(textwrap.dedent(f'''\
+ {desc.tool.name} {info.version}
+ Copyright (C) {info.copyright_year} {info.copyright_holder}
+ '''))
+ out.write(license(desc, info, 'short'))
+ if info.bug_email:
+ out.write(textwrap.dedent(f'''\
+
+ Please send bug reports to: <{info.bug_email}>\
+ '''))
+ elif what == 'n':
+ out.write(textwrap.dedent(f'''\
+ {desc.tool.name} {info.version}
+ Copyright (C) {info.copyright_year} {info.copyright_holder}
+ '''))
+ out.write(license(desc, info, 'full'))
+ if info.bug_email:
+ out.write(textwrap.dedent(f'''\
+
+ Please send bug reports to: <{info.bug_email}>\
+ '''))
+ return out.getvalue()