Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions sarracenia/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,13 @@ def naturalDelta(value, months=True, minimum_unit='seconds'):
return "%d" % value


if features['appdirs']['present']:
if features['platformdirs']['present']:
import platformdirs as appdirs
elif features['appdirs']['present']:
import appdirs

if features['platformdirs']['present'] or features['appdirs']['present']:

def site_config_dir( app, author ):
return appdirs.site_config_dir( app, author )

Expand All @@ -117,7 +121,7 @@ def user_config_dir( app, author ):
def user_cache_dir( app, author ):
return appdirs.user_cache_dir( app, author )
else:
# if appdirs is missing, pretend we're on Linux.
# if appdirs/platformdirs is missing, pretend we're on Linux.
import pathlib

def site_config_dir( app, author ):
Expand Down
8 changes: 5 additions & 3 deletions sarracenia/featuredetection.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,11 @@
'azurestorage' : { 'modules_needed': [ 'azure.storage.blob' ], 'present': False,
'lament' : 'cannot connect natively to Azure Stoarge accounts',
'rejoice' : 'can connect natively to Azure Stoarge accounts' },
'appdirs' : { 'modules_needed': [ 'appdirs' ], 'present': False,
'lament' : 'assume linux file placement under home dir',
'appdirs' : { 'modules_needed': [ 'appdirs' ], 'present': False,
'lament' : 'assume linux file placement under home dir',
'rejoice': 'place configuration and state files appropriately for platform (windows/mac/linux)', },
'platformdirs' : { 'modules_needed': [ 'platformdirs' ], 'present': False,
'lament' : 'assume linux file placement under home dir',
'rejoice': 'place configuration and state files appropriately for platform (windows/mac/linux)', },
'filetypes' : { 'modules_needed': ['magic'], 'present': False,
'lament': '(pip package python-magic, on windows python-magic-bin) will not be able to set content headers' ,
Expand Down Expand Up @@ -143,4 +146,3 @@
features['mqtt']['present'] = False
logger.debug('paho-mqtt minimum version needed is 2.1.0')


12 changes: 10 additions & 2 deletions tests/sarracenia/featuredetection_test.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import pytest
from tests.conftest import *
#from unittest.mock import Mock
# from unittest.mock import Mock

import sarracenia.config
import sarracenia.featuredetection
import sarracenia.featuredetection


def test_platformdirs_is_a_separate_feature():
assert 'appdirs' in sarracenia.featuredetection.features
assert 'platformdirs' in sarracenia.featuredetection.features
assert sarracenia.featuredetection.features['appdirs']['modules_needed'] == ['appdirs']
assert sarracenia.featuredetection.features['platformdirs']['modules_needed'] == ['platformdirs']
assert 'Alternate_modules' not in sarracenia.featuredetection.features['appdirs']
77 changes: 77 additions & 0 deletions tests/sarracenia/platformdirs_import_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import sys
import types
from pathlib import Path


def _exec_sarracenia_init_with_features(features, modules):
init_path = Path(__file__).parents[2] / "sarracenia" / "__init__.py"
old_modules = {}
for name, module in modules.items():
old_modules[name] = sys.modules.get(name)
sys.modules[name] = module

namespace = {
"__file__": str(init_path),
"__name__": "sarracenia_platformdirs_test",
"features": features,
}
lines = init_path.read_text().splitlines()
start = next(index for index, line in enumerate(lines) if line.startswith("if features['humanize']['present']:"))
end = next(index for index, line in enumerate(lines) if line.startswith('"""') and index > start)
try:
exec("\n".join(lines[start:end]), namespace)
finally:
for name, module in old_modules.items():
if module is None:
sys.modules.pop(name, None)
else:
sys.modules[name] = module

return namespace


def test_platformdirs_preferred_over_appdirs():
platformdirs = types.SimpleNamespace(
site_config_dir=lambda app, author: f"platform-site/{app}/{author}",
user_config_dir=lambda app, author: f"platform-config/{app}/{author}",
user_cache_dir=lambda app, author: f"platform-cache/{app}/{author}",
)
appdirs = types.SimpleNamespace(
site_config_dir=lambda app, author: f"appdirs-site/{app}/{author}",
user_config_dir=lambda app, author: f"appdirs-config/{app}/{author}",
user_cache_dir=lambda app, author: f"appdirs-cache/{app}/{author}",
)

namespace = _exec_sarracenia_init_with_features(
{
'humanize': {'present': False},
'platformdirs': {'present': True},
'appdirs': {'present': True},
},
{'platformdirs': platformdirs, 'appdirs': appdirs},
)

assert namespace['site_config_dir']('sr3', 'MetPX') == 'platform-site/sr3/MetPX'
assert namespace['user_config_dir']('sr3', 'MetPX') == 'platform-config/sr3/MetPX'
assert namespace['user_cache_dir']('sr3', 'MetPX') == 'platform-cache/sr3/MetPX'


def test_appdirs_used_when_platformdirs_missing():
appdirs = types.SimpleNamespace(
site_config_dir=lambda app, author: f"appdirs-site/{app}/{author}",
user_config_dir=lambda app, author: f"appdirs-config/{app}/{author}",
user_cache_dir=lambda app, author: f"appdirs-cache/{app}/{author}",
)

namespace = _exec_sarracenia_init_with_features(
{
'humanize': {'present': False},
'platformdirs': {'present': False},
'appdirs': {'present': True},
},
{'appdirs': appdirs},
)

assert namespace['site_config_dir']('sr3', 'MetPX') == 'appdirs-site/sr3/MetPX'
assert namespace['user_config_dir']('sr3', 'MetPX') == 'appdirs-config/sr3/MetPX'
assert namespace['user_cache_dir']('sr3', 'MetPX') == 'appdirs-cache/sr3/MetPX'
Loading