You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

setup.py 6.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. # Copyright (c) Alibaba, Inc. and its affiliates.
  2. # !/usr/bin/env python
  3. import os
  4. import shutil
  5. import subprocess
  6. from setuptools import find_packages, setup
  7. def readme():
  8. with open('README.md', encoding='utf-8') as f:
  9. content = f.read()
  10. return content
  11. version_file = 'maas_lib/version.py'
  12. def get_git_hash():
  13. def _minimal_ext_cmd(cmd):
  14. # construct minimal environment
  15. env = {}
  16. for k in ['SYSTEMROOT', 'PATH', 'HOME']:
  17. v = os.environ.get(k)
  18. if v is not None:
  19. env[k] = v
  20. # LANGUAGE is used on win32
  21. env['LANGUAGE'] = 'C'
  22. env['LANG'] = 'C'
  23. env['LC_ALL'] = 'C'
  24. out = subprocess.Popen(
  25. cmd, stdout=subprocess.PIPE, env=env).communicate()[0]
  26. return out
  27. try:
  28. out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
  29. sha = out.strip().decode('ascii')
  30. except OSError:
  31. sha = 'unknown'
  32. return sha
  33. def get_hash():
  34. assert os.path.exists('.git'), '.git directory does not exist'
  35. sha = get_git_hash()[:7]
  36. return sha
  37. def get_version():
  38. with open(version_file, 'r') as f:
  39. exec(compile(f.read(), version_file, 'exec'))
  40. return locals()['__version__']
  41. def parse_requirements(fname='requirements.txt', with_version=True):
  42. """
  43. Parse the package dependencies listed in a requirements file but strips
  44. specific versioning information.
  45. Args:
  46. fname (str): path to requirements file
  47. with_version (bool, default=False): if True include version specs
  48. Returns:
  49. List[str]: list of requirements items
  50. CommandLine:
  51. python -c "import setup; print(setup.parse_requirements())"
  52. """
  53. import sys
  54. from os.path import exists
  55. import re
  56. require_fpath = fname
  57. def parse_line(line):
  58. """
  59. Parse information from a line in a requirements text file
  60. """
  61. if line.startswith('-r '):
  62. # Allow specifying requirements in other files
  63. target = line.split(' ')[1]
  64. for info in parse_require_file(target):
  65. yield info
  66. else:
  67. info = {'line': line}
  68. if line.startswith('-e '):
  69. info['package'] = line.split('#egg=')[1]
  70. else:
  71. # Remove versioning from the package
  72. pat = '(' + '|'.join(['>=', '==', '>']) + ')'
  73. parts = re.split(pat, line, maxsplit=1)
  74. parts = [p.strip() for p in parts]
  75. info['package'] = parts[0]
  76. if len(parts) > 1:
  77. op, rest = parts[1:]
  78. if ';' in rest:
  79. # Handle platform specific dependencies
  80. # http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies
  81. version, platform_deps = map(str.strip,
  82. rest.split(';'))
  83. info['platform_deps'] = platform_deps
  84. else:
  85. version = rest # NOQA
  86. info['version'] = (op, version)
  87. yield info
  88. def parse_require_file(fpath):
  89. with open(fpath, 'r') as f:
  90. for line in f.readlines():
  91. line = line.strip()
  92. if line.startswith('http'):
  93. print('skip http requirements %s' % line)
  94. continue
  95. if line and not line.startswith('#') and not line.startswith(
  96. '--'):
  97. for info in parse_line(line):
  98. yield info
  99. elif line and line.startswith('--find-links'):
  100. eles = line.split()
  101. for e in eles:
  102. e = e.strip()
  103. if 'http' in e:
  104. info = dict(dependency_links=e)
  105. yield info
  106. def gen_packages_items():
  107. items = []
  108. deps_link = []
  109. if exists(require_fpath):
  110. for info in parse_require_file(require_fpath):
  111. if 'dependency_links' not in info:
  112. parts = [info['package']]
  113. if with_version and 'version' in info:
  114. parts.extend(info['version'])
  115. if not sys.version.startswith('3.4'):
  116. # apparently package_deps are broken in 3.4
  117. platform_deps = info.get('platform_deps')
  118. if platform_deps is not None:
  119. parts.append(';' + platform_deps)
  120. item = ''.join(parts)
  121. items.append(item)
  122. else:
  123. deps_link.append(info['dependency_links'])
  124. return items, deps_link
  125. return gen_packages_items()
  126. def pack_resource():
  127. # pack resource such as configs and tools
  128. root_dir = 'package/'
  129. if os.path.isdir(root_dir):
  130. shutil.rmtree(root_dir)
  131. os.makedirs(root_dir)
  132. proj_dir = root_dir + 'maas_lib/'
  133. shutil.copytree('./maas_lib', proj_dir)
  134. shutil.copytree('./configs', proj_dir + 'configs')
  135. shutil.copytree('./requirements', 'package/requirements')
  136. shutil.copy('./requirements.txt', 'package/requirements.txt')
  137. shutil.copy('./MANIFEST.in', 'package/MANIFEST.in')
  138. shutil.copy('./README.md', 'package/README.md')
  139. if __name__ == '__main__':
  140. # write_version_py()
  141. pack_resource()
  142. os.chdir('package')
  143. install_requires, deps_link = parse_requirements('requirements.txt')
  144. setup(
  145. name='maas-lib',
  146. version=get_version(),
  147. description='',
  148. long_description=readme(),
  149. long_description_content_type='text/markdown',
  150. author='Alibaba MaaS team',
  151. author_email='maas_lib@list.alibaba-inc.com',
  152. keywords='',
  153. url='TBD',
  154. packages=find_packages(exclude=('configs', 'tools', 'demo')),
  155. include_package_data=True,
  156. classifiers=[
  157. 'Development Status :: 4 - Beta',
  158. 'License :: OSI Approved :: Apache Software License',
  159. 'Operating System :: OS Independent',
  160. 'Programming Language :: Python :: 3',
  161. 'Programming Language :: Python :: 3.5',
  162. 'Programming Language :: Python :: 3.6',
  163. 'Programming Language :: Python :: 3.7',
  164. ],
  165. license='Apache License 2.0',
  166. tests_require=parse_requirements('requirements/tests.txt'),
  167. install_requires=install_requires,
  168. dependency_links=deps_link,
  169. zip_safe=False)

致力于通过开放的社区合作,开源AI模型以及相关创新技术,推动基于模型即服务的生态繁荣发展