Skip to content

Commit 7b5aa33

Browse files
authored
Merge pull request #44 from Contraz/settings-cleanup
Simplify a ridiculous way of generating a settings file
2 parents cd9beff + 1fc8fef commit 7b5aa33

File tree

4 files changed

+88
-138
lines changed

4 files changed

+88
-138
lines changed

demosys/conf/__init__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import importlib
55
import os
66

7-
from demosys.conf import default_settings
7+
from demosys.conf import default
88
from demosys.core.exceptions import ImproperlyConfigured
99

1010
ENVIRONMENT_VARIABLE = "DEMOSYS_SETTINGS_MODULE"
@@ -13,10 +13,11 @@
1313

1414

1515
class Settings:
16+
SETTINGS_MODULE = None
1617
SHADER_DIRS = []
1718
TEXTURE_DIRS = []
1819
DATA_DIRS = []
19-
SETTINGS_MODULE = None
20+
SCENE_DIRS = []
2021

2122
def __init__(self):
2223
settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
@@ -27,9 +28,9 @@ def __init__(self):
2728
)
2829

2930
# Update this dict from global settings
30-
for setting in dir(default_settings):
31+
for setting in dir(default):
3132
if setting.isupper():
32-
setattr(self, setting, getattr(default_settings, setting))
33+
setattr(self, setting, getattr(default, setting))
3334

3435
# Read the supplied settings module
3536
self.SETTINGS_MODULE = settings_module

demosys/conf/default_settings.py renamed to demosys/conf/default.py

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,16 @@
1-
"""
2-
Default settings for demosys. Override using a settings module.
3-
"""
4-
5-
# What attributes should be used when generating a settings file
6-
__ORDER__ = (
7-
'DEBUG',
8-
'SCREENSHOT_PATH',
9-
'OPENGL',
10-
'WINDOW',
11-
'MUSIC',
12-
'TIMER',
13-
'ROCKET',
14-
'EFFECTS',
15-
'EFFECT_MANAGER',
16-
'SHADER_DIRS',
17-
'SHADER_FINDERS',
18-
'TEXTURE_DIRS',
19-
'TEXTURE_FINDERS',
20-
'SCENE_DIRS',
21-
'SCENE_FINDERS',
22-
'SCENE_LOADERS',
23-
'DATA_DIRS',
24-
'DATA_FINDERS',
25-
)
1+
import os
262

27-
DEBUG = False
3+
PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
284

29-
SCREENSHOT_PATH = None
5+
SCREENSHOT_PATH = os.path.join(PROJECT_DIR, 'screenshots')
306

317
# OpenGL context configuration
328
# version: (MAJOR, MINOR)
339
OPENGL = {
3410
"version": (3, 3),
3511
}
3612

37-
# Window size
13+
# Window / context properties
3814
WINDOW = {
3915
"class": "demosys.context.glfw.GLFW_Window",
4016
"size": (1280, 720),
@@ -63,7 +39,7 @@
6339

6440
EFFECT_MANAGER = 'demosys.effects.managers.SingleEffectManager'
6541

66-
# Raise errors when uniforms are assigned with incorrect type
42+
# Raise errors when shader uniforms are assigned incorrectly
6743
# Otherwise just print the errors to terminal
6844
SHADER_STRICT_VALIDATION = False
6945

@@ -73,23 +49,22 @@
7349
'geometry_shader_suffix': ('geom', '_gs.glsl', '.glslg'),
7450
}
7551

76-
# Additional directories shaders can be found
7752
SHADER_DIRS = ()
7853

79-
# Finder
8054
SHADER_FINDERS = (
8155
'demosys.core.shaderfiles.finders.FileSystemFinder',
8256
'demosys.core.shaderfiles.finders.EffectDirectoriesFinder'
8357
)
8458

85-
# Additonal directories textures can be found
8659
TEXTURE_DIRS = ()
60+
8761
TEXTURE_FINDERS = (
8862
'demosys.core.texturefiles.finders.FileSystemFinder',
8963
'demosys.core.texturefiles.finders.EffectDirectoriesFinder'
9064
)
9165

9266
SCENE_DIRS = ()
67+
9368
SCENE_FINDERS = (
9469
"demosys.core.scenefiles.finders.FileSystemFinder",
9570
"demosys.core.scenefiles.finders.EffectDirectoriesFinder",
@@ -101,6 +76,7 @@
10176
)
10277

