Skip to content

Commit 96f471d

Browse files
author
Uwe Schmitt
committed
[CODE] refactored config.py
1 parent ca0b90c commit 96f471d

File tree

7 files changed

+174
-88
lines changed

7 files changed

+174
-88
lines changed

Diff for: emzed/core/config.py

+79-53
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,105 @@
1-
import pdb
21
#encoding: latin-1
32

4-
import guidata.dataset.datatypes as dt
5-
import guidata.dataset.dataitems as di
6-
import guidata.userconfig
3+
# keep namespace clean:
74

8-
is_expert = dt.ValueProp(False)
5+
import guidata.dataset.datatypes as _dt
6+
import guidata.dataset.dataitems as _di
97

10-
class UserConfig(dt.DataSet):
8+
_is_expert = _dt.ValueProp(False)
119

12-
g1 = dt.BeginGroup("User Settings")
10+
class _UserConfig(object):
1311

14-
user_name = di.StringItem("Full Name", notempty=True)
15-
user_email = di.StringItem("Email Adress", notempty=True)
16-
user_url = di.StringItem("Website URL")
1712

18-
_g1 = dt.EndGroup("User Settings")
13+
class Parameters(_dt.DataSet):
1914

20-
g2 = dt.BeginGroup("Webservice Settings")
15+
g1 = _dt.BeginGroup("User Settings")
2116

22-
metlin_token = di.StringItem("Metlin Token")
17+
user_name = _di.StringItem("Full Name", notempty=True)
18+
user_email = _di.StringItem("Email Adress", notempty=True)
19+
user_url = _di.StringItem("Website URL")
2320

24-
_g2 = dt.EndGroup("Webservice Settings")
21+
_g1 = _dt.EndGroup("User Settings")
2522

26-
g3 = dt.BeginGroup("Emzed Store User Account")
23+
g2 = _dt.BeginGroup("Webservice Settings")
2724

28-
emzed_store_user = di.StringItem("User Name")
29-
emzed_store_password = di.StringItem("User Password")
25+
metlin_token = _di.StringItem("Metlin Token")
3026

31-
_g3 = dt.EndGroup("Emzed Store Settings")
27+
_g2 = _dt.EndGroup("Webservice Settings")
3228

33-
g4 = dt.BeginGroup("Emzed Store Expert Settings")
34-
enable_expert_settings = di.BoolItem("Enable Settings").set_prop("display",
35-
store=is_expert)
36-
emzed_store_url = di.StringItem("Emzed Store URL").set_prop("display", active=is_expert)
37-
emzed_store_index_url = di.StringItem("Emzed Store Index URL").set_prop("display", active=is_expert)
38-
pypi_url = di.StringItem("PyPi URL").set_prop("display", active=is_expert)
29+
g3 = _dt.BeginGroup("Emzed Store User Account")
3930

40-
_g4 = dt.EndGroup("Expert Settings")
31+
emzed_store_user = _di.StringItem("User Name")
32+
emzed_store_password = _di.StringItem("User Password")
4133

42-
test_config = UserConfig()
34+
_g3 = _dt.EndGroup("Emzed Store Settings")
4335

44-
test_config.user_name = "Uwe Schmitt"
45-
test_config.user_email = "[email protected]"
46-
test_config.user_url = ""
36+
g4 = _dt.BeginGroup("Emzed Store Expert Settings")
37+
enable_expert_settings = _di.BoolItem("Enable Settings").set_prop("display",
38+
store=_is_expert)
39+
emzed_store_url = _di.StringItem("Emzed Store URL").set_prop("display", active=_is_expert)
40+
emzed_store_index_url = _di.StringItem("Emzed Store Index URL").set_prop("display", active=_is_expert)
41+
pypi_url = _di.StringItem("PyPi URL").set_prop("display", active=_is_expert)
4742

48-
test_config.metlin_token = ""
43+
_g4 = _dt.EndGroup("Expert Settings")
4944

50-
test_config.emzed_store_user = "uschmitt"
51-
test_config.emzed_store_password = "pillepalle"
45+
def __init__(self, *a, **kw):
46+
self.parameters = _UserConfig.Parameters()
47+
if "_no_load" not in kw:
48+
loaded = self.load()
49+
if not loaded:
50+
self.set_defaults()
51+
else:
52+
self.set_defaults()
5253

53-
test_config.emzed_store_url = "http://uweschmitt.info:3141/root/dev"
54-
test_config.emzed_store_index_url = "http://uweschmitt.info:3141/root/dev/+simple/"
55-
test_config.pypi_url = "http://testpypi.python.org/pypi"
54+
def get(self, key):
55+
val = getattr(self.parameters, key)
56+
if isinstance(val, unicode):
57+
val = val.encode("latin-1")
58+
return val
5659

