# 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
#
# - Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
# - Neither the name of Salesforce.com nor the names of its contributors
#   may be used to endorse or promote products derived from this
#   software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# 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: [])

# 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

#
# - Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
# - Neither the name of Salesforce.com nor the names of its contributors
#   may be used to endorse or promote products derived from this
#   software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# 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():