All unit-tests now pass with Python 3
[zeroinstall/solver.git] / zeroinstall / injector / config.py
blob4c081fb921c751b63a101cf6b5bb626c18cde6c7
1 """
2 Holds user settings and various helper objects.
3 @since: 0.53
4 """
6 # Copyright (C) 2011, Thomas Leonard
7 # See the README file for details, or visit http://0install.net.
9 from zeroinstall import support, _
10 import os
11 from logging import info, warn
13 try:
14 import ConfigParser
15 except ImportError:
16 import configparser as ConfigParser
18 from zeroinstall import zerostore
19 from zeroinstall.injector.model import network_levels, network_full
20 from zeroinstall.injector.namespaces import config_site, config_prog
21 from zeroinstall.support import basedir
23 DEFAULT_FEED_MIRROR = "http://roscidus.com/0mirror"
24 DEFAULT_KEY_LOOKUP_SERVER = 'https://keylookup.appspot.com'
26 class Config(object):
27 """
28 @ivar auto_approve_keys: whether to approve known keys automatically
29 @type auto_approve_keys: bool
30 @ivar handler: handler for main-loop integration
31 @type handler: L{handler.Handler}
32 @ivar key_info_server: the base URL of a key information server
33 @type key_info_server: str
34 @ivar feed_mirror: the base URL of a mirror site for keys and feeds
35 @type feed_mirror: str | None
36 @ivar freshness: seconds since a feed was last checked before it is considered stale
37 @type freshness: int
38 """
40 __slots__ = ['help_with_testing', 'freshness', 'network_use', 'feed_mirror', 'key_info_server', 'auto_approve_keys',
41 '_fetcher', '_stores', '_iface_cache', '_handler', '_trust_mgr', '_trust_db', '_app_mgr']
43 def __init__(self, handler = None):
44 self.help_with_testing = False
45 self.freshness = 60 * 60 * 24 * 30
46 self.network_use = network_full
47 self._handler = handler
48 self._app_mgr = self._fetcher = self._stores = self._iface_cache = self._trust_mgr = self._trust_db = None
49 self.feed_mirror = DEFAULT_FEED_MIRROR
50 self.key_info_server = DEFAULT_KEY_LOOKUP_SERVER
51 self.auto_approve_keys = True
53 @property
54 def stores(self):
55 if not self._stores:
56 self._stores = zerostore.Stores()
57 return self._stores
59 @property
60 def iface_cache(self):
61 if not self._iface_cache:
62 from zeroinstall.injector import iface_cache
63 self._iface_cache = iface_cache.iface_cache
64 #self._iface_cache = iface_cache.IfaceCache()
65 return self._iface_cache
67 @property
68 def fetcher(self):
69 if not self._fetcher:
70 from zeroinstall.injector import fetch
71 self._fetcher = fetch.Fetcher(self)
72 return self._fetcher
74 @property
75 def trust_mgr(self):
76 if not self._trust_mgr:
77 from zeroinstall.injector import trust
78 self._trust_mgr = trust.TrustMgr(self)
79 return self._trust_mgr
81 @property
82 def trust_db(self):
83 from zeroinstall.injector import trust
84 self._trust_db = trust.trust_db
86 @property
87 def handler(self):
88 if not self._handler:
89 from zeroinstall.injector import handler
90 if os.isatty(1):
91 self._handler = handler.ConsoleHandler()
92 else:
93 self._handler = handler.Handler()
94 return self._handler
96 @property
97 def app_mgr(self):
98 if not self._app_mgr:
99 from zeroinstall import apps
100 self._app_mgr = apps.AppManager(self)
101 return self._app_mgr
103 def save_globals(self):
104 """Write global settings."""
105 parser = ConfigParser.ConfigParser()
106 parser.add_section('global')
108 parser.set('global', 'help_with_testing', str(self.help_with_testing))
109 parser.set('global', 'network_use', self.network_use)
110 parser.set('global', 'freshness', str(self.freshness))
111 parser.set('global', 'auto_approve_keys', str(self.auto_approve_keys))
113 path = basedir.save_config_path(config_site, config_prog)
114 path = os.path.join(path, 'global')
115 with open(path + '.new', 'wt') as stream:
116 parser.write(stream)
117 support.portable_rename(path + '.new', path)
119 def load_config(handler = None):
120 config = Config(handler)
121 parser = ConfigParser.RawConfigParser()
122 parser.add_section('global')
123 parser.set('global', 'help_with_testing', 'False')
124 parser.set('global', 'freshness', str(60 * 60 * 24 * 30)) # One month
125 parser.set('global', 'network_use', 'full')
126 parser.set('global', 'auto_approve_keys', 'True')
128 path = basedir.load_first_config(config_site, config_prog, 'global')
129 if path:
130 info("Loading configuration from %s", path)
131 try:
132 parser.read(path)
133 except Exception as ex:
134 warn(_("Error loading config: %s"), str(ex) or repr(ex))
136 config.help_with_testing = parser.getboolean('global', 'help_with_testing')
137 config.network_use = parser.get('global', 'network_use')
138 config.freshness = int(parser.get('global', 'freshness'))
139 config.auto_approve_keys = parser.getboolean('global', 'auto_approve_keys')
141 assert config.network_use in network_levels, config.network_use
143 return config