Opened 12 years ago
Last modified 12 years ago
#30 closed defect (FIXED)
Separate out and geniericify utility for parsing config from mediagoblin/celery_setup/__init__.py
|Reported by:||Christopher Allan Webber||Owned by:||Christopher Allan Webber|
It would be great if we could have something like: :: >>> from mediagoblin.util import parse_app_config >>> parse_app_config(path_to_config_file, app_section='app:mediagoblin') (app_config, global_config) where the former is the app config (a dictionary of all values you see in [app:mediagoblin] in mediagoblin.ini) and the latter is the global config (a dictionary of dictionaries for all sections). This tool kind of already exists in mediagoblin/celery\_setup/**init**.py, you can see a section like: :: parser = NicerConfigParser(mgoblin_conf_file) parser.read(mgoblin_conf_file) parser._defaults.setdefault( 'here', os.path.dirname(os.path.abspath(mgoblin_conf_file))) parser._defaults.setdefault( '__file__', os.path.abspath(mgoblin_conf_file)) mgoblin_section = dict(parser.items(mgoblin_section)) mgoblin_conf = dict( [(section_name, dict(parser.items(section_name))) for section_name in parser.sections()]) This should be: - separated out into an independent utility - given tests in mediagoblin/tests/test\_util.py - able to take the specific section as the app\_section keyword argument (defaults to 'app:mediagoblin') - bonus feature? If 'app:mediagoblin' is not found maybe we could find the section by iterating through until we find the one that has 'use': 'egg:mediagoblin#app'
Change History (13)
comment:1 by , 12 years ago
comment:2 by , 12 years ago
I wonder if the bonus feature is too magical and a bad idea... it's probably best to implement it outside of the actual utility if done. Scrap the bonus! It's probably too magical, I think.
comment:3 by , 12 years ago
Cool. Then, I basically have this written in it's own module but I'm not sure how to set up tests because I'm terribly new to Python. Can someone point me to a good resource on creating tests?
comment:4 by , 12 years ago
Great! So there's some documentation on tests on: - `http://somethingaboutorange.com/mrl/projects/nose/1.0.0/ <http://somethingaboutorange.com/mrl/projects/nose/1.0.0/>`_ - `http://docs.python.org/library/unittest.html <http://docs.python.org/library/unittest.html>`_ We use nose which has some wrappers around unittest... for one thing, it makes things nicer because it makes writing tests super easy. You'll want to put the utility in mediagoblin/tests/test\_util.py But if you want a really easy example of what tests look like, I suggest looking at test\_globals.py's test\_setup\_globals function which is pretty straightforward: :: def test_setup_globals(): mg_globals.setup_globals( db_connection='my favorite db_connection!', database='my favorite database!', public_store='my favorite public_store!', queue_store='my favorite queue_store!') assert mg_globals.db_connection == 'my favorite db_connection!' assert mg_globals.database == 'my favorite database!' assert mg_globals.public_store == 'my favorite public_store!' assert mg_globals.queue_store == 'my favorite queue_store!' See, all you need to do is put a test*foo method in one of the test*\* modules in mediagoblin/tests/ and when you run ./bin/nosetests it should pick it up and see if it works. Just store a simple config file in the tests/ directory, use pkg\_resources to pick it up like so: :: import pkg_resources config_filename = pkg_resources.resource_filename( u'mediagoblin.tests', u'fakeconfig.ini') should pick up the filename (but not load it) Then just run that file through your utility, do asserts to make sure that everything's returned in the way that you expected. Next time you run ./bin/nosetests it should pick up your test function and make sure that everything **does** work. Does that make sense?
comment:5 by , 12 years ago
Hey Matt, Mind tacking your current progress to the ticket, preferably by using git format-patch? (but optionally pushing a git branch I can access works also) This would be helpful even if you don't have tests written yet.
comment:6 by , 12 years ago
When this is done we should update `http://bugs.foocorp.net/issues/344 <http://bugs.foocorp.net/issues/344>`_
comment:7 by , 12 years ago
Hi Chris, Sorry for the delay. I've had some connectivity issues at home. I'll get this posted ASAP. Thanks, Matt
comment:8 by , 12 years ago
Okay great, looking forward to seeing it!
comment:9 by , 12 years ago
This is done, almost. I changed my mind a bit and selecting a section is not really done via the function itself because it's easy enough to select it yourself via the key. Not everything is switched over yet though, and tests aren't written. Getting close though.
comment:10 by , 12 years ago
|Status:||New → Resolved|
This is actually resolved really with the new ConfigObj branch being merged in.
comment:11 by , 12 years ago
This wasn't targeted at 0.0.3, but will now be in that version, so change it. Makes looking at the bugs a nice way to see, what happened, for release notes. As Christopher Webber did most of the work, assigning to him. ;)
comment:12 by , 12 years ago
|Status:||Resolved → Closed|
Also this should be closed, not resolved!
comment:13 by , 11 years ago
The original url for this bug was http://bugs.foocorp.net/issues/297 .
Note: See TracTickets for help on using tickets.