From 6fa99778d1c7b49835aba23ad55e0a24365bec8a Mon Sep 17 00:00:00 2001
From: k204230 <bergemann@dkrz.de>
Date: Fri, 22 Jul 2022 14:18:19 +0200
Subject: [PATCH] Improve packaging

---
 .gitlab-ci.yml                |  2 +-
 MANIFEST.in                   |  2 +-
 setup.py                      | 51 ++++++++++++++++++++++++++---------
 src/freva_deployment/utils.py | 35 +++++++++++++++++++++---
 4 files changed, 72 insertions(+), 18 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index c3e2e33..30439ba 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -45,7 +45,7 @@ release_job:
         - pip install twine
         - chmod +x /usr/local/bin/release-cli
     script:
-        - python setup.py sdist
+        - python setup.py sdist bdist_wheel
         - TWINE_PASSWORD=${CI_JOB_TOKEN}
           TWINE_USERNAME=gitlab-ci-token
           python -m twine upload --skip-existing --verbose --repository-url
diff --git a/MANIFEST.in b/MANIFEST.in
index af8fff7..f20fbdc 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1 +1 @@
-graft ./assets/*
+graft assets/*
diff --git a/setup.py b/setup.py
index bef2bb9..f7f3b22 100644
--- a/setup.py
+++ b/setup.py
@@ -7,6 +7,8 @@ import urllib.request
 from setuptools import setup, find_packages
 from setuptools.command.develop import develop
 from setuptools.command.install import install
+import sys
+from typing import List
 
 
 THIS_DIR = Path(__file__).parent
@@ -14,6 +16,20 @@ CONFIG_DIR = Path("freva") / "deployment"
 ASSET_DIR = THIS_DIR / "assets"
 
 
+INSTALL_REQUIRES = [
+    "appdirs",
+    "npyscreen",
+    "numpy",
+    "PyMySQL",
+    "pyncclient",
+    "pyyml",
+    "rich",
+    "toml",
+    "tomlkit",
+    "requests",
+]
+
+
 def find_version(*parts):
     vers_file = read(*parts)
     match = re.search(r'^__version__ = "(\d+.\d+.\d+)"', vers_file, re.M)
@@ -90,6 +106,26 @@ def read(*parts: str) -> str:
         return f.read()
 
 
+def get_packages() -> List[str]:
+    """Get the packages needed to install."""
+    plf = sys.platform
+    if plf.startswith("win") or plf.startswith("cygwin") or plf.startswith("ms"):
+        return INSTALL_REQUIRES
+    INSTALL_REQUIRES.append("ansible")
+    return INSTALL_REQUIRES
+
+
+def get_data_files() -> List[str]:
+    dirs = [d for d in ASSET_DIR.rglob("*") if d.is_dir()]
+    files = []
+    for d in dirs:
+        target_dir = Path("share") / "freva" / "deployment" / d.relative_to(ASSET_DIR)
+        add_files = [str(f) for f in d.rglob("*") if f.is_file()]
+        if add_files:
+            files.append((str(target_dir), add_files))
+    return files
+
+
 setup(
     name="freva_deployment",
     version=find_version("src", "freva_deployment", "__init__.py"),
@@ -101,7 +137,7 @@ setup(
     long_description=read("README.md"),
     long_description_content_type="text/markdown",
     include_package_data=True,
-    package_data={"assets": ["assets"]},
+    data_files=get_data_files(),
     license="GPLv3",
     packages=find_packages("src"),
     package_dir={"": "src"},
@@ -119,18 +155,7 @@ setup(
         ]
     },
     setup_requires=["appdirs"],
-    install_requires=[
-        "appdirs",
-        "npyscreen",
-        "numpy",
-        "PyMySQL",
-        "pyncclient",
-        "pyyml",
-        "rich",
-        "toml",
-        "tomlkit",
-        "requests",
-    ],
+    install_requires=get_packages(),
     extras_require={
         "docs": [
             "sphinx",
diff --git a/src/freva_deployment/utils.py b/src/freva_deployment/utils.py
index c90fa91..f5460e2 100644
--- a/src/freva_deployment/utils.py
+++ b/src/freva_deployment/utils.py
@@ -5,7 +5,9 @@ import logging
 import json
 from pathlib import Path
 import re
-from subprocess import run, PIPE
+from subprocess import PIPE
+import sys
+import shutil
 from typing import cast, NamedTuple
 
 import appdirs
@@ -18,8 +20,7 @@ logging.basicConfig(format="%(name)s - %(levelname)s - %(message)s", level=loggi
 logger = logging.getLogger("freva-deployment")
 
 RichConsole = Console(markup=True, force_terminal=True)
-config_dir = Path(appdirs.user_config_dir()) / "freva" / "deployment"
-asset_dir = Path(appdirs.user_data_dir()) / "freva" / "deployment"
+
 password_prompt = (
     "[green]Choose[/] a [b]master password[/], this password will be used to:\n"
     "- create the [magenta]mysql root[/] password\n"
@@ -33,6 +34,34 @@ ServiceInfo = NamedTuple(
 )
 
 
+class AssetDir:
+    def __init__(self):
+
+        self._user_asset_dir = Path(appdirs.user_data_dir()) / "freva" / "deployment"
+        self._user_config_dir = Path(appdirs.user_config_dir()) / "freva" / "deployment"
+        self._central_asset_dir = Path(sys.exec_prefix) / "freva" / "deployment"
+
+    @property
+    def asset_dir(self):
+        if self._user_asset_dir.exists():
+            return self._user_asset_dir
+        return self._central_asset_dir
+
+    @property
+    def config_dir(self):
+        inventory_file = self._user_config_dir / "inventory.toml"
+        if inventory_file.exists():
+            return self._user_config_dir
+        self._user_config_dir.mkdir(exist_ok=True, parents=True)
+        shutil.copy(self.asset_dir / "config" / "inventory.toml", inventory_file)
+        return self._user_config_dir
+
+
+AD = AssetDir()
+asset_dir = AD.asset_dir
+config_dir = AD.config_dir
+
+
 def guess_map_server(
     inp_server: str | None, default_port: int = 6111, mandatory: bool = True
 ) -> str:
-- 
GitLab