57-
import os
58-
is_test = os.environ.get("IS_TEST")
59-
if is_test:
60-
config = test_config
60+
def set_(self, key, value):
61+
return setattr(self.parameters, key, value)
6162

62-
def get(key):
63-
return getattr(config, key)
63+
def get_url(self, key):
64+
return self.get(key).rstrip("/") + "/"
6465

65-
def set_(key, value):
66-
return setattr(config, key, value)
66+
def store(self, path=None):
67+
import guidata.userconfig
68+
if path is None:
69+
path = self.config_file_path()
70+
cf = guidata.userconfig.UserConfig(dict())
71+
self.parameters.write_config(cf, "emzed", "")
72+
with open(path, "wt") as fp:
73+
cf.write(fp)
6774

68-
def get_url(key):
69-
return get(key).rstrip("/") + "/"
75+
def load(self, path=None):
76+
import os
77+
import guidata.userconfig
78+
cf = guidata.userconfig.UserConfig(dict())
79+
if path is None:
80+
path = self.config_file_path()
81+
if os.path.exists(path):
82+
with open(path, "rt") as fp:
83+
try:
84+
cf.readfp(fp)
85+
self.parameters.read_config(cf, "emzed", "")
86+
return True
87+
except:
88+
pass
89+
return False
7090

71-
def store(fp):
72-
cf = guidata.userconfig.UserConfig(dict())
73-
config.write_config(cf, "emzed", "")
74-
cf.write(fp)
91+
def edit(self):
92+
self.parameters.edit()
93+
self.store()
7594

76-
def load(fp):
77-
cf = guidata.userconfig.UserConfig(dict())
78-
cf.read(fp)
79-
config.read_config(cf, "emzed", "")
95+
def config_file_path(self):
96+
import os
97+
from emzed.core.platform_dependent import getEmzedFolder
98+
return os.path.join(getEmzedFolder(), "config.ini")
99+
100+
def set_defaults(self):
101+
self.parameters.emzed_store_url = "http://uweschmitt.info:3141/root/dev"
102+
self.parameters.emzed_store_index_url = "http://uweschmitt.info:3141/root/dev/+simple/"
103+
self.parameters.pypi_url = "http://testpypi.python.org/pypi"
104+
105+
global_config = _UserConfig()

Diff for: emzed/core/packages.py

+12-14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import pdb
21
# encoding:latin-1
32

43
EMZED_PKG_MARKER_FILE = ".emzed_pkg_marker"
@@ -8,10 +7,9 @@
87
import requests
98
import subprocess
109
import pkg_resources
11-
import urllib
1210

1311
import helpers
14-
import config
12+
from config import global_config
1513
import licenses
1614

1715

