Merge lp:~jml/pkgme/logging into lp:pkgme

Proposed by Jonathan Lange
Status: Merged
Approved by: James Westby
Approved revision: 72
Merged at revision: 69
Proposed branch: lp:~jml/pkgme/logging
Merge into: lp:pkgme
Diff against target: 131 lines (+111/-0)
3 files modified
pkgme/tests/__init__.py (+1/-0)
pkgme/tests/test_trace.py (+52/-0)
pkgme/trace.py (+58/-0)
To merge this branch: bzr merge lp:~jml/pkgme/logging
Reviewer Review Type Date Requested Status
James Westby Approve
Review via email: mp+68396@code.launchpad.net

Description of the change

This is what happens when you go down a rabbit hole on a distracted day.

Very basic logging support, with tests.

To post a comment you must log in.
Revision history for this message
James Westby (james-w) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'pkgme/tests/__init__.py'
2--- pkgme/tests/__init__.py 2011-07-14 13:42:04 +0000
3+++ pkgme/tests/__init__.py 2011-07-19 15:07:04 +0000
4@@ -17,6 +17,7 @@
5 'pkgme.tests.test_script',
6 'pkgme.tests.test_template_file',
7 'pkgme.tests.test_testing',
8+ 'pkgme.tests.test_trace',
9 'pkgme.tests.test_vala_backend',
10 'pkgme.tests.test_write',
11 'pkgme.tests.test_write_packaging',
12
13=== added file 'pkgme/tests/test_trace.py'
14--- pkgme/tests/test_trace.py 1970-01-01 00:00:00 +0000
15+++ pkgme/tests/test_trace.py 2011-07-19 15:07:04 +0000
16@@ -0,0 +1,52 @@
17+import os
18+
19+from fixtures import EnvironmentVariableFixture
20+from testtools import TestCase
21+from testtools.matchers import MatchesRegex
22+
23+from pkgme.testing import TempdirFixture
24+from pkgme import trace
25+
26+
27+_date_time_re = r'\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d,\d\d\d'
28+
29+class TestLogging(TestCase):
30+
31+ def with_temp_home(self):
32+ temp_dir = self.useFixture(TempdirFixture())
33+ self.useFixture(EnvironmentVariableFixture('HOME', temp_dir.path))
34+ return temp_dir
35+
36+ def with_temp_log(self):
37+ self.useFixture(trace.LoggingFixture.get_default())
38+
39+ def test_log_location(self):
40+ # We log to the XDG cache home.
41+ temp_home = self.with_temp_home()
42+ log_location = trace.get_log_location()
43+ self.assertEqual(
44+ os.path.join(temp_home.path, '.cache', 'pkgme', 'pkgme.log'),
45+ log_location)
46+
47+ def test_log_to_file(self):
48+ self.with_temp_log()
49+ trace.log("message")
50+ log_location = trace.get_log_location()
51+ with open(log_location) as f:
52+ log_contents = f.read()
53+ self.assertThat(
54+ log_contents,
55+ MatchesRegex(r'%s - INFO - message\n' % (_date_time_re,)))
56+
57+ def test_log_twice(self):
58+ self.with_temp_log()
59+ trace.log("first")
60+ trace.log("second")
61+ log_location = trace.get_log_location()
62+ with open(log_location) as f:
63+ log_contents = f.read()
64+ self.assertThat(
65+ log_contents,
66+ MatchesRegex(
67+ r'%s - INFO - first\n%s - INFO - second\n' % (
68+ _date_time_re, _date_time_re)))
69
70=== added file 'pkgme/trace.py'
71--- pkgme/trace.py 1970-01-01 00:00:00 +0000
72+++ pkgme/trace.py 2011-07-19 15:07:04 +0000
73@@ -0,0 +1,58 @@
74+import logging
75+import os
76+
77+from fixtures import Fixture
78+
79+from pkgme.write import write_file
80+
81+
82+def get_log_location():
83+ """Return the path that we're logging to."""
84+ return os.path.expanduser(
85+ os.path.join('~', '.cache', 'pkgme', 'pkgme.log'))
86+
87+
88+class LoggingFixture(Fixture):
89+
90+ def __init__(self, name, filename, level):
91+ super(LoggingFixture, self).__init__()
92+ self._name = name
93+ self._filename = filename
94+ self._level = level
95+ self._logger = logging.getLogger(self._name)
96+
97+ def _make_handler(self):
98+ # Make sure that the log file exists.
99+ write_file(self._filename, '')
100+ handler = logging.FileHandler(self._filename)
101+ handler.setLevel(self._level)
102+ formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
103+ handler.setFormatter(formatter)
104+ return handler
105+
106+ def setUp(self):
107+ super(LoggingFixture, self).setUp()
108+ handler = self._make_handler()
109+ loggers = [self._logger, logging.getLogger('debpython')]
110+ for logger in loggers:
111+ self.addCleanup(
112+ setattr, logger, 'handlers', list(logger.handlers))
113+ self.addCleanup(logger.setLevel, logger.level)
114+ logger.handlers = []
115+ logger.addHandler(handler)
116+ logger.setLevel(self._level)
117+ return self._logger
118+
119+ @classmethod
120+ def get_default(cls, level=logging.INFO):
121+ return cls('pkgme', get_log_location(), level)
122+
123+
124+_logger = logging.getLogger('pkgme')
125+
126+_logging_fixture = LoggingFixture.get_default()
127+_logging_fixture.setUp()
128+
129+
130+def log(message):
131+ _logger.info(message)

Subscribers

People subscribed via source and target branches