annotate mamba/options.py @ 552:b2e0f1267282

Add test mode to README. Tweak help text
author Neil Muller <drnlmuller@gmail.com>
date Wed, 21 Sep 2011 14:19:45 +0200
parents d759f49c477d
children fca61cd8fc33
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
39
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 # global options that are set on startup
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 import optparse
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4 import os
166
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
5 import sys
39
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
6 from mamba.constants import DEFAULTS
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
7
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
8
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
9 class OptionGetter(object):
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10 """Object grabber."""
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
11
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
12 def __init__(self, options):
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13 self._options = options
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
14 self._finalized = False
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
15
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
16 def set_option(self, name, value):
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
17 if self._finalized:
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
18 raise RuntimeError("Cannot set option %r to %r after"
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
19 "options are finalized." % (name, value))
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
20 self._options[name] = value
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
21
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
22 def finalize(self):
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
23 self._finalized = True
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
24
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
25 def __getattr__(self, name):
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
26 if name in self._options:
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
27 return self._options[name]
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
28 raise AttributeError("Unknown option %r" % (name,))
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
29
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
30 options = OptionGetter(DEFAULTS.copy())
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
31
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
32
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
33 def parse_args(args, options=options):
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
34 options.set_option('debug', 'DEBUG' in os.environ)
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
35
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
36 parser = optparse.OptionParser()
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
37 parser.add_option("--no-sound", action="store_false", default=True,
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
38 dest="sound", help="disable sound")
166
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
39 parser.add_option("--save-location", default=_get_default_save_location(),
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
40 dest="save_location", help="Saved game location")
39
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
41
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
42 if options.debug:
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
43 parser.add_option("--level", type="str", default=None,
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
44 dest="level", help="Initial level")
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
45 parser.add_option('--edit', action="store_true", default=False,
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
46 dest="edit", help="Edit given level")
362
cc8be536a7fc Add ability to play uncurated levels via the command line.
Simon Cross <hodgestar@gmail.com>
parents: 166
diff changeset
47 parser.add_option("--uncurated", type="str", default=None,
cc8be536a7fc Add ability to play uncurated levels via the command line.
Simon Cross <hodgestar@gmail.com>
parents: 166
diff changeset
48 dest="uncurated", help="Load uncurated level "
cc8be536a7fc Add ability to play uncurated levels via the command line.
Simon Cross <hodgestar@gmail.com>
parents: 166
diff changeset
49 "from the web by name.")
366
d759f49c477d Option for printing list of uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 362
diff changeset
50 parser.add_option("--list-uncurated", action="store_true",
d759f49c477d Option for printing list of uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 362
diff changeset
51 default=False, dest="list_uncurated",
d759f49c477d Option for printing list of uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 362
diff changeset
52 help="List uncurated levels.")
39
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
53
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
54 opts, _ = parser.parse_args(args)
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
55
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
56 options.set_option('sound', opts.sound)
166
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
57 options.set_option('save_location', opts.save_location)
39
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
58
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
59 if options.debug:
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
60 options.set_option('level', opts.level)
362
cc8be536a7fc Add ability to play uncurated levels via the command line.
Simon Cross <hodgestar@gmail.com>
parents: 166
diff changeset
61 options.set_option('uncurated', opts.uncurated)
366
d759f49c477d Option for printing list of uncurated levels.
Simon Cross <hodgestar@gmail.com>
parents: 362
diff changeset
62 options.set_option('list_uncurated', opts.list_uncurated)
39
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
63 options.set_option('edit', opts.edit)
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
64
3ab5097e8757 Refactor options.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
65 options.finalize()
48
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
66
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
67
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
68 def check_args(options=options):
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
69 """Check options and complain if they're invalid."""
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
70 if options.edit and options.level is None:
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
71 print "You must supply --level when using --edit."
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
72 return False
a70ded879f46 Move argument checking into mamba.options.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
73 return True
166
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
74
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
75
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
76 def _get_default_save_location():
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
77 """Return a default save game location."""
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
78 app = "mamba"
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
79 if sys.platform.startswith("win"):
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
80 if "APPDATA" in os.environ:
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
81 return os.path.join(os.environ["APPDATA"], app)
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
82 return os.path.join(os.path.expanduser("~"), "." + app)
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
83 elif 'XDG_DATA_HOME' in os.environ:
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
84 return os.path.join(os.environ["XDG_DATA_HOME"], app)
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 48
diff changeset
85 return os.path.join(os.path.expanduser("~"), ".local", "share", app)