| Index: boto/pyami/config.py | 
| diff --git a/boto/pyami/config.py b/boto/pyami/config.py | 
| index f4613ab549b246f213299ca0b52dbd8bf93c5eb1..d75e79106c724f36c65111c5a49ec578f189c556 100644 | 
| --- a/boto/pyami/config.py | 
| +++ b/boto/pyami/config.py | 
| @@ -1,4 +1,5 @@ | 
| # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ | 
| +# Copyright (c) 2011 Chris Moyer http://coredumped.org/ | 
| # | 
| # Permission is hereby granted, free of charge, to any person obtaining a | 
| # copy of this software and associated documentation files (the | 
| @@ -20,18 +21,39 @@ | 
| # IN THE SOFTWARE. | 
| # | 
| import StringIO, os, re | 
| +import warnings | 
| import ConfigParser | 
| import boto | 
|  | 
| +# If running in Google App Engine there is no "user" and | 
| +# os.path.expanduser() will fail. Attempt to detect this case and use a | 
| +# no-op expanduser function in this case. | 
| +try: | 
| +  os.path.expanduser('~') | 
| +  expanduser = os.path.expanduser | 
| +except (AttributeError, ImportError): | 
| +  # This is probably running on App Engine. | 
| +  expanduser = (lambda x: x) | 
| + | 
| +# By default we use two locations for the boto configurations, | 
| +# /etc/boto.cfg and ~/.boto (which works on Windows and Unix). | 
| BotoConfigPath = '/etc/boto.cfg' | 
| BotoConfigLocations = [BotoConfigPath] | 
| +UserConfigPath = os.path.join(expanduser('~'), '.boto') | 
| +BotoConfigLocations.append(UserConfigPath) | 
| + | 
| +# If there's a BOTO_CONFIG variable set, we load ONLY | 
| +# that variable | 
| if 'BOTO_CONFIG' in os.environ: | 
| -    BotoConfigLocations = [os.path.expanduser(os.environ['BOTO_CONFIG'])] | 
| -elif 'HOME' in os.environ: | 
| -    UserConfigPath = os.path.expanduser('~/.boto') | 
| -    BotoConfigLocations.append(UserConfigPath) | 
| -else: | 
| -    UserConfigPath = None | 
| +    BotoConfigLocations = [expanduser(os.environ['BOTO_CONFIG'])] | 
| + | 
| +# If there's a BOTO_PATH variable set, we use anything there | 
| +# as the current configuration locations, split with colons | 
| +elif 'BOTO_PATH' in os.environ: | 
| +    BotoConfigLocations = [] | 
| +    for path in os.environ['BOTO_PATH'].split(":"): | 
| +        BotoConfigLocations.append(expanduser(path)) | 
| + | 
|  | 
| class Config(ConfigParser.SafeConfigParser): | 
|  | 
| @@ -46,7 +68,11 @@ class Config(ConfigParser.SafeConfigParser): | 
| else: | 
| self.read(BotoConfigLocations) | 
| if "AWS_CREDENTIAL_FILE" in os.environ: | 
| -                self.load_credential_file(os.path.expanduser(os.environ['AWS_CREDENTIAL_FILE'])) | 
| +                full_path = expanduser(os.environ['AWS_CREDENTIAL_FILE']) | 
| +                try: | 
| +                    self.load_credential_file(full_path) | 
| +                except IOError: | 
| +                    warnings.warn('Unable to load AWS_CREDENTIAL_FILE (%s)' % full_path) | 
|  | 
| def load_credential_file(self, path): | 
| """Load a credential file as is setup like the Java utilities""" | 
| @@ -170,7 +196,11 @@ class Config(ConfigParser.SafeConfigParser): | 
| fp.write('%s = %s\n' % (option, self.get(section, option))) | 
|  | 
| def dump_to_sdb(self, domain_name, item_name): | 
| -        import simplejson | 
| +        try: | 
| +            import simplejson as json | 
| +        except ImportError: | 
| +            import json | 
| + | 
| sdb = boto.connect_sdb() | 
| domain = sdb.lookup(domain_name) | 
| if not domain: | 
| @@ -181,18 +211,22 @@ class Config(ConfigParser.SafeConfigParser): | 
| d = {} | 
| for option in self.options(section): | 
| d[option] = self.get(section, option) | 
| -            item[section] = simplejson.dumps(d) | 
| +            item[section] = json.dumps(d) | 
| item.save() | 
|  | 
| def load_from_sdb(self, domain_name, item_name): | 
| -        import simplejson | 
| +        try: | 
| +            import json | 
| +        except ImportError: | 
| +            import simplejson as json | 
| + | 
| sdb = boto.connect_sdb() | 
| domain = sdb.lookup(domain_name) | 
| item = domain.get_item(item_name) | 
| for section in item.keys(): | 
| if not self.has_section(section): | 
| self.add_section(section) | 
| -            d = simplejson.loads(item[section]) | 
| +            d = json.loads(item[section]) | 
| for attr_name in d.keys(): | 
| attr_value = d[attr_name] | 
| if attr_value == None: | 
|  |