10378
DATA_DIRS = ()
79+
10480
DATA_FINDERS = (
10581
"demosys.core.datafiles.finders.FileSystemFinder",
10682
"demosys.core.datafiles.finders.EffectDirectoriesFinder",

demosys/conf/settingsfile.py

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,19 @@
1+
import os
12

23

3-
def create(settings):
4+
def create(**kwargs):
45
"""
5-
Return a string representation of the settings.
6-
This is an extremely ugly way of doing this, but it works for now!
6+
Return a string representing a new default settings file for a project
77
"""
8-
# FIXME: Use a template system for generating settings file
9-
data = "# Auto generated settings file\n" \
10-
"import os\n" \
11-
"PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))\n\n"
12-
13-
for name in settings.__ORDER__:
14-
value = getattr(settings, name)
15-
16-
if isinstance(value, dict):
17-
value = ",\n".join(' "{}": {}'.format(k, to_s(v)) for k, v in value.items())
18-
19-
# Add comma after the last dict entry
20-
if value:
21-
value += ','
22-
23-
data += "%s = {\n%s\n}\n\n" % (name, value)
24-
25-
elif isinstance(value, tuple):
26-
value = ",\n".join(" {}".format(to_s(v)) for v in value)
27-
28-
# Add comma after the last tuple entry
29-
if value:
30-
value += ","
31-
32-
data += "{} = (\n{}\n)\n\n".format(name, value)
33-
34-
elif value is None:
35-
data += "{} = {}\n\n".format(name, value)
36-
37-
# Return config excluding last newline
38-
return data[:-1]
39-
40-
41-
def to_s(var):
42-
if isinstance(var, str):
43-
return '"{}"'.format(var)
44-
else:
45-
return str(var)
8+
template_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'default.py')
9+
data = ""
10+
with open(template_file, 'r') as fd:
11+
data = fd.read()
12+
13+
header = (
14+
'"""\n'
15+
'Auto generated settings file for project {}\n'
16+
'"""\n'
17+
).format(kwargs.get('name'))
18+
19+
return header + data
Lines changed: 60 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,60 @@
1-
import os
2-
from demosys.core.management.base import CreateCommand
3-
4-
5-
class Command(CreateCommand):
6-
help = "Create a project"
7-
8-
def add_arguments(self, parser):
9-
parser.add_argument("name", help="Name of the project")
10-
11-
def handle(self, *args, **options):
12-
name = options['name']
13-
14-
# Check for python module collision
15-
self.try_import(name)
16-
17-
# Is the name a valid identifier?
18-
self.validate_name(name)
19-
20-
# Make sure we don't mess with existing directories
21-
if os.path.exists(name):
22-
print("Directory {} already exist. Aborting.".format(name))
23-
return
24-
25-
manage_file = 'manage.py'
26-
if os.path.exists(manage_file):
27-
print("A manage.py file already exist in the current directory. Aborting.")
28-
return
29-
30-
# Create the project directory
31-
os.makedirs(name)
32-
33-
# Use the default settings file
34-
os.environ['DEMOSYS_SETTINGS_MODULE'] = 'demosys.conf.default_settings'
35-
from demosys.conf import settings
36-
from demosys.conf import settingsfile
37-
38-
with open(os.path.join(name, 'settings.py'), 'w') as fd:
39-
fd.write(settingsfile.create(settings))
40-
41-
with open(manage_file, 'w') as fd:
42-
fd.write(gen_manage_py(name))
43-
44-
os.chmod(manage_file, 0o777)
45-
46-
47-
def gen_manage_py(project_name):
48-
lines = [
49-
'#!/usr/bin/env python3',
50-
'import os',
51-
'import sys',
52-
'',
53-
'if __name__ == "__main__":',
54-
' os.environ.setdefault("DEMOSYS_SETTINGS_MODULE", "{}.settings")'.format(project_name),
55-
'',
56-
' from demosys.core.management import execute_from_command_line',
57-
'',
58-
' execute_from_command_line(sys.argv)',
59-
'',
60-
]
61-
return "\n".join(lines)
1+
import os
2+
from demosys.core.management.base import CreateCommand
3+
4+
5+
class Command(CreateCommand):
6+
help = "Create a project"
7+
8+
def add_arguments(self, parser):
9+
parser.add_argument("name", help="Name of the project")
10+
11+
def handle(self, *args, **options):
12+
name = options['name']
13+
14+
# Check for python module collision
15+
self.try_import(name)
16+
17+
# Is the name a valid identifier?
18+
self.validate_name(name)
19+
20+
# Make sure we don't mess with existing directories
21+
if os.path.exists(name):
22+
print("Directory {} already exist. Aborting.".format(name))
23+
return
24+
25+
manage_file = 'manage.py'
26+
if os.path.exists(manage_file):
27+
print("A manage.py file already exist in the current directory. Aborting.")
28+
return
29+
30+
# Create the project directory
31+
os.makedirs(name)
32+
33+
# Use the default settings file
34+
os.environ['DEMOSYS_SETTINGS_MODULE'] = 'demosys.conf.default'
35+
from demosys.conf import settingsfile
36+
37+
with open(os.path.join(name, 'settings.py'), 'w') as fd:
38+
fd.write(settingsfile.create(name=name))
39+
40+
with open(manage_file, 'w') as fd:
41+
fd.write(gen_manage_py(name))
42+
43+
os.chmod(manage_file, 0o777)
44+
45+
46+
def gen_manage_py(project_name):
47+
lines = [
48+
'#!/usr/bin/env python3',
49+
'import os',
50+
'import sys',
51+
'',
52+
'if __name__ == "__main__":',
53+
' os.environ.setdefault("DEMOSYS_SETTINGS_MODULE", "{}.settings")'.format(project_name),
54+
'',
55+
' from demosys.core.management import execute_from_command_line',
56+
'',
57+
' execute_from_command_line(sys.argv)',
58+
'',
59+
]
60+
return "\n".join(lines)

0 commit comments

Comments
 (0)