Merge lp:~abentley/charmworld/remove-store-ingest-job into lp:~juju-jitsu/charmworld/trunk

Proposed by Aaron Bentley
Status: Merged
Approved by: Curtis Hovey
Approved revision: 293
Merged at revision: 283
Proposed branch: lp:~abentley/charmworld/remove-store-ingest-job
Merge into: lp:~juju-jitsu/charmworld/trunk
Diff against target: 664 lines (+204/-226)
4 files modified
charmworld/jobs/ingest.py (+142/-171)
charmworld/jobs/tests/test_bzr.py (+24/-26)
charmworld/jobs/tests/test_proof.py (+13/-10)
charmworld/jobs/tests/test_store.py (+25/-19)
To merge this branch: bzr merge lp:~abentley/charmworld/remove-store-ingest-job
Reviewer Review Type Date Requested Status
Curtis Hovey (community) code Approve
Review via email: mp+171162@code.launchpad.net

Commit message

Remove remaining sub-Jobs from ingest.

Description of the change

This branch completes the work for bug #1190015: ingest is really a set of functions that are run consecutively, but is structured as a list of jobs.

It removes StoreIngestJob, ChangelogIngestJob and ProofIngestJob. The remaining code has some room for improvement, espeicially some very short functions, but this can be addressed piecemeal.

IngestJob and DBIngestJob are retained because they are parents of the remaining job, UpdateCharmJob.

As a driveby, the 'retry' parameter was removed from do_bzr_update, since it was never used.

To post a comment you must log in.
Revision history for this message
Curtis Hovey (sinzui) wrote :