@@ -155,12 +153,12 @@ def hello():
155153
""" % pkg_name)
156154

157155
with open(os.path.join(pkg_folder, "setup.py"), "w") as fp:
158-
user = config.get("emzed_store_user")
159-
password = config.get("emzed_store_password")
160-
repository = config.get_url("emzed_store_url")
161-
author = config.get("user_name")
162-
author_email = config.get("user_email")
163-
author_url = config.get("user_url")
156+
user = global_config.get("emzed_store_user")
157+
password = global_config.get("emzed_store_password")
158+
repository = global_config.get_url("emzed_store_url")
159+
author = global_config.get("user_name")
160+
author_email = global_config.get("user_email")
161+
author_url = global_config.get("user_url")
164162
fp.write(SETUP_PY_TEMPLATE % locals())
165163

166164
with open(os.path.join(pkg_folder, "LICENSE"), "w") as fp:
@@ -190,9 +188,9 @@ def create_package_scaffold(folder, pkg_name, version=(0,0,1)):
190188
_create_pkg_folder(folder, pkg_name, version)
191189

192190
def delete_from_emzed_store(pkg_name):
193-
user = config.get("emzed_store_user")
194-
password = config.get("emzed_store_password")
195-
url = config.get_url("emzed_store_url") + pkg_name
191+
user = global_config.get("emzed_store_user")
192+
password = global_config.get("emzed_store_password")
193+
url = global_config.get_url("emzed_store_url") + pkg_name
196194
response = requests.delete(url, auth=(user, password))
197195
response.raise_for_status()
198196

@@ -217,7 +215,7 @@ def install_from_emzed_store(pkg_name, version=None):
217215
if version:
218216
assert isinstance(version, tuple)
219217
assert len(version) == 3
220-
index_url = config.get_url("emzed_store_index_url")
218+
index_url = global_config.get_url("emzed_store_index_url")
221219
pkg_query = pkg_name
222220
if version:
223221
pkg_query += "==%s.%s.%s" % version
@@ -246,7 +244,7 @@ def installed_emzed_packages():
246244
return [ (p, p in extensions, p in apps) for p in packages]
247245

248246
def list_packages_from_emzed_store():
249-
url = config.get_url("emzed_store_url")
247+
url = global_config.get_url("emzed_store_url")
250248
response = helpers.get_json(url)
251249
response.raise_for_status()
252250
packages = [ name.encode("latin-1") for name in response.json()["result"]]

Diff for: emzed/core/platform_dependent.py

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import os, sys
2+
import functools
3+
4+
5+
def userShellFolderKey():
6+
import _winreg
7+
key =_winreg.OpenKey(_winreg.HKEY_CURRENT_USER,
8+
"Software\\Microsoft\\Windows\\CurrentVersion"
9+
"\\Explorer\\User Shell Folders")
10+
return key
11+
12+
def _query(key, subKey):
13+
import _winreg
14+
val, _ = _winreg.QueryValueEx(key, subKey)
15+
return _winreg.ExpandEnvironmentStrings(val)
16+
17+
def linuxdefault(path):
18+
def wrapper(fun, path=path):
19+
@functools.wraps(fun)
20+
def new_fun():
21+
if sys.platform == "win32":
22+
return fun()
23+
else:
24+
return path
25+
return new_fun
26+
return wrapper
27+
28+
29+
@linuxdefault(os.environ.get("HOME"))
30+
def getDocumentFolder():
31+
key = userShellFolderKey()
32+
return _query(key, "Personal")
33+
34+
@linuxdefault(os.environ.get("HOME"))
35+
def getAppDataFolder():
36+
key = userShellFolderKey()
37+
return _query(key, "AppData")
38+
39+
@linuxdefault(os.environ.get("HOME"))
40+
def getLocalAppDataFolder():
41+
key = userShellFolderKey()
42+
return _query(key, "Local AppData")
43+
44+
def getEmzedFolder():
45+
if sys.platform == "win32":
46+
return os.path.join(getAppDataFolder(), "emzed")
47+
else:
48+
return os.path.join(getAppDataFolder(), ".emzed")
49+
50+
51+
def getDataHome():
52+
dataHome = os.path.join(getDocumentFolder(), "emzed_files")
53+
return dataHome

Diff for: emzed/core/updaters.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# encoding:latin-1
22

3-
import config
3+
from config import global_config
44
import requests
55

66
def get_latest_emzed_version_from_pypi():
7-
url = config.get_url("pypi_url")
7+
url = global_config.get_url("pypi_url")
88
response = requests.get(url + "emzed/json")
99
response.raise_for_status()
1010
version_str = response.json()["info"]["version"]

Diff for: run_coverage_test.sh

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
py.test --cov-report term-missing --cov emzed tests/

Diff for: tests/test_config.py

+10-19
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,23 @@
11
#encoding: latin-1
22

33
import unittest
4+
import emzed.core.config
5+
import tempfile, os.path
46

5-
import emzed.core.config as config
67

78
class ConfigTests(unittest.TestCase):
89

9-
def test_config(self):
10+
def setUp(self):
11+
self.path = os.path.join(tempfile.mkdtemp(), "test_config.ini")
1012

11-
return
13+
def test_global_config(self):
14+
15+
config = emzed.core.config.global_config
1216

13-
self.assertEqual(config.get("user_name"), "Uwe Schmitt")
1417
config.set_("user_name", "Hans Dampf")
1518
self.assertEqual(config.get("user_name"), "Hans Dampf")
16-
17-
import cStringIO
18-
fp = cStringIO.StringIO()
19-
config.store(fp)
20-
fp.seek(0)
19+
config.store(self.path)
2120

2221
config.set_("user_name", "Udo Juergens")
23-
config.load(fp)
24-
25-
config.set_("user_name", "Hans Dampf")
26-
27-
28-
29-
30-
31-
32-
22+
assert config.load(self.path)
23+
self.assertEqual(config.get("user_name"), "Hans Dampf")

Diff for: tests/test_package_store.py

+17
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@
44

55
class PackageStoreTests(unittest.TestCase):
66

7+
def setUp(self):
8+
from emzed.core.config import global_config
9+
10+
global_config.parameters.user_name = "Uwe Schmitt"
11+
global_config.parameters.user_email = "[email protected]"
12+
global_config.parameters.user_url = ""
13+
14+
global_config.parameters.metlin_token = ""
15+
16+
global_config.parameters.emzed_store_user = "uschmitt"
17+
global_config.parameters.emzed_store_password = "pillepalle"
18+
19+
# for testing implicit unicode conversions:
20+
global_config.store()
21+
global_config.load()
22+
723
def test_project_scaffold(self):
824
import tempfile
925
import os.path
@@ -100,5 +116,6 @@ def test_minimal_package(self):
100116

101117

102118
def test_delete_nonexisting(self):
119+
import emzed.core.packages
103120
with self.assertRaises(Exception):
104121
emzed.core.packages.delete_from_emzed_store("abc123")

0 commit comments

Comments
 (0)