Merge lp:~jderose/dmedia/project-scan into lp:dmedia

Proposed by Jason Gerard DeRose
Status: Merged
Merged at revision: 444
Proposed branch: lp:~jderose/dmedia/project-scan
Merge into: lp:dmedia
Diff against target: 161 lines (+83/-4)
4 files modified
dmedia/core.py (+26/-3)
dmedia/schema.py (+26/-0)
dmedia/tests/test_core.py (+15/-1)
dmedia/tests/test_schema.py (+16/-0)
To merge this branch: bzr merge lp:~jderose/dmedia/project-scan
Reviewer Review Type Date Requested Status
David Jordan Approve
Review via email: mp+119303@code.launchpad.net

Description of the change

* Adds schema.get_project_id() function (and test) to go from dmedia-0-project_id to PROJECT_ID

* Adds core.projects_iter() function (and test) to iterate through all Dmedia project databases

* Changes Core.init_project_views() to use projects_iter() instead of the project/atime view, and to copy over the project doc into dmedia-0 when it doesn't already exist

To post a comment you must log in.
lp:~jderose/dmedia/project-scan updated
448. By Jason Gerard DeRose

Core.init_project_views() now preps project/atime view for performance reasons

Revision history for this message
David Jordan (dmj726) wrote :

Approved!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'dmedia/core.py'
--- dmedia/core.py 2012-08-06 11:03:16 +0000
+++ dmedia/core.py 2012-08-13 06:09:20 +0000
@@ -38,7 +38,7 @@
38import logging38import logging
39from queue import Queue39from queue import Queue
4040
41from microfiber import Database, NotFound, Conflict, random_id241from microfiber import Server, Database, NotFound, Conflict
42from filestore import FileStore, check_root_hash, check_id, _start_thread42from filestore import FileStore, check_root_hash, check_id, _start_thread
4343
44import dmedia44import dmedia
@@ -83,6 +83,17 @@
83 return (httpd, port)83 return (httpd, port)
8484
8585
86def projects_iter(env):
87 server = Server(env)
88 for name in server.get('_all_dbs'):
89 if name.startswith('_'):
90 continue
91 _id = schema.get_project_id(name)
92 if _id is None:
93 continue
94 yield (name, _id)
95
96
86class Core:97class Core:
87 def __init__(self, env, private=None, shared=None, full_init=True):98 def __init__(self, env, private=None, shared=None, full_init=True):
88 self.env = env99 self.env = env
@@ -172,8 +183,20 @@
172 self.thread = _start_thread(self._background_worker)183 self.thread = _start_thread(self._background_worker)
173184
174 def init_project_views(self):185 def init_project_views(self):
175 for row in self.db.view('project', 'atime')['rows']:186 try:
176 util.get_project_db(row['id'], self.env, True)187 for (name, _id) in projects_iter(self.env):
188 db = util.get_project_db(_id, self.env, True)
189 try:
190 doc = self.db.get(_id)
191 except NotFound:
192 log.info('missing project doc for %s', _id)
193 doc = db.get(_id)
194 del doc['_rev']
195 self.db.save(doc)
196 except Exception:
197 log.exception('Error in Core.init_project_views():')
198 log.info('prepping project/atime view...')
199 self.db.view('project', 'atime')
177 log.info('Core.init_project_views() complete')200 log.info('Core.init_project_views() complete')
178201
179 def set_default_store(self, value):202 def set_default_store(self, value):
180203
=== modified file 'dmedia/schema.py'
--- dmedia/schema.py 2012-08-06 11:27:03 +0000
+++ dmedia/schema.py 2012-08-13 06:09:20 +0000
@@ -259,6 +259,9 @@
259# Pattern that doc['ext'] must match for dmedia/file259# Pattern that doc['ext'] must match for dmedia/file
260EXT_PAT = '^[a-z0-9]+(\.[a-z0-9]+)?$'260EXT_PAT = '^[a-z0-9]+(\.[a-z0-9]+)?$'
261261
262# Pattern to match a project DB name
263PROJECT_DB_PAT = '^dmedia-0-([234567abcdefghijklmnopqrstuvwxyz]{24})$'
264
262265
263# Some private helper functions that don't directly define any schema.266# Some private helper functions that don't directly define any schema.
264#267#
@@ -984,10 +987,33 @@
984 >>> project_db_name('HB6YSCKAY27KIWUTWKGKCTNI')987 >>> project_db_name('HB6YSCKAY27KIWUTWKGKCTNI')
985 'dmedia-0-hb6ysckay27kiwutwkgkctni'988 'dmedia-0-hb6ysckay27kiwutwkgkctni'
986989
990 Also see `get_project_id()`.
987 """991 """
988 return '-'.join(['dmedia', str(VER), _id.lower()])992 return '-'.join(['dmedia', str(VER), _id.lower()])
989993
990994
995def get_project_id(db_name):
996 """
997 Return project ID from CouchDB database name.
998
999 For example:
1000
1001 >>> get_project_id('dmedia-0-hb6ysckay27kiwutwkgkctni')
1002 'HB6YSCKAY27KIWUTWKGKCTNI'
1003
1004 If *db_name* doesn't match the expected naming convention, ``None`` is
1005 returned:
1006
1007 >>> get_project_id('dmedia-hb6ysckay27kiwutwkgkctni') is None
1008 True
1009
1010 Also see `project_db_name()`.
1011 """
1012 match = re.match(PROJECT_DB_PAT, db_name)
1013 if match:
1014 return match.group(1).upper()
1015
1016
991def create_project(title=''):1017def create_project(title=''):
992 _id = random_id()1018 _id = random_id()
993 ts = time.time()1019 ts = time.time()
9941020
=== modified file 'dmedia/tests/test_core.py'
--- dmedia/tests/test_core.py 2012-07-21 00:23:37 +0000
+++ dmedia/tests/test_core.py 2012-08-13 06:09:20 +0000
@@ -32,13 +32,27 @@
32import filestore32import filestore
3333
34from dmedia.local import LocalStores34from dmedia.local import LocalStores
35from dmedia.schema import DB_NAME, create_filestore35from dmedia.schema import DB_NAME, create_filestore, project_db_name
36from dmedia import util, core36from dmedia import util, core
3737
38from .couch import CouchCase38from .couch import CouchCase
39from .base import TempDir39from .base import TempDir
4040
4141
42class TestCouchFunctions(CouchCase):
43 def test_projects_iter(self):
44 self.assertEqual(list(core.projects_iter(self.env)), [])
45 ids = tuple(random_id() for i in range(20))
46 server = microfiber.Server(self.env)
47 for _id in ids:
48 db_name = project_db_name(_id)
49 server.put(None, db_name)
50 self.assertEqual(
51 list(core.projects_iter(self.env)),
52 [(project_db_name(_id), _id) for _id in sorted(ids)]
53 )
54
55
42class TestCore(CouchCase):56class TestCore(CouchCase):
43 def test_init(self):57 def test_init(self):
44 inst = core.Core(self.env)58 inst = core.Core(self.env)
4559
=== modified file 'dmedia/tests/test_schema.py'
--- dmedia/tests/test_schema.py 2012-08-06 11:27:03 +0000
+++ dmedia/tests/test_schema.py 2012-08-13 06:09:20 +0000
@@ -721,6 +721,22 @@
721 'dmedia-0-{}'.format(_id.lower())721 'dmedia-0-{}'.format(_id.lower())
722 )722 )
723723
724 def test_get_project_id(self):
725 self.assertEqual(
726 schema.get_project_id('dmedia-0-aaaaaaaaaaaaaaaaaaaaaaaa'),
727 'AAAAAAAAAAAAAAAAAAAAAAAA'
728 )
729 self.assertIsNone(schema.get_project_id('dmedia-0'))
730 self.assertIsNone(schema.get_project_id('novacut-0'))
731 self.assertIsNone(
732 schema.get_project_id('novacut-0-aaaaaaaaaaaaaaaaaaaaaaaa')
733 )
734 # Make sure we can round-trip with project_db_name():
735 for i in range(1000):
736 _id = random_id()
737 db_name = schema.project_db_name(_id)
738 self.assertEqual(schema.get_project_id(db_name), _id)
739
724 def test_create_project(self):740 def test_create_project(self):
725 doc = schema.create_project()741 doc = schema.create_project()
726 schema.check_project(doc)742 schema.check_project(doc)

Subscribers

People subscribed via source and target branches