Thank you.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'charmworld/jobs/ingest.py'
--- charmworld/jobs/ingest.py 2013-06-24 15:45:29 +0000
+++ charmworld/jobs/ingest.py 2013-06-24 19:49:29 +0000
@@ -88,14 +88,14 @@
88 self.db = db88 self.db = db
8989
9090
91def do_bzr_update(charm_data, db, fs, log, root_dir=None, retry=True):91def do_bzr_update(charm_data, db, fs, log, root_dir=None):
92 """Fetch a branch from bzr, and augment charm data."""92 """Fetch a branch from bzr, and augment charm data."""
93 if not root_dir:93 if not root_dir:
94 root_dir = CHARM_DIR94 root_dir = CHARM_DIR
95 root_dir = root_dir95 root_dir = root_dir
96 if not os.path.exists(root_dir):96 if not os.path.exists(root_dir):
97 os.makedirs(root_dir)97 os.makedirs(root_dir)
98 update_charm_files(root_dir, fs, charm_data, log, retry)98 update_charm_files(root_dir, fs, charm_data, log)
9999
100100
101def update_charm_branch(root_dir, fs, charm_data, branch_dir, log,101def update_charm_branch(root_dir, fs, charm_data, branch_dir, log,
@@ -153,7 +153,7 @@
153 return charm_data153 return charm_data
154154
155155
156def update_charm_files(root_dir, fs, charm_data, log, retry):156def update_charm_files(root_dir, fs, charm_data, log, retry=True):
157 if charm_data['branch_deleted']:157 if charm_data['branch_deleted']:
158 return158 return
159 branch_dir = os.path.abspath(159 branch_dir = os.path.abspath(
@@ -225,13 +225,10 @@
225 fs = getfs(db)225 fs = getfs(db)
226 try:226 try:
227 do_bzr_update(charm_data, db, fs, log)227 do_bzr_update(charm_data, db, fs, log)
228 if not run_job(StoreIngestJob(), charm_data):228 update_from_store(charm_data, CharmStore(), log)
229 return False229 update_proof_data(charm_data, log)
230 if not run_job(ProofIngestJob(), charm_data):
231 return False
232 update_jenkins_data(db, charm_data, log)230 update_jenkins_data(db, charm_data, log)
233 if not run_job(ChangelogIngestJob(), charm_data):231 update_from_revisions(charm_data)
234 return False
235 update_date_created(charm_data, log)232 update_date_created(charm_data, log)
236 scan_charm(charm_data, db, fs, log)233 scan_charm(charm_data, db, fs, log)
237 except Exception as e:234 except Exception as e:
@@ -258,78 +255,69 @@
258 CharmSource(self.db, index_client).save(charm_data)255 CharmSource(self.db, index_client).save(charm_data)
259256
260257
261class ChangelogIngestJob(IngestJob):258def _rev_info(r, branch):
262259 d = {
263 name = 'changelog'260 'authors': r.get_apparent_authors(),
264261 "revno": branch.revision_id_to_revno(r.revision_id),
265 def __init__(self, limit=10, since=None):262 "committer": r.committer,
266 self.limit = limit263 "created": r.timestamp,
267 self.since = since264 "message": r.message
268265 }
269 def setup(self):266 return d
270 super(ChangelogIngestJob, self).setup()267
271 if self.since is None:268
272 days_of_revisions = settings.get('days_of_revisions')269def update_from_revisions(charm_data, limit=10, since=None):
273 if days_of_revisions is not None:270 if charm_data['branch_deleted']:
274 cutoff = datetime.utcnow() - timedelta(int(days_of_revisions))271 return
275 self.since = calendar.timegm(cutoff.timetuple())272 if since is None:
276273 days_of_revisions = settings.get('days_of_revisions')
277 @staticmethod274 if days_of_revisions is not None:
278 def _rev_info(r, branch):275 cutoff = datetime.utcnow() - timedelta(int(days_of_revisions))
279 d = {276 since = calendar.timegm(cutoff.timetuple())
280 'authors': r.get_apparent_authors(),277 branch_dir = charm_data["branch_dir"]
281 "revno": branch.revision_id_to_revno(r.revision_id),278 charm_data.update(get_changes(branch_dir, limit, since))
282 "committer": r.committer,279
283 "created": r.timestamp,280
284 "message": r.message281def get_changes(branch_dir, limit, since):
285 }282 charm_data = {}
286 return d283 branch = Branch.open(branch_dir)
287284 branch.lock_read()
288 def run(self, charm_data):285 try:
289 if charm_data['branch_deleted']:286 revisions = get_revisions(branch, limit, since)
290 return287 charm_data["changes"] = changes = []
291 branch_dir = charm_data["branch_dir"]288 for r in revisions:
292 charm_data.update(self.get_changes(branch_dir))289 changes.append(_rev_info(r, branch))
293290 if len(revisions) == 0:
294 def get_changes(self, branch_dir):291 last_change = None
295 charm_data = {}292 first_change = None
296 branch = Branch.open(branch_dir)293 else:
297 branch.lock_read()294 last_change = changes[0]
298 try:295 first = branch.repository.get_revision(branch.get_rev_id(1))
299 revisions = self.get_revisions(branch)296 first_change = _rev_info(first, branch)
300 charm_data["changes"] = changes = []297 charm_data.update({
301 for r in revisions:298 'last_change': last_change,
302 changes.append(self._rev_info(r, branch))299 'first_change': first_change,
303 if len(revisions) == 0:300 })
304 last_change = None301 return charm_data
305 first_change = None302 finally:
306 else:303 branch.unlock()
307 last_change = changes[0]304
308 first = branch.repository.get_revision(branch.get_rev_id(1))305
309 first_change = self._rev_info(first, branch)306def get_revisions(branch, limit, since):
310 charm_data.update({307 # We only want the last 10 changes, in descending order.
311 'last_change': last_change,308 graph = branch.repository.get_graph()
312 'first_change': first_change,309 cur_rev_id = branch.last_revision()
313 })310 ancestry_iter = graph.iter_lefthand_ancestry(cur_rev_id)
314 return charm_data311 revs = []
315 finally:312 for num, revision_id in enumerate(ancestry_iter):
316 branch.unlock()313 if revision_id == NULL_REVISION:
317314 break
318 def get_revisions(self, branch):315 revision = branch.repository.get_revision(revision_id)
319 # We only want the last 10 changes, in descending order.316 if num >= limit:
320 graph = branch.repository.get_graph()317 if since is None or revision.timestamp < since:
321 cur_rev_id = branch.last_revision()
322 ancestry_iter = graph.iter_lefthand_ancestry(cur_rev_id)
323 revs = []
324 for num, revision_id in enumerate(ancestry_iter):
325 if revision_id == NULL_REVISION:
326 break318 break
327 revision = branch.repository.get_revision(revision_id)319 revs.append(revision)
328 if num >= self.limit:320 return revs
329 if self.since is None or revision.timestamp < self.since:
330 break
331 revs.append(revision)
332 return revs
333321
334322
335def update_jenkins_data(db, charm, log):323def update_jenkins_data(db, charm, log):
@@ -414,66 +402,62 @@
414 return (result_id, result['result'])402 return (result_id, result['result'])
415403
416404
417class ProofIngestJob(IngestJob):405@contextlib.contextmanager
418406def get_proof_lib(new_path):
419 name = 'proof'407 if new_path not in sys.path:
420408 sys.path.append(new_path)
421 @contextlib.contextmanager409 try:
422 def _get_proof_lib(self, new_path):410 import lib.proof as prooflib
423 if new_path not in sys.path:411 yield prooflib
424 sys.path.append(new_path)412 except ImportError:
425 try:413 yield None
426 import lib.proof as prooflib414 finally:
427 yield prooflib415 if new_path in sys.path:
428 except ImportError:416 sys.path.remove(new_path)
429 yield None417
430 finally:418
431 if new_path in sys.path:419def get_proofer(log, proof_path=None):
432 sys.path.remove(new_path)420 proofer = None
433421 if not proof_path:
434 def setup(self, proofer=None, proof_path=None):422 proof_path = CHARM_PROOF_PATH
435 if not proofer:423
436 proofer = self.get_proofer(proof_path)424 # Use config.CHARM_PROOF_PATH for testing. Monkeypatching is scary.
437 self.proofer = proofer425 if not os.path.isdir(proof_path):
438426 err_msg = ("proof error before processing began: could not find "
439 def get_proofer(self, proof_path=None):427 "charm proof path.")
440 proofer = None428 log.exception(err_msg)
441 if not proof_path:429 log.exception("CHARM_PROOF_PATH: %s", proof_path)
442 proof_path = CHARM_PROOF_PATH430 with get_proof_lib(proof_path) as prooflib:
443431 if not prooflib:
444 # Use config.CHARM_PROOF_PATH for testing. Monkeypatching is scary.432 err_msg = ("proof error before processing began: could not "
445 if not os.path.isdir(proof_path):433 "import charm proof lib.")
446 err_msg = ("proof error before processing began: could not find "434 log.exception(err_msg)
447 "charm proof path.")435 log.exception(
448 self.log.exception(err_msg)436 "CHARM_PROOF_PATH: %s", proof_path)
449 self.log.exception("CHARM_PROOF_PATH: %s", proof_path)437 else:
450 with self._get_proof_lib(proof_path) as prooflib:438 proofer = prooflib.run
451 if not prooflib:439 return proofer
452 err_msg = ("proof error before processing began: could not "440
453 "import charm proof lib.")441
454 self.log.exception(err_msg)442def update_proof_data(charm, log, _proofer=None):
455 self.log.exception(443 proofer = _proofer
456 "CHARM_PROOF_PATH: %s", proof_path)444 if proofer is None:
457 else:445 proofer = get_proofer(log)
458 proofer = prooflib.run446 if not proofer:
459 return proofer447 log.exception("proof aborted.")
460448 raise Exception("No proofer")
461 def run(self, charm):449 if charm['branch_deleted']:
462 if not self.proofer:450 return
463 self.log.exception("proof aborted.")451 proof = {}
464 raise Exception("No proofer")452 lint, exit_code = proofer(charm['branch_dir'])
465 if charm['branch_deleted']:453 for line in lint:
466 return454 if not ':' in line:
467 proof = {}455 continue
468 lint, exit_code = self.proofer(charm['branch_dir'])456 level, msg = line.split(':', 1)
469 for line in lint:457 if level == "W" and 'name' in msg:
470 if not ':' in line:458 continue
471 continue459 proof.setdefault(level.lower(), []).append(msg)
472 level, msg = line.split(':', 1)460 charm['proof'] = proof
473 if level == "W" and 'name' in msg:
474 continue
475 proof.setdefault(level.lower(), []).append(msg)
476 charm['proof'] = proof
477461
478462
479def scan_charm(charm_data, db, fs, log):463def scan_charm(charm_data, db, fs, log):
@@ -639,37 +623,24 @@
639 charm['date_created'] = timestamp(date_created.replace(microsecond=0))623 charm['date_created'] = timestamp(date_created.replace(microsecond=0))
640624
641625
642class StoreIngestJob(IngestJob):626def update_from_store(charm, store, log):
643627 old_address = None
644 name = 'store'628 for address in addresses(charm):
645629 if old_address is not None:
646 def __init__(self, store=None):630 log.info("rechecking %s with %s", old_address, address)
647 super(StoreIngestJob, self).__init__()631 old_address = address
648 if store is None:632 data = store.get_charm_info(address)
649 store = CharmStore()633 if 'errors' not in data and 'warnings' not in data:
650 self.store = store634 break
651635
652 def run(self, charm):636 if 'errors' in data or 'warnings' in data:
653 old_address = None637 log.warning("store error on %s %s" % (address, data))
654 for address in addresses(charm):638
655 if old_address is not None:639 data["store_checked"] = datetime.now().ctime()
656 self.log.info("rechecking %s with %s", old_address, address)640
657 old_address = address641 charm['store_data'] = data
658 data = self._store_get(address)642 charm['store_url'] = make_store_url(data['revision'], address)
659 if 'errors' not in data and 'warnings' not in data:643 update_download_count(store, charm)
660 break
661
662 if 'errors' in data or 'warnings' in data:
663 self.log.warning("store error on %s %s" % (address, data))
664
665 data["store_checked"] = datetime.now().ctime()
666
667 charm['store_data'] = data
668 charm['store_url'] = make_store_url(data['revision'], address)
669 update_download_count(self.store, charm)
670
671 def _store_get(self, address):
672 return CharmStore().get_charm_info(address)
673644
674645
675# XXX j.c.sackett Jan 31 2013 Bug:1111708 scan_repo is swapped for646# XXX j.c.sackett Jan 31 2013 Bug:1111708 scan_repo is swapped for
676647
=== modified file 'charmworld/jobs/tests/test_bzr.py'
--- charmworld/jobs/tests/test_bzr.py 2013-06-24 15:45:29 +0000
+++ charmworld/jobs/tests/test_bzr.py 2013-06-24 19:49:29 +0000
@@ -6,15 +6,20 @@
6from logging import getLogger6from logging import getLogger
7import os7import os
8import shutil8import shutil
9import time
910
10from bzrlib.bzrdir import BzrDir11from bzrlib.bzrdir import BzrDir
11from mock import patch12from mock import patch
1213
1314
15from charmworld.jobs import ingest
14from charmworld.jobs.ingest import (16from charmworld.jobs.ingest import (
15 add_files,17 add_files,
16 do_bzr_update,18 do_bzr_update,
17 ChangelogIngestJob,19 get_changes,
20 get_revisions,
21 _rev_info,
22 update_from_revisions,
18)23)
19from charmworld.models import getfs24from charmworld.models import getfs
20from charmworld.testing import (25from charmworld.testing import (
@@ -169,24 +174,23 @@
169174
170 def test_get_revisions(self):175 def test_get_revisions(self):
171 tree = self.make_locked_tree()176 tree = self.make_locked_tree()
172 job = ChangelogIngestJob()177 revisions = get_revisions(tree.branch, 10, 0)
173 revisions = job.get_revisions(tree.branch)
174 self.assertEqual([], revisions)178 self.assertEqual([], revisions)
175 for x in range(9):179 for x in range(9):
176 self.num_commit(tree, x)180 self.num_commit(tree, x)
177 revisions = job.get_revisions(tree.branch)181 revisions = get_revisions(tree.branch, 10, 0)
178 self.assertEqual(["revision %d" % num for num in range(8, -1, -1)],182 self.assertEqual(["revision %d" % num for num in range(8, -1, -1)],
179 [revision.message for revision in revisions])183 [revision.message for revision in revisions])
180 self.num_commit(tree, 9)184 self.num_commit(tree, 9)
181 revisions = job.get_revisions(tree.branch)185 revisions = get_revisions(tree.branch, 10, time.time())
182 self.assertEqual(["revision %d" % num for num in range(9, -1, -1)],186 self.assertEqual(["revision %d" % num for num in range(9, -1, -1)],
183 [revision.message for revision in revisions])187 [revision.message for revision in revisions])
184 self.num_commit(tree, 10)188 self.num_commit(tree, 10)
185 revisions = job.get_revisions(tree.branch)189 revisions = get_revisions(tree.branch, 10, time.time())
186 self.assertEqual(["revision %d" % num for num in range(10, 0, -1)],190 self.assertEqual(["revision %d" % num for num in range(10, 0, -1)],
187 [revision.message for revision in revisions])191 [revision.message for revision in revisions])
188 self.num_commit(tree, 11)192 self.num_commit(tree, 11)
189 revisions = job.get_revisions(tree.branch)193 revisions = get_revisions(tree.branch, 10, time.time())
190 self.assertEqual(["revision %d" % num for num in range(11, 1, -1)],194 self.assertEqual(["revision %d" % num for num in range(11, 1, -1)],
191 [revision.message for revision in revisions])195 [revision.message for revision in revisions])
192196
@@ -194,9 +198,9 @@
194 tree = self.make_locked_tree()198 tree = self.make_locked_tree()
195 for x in range(15):199 for x in range(15):
196 self.num_commit(tree, x)200 self.num_commit(tree, x)
197 revisions = ChangelogIngestJob(limit=5).get_revisions(tree.branch)201 revisions = get_revisions(tree.branch, 5, time.time())
198 self.assertEqual(5, len(revisions))202 self.assertEqual(5, len(revisions))
199 revisions = ChangelogIngestJob(limit=20).get_revisions(tree.branch)203 revisions = get_revisions(tree.branch, 20, time.time())
200 self.assertEqual(15, len(revisions))204 self.assertEqual(15, len(revisions))
201205
202 def test_get_revisions_honours_since(self):206 def test_get_revisions_honours_since(self):
@@ -204,11 +208,9 @@
204 tree.commit('', timestamp=0, committer='')208 tree.commit('', timestamp=0, committer='')
205 tree.commit('', timestamp=1, committer='')209 tree.commit('', timestamp=1, committer='')
206 tree.commit('', timestamp=2, committer='')210 tree.commit('', timestamp=2, committer='')
207 job = ChangelogIngestJob(since=0, limit=0)211 revisions = get_revisions(tree.branch, 0, 0)
208 revisions = job.get_revisions(tree.branch)
209 self.assertEqual(3, len(revisions))212 self.assertEqual(3, len(revisions))
210 job = ChangelogIngestJob(since=1, limit=0)213 revisions = get_revisions(tree.branch, 0, 1)
211 revisions = job.get_revisions(tree.branch)
212 self.assertEqual(2, len(revisions))214 self.assertEqual(2, len(revisions))
213215
214 def test_limit_overrides_since(self):216 def test_limit_overrides_since(self):
@@ -216,8 +218,7 @@
216 tree.commit('', timestamp=0, committer='')218 tree.commit('', timestamp=0, committer='')
217 tree.commit('', timestamp=1, committer='')219 tree.commit('', timestamp=1, committer='')
218 tree.commit('', timestamp=2, committer='')220 tree.commit('', timestamp=2, committer='')
219 job = ChangelogIngestJob(since=1, limit=3)221 revisions = get_revisions(tree.branch, since=1, limit=3)
220 revisions = job.get_revisions(tree.branch)
221 self.assertEqual(3, len(revisions))222 self.assertEqual(3, len(revisions))
222223
223 def test_rev_info(self):224 def test_rev_info(self):
@@ -225,7 +226,7 @@
225 revision_id = tree.commit('message1', committer=JRH)226 revision_id = tree.commit('message1', committer=JRH)
226 rev = tree.branch.repository.get_revision(revision_id)227 rev = tree.branch.repository.get_revision(revision_id)
227 rev.timestamp = 34228 rev.timestamp = 34
228 rev_info = ChangelogIngestJob._rev_info(rev, tree.branch)229 rev_info = _rev_info(rev, tree.branch)
229 self.assertEqual({230 self.assertEqual({
230 'authors': [JRH],231 'authors': [JRH],
231 'committer': JRH,232 'committer': JRH,
@@ -236,8 +237,7 @@
236237
237 @staticmethod238 @staticmethod
238 def get_rev_info(branch, revision_id):239 def get_rev_info(branch, revision_id):
239 rev = branch.repository.get_revision(revision_id)240 return _rev_info(branch.repository.get_revision(revision_id), branch)
240 return ChangelogIngestJob._rev_info(rev, branch)
241241
242 def test_rev_info_supplied_authors(self):242 def test_rev_info_supplied_authors(self):
243 tree = self.make_locked_tree()243 tree = self.make_locked_tree()
@@ -250,15 +250,14 @@
250 def test_get_changes(self):250 def test_get_changes(self):
251 tree = self.make_locked_tree()251 tree = self.make_locked_tree()
252 first_id = self.num_commit(tree, 1)252 first_id = self.num_commit(tree, 1)
253 job = ChangelogIngestJob()253 charm_data = get_changes('tree', 10, time.time())
254 charm_data = job.get_changes('tree')
255 self.assertItemsEqual(['changes', 'first_change', 'last_change'],254 self.assertItemsEqual(['changes', 'first_change', 'last_change'],
256 charm_data.keys())255 charm_data.keys())
257 self.assertEqual(charm_data['first_change'], charm_data['last_change'])256 self.assertEqual(charm_data['first_change'], charm_data['last_change'])
258 self.assertEqual([charm_data['first_change']], charm_data['changes'])257 self.assertEqual([charm_data['first_change']], charm_data['changes'])
259 for num in range(1, 11):258 for num in range(1, 11):
260 self.num_commit(tree, 1)259 self.num_commit(tree, 1)
261 charm_data = job.get_changes('tree')260 charm_data = get_changes('tree', 10, time.time())
262 self.assertNotEqual(charm_data['first_change'],261 self.assertNotEqual(charm_data['first_change'],
263 charm_data['last_change'])262 charm_data['last_change'])
264 self.assertEqual(charm_data['last_change'], charm_data['changes'][0])263 self.assertEqual(charm_data['last_change'], charm_data['changes'][0])
@@ -269,16 +268,15 @@
269268
270 def test_get_changes_no_revisions(self):269 def test_get_changes_no_revisions(self):
271 self.make_locked_tree()270 self.make_locked_tree()
272 charm_data = ChangelogIngestJob().get_changes('tree')271 charm_data = get_changes('tree', 10, time.time())
273 self.assertEqual([], charm_data['changes'])272 self.assertEqual([], charm_data['changes'])
274 self.assertIs(None, charm_data['first_change'])273 self.assertIs(None, charm_data['first_change'])
275 self.assertIs(None, charm_data['last_change'])274 self.assertIs(None, charm_data['last_change'])
276275
277 def test_branch_deleted(self):276 def test_branch_deleted(self):
278 # ChangelogIngestJob does not do anything if the Launchpad branch277 # update_from_revisions does not do anything if the Launchpad branch
279 # of a charm is deleted.278 # of a charm is deleted.
280 job = ChangelogIngestJob()
281 charm = factory.get_charm_json(branch_deleted=True)279 charm = factory.get_charm_json(branch_deleted=True)
282 with patch.object(job, 'get_changes') as mock:280 with patch.object(ingest, 'get_changes') as mock:
283 job.run(charm)281 update_from_revisions(charm)
284 self.assertFalse(mock.called)282 self.assertFalse(mock.called)
285283
=== modified file 'charmworld/jobs/tests/test_proof.py'
--- charmworld/jobs/tests/test_proof.py 2013-06-07 12:36:30 +0000
+++ charmworld/jobs/tests/test_proof.py 2013-06-24 19:49:29 +0000
@@ -1,9 +1,14 @@
1# Copyright 2012, 2013 Canonical Ltd. This software is licensed under the1# Copyright 2012, 2013 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4from mock import patch4from logging import getLogger
55
6from charmworld.jobs.ingest import ProofIngestJob6from mock import MagicMock
7
8from charmworld.jobs.ingest import (
9 get_proofer,
10 update_proof_data,
11)
7from charmworld.testing import factory12from charmworld.testing import factory
8from charmworld.testing import JobTestBase13from charmworld.testing import JobTestBase
914
@@ -14,9 +19,8 @@
14 # If the charm-proof library cannot be found, an error is logged19 # If the charm-proof library cannot be found, an error is logged
15 # and the proof loop aborted.20 # and the proof loop aborted.
16 nonexistant_path = '/does/not/exist/'21 nonexistant_path = '/does/not/exist/'
17 job = ProofIngestJob()
18 handler = self.get_handler('charm.proof')22 handler = self.get_handler('charm.proof')
19 job.setup(proof_path=nonexistant_path)23 get_proofer(getLogger('charm.proof'), nonexistant_path)
20 log_messages = [record.getMessage() for record in handler.buffer]24 log_messages = [record.getMessage() for record in handler.buffer]
21 err = ("proof error before processing began: "25 err = ("proof error before processing began: "
22 "could not find charm proof path.")26 "could not find charm proof path.")
@@ -26,9 +30,8 @@
26 def test_no_proof_for_deleted_branch(self):30 def test_no_proof_for_deleted_branch(self):
27 # If the branch of a charm is deleted from Launchpad, the proof31 # If the branch of a charm is deleted from Launchpad, the proof
28 # job does nothing.32 # job does nothing.
29 job = ProofIngestJob()33 self.proofer = get_proofer(getLogger('charm.proof'))
30 job.setup()
31 charm = factory.get_charm_json(branch_deleted=True)34 charm = factory.get_charm_json(branch_deleted=True)
32 with patch.object(job, 'proofer') as mock:35 proofer = MagicMock()
33 job.run(charm)36 update_proof_data(charm, getLogger('charm.proof'), proofer)
34 self.assertFalse(mock.called)37 self.assertFalse(proofer.called)
3538
=== modified file 'charmworld/jobs/tests/test_store.py'
--- charmworld/jobs/tests/test_store.py 2013-05-27 12:45:51 +0000
+++ charmworld/jobs/tests/test_store.py 2013-06-24 19:49:29 +0000
@@ -1,17 +1,25 @@
1# Copyright 2012, 2013 Canonical Ltd. This software is licensed under the1# Copyright 2012, 2013 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4from logging import getLogger
4from mock import patch5from mock import patch
5from requests import Response6from requests import Response
67
7from charmworld.jobs.ingest import StoreIngestJob8from charmworld.charmstore import CharmStore
8from charmworld.jobs.ingest import addresses9from charmworld.jobs.ingest import (
10 addresses,
11 update_from_store,
12)
9from charmworld.testing import factory13from charmworld.testing import factory
10from charmworld.testing import JobTestBase14from charmworld.testing import JobTestBase
1115
1216
13class TestStoreJob(JobTestBase):17class TestStoreJob(JobTestBase):
1418
19 def setUp(self):
20 super(TestStoreJob, self).setUp()
21 self.log = getLogger('charm.store')
22
15 def _mock_data(self, warning=False, error=False):23 def _mock_data(self, warning=False, error=False):
16 data = {'revision': 1}24 data = {'revision': 1}
17 if warning:25 if warning:
@@ -20,7 +28,7 @@
20 data['errors'] = 'Error forced by mock.'28 data['errors'] = 'Error forced by mock.'
21 return data29 return data
2230
23 def falsify_session(self, job, content='[[0]]'):31 def falsify_session(self, store, content='[[0]]'):
2432
25 class FakeSession:33 class FakeSession:
2634
@@ -30,17 +38,16 @@
30 response._content = content38 response._content = content
31 return response39 return response
3240
33 job.store.session = FakeSession41 store.session = FakeSession
3442
35 def test_error_handling_error(self):43 def test_error_handling_error(self):
36 handler = self.get_handler('charm.store')44 handler = self.get_handler('charm.store')
37 job = StoreIngestJob()45 store = CharmStore()
38 job.setup()46 self.falsify_session(store)
39 self.falsify_session(job)
40 ignore, charm = factory.makeCharm(self.db, promulgated=True)47 ignore, charm = factory.makeCharm(self.db, promulgated=True)
41 with patch.object(job, '_store_get',48 with patch.object(store, 'get_charm_info',
42 lambda x: self._mock_data(error=True)):49 lambda x: self._mock_data(error=True)):
43 job.run(charm)50 update_from_store(charm, store, self.log)
4451
45 first_address = "cs:%s/%s" % (charm["series"], charm["name"])52 first_address = "cs:%s/%s" % (charm["series"], charm["name"])
46 second_address = "cs:~%s/%s/%s" % (53 second_address = "cs:~%s/%s/%s" % (
@@ -54,13 +61,12 @@
5461
55 def test_error_handling_warning(self):62 def test_error_handling_warning(self):
56 handler = self.get_handler('charm.store')63 handler = self.get_handler('charm.store')
57 job = StoreIngestJob()64 store = CharmStore()
58 job.setup()65 self.falsify_session(store)
59 self.falsify_session(job)
60 ignore, charm = factory.makeCharm(self.db, promulgated=True)66 ignore, charm = factory.makeCharm(self.db, promulgated=True)
61 with patch.object(job, '_store_get',67 with patch.object(store, 'get_charm_info',
62 lambda x: self._mock_data(warning=True)):68 lambda x: self._mock_data(warning=True)):
63 job.run(charm)69 update_from_store(charm, store, self.log)
6470
65 first_address = "cs:%s/%s" % (charm["series"], charm["name"])71 first_address = "cs:%s/%s" % (charm["series"], charm["name"])
66 second_address = "cs:~%s/%s/%s" % (72 second_address = "cs:~%s/%s/%s" % (
@@ -73,13 +79,13 @@
73 self.assertIn(err_msg, log_messages)79 self.assertIn(err_msg, log_messages)
7480
75 def test_run(self):81 def test_run(self):
76 job = StoreIngestJob()82 store = CharmStore()
77 job.setup()83 self.falsify_session(store, '[["2010-12-24", 4], ["2010-12-25", 1]]')
78 self.falsify_session(job, '[["2010-12-24", 4], ["2010-12-25", 1]]')
79 ignore, charm = factory.makeCharm(self.db, promulgated=True)84 ignore, charm = factory.makeCharm(self.db, promulgated=True)
80 del charm['store_url']85 del charm['store_url']
81 with patch.object(job, '_store_get', lambda x: self._mock_data()):86 with patch.object(store, 'get_charm_info',
82 job.run(charm)87 lambda x: self._mock_data()):
88 update_from_store(charm, store, self.log)
83 data = charm['store_data']89 data = charm['store_data']
84 self.assertIn('store_checked', data.keys())90 self.assertIn('store_checked', data.keys())
85 self.assertEqual(1, data['revision'])91 self.assertEqual(1, data['revision'])

Subscribers

People subscribed via source and target branches