# Path: distributions/tests/util.py
# def list_models():
#     result = set()
#     for path in glob.glob(os.path.join(ROOT, '*', 'models', '*.p*')):
#         dirname, filename = os.path.split(path)
#         flavor = os.path.split(os.path.dirname(dirname))[-1]
#         name = os.path.splitext(filename)[0]
#         if not name.startswith('__'):
#             result.add((name, flavor))
#     for name, flavor in sorted(result):
#         spec = {'flavor': flavor, 'name': name}
#         if name.startswith('_'):
#             continue
#         try:
#             import_model(spec)
#             yield spec
#         except ImportError:
#             module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#             print 'failed to import {}'.format(module_name)
#             import traceback
#             print traceback.format_exc()
# 
# def import_model(spec):
#     module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#     return importlib.import_module(module_name)


from collections import defaultdict
from distributions.tests.util import list_models, import_model
import parsable
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



@parsable.command
def flavors_by_model():
    '''
    List flavors implemented of each model.
    '''
    models = defaultdict(lambda: [])
    for spec in list_models():
        models[spec['name']].append(spec['flavor'])
    for model in sorted(models):
        print 'model {}: {}'.format(model, ' '.join(sorted(models[model])))


@parsable.command
def models_by_flavor():
    '''
    List models implemented of each flavor.
    '''
    flavors = defaultdict(lambda: [])

# Path: distributions/tests/util.py
# def list_models():
#     result = set()
#     for path in glob.glob(os.path.join(ROOT, '*', 'models', '*.p*')):
#         dirname, filename = os.path.split(path)
#         flavor = os.path.split(os.path.dirname(dirname))[-1]
#         name = os.path.splitext(filename)[0]
#         if not name.startswith('__'):
#             result.add((name, flavor))
#     for name, flavor in sorted(result):
#         spec = {'flavor': flavor, 'name': name}
#         if name.startswith('_'):
#             continue
#         try:
#             import_model(spec)
#             yield spec
#         except ImportError:
#             module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#             print 'failed to import {}'.format(module_name)
#             import traceback
#             print traceback.format_exc()
# 
# def import_model(spec):
#     module_name = 'distributions.{flavor}.models.{name}'.format(**spec)
#     return importlib.import_module(module_name)


# Path: distributions/__main__.py
from collections import defaultdict
from distributions.tests.util import list_models, import_model
import parsable

# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



@parsable.command
def flavors_by_model():
    '''
    List flavors implemented of each model.
    '''
    models = defaultdict(lambda: [])
    for spec in list_models():
        models[spec['name']].append(spec['flavor'])
    for model in sorted(models):
        print 'model {}: {}'.format(model, ' '.join(sorted(models[model])))


@parsable.command
def models_by_flavor():
    '''
    List models implemented of each flavor.
    '''
    flavors = defaultdict(lambda: [])

    for spec in list_models():