#!/usr/bin/python
# -*- coding: utf-8 -*-

from distutils.core import setup
import os


def _do_list_dir(top_dir, base_dir):
    top_dir = os.path.realpath(top_dir)
    print "top : ", top_dir
    base_dir = os.path.realpath(base_dir)
    all_files = os.listdir(base_dir)
    modules = []
    for f in all_files:
        fname = os.path.join(base_dir, f)
        if os.path.isfile(fname):
            ext = f.split('.')[-1]
            if ext == 'py':
                p = base_dir.find(top_dir)
                mod = os.path.join(base_dir[p + len(top_dir) + 1:], f)
                modules.append(mod)
        elif os.path.isdir(fname):
            modules += _do_list_dir(top_dir, fname)
    return modules


def find_all_dist_module():
    base_dir = 'supwisdom'
    return _do_list_dir(base_dir, base_dir)

#print find_all_dist_module()

setup(
    name='supwisdom',
    version="0.1",
    description="Supwisdom python libraries",
    author='Cheng Tang',
    author_email='cheng.tang@supwisdom.com',
    platforms=['All'],
    packages=['supwisdom', 'supwisdom.protocol']
    )
