diff --git a/README.rst b/README.rst index 9da4b22..72ad0fc 100644 --- a/README.rst +++ b/README.rst @@ -133,13 +133,13 @@ The package contains several text analysis tasks to generate the terms used in t .. code-block:: bash - $ ./mange.py construct_tfidf_model gensim_data/immix_summaries.mm gensim_data/immix_summaries.tfidf_model + $ ./manage.py construct_tfidf_model gensim_data/immix_summaries.mm gensim_data/immix_summaries.tfidf_model 7. Add the topN 'most descriptive' terms to each indexed document: .. code-block:: bash - $ ./mange.py analyze_text index_descriptive_terms "immix_analyzed/summaries/*.tar.gz" gensim_data/immix_summaries_pruned.dict gensim_data/immix_summaries.tfidf_model gensim_data/immix_summaries.tfidf_model 'quamerdes_immix_20140920' 'text_descriptive_terms' 10 + $ ./manage.py analyze_text index_descriptive_terms "immix_analyzed/summaries/*.tar.gz" gensim_data/immix_summaries_pruned.dict gensim_data/immix_summaries.tfidf_model gensim_data/immix_summaries.tfidf_model 'quamerdes_immix_20140920' 'text_descriptive_terms' 10 License ------- diff --git a/avresearcher/app.py b/avresearcher/app.py index 8cbd70f..f82d771 100644 --- a/avresearcher/app.py +++ b/avresearcher/app.py @@ -6,6 +6,9 @@ from .extensions import mail, db, bcrypt, sentry, login_manager +__all__ = ['create_app'] + + DEFAULT_BLUEPRINTS = ( views, ) @@ -23,6 +26,7 @@ def create_app(package_name='avresearcher', settings_override=None): app.config.from_object('avresearcher.settings') app.config.from_object(settings_override) + _validate(app.config) if app.config['DEBUG'] and app.config['SENTRY_DSN']: sentry.init_app(app) @@ -51,3 +55,34 @@ def load_user(user_id): app.register_blueprint(bp) return app + + +def _validate(config): + # Settings validation: should catch common settings.py/local_settings.py + # mistakes. Add rules as needed. + + collections_config = config['COLLECTIONS_CONFIG'] + for coll in config['ENABLED_COLLECTIONS']: + if coll not in collections_config: + raise ValueError("collection %r enabled, but not configured" + " in COLLECTIONS_CONFIG" % (coll)) + + for index, settings in collections_config.iteritems(): + index_name = settings.get('index_name') + if not isinstance(index_name, basestring): + raise TypeError("not a valid index_name for index %r: %r of %r" + % (index, index_name, type(index_name))) + + aggregations = settings.get('available_aggregations', []) + for facet in settings.get('enabled_facets', []): + if facet not in aggregations: + raise ValueError("facet %r not among available_aggregations=%r" + " for index %r" + % (facet, list(aggregations.keys()), index)) + + avail_fields = settings['available_search_fields'] + for field in settings['enabled_search_fields']: + if field not in avail_fields: + raise ValueError("search field %r not among" + " available_search_fields=%r for index %r" + % (field, list(avail_fields), index)) diff --git a/avresearcher/tests/test_app.py b/avresearcher/tests/test_app.py new file mode 100644 index 0000000..479ce33 --- /dev/null +++ b/avresearcher/tests/test_app.py @@ -0,0 +1,44 @@ +from avresearcher.app import _validate + +from copy import deepcopy + +from nose.tools import assert_raises + + +config = { + "COLLECTIONS_CONFIG": { + "index1": { + "index_name": "hello?", + "enabled_facets": ["cheap_facet"], + "available_aggregations": { + "cheap_facet": {} + }, + "available_search_fields": { + "field1": {"name": "1", "fields": ["1"]}, + "field2": {"name": "2", "fields": ["2"]}, + }, + "enabled_search_fields": ["field1", "field2"], + }, + }, + "ENABLED_COLLECTIONS": ["index1"], +} + + +def test_validate(): + _validate(config) + + c = deepcopy(config) + c["ENABLED_COLLECTIONS"] += "index2" + assert_raises(ValueError, _validate, c) + + c = deepcopy(config) + c["COLLECTIONS_CONFIG"]["index1"]["index_name"] = 123456 + assert_raises(TypeError, _validate, c) + + c = deepcopy(config) + c["COLLECTIONS_CONFIG"]["index1"]["enabled_facets"] += "expensive_facet" + assert_raises(ValueError, _validate, c) + + c = deepcopy(config) + c["COLLECTIONS_CONFIG"]["index1"]["enabled_search_fields"] += "field3" + assert_raises(ValueError, _validate, c)