1
0
Fork 0

feat: add app handler method, get_appdir()

This commit is contained in:
Lance Edgar 2024-08-25 12:33:52 -05:00
parent 4b9db13b8f
commit 94868bbaa9
4 changed files with 97 additions and 1 deletions

View file

@ -25,6 +25,9 @@ Glossary
Usually this is named ``app`` and is located at the root of the Usually this is named ``app`` and is located at the root of the
virtual environment. virtual environment.
Can be retrieved via
:meth:`~wuttjamaican.app.AppHandler.get_appdir()`.
app enum app enum
Python module whose namespace contains all the "enum" values Python module whose namespace contains all the "enum" values
used by the :term:`app`. Available on the :term:`app handler` used by the :term:`app`. Available on the :term:`app handler`

View file

@ -26,6 +26,7 @@ WuttJamaican - app handler
import importlib import importlib
import os import os
import sys
import warnings import warnings
from wuttjamaican.util import (load_entry_points, load_object, from wuttjamaican.util import (load_entry_points, load_object,
@ -353,6 +354,54 @@ class AppHandler:
""" """
return load_object(spec) return load_object(spec)
def get_appdir(self, *args, **kwargs):
"""
Returns path to the :term:`app dir`.
This does not check for existence of the path, it only reads
it from config or (optionally) provides a default path.
:param configured_only: Pass ``True`` here if you only want
the configured path and ignore the default path.
:param create: Pass ``True`` here if you want to ensure the
returned path exists, creating it if necessary.
:param \*args: Any additional args will be added as child
paths for the final value.
For instance, assuming ``/srv/envs/poser`` is the virtual
environment root::
app.get_appdir() # => /srv/envs/poser/app
app.get_appdir('data') # => /srv/envs/poser/app/data
"""
configured_only = kwargs.pop('configured_only', False)
create = kwargs.pop('create', False)
# maybe specify default path
if not configured_only:
path = os.path.join(sys.prefix, 'app')
kwargs.setdefault('default', path)
# get configured path
kwargs.setdefault('usedb', False)
path = self.config.get(f'{self.appname}.appdir', **kwargs)
# add any subpath info
if path and args:
path = os.path.join(path, *args)
# create path if requested/needed
if create:
if not path:
raise ValueError("appdir path unknown! so cannot create it.")
if not os.path.exists(path):
os.makedirs(path)
return path
def make_appdir(self, path, subfolders=None, **kwargs): def make_appdir(self, path, subfolders=None, **kwargs):
""" """
Establish an :term:`app dir` at the given path. Establish an :term:`app dir` at the given path.

View file

@ -97,3 +97,11 @@ class FileConfigTestCase(TestCase):
with open(path, 'wt') as f: with open(path, 'wt') as f:
f.write(content) f.write(content)
return path return path
def mkdir(self, dirname):
"""
Make a new temporary folder and return its path.
Note that this will be created *underneath* :attr:`tempdir`.
"""
return tempfile.mkdtemp(dir=self.tempdir)

View file

@ -15,11 +15,13 @@ from wuttjamaican import app
from wuttjamaican.progress import ProgressBase from wuttjamaican.progress import ProgressBase
from wuttjamaican.conf import WuttaConfig from wuttjamaican.conf import WuttaConfig
from wuttjamaican.util import UNSPECIFIED from wuttjamaican.util import UNSPECIFIED
from wuttjamaican.testing import FileConfigTestCase
class TestAppHandler(TestCase): class TestAppHandler(FileConfigTestCase):
def setUp(self): def setUp(self):
self.setup_files()
self.config = WuttaConfig(appname='wuttatest') self.config = WuttaConfig(appname='wuttatest')
self.app = app.AppHandler(self.config) self.app = app.AppHandler(self.config)
self.config.app = self.app self.config.app = self.app
@ -39,6 +41,40 @@ class TestAppHandler(TestCase):
obj = self.app.load_object('wuttjamaican.util:UNSPECIFIED') obj = self.app.load_object('wuttjamaican.util:UNSPECIFIED')
self.assertIs(obj, UNSPECIFIED) self.assertIs(obj, UNSPECIFIED)
def test_get_appdir(self):
mockdir = self.mkdir('mockdir')
# default appdir
with patch.object(sys, 'prefix', new=mockdir):
# default is returned by default
appdir = self.app.get_appdir()
self.assertEqual(appdir, os.path.join(mockdir, 'app'))
# but not if caller wants config only
appdir = self.app.get_appdir(configured_only=True)
self.assertIsNone(appdir)
# also, cannot create if appdir path not known
self.assertRaises(ValueError, self.app.get_appdir, configured_only=True, create=True)
# configured appdir
self.config.setdefault('wuttatest.appdir', mockdir)
appdir = self.app.get_appdir()
self.assertEqual(appdir, mockdir)
# appdir w/ subpath
appdir = self.app.get_appdir('foo', 'bar')
self.assertEqual(appdir, os.path.join(mockdir, 'foo', 'bar'))
# subpath is created
self.assertEqual(len(os.listdir(mockdir)), 0)
appdir = self.app.get_appdir('foo', 'bar', create=True)
self.assertEqual(appdir, os.path.join(mockdir, 'foo', 'bar'))
self.assertEqual(os.listdir(mockdir), ['foo'])
self.assertEqual(os.listdir(os.path.join(mockdir, 'foo')), ['bar'])
def test_make_appdir(self): def test_make_appdir(self):
# appdir is created, and 3 subfolders added by default # appdir is created, and 3 subfolders added by default