Merge lp:~benji/charmworld/expose-bundle-changes into lp:~juju-jitsu/charmworld/trunk
- expose-bundle-changes
- Merge into trunk
Proposed by
Benji York
Status: | Merged |
---|---|
Merged at revision: | 427 |
Proposed branch: | lp:~benji/charmworld/expose-bundle-changes |
Merge into: | lp:~juju-jitsu/charmworld/trunk |
Diff against target: |
445 lines (+122/-69) 10 files modified
charmworld/jobs/ingest.py (+33/-23) charmworld/jobs/tests/test_bzr.py (+51/-22) charmworld/jobs/tests/test_ingest.py (+3/-3) charmworld/migrations/versions/tests/test_migrations.py (+1/-0) charmworld/models.py (+10/-5) charmworld/templates/bundle.pt (+0/-8) charmworld/testing/factory.py (+2/-1) charmworld/tests/test_models.py (+15/-4) charmworld/tests/test_search.py (+3/-2) charmworld/views/tests/test_api.py (+4/-1) |
To merge this branch: | bzr merge lp:~benji/charmworld/expose-bundle-changes |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Juju-Jitsu Hackers | Pending | ||
Review via email: mp+192389@code.launchpad.net |
Commit message
Description of the change
Add recent bzr changes to bundles.
To post a comment you must log in.
Revision history for this message
Brad Crittenden (bac) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'charmworld/jobs/ingest.py' | |||
2 | --- charmworld/jobs/ingest.py 2013-10-17 21:32:57 +0000 | |||
3 | +++ charmworld/jobs/ingest.py 2013-10-23 18:29:57 +0000 | |||
4 | @@ -261,7 +261,7 @@ | |||
5 | 261 | update_download_count(store, charm_data) | 261 | update_download_count(store, charm_data) |
6 | 262 | update_proof_data(charm_data, log) | 262 | update_proof_data(charm_data, log) |
7 | 263 | update_jenkins_data(db, charm_data, log) | 263 | update_jenkins_data(db, charm_data, log) |
9 | 264 | update_from_revisions(charm_data, newest_revision=revision) | 264 | update_revision_details(charm_data, newest_revision=revision) |
10 | 265 | update_date_created(charm_data, log) | 265 | update_date_created(charm_data, log) |
11 | 266 | scan_charm(charm_data, fs, log) | 266 | scan_charm(charm_data, fs, log) |
12 | 267 | update_hash(charm_data) | 267 | update_hash(charm_data) |
13 | @@ -309,8 +309,11 @@ | |||
14 | 309 | self.working_dir = working_dir | 309 | self.working_dir = working_dir |
15 | 310 | super(UpdateBundleJob, self).__init__() | 310 | super(UpdateBundleJob, self).__init__() |
16 | 311 | 311 | ||
19 | 312 | def store_bundles(self, deployer_config, owner, basket_id): | 312 | def store_bundles(self, deployer_config, owner, basket_id, first_change, |
20 | 313 | store_bundles(self.db.bundles, deployer_config, owner, basket_id) | 313 | last_change, changes): |
21 | 314 | store_bundles( | ||
22 | 315 | self.db.bundles, deployer_config, owner, basket_id, first_change, | ||
23 | 316 | last_change, changes) | ||
24 | 314 | 317 | ||
25 | 315 | @staticmethod | 318 | @staticmethod |
26 | 316 | def set_basket_info(data, revno): | 319 | def set_basket_info(data, revno): |
27 | @@ -319,6 +322,9 @@ | |||
28 | 319 | def decorate_basket(self, basket_data, fs): | 322 | def decorate_basket(self, basket_data, fs): |
29 | 320 | branch_dir = fetch_branch(self.working_dir, basket_data, self.log, | 323 | branch_dir = fetch_branch(self.working_dir, basket_data, self.log, |
30 | 321 | revisionId=basket_data['commit']) | 324 | revisionId=basket_data['commit']) |
31 | 325 | basket_data['branch_dir'] = branch_dir | ||
32 | 326 | update_revision_details( | ||
33 | 327 | basket_data, newest_revision=basket_data['commit']) | ||
34 | 322 | branch = Branch.open(branch_dir) | 328 | branch = Branch.open(branch_dir) |
35 | 323 | revno = branch.revision_id_to_revno(basket_data['commit']) | 329 | revno = branch.revision_id_to_revno(basket_data['commit']) |
36 | 324 | self.set_basket_info(basket_data, revno) | 330 | self.set_basket_info(basket_data, revno) |
37 | @@ -340,7 +346,8 @@ | |||
38 | 340 | self.db.baskets.save(basket_data) | 346 | self.db.baskets.save(basket_data) |
39 | 341 | deployer_config = self.get_deployer_config(fs, basket_data) | 347 | deployer_config = self.get_deployer_config(fs, basket_data) |
40 | 342 | self.store_bundles( | 348 | self.store_bundles( |
42 | 343 | deployer_config, basket_data['owner'], basket_data['name_revno']) | 349 | deployer_config, basket_data['owner'], basket_data['name_revno'], |
43 | 350 | None, None, None) | ||
44 | 344 | 351 | ||
45 | 345 | 352 | ||
46 | 346 | def _rev_info(r, branch): | 353 | def _rev_info(r, branch): |
47 | @@ -354,27 +361,34 @@ | |||
48 | 354 | return d | 361 | return d |
49 | 355 | 362 | ||
50 | 356 | 363 | ||
54 | 357 | def update_from_revisions(charm_data, limit=10, since=None, | 364 | def find_revision_cutoff(now=None, settings=settings): |
55 | 358 | newest_revision=None): | 365 | days_of_revisions = settings.get('days_of_revisions') |
56 | 359 | if charm_data['branch_deleted']: | 366 | if days_of_revisions is None: |
57 | 367 | days_of_revisions = 30 | ||
58 | 368 | if now is None: | ||
59 | 369 | now = datetime.utcnow() | ||
60 | 370 | cutoff = now - timedelta(int(days_of_revisions)) | ||
61 | 371 | return calendar.timegm(cutoff.timetuple()) | ||
62 | 372 | |||
63 | 373 | |||
64 | 374 | def update_revision_details(data, limit=10, newest_revision=None): | ||
65 | 375 | # If the branch has been deleted, there can be no new revisions to pull in. | ||
66 | 376 | if data['branch_deleted']: | ||
67 | 360 | return | 377 | return |
76 | 361 | if since is None: | 378 | since = find_revision_cutoff() |
77 | 362 | days_of_revisions = settings.get('days_of_revisions') | 379 | changes, first_change, last_change = get_changes( |
78 | 363 | if days_of_revisions is not None: | 380 | data['branch_dir'], limit, since, newest_revision) |
79 | 364 | cutoff = datetime.utcnow() - timedelta(int(days_of_revisions)) | 381 | data['changes'] = changes |
80 | 365 | since = calendar.timegm(cutoff.timetuple()) | 382 | data['first_change'] = first_change |
81 | 366 | branch_dir = charm_data['branch_dir'] | 383 | data['last_change'] = last_change |
74 | 367 | changes = get_changes(branch_dir, limit, since, newest_revision) | ||
75 | 368 | charm_data.update(changes) | ||
82 | 369 | 384 | ||
83 | 370 | 385 | ||
84 | 371 | def get_changes(branch_dir, limit, since, newest_revision=None): | 386 | def get_changes(branch_dir, limit, since, newest_revision=None): |
85 | 372 | charm_data = {} | ||
86 | 373 | branch = Branch.open(branch_dir) | 387 | branch = Branch.open(branch_dir) |
87 | 374 | branch.lock_read() | 388 | branch.lock_read() |
88 | 375 | try: | 389 | try: |
89 | 376 | revisions = get_revisions(branch, limit, since) | 390 | revisions = get_revisions(branch, limit, since) |
91 | 377 | charm_data['changes'] = changes = [] | 391 | changes = [] |
92 | 378 | # If there is no limit on how new a revision we can include, then | 392 | # If there is no limit on how new a revision we can include, then |
93 | 379 | # consider the starting revision to be already found. | 393 | # consider the starting revision to be already found. |
94 | 380 | found_start = newest_revision is None | 394 | found_start = newest_revision is None |
95 | @@ -391,11 +405,7 @@ | |||
96 | 391 | last_change = changes[0] | 405 | last_change = changes[0] |
97 | 392 | first = branch.repository.get_revision(branch.get_rev_id(1)) | 406 | first = branch.repository.get_revision(branch.get_rev_id(1)) |
98 | 393 | first_change = _rev_info(first, branch) | 407 | first_change = _rev_info(first, branch) |
104 | 394 | charm_data.update({ | 408 | return changes, first_change, last_change |
100 | 395 | 'last_change': last_change, | ||
101 | 396 | 'first_change': first_change, | ||
102 | 397 | }) | ||
103 | 398 | return charm_data | ||
105 | 399 | finally: | 409 | finally: |
106 | 400 | branch.unlock() | 410 | branch.unlock() |
107 | 401 | 411 | ||
108 | @@ -411,7 +421,7 @@ | |||
109 | 411 | break | 421 | break |
110 | 412 | revision = branch.repository.get_revision(revision_id) | 422 | revision = branch.repository.get_revision(revision_id) |
111 | 413 | if num >= limit: | 423 | if num >= limit: |
113 | 414 | if since is None or revision.timestamp < since: | 424 | if revision.timestamp < since: |
114 | 415 | break | 425 | break |
115 | 416 | revs.append(revision) | 426 | revs.append(revision) |
116 | 417 | return revs | 427 | return revs |
117 | 418 | 428 | ||
118 | === modified file 'charmworld/jobs/tests/test_bzr.py' | |||
119 | --- charmworld/jobs/tests/test_bzr.py 2013-10-17 20:19:55 +0000 | |||
120 | +++ charmworld/jobs/tests/test_bzr.py 2013-10-23 18:29:57 +0000 | |||
121 | @@ -3,6 +3,7 @@ | |||
122 | 3 | 3 | ||
123 | 4 | 4 | ||
124 | 5 | from contextlib import contextmanager | 5 | from contextlib import contextmanager |
125 | 6 | import datetime | ||
126 | 6 | from logging import getLogger | 7 | from logging import getLogger |
127 | 7 | import os | 8 | import os |
128 | 8 | import time | 9 | import time |
129 | @@ -13,13 +14,14 @@ | |||
130 | 13 | 14 | ||
131 | 14 | from charmworld.jobs import ingest | 15 | from charmworld.jobs import ingest |
132 | 15 | from charmworld.jobs.ingest import ( | 16 | from charmworld.jobs.ingest import ( |
133 | 17 | _rev_info, | ||
134 | 16 | add_files, | 18 | add_files, |
135 | 17 | checkout_branch, | 19 | checkout_branch, |
136 | 18 | do_bzr_update, | 20 | do_bzr_update, |
137 | 21 | find_revision_cutoff, | ||
138 | 19 | get_changes, | 22 | get_changes, |
139 | 20 | get_revisions, | 23 | get_revisions, |
142 | 21 | _rev_info, | 24 | update_revision_details, |
141 | 22 | update_from_revisions, | ||
143 | 23 | ) | 25 | ) |
144 | 24 | from charmworld.models import getfs | 26 | from charmworld.models import getfs |
145 | 25 | from charmworld.testing import ( | 27 | from charmworld.testing import ( |
146 | @@ -268,36 +270,63 @@ | |||
147 | 268 | self.assertEqual([YRH, ZRH], rev_info['authors']) | 270 | self.assertEqual([YRH, ZRH], rev_info['authors']) |
148 | 269 | self.assertEqual(JRH, rev_info['committer']) | 271 | self.assertEqual(JRH, rev_info['committer']) |
149 | 270 | 272 | ||
151 | 271 | def test_get_changes(self): | 273 | def test_get_changes_with_one_revision(self): |
152 | 274 | tree = self.make_locked_tree() | ||
153 | 275 | self.num_commit(tree, 1) | ||
154 | 276 | changes, first_change, last_change = get_changes( | ||
155 | 277 | 'tree', 10, time.time()) | ||
156 | 278 | self.assertEqual(first_change, last_change) | ||
157 | 279 | self.assertEqual([first_change], changes) | ||
158 | 280 | |||
159 | 281 | def test_get_changes_with_multiple_revisions(self): | ||
160 | 272 | tree = self.make_locked_tree() | 282 | tree = self.make_locked_tree() |
161 | 273 | first_id = self.num_commit(tree, 1) | 283 | first_id = self.num_commit(tree, 1) |
162 | 274 | charm_data = get_changes('tree', 10, time.time()) | ||
163 | 275 | self.assertItemsEqual(['changes', 'first_change', 'last_change'], | ||
164 | 276 | charm_data.keys()) | ||
165 | 277 | self.assertEqual(charm_data['first_change'], charm_data['last_change']) | ||
166 | 278 | self.assertEqual([charm_data['first_change']], charm_data['changes']) | ||
167 | 279 | for num in range(1, 11): | 284 | for num in range(1, 11): |
168 | 280 | self.num_commit(tree, 1) | 285 | self.num_commit(tree, 1) |
177 | 281 | charm_data = get_changes('tree', 10, time.time()) | 286 | changes, first_change, last_change = get_changes( |
178 | 282 | self.assertNotEqual(charm_data['first_change'], | 287 | 'tree', 10, time.time()) |
179 | 283 | charm_data['last_change']) | 288 | self.assertNotEqual(first_change, last_change) |
180 | 284 | self.assertEqual(charm_data['last_change'], charm_data['changes'][0]) | 289 | self.assertEqual(last_change, changes[0]) |
181 | 285 | self.assertNotEqual(charm_data['first_change'], | 290 | self.assertNotEqual(first_change, changes[-1]) |
182 | 286 | charm_data['changes'][-1]) | 291 | self.assertEqual( |
183 | 287 | self.assertEqual(self.get_rev_info(tree.branch, first_id), | 292 | self.get_rev_info(tree.branch, first_id), |
184 | 288 | charm_data['first_change']) | 293 | first_change) |
185 | 289 | 294 | ||
186 | 290 | def test_get_changes_no_revisions(self): | 295 | def test_get_changes_no_revisions(self): |
187 | 291 | self.make_locked_tree() | 296 | self.make_locked_tree() |
192 | 292 | charm_data = get_changes('tree', 10, time.time()) | 297 | changes, first_change, last_change = get_changes( |
193 | 293 | self.assertEqual([], charm_data['changes']) | 298 | 'tree', 10, time.time()) |
194 | 294 | self.assertIs(None, charm_data['first_change']) | 299 | self.assertEqual([], changes) |
195 | 295 | self.assertIs(None, charm_data['last_change']) | 300 | self.assertIs(None, first_change) |
196 | 301 | self.assertIs(None, last_change) | ||
197 | 296 | 302 | ||
198 | 297 | def test_branch_deleted(self): | 303 | def test_branch_deleted(self): |
200 | 298 | # update_from_revisions does not do anything if the Launchpad branch | 304 | # update_revision_details does not do anything if the Launchpad branch |
201 | 299 | # of a charm is deleted. | 305 | # of a charm is deleted. |
202 | 300 | charm = factory.get_charm_json(branch_deleted=True) | 306 | charm = factory.get_charm_json(branch_deleted=True) |
203 | 301 | with patch.object(ingest, 'get_changes') as mock: | 307 | with patch.object(ingest, 'get_changes') as mock: |
205 | 302 | update_from_revisions(charm) | 308 | update_revision_details(charm) |
206 | 303 | self.assertFalse(mock.called) | 309 | self.assertFalse(mock.called) |
207 | 310 | |||
208 | 311 | |||
209 | 312 | class TestFindRevisionCutoff(TestCase): | ||
210 | 313 | """Tests for charmworld.jobs.ingest.find_revision_cutoff.""" | ||
211 | 314 | |||
212 | 315 | def test_return_type(self): | ||
213 | 316 | # find_revision_cutoff returns seconds since the epoch (an int). | ||
214 | 317 | self.assertEqual(type(find_revision_cutoff()), int) | ||
215 | 318 | |||
216 | 319 | def test_days_of_revisions_is_respected(self): | ||
217 | 320 | # If the cutoff date is further in the past, the resulting seconds | ||
218 | 321 | # since the epoch is further in the past too. | ||
219 | 322 | old = find_revision_cutoff(settings=dict(days_of_revisions=10)) | ||
220 | 323 | older = find_revision_cutoff(settings=dict(days_of_revisions=20)) | ||
221 | 324 | self.assertGreater(old, older) | ||
222 | 325 | |||
223 | 326 | def test_days_are_the_right_size(self): | ||
224 | 327 | # If we start at time 0 and ask for one day in the past, we get the | ||
225 | 328 | # obvious value. | ||
226 | 329 | time = find_revision_cutoff( | ||
227 | 330 | now=datetime.datetime.utcfromtimestamp(0), | ||
228 | 331 | settings=dict(days_of_revisions=1)) | ||
229 | 332 | self.assertEqual(time, -86400) | ||
230 | 304 | 333 | ||
231 | === modified file 'charmworld/jobs/tests/test_ingest.py' | |||
232 | --- charmworld/jobs/tests/test_ingest.py 2013-10-17 21:32:57 +0000 | |||
233 | +++ charmworld/jobs/tests/test_ingest.py 2013-10-23 18:29:57 +0000 | |||
234 | @@ -533,8 +533,8 @@ | |||
235 | 533 | """) | 533 | """) |
236 | 534 | fs.put(deployer_config, _id=DEPLOYER_CONFIG_HASH) | 534 | fs.put(deployer_config, _id=DEPLOYER_CONFIG_HASH) |
237 | 535 | job.store_bundles( | 535 | job.store_bundles( |
240 | 536 | yaml.safe_load(deployer_config), | 536 | yaml.safe_load(deployer_config), basket_data['owner'], |
241 | 537 | basket_data['owner'], basket_data['name_revno']) | 537 | basket_data['name_revno'], None, None, None) |
242 | 538 | self.assertIsNotNone(self.db.bundles.find_one(bundle_id)) | 538 | self.assertIsNotNone(self.db.bundles.find_one(bundle_id)) |
243 | 539 | 539 | ||
244 | 540 | def test_job_run_stores_bundles_in_the_db(self): | 540 | def test_job_run_stores_bundles_in_the_db(self): |
245 | @@ -559,7 +559,7 @@ | |||
246 | 559 | with patch.object(job, 'store_bundles') as store_bundles: | 559 | with patch.object(job, 'store_bundles') as store_bundles: |
247 | 560 | job.run(basket_data) | 560 | job.run(basket_data) |
248 | 561 | store_bundles.assert_called_with( | 561 | store_bundles.assert_called_with( |
250 | 562 | {'foo': {}}, 'charmers', 'dummy') | 562 | {'foo': {}}, 'charmers', 'dummy', None, None, None) |
251 | 563 | 563 | ||
252 | 564 | 564 | ||
253 | 565 | class TestUpdateCharm(MongoTestBase): | 565 | class TestUpdateCharm(MongoTestBase): |
254 | 566 | 566 | ||
255 | === modified file 'charmworld/migrations/versions/tests/test_migrations.py' | |||
256 | --- charmworld/migrations/versions/tests/test_migrations.py 2013-09-23 15:58:47 +0000 | |||
257 | +++ charmworld/migrations/versions/tests/test_migrations.py 2013-10-23 18:29:57 +0000 | |||
258 | @@ -60,6 +60,7 @@ | |||
259 | 60 | owner, basket_name, bundle_name) | 60 | owner, basket_name, bundle_name) |
260 | 61 | store_bundles( | 61 | store_bundles( |
261 | 62 | self.db.bundles, parsed, owner, basket_id, | 62 | self.db.bundles, parsed, owner, basket_id, |
262 | 63 | None, None, None, | ||
263 | 63 | index_client=self.index_client) | 64 | index_client=self.index_client) |
264 | 64 | 65 | ||
265 | 65 | def test_bundles_are_removed_from_elastic_search(self): | 66 | def test_bundles_are_removed_from_elastic_search(self): |
266 | 66 | 67 | ||
267 | === modified file 'charmworld/models.py' | |||
268 | --- charmworld/models.py 2013-10-22 22:57:51 +0000 | |||
269 | +++ charmworld/models.py 2013-10-23 18:29:57 +0000 | |||
270 | @@ -1743,7 +1743,8 @@ | |||
271 | 1743 | return options | 1743 | return options |
272 | 1744 | 1744 | ||
273 | 1745 | 1745 | ||
275 | 1746 | def make_bundle_doc(data, owner, basket_id, bundle_name): | 1746 | def make_bundle_doc(data, owner, basket_id, bundle_name, first_change, |
276 | 1747 | last_change, changes): | ||
277 | 1747 | basket_name, basket_revision = basket_id.split('/') | 1748 | basket_name, basket_revision = basket_id.split('/') |
278 | 1748 | _id = Bundle.construct_id(owner, basket_name, bundle_name, basket_revision) | 1749 | _id = Bundle.construct_id(owner, basket_name, bundle_name, basket_revision) |
279 | 1749 | return { | 1750 | return { |
280 | @@ -1753,11 +1754,14 @@ | |||
281 | 1753 | 'basket_name': basket_name, | 1754 | 'basket_name': basket_name, |
282 | 1754 | 'basket_revision': int(basket_revision), | 1755 | 'basket_revision': int(basket_revision), |
283 | 1755 | 'data': data, | 1756 | 'data': data, |
284 | 1757 | 'first_change': first_change, | ||
285 | 1758 | 'last_change': last_change, | ||
286 | 1759 | 'changes': changes, | ||
287 | 1756 | } | 1760 | } |
288 | 1757 | 1761 | ||
289 | 1758 | 1762 | ||
292 | 1759 | def store_bundles(collection, deployer_config, owner, basket_id, | 1763 | def store_bundles(collection, deployer_config, owner, basket_id, first_change, |
293 | 1760 | index_client=None): | 1764 | last_change, changes, index_client=None): |
294 | 1761 | """Store a basket of bundles into MongoDB and/or ElasticSearch. | 1765 | """Store a basket of bundles into MongoDB and/or ElasticSearch. |
295 | 1762 | 1766 | ||
296 | 1763 | :param: collection: A db bundles collection. If None the bundles are not | 1767 | :param: collection: A db bundles collection. If None the bundles are not |
297 | @@ -1779,8 +1783,9 @@ | |||
298 | 1779 | for bundle_name in deployer_config: | 1783 | for bundle_name in deployer_config: |
299 | 1780 | # Set up indexing. | 1784 | # Set up indexing. |
300 | 1781 | data = get_flattened_deployment(deployer_config, bundle_name) | 1785 | data = get_flattened_deployment(deployer_config, bundle_name) |
303 | 1782 | index_data[bundle_name] = make_bundle_doc(data, owner, basket_id, | 1786 | index_data[bundle_name] = make_bundle_doc( |
304 | 1783 | bundle_name) | 1787 | data, owner, basket_id, bundle_name, first_change, last_change, |
305 | 1788 | changes) | ||
306 | 1784 | if collection is not None: | 1789 | if collection is not None: |
307 | 1785 | collection.save(index_data[bundle_name]) | 1790 | collection.save(index_data[bundle_name]) |
308 | 1786 | 1791 | ||
309 | 1787 | 1792 | ||
310 | === modified file 'charmworld/templates/bundle.pt' | |||
311 | --- charmworld/templates/bundle.pt 2013-10-11 13:51:05 +0000 | |||
312 | +++ charmworld/templates/bundle.pt 2013-10-23 18:29:57 +0000 | |||
313 | @@ -103,14 +103,6 @@ | |||
314 | 103 | </li> | 103 | </li> |
315 | 104 | </ul> | 104 | </ul> |
316 | 105 | </div> | 105 | </div> |
317 | 106 | <tal:comment condition="nothing"> | ||
318 | 107 | <div tal:condition="is_owner"> | ||
319 | 108 | You are the owner. In the future we'll show you extra stuff here. | ||
320 | 109 | </div> | ||
321 | 110 | <div tal:condition="not: is_owner"> | ||
322 | 111 | If you were the author/owner you'd see extra stuff here. | ||
323 | 112 | </div> | ||
324 | 113 | </tal:comment> | ||
325 | 114 | </metal:block> | 106 | </metal:block> |
326 | 115 | </body> | 107 | </body> |
327 | 116 | </html> | 108 | </html> |
328 | 117 | 109 | ||
329 | === modified file 'charmworld/testing/factory.py' | |||
330 | --- charmworld/testing/factory.py 2013-10-04 19:45:06 +0000 | |||
331 | +++ charmworld/testing/factory.py 2013-10-23 18:29:57 +0000 | |||
332 | @@ -331,7 +331,8 @@ | |||
333 | 331 | data = dict(series=series, | 331 | data = dict(series=series, |
334 | 332 | relations=relations, | 332 | relations=relations, |
335 | 333 | services=services) | 333 | services=services) |
337 | 334 | bundle_doc = make_bundle_doc(data, owner, basket_with_rev, name) | 334 | bundle_doc = make_bundle_doc( |
338 | 335 | data, owner, basket_with_rev, name, None, None, None) | ||
339 | 335 | bundle_doc.update(dict(branch_deleted=branch_deleted, | 336 | bundle_doc.update(dict(branch_deleted=branch_deleted, |
340 | 336 | data=data, | 337 | data=data, |
341 | 337 | description=description, | 338 | description=description, |
342 | 338 | 339 | ||
343 | === modified file 'charmworld/tests/test_models.py' | |||
344 | --- charmworld/tests/test_models.py 2013-10-22 22:57:51 +0000 | |||
345 | +++ charmworld/tests/test_models.py 2013-10-23 18:29:57 +0000 | |||
346 | @@ -1595,7 +1595,7 @@ | |||
347 | 1595 | basket_id = "%s/%d" % (basket_name, basket_rev) | 1595 | basket_id = "%s/%d" % (basket_name, basket_rev) |
348 | 1596 | _id = Bundle.construct_id(owner, basket_name, bundle_name, basket_rev) | 1596 | _id = Bundle.construct_id(owner, basket_name, bundle_name, basket_rev) |
349 | 1597 | store_bundles( | 1597 | store_bundles( |
351 | 1598 | self.db.bundles, parsed, 'bac', basket_id) | 1598 | self.db.bundles, parsed, 'bac', basket_id, None, None, None) |
352 | 1599 | self.assertEqual( | 1599 | self.assertEqual( |
353 | 1600 | { | 1600 | { |
354 | 1601 | '_id': _id, | 1601 | '_id': _id, |
355 | @@ -1604,6 +1604,9 @@ | |||
356 | 1604 | 'name': bundle_name, | 1604 | 'name': bundle_name, |
357 | 1605 | 'owner': owner, | 1605 | 'owner': owner, |
358 | 1606 | 'data': parsed['wordpress-stage'], | 1606 | 'data': parsed['wordpress-stage'], |
359 | 1607 | 'first_change': None, | ||
360 | 1608 | 'last_change': None, | ||
361 | 1609 | 'changes': None, | ||
362 | 1607 | }, | 1610 | }, |
363 | 1608 | self.db.bundles.find_one(_id)) | 1611 | self.db.bundles.find_one(_id)) |
364 | 1609 | 1612 | ||
365 | @@ -1638,7 +1641,9 @@ | |||
366 | 1638 | 1641 | ||
367 | 1639 | with patch('charmworld.models.get_flattened_deployment', | 1642 | with patch('charmworld.models.get_flattened_deployment', |
368 | 1640 | get_flattened_deployment): | 1643 | get_flattened_deployment): |
370 | 1641 | store_bundles(self.db.bundles, parsed, 'bac', 'wordpress-basket/5') | 1644 | store_bundles( |
371 | 1645 | self.db.bundles, parsed, 'bac', 'wordpress-basket/5', None, | ||
372 | 1646 | None, None) | ||
373 | 1642 | self.assertItemsEqual(['wordpress-stage', 'wordpress-prod'], keys) | 1647 | self.assertItemsEqual(['wordpress-stage', 'wordpress-prod'], keys) |
374 | 1643 | 1648 | ||
375 | 1644 | def test_storing_a_bundle_includes_indexing_it(self): | 1649 | def test_storing_a_bundle_includes_indexing_it(self): |
376 | @@ -1656,7 +1661,9 @@ | |||
377 | 1656 | with patch( | 1661 | with patch( |
378 | 1657 | 'charmworld.models.ElasticSearchClient', | 1662 | 'charmworld.models.ElasticSearchClient', |
379 | 1658 | FauxElasticSearchClient): | 1663 | FauxElasticSearchClient): |
381 | 1659 | store_bundles(self.db.bundles, {}, 'owner', 'wordpress-basket/5') | 1664 | store_bundles( |
382 | 1665 | self.db.bundles, {}, 'owner', 'wordpress-basket/5', None, | ||
383 | 1666 | None, None) | ||
384 | 1660 | 1667 | ||
385 | 1661 | self.assertTrue(FauxElasticSearchClient.index_bundles_called) | 1668 | self.assertTrue(FauxElasticSearchClient.index_bundles_called) |
386 | 1662 | 1669 | ||
387 | @@ -2002,7 +2009,8 @@ | |||
388 | 2002 | class TestMakeBundleDoc(TestCase): | 2009 | class TestMakeBundleDoc(TestCase): |
389 | 2003 | 2010 | ||
390 | 2004 | def test_bundle_doc(self): | 2011 | def test_bundle_doc(self): |
392 | 2005 | doc = make_bundle_doc({'a': 'b'}, 'foo', 'bar/9', 'baz') | 2012 | doc = make_bundle_doc( |
393 | 2013 | {'a': 'b'}, 'foo', 'bar/9', 'baz', None, None, None) | ||
394 | 2006 | self.assertEqual({ | 2014 | self.assertEqual({ |
395 | 2007 | 'owner': 'foo', | 2015 | 'owner': 'foo', |
396 | 2008 | 'basket_name': 'bar', | 2016 | 'basket_name': 'bar', |
397 | @@ -2010,6 +2018,9 @@ | |||
398 | 2010 | 'name': 'baz', | 2018 | 'name': 'baz', |
399 | 2011 | 'data': {'a': 'b'}, | 2019 | 'data': {'a': 'b'}, |
400 | 2012 | '_id': '~foo/bar/9/baz', | 2020 | '_id': '~foo/bar/9/baz', |
401 | 2021 | 'first_change': None, | ||
402 | 2022 | 'last_change': None, | ||
403 | 2023 | 'changes': None, | ||
404 | 2013 | }, doc) | 2024 | }, doc) |
405 | 2014 | 2025 | ||
406 | 2015 | 2026 | ||
407 | 2016 | 2027 | ||
408 | === modified file 'charmworld/tests/test_search.py' | |||
409 | --- charmworld/tests/test_search.py 2013-09-16 21:14:06 +0000 | |||
410 | +++ charmworld/tests/test_search.py 2013-10-23 18:29:57 +0000 | |||
411 | @@ -166,8 +166,9 @@ | |||
412 | 166 | charm: cs:precise/mysql | 166 | charm: cs:precise/mysql |
413 | 167 | """) | 167 | """) |
414 | 168 | parsed = yaml.safe_load(deployer_config) | 168 | parsed = yaml.safe_load(deployer_config) |
417 | 169 | store_bundles(None, parsed, 'abentley', 'wordpress-basket/5', | 169 | store_bundles( |
418 | 170 | index_client=self.index_client) | 170 | None, parsed, 'abentley', 'wordpress-basket/5', None, None, None, |
419 | 171 | index_client=self.index_client) | ||
420 | 171 | return _id | 172 | return _id |
421 | 172 | 173 | ||
422 | 173 | def test_store_bundles_bundle_name_indexed(self): | 174 | def test_store_bundles_bundle_name_indexed(self): |
423 | 174 | 175 | ||
424 | === modified file 'charmworld/views/tests/test_api.py' | |||
425 | --- charmworld/views/tests/test_api.py 2013-10-22 21:02:10 +0000 | |||
426 | +++ charmworld/views/tests/test_api.py 2013-10-23 18:29:57 +0000 | |||
427 | @@ -732,6 +732,9 @@ | |||
428 | 732 | description='', | 732 | description='', |
429 | 733 | promulgated=False, | 733 | promulgated=False, |
430 | 734 | branch_deleted=False, | 734 | branch_deleted=False, |
431 | 735 | first_change=None, | ||
432 | 736 | last_change=None, | ||
433 | 737 | changes=None, | ||
434 | 735 | ) | 738 | ) |
435 | 736 | self.assertEqual(expected, bundle._representation) | 739 | self.assertEqual(expected, bundle._representation) |
436 | 737 | 740 | ||
437 | @@ -858,7 +861,7 @@ | |||
438 | 858 | self.assertEqual(u'text/plain', response.content_type) | 861 | self.assertEqual(u'text/plain', response.content_type) |
439 | 859 | 862 | ||
440 | 860 | def test_bundle_icon(self): | 863 | def test_bundle_icon(self): |
442 | 861 | # The current design is that all bundles, regardless of their id, will | 864 | # The current design is that all bundles, regardless of their ID, will |
443 | 862 | # get the default bundle icon. | 865 | # get the default bundle icon. |
444 | 863 | bundle = self.makeBundle() | 866 | bundle = self.makeBundle() |
445 | 864 | response = self.get_response( | 867 | response = self.get_response( |
LGTM
https:/ /codereview. appspot. com/15100046/ diff/1/ charmworld/ jobs/ingest. py jobs/ingest. py (right):
File charmworld/
https:/ /codereview. appspot. com/15100046/ diff/1/ charmworld/ jobs/ingest. py#newcode424 jobs/ingest. py:424: if revision.timestamp < since:
charmworld/
So since cannot be None?
https:/ /codereview. appspot. com/15100046/ diff/1/ charmworld/ jobs/ingest. py#newcode424 jobs/ingest. py:424: if revision.timestamp < since:
charmworld/
So we're sure since can never be None?
https:/ /codereview. appspot. com/15100046/