|
|
from __future__ import print_function,absolute_import,division,unicode_literals
|
|
|
_T='bdist_wheel'
|
|
|
_S='--version'
|
|
|
_R='extra_packages'
|
|
|
_Q='universal'
|
|
|
_P='nested'
|
|
|
_O='setting distdir {}/{}'
|
|
|
_N='PYDISTBASE'
|
|
|
_M='DVDEBUG'
|
|
|
_L='LICENSE'
|
|
|
_K='Jython'
|
|
|
_J='install'
|
|
|
_I='full_package_name'
|
|
|
_H='__init__.py'
|
|
|
_G='python'
|
|
|
_F='setup.py'
|
|
|
_E='utf-8'
|
|
|
_D=True
|
|
|
_C=False
|
|
|
_B='.'
|
|
|
_A=None
|
|
|
import sys,os,datetime,traceback
|
|
|
sys.path=[path for path in sys.path if path not in[os.getcwd(),'']]
|
|
|
import platform
|
|
|
from _ast import*
|
|
|
from ast import parse
|
|
|
from setuptools import setup,Extension,Distribution
|
|
|
from setuptools.command import install_lib
|
|
|
from setuptools.command.sdist import sdist as _sdist
|
|
|
try:from setuptools.namespaces import Installer as NameSpaceInstaller
|
|
|
except ImportError:msg='You should use the latest setuptools. The namespaces.py file that this setup.py uses was added in setuptools 28.7.0 (Oct 2016)';print(msg);sys.exit()
|
|
|
if __name__!='__main__':raise NotImplementedError('should never include setup.py')
|
|
|
full_package_name=_A
|
|
|
if sys.version_info<(3,):string_type=basestring
|
|
|
else:string_type=str
|
|
|
if sys.version_info<(3,4):
|
|
|
class Bytes:0
|
|
|
class NameConstant:0
|
|
|
if sys.version_info>=(3,8):from ast import Str,Num,Bytes,NameConstant
|
|
|
if sys.version_info<(3,):open_kw=dict()
|
|
|
else:open_kw=dict(encoding=_E)
|
|
|
if sys.version_info<(2,7)or platform.python_implementation()==_K:
|
|
|
class Set:0
|
|
|
if os.environ.get(_M,'')=='':
|
|
|
def debug(*args,**kw):0
|
|
|
else:
|
|
|
def debug(*args,**kw):
|
|
|
with open(os.environ[_M],'a')as fp:kw1=kw.copy();kw1['file']=fp;print('{:%Y-%d-%mT%H:%M:%S}'.format(datetime.datetime.now()),file=fp,end=' ');print(*args,**kw1)
|
|
|
def literal_eval(node_or_string):
|
|
|
_safe_names={'None':_A,'True':_D,'False':_C}
|
|
|
if isinstance(node_or_string,string_type):node_or_string=parse(node_or_string,mode='eval')
|
|
|
if isinstance(node_or_string,Expression):node_or_string=node_or_string.body
|
|
|
else:raise TypeError('only string or AST nodes supported')
|
|
|
def _convert(node):
|
|
|
if isinstance(node,Str):
|
|
|
if sys.version_info<(3,)and not isinstance(node.s,unicode):return node.s.decode(_E)
|
|
|
return node.s
|
|
|
elif isinstance(node,Bytes):return node.s
|
|
|
elif isinstance(node,Num):return node.n
|
|
|
elif isinstance(node,Tuple):return tuple(map(_convert,node.elts))
|
|
|
elif isinstance(node,List):return list(map(_convert,node.elts))
|
|
|
elif isinstance(node,Set):return set(map(_convert,node.elts))
|
|
|
elif isinstance(node,Dict):return dict((_convert(k),_convert(v))for(k,v)in zip(node.keys,node.values))
|
|
|
elif isinstance(node,NameConstant):return node.value
|
|
|
elif sys.version_info<(3,4)and isinstance(node,Name):
|
|
|
if node.id in _safe_names:return _safe_names[node.id]
|
|
|
elif isinstance(node,UnaryOp)and isinstance(node.op,(UAdd,USub))and isinstance(node.operand,(Num,UnaryOp,BinOp)):
|
|
|
operand=_convert(node.operand)
|
|
|
if isinstance(node.op,UAdd):return+operand
|
|
|
else:return-operand
|
|
|
elif isinstance(node,BinOp)and isinstance(node.op,(Add,Sub))and isinstance(node.right,(Num,UnaryOp,BinOp))and isinstance(node.left,(Num,UnaryOp,BinOp)):
|
|
|
left=_convert(node.left);right=_convert(node.right)
|
|
|
if isinstance(node.op,Add):return left+right
|
|
|
else:return left-right
|
|
|
elif isinstance(node,Call):
|
|
|
func_id=getattr(node.func,'id',_A)
|
|
|
if func_id=='dict':return dict((k.arg,_convert(k.value))for k in node.keywords)
|
|
|
elif func_id=='set':return set(_convert(node.args[0]))
|
|
|
elif func_id=='date':return datetime.date(*[_convert(k)for k in node.args])
|
|
|
elif func_id=='datetime':return datetime.datetime(*[_convert(k)for k in node.args])
|
|
|
err=SyntaxError('malformed node or string: '+repr(node));err.filename='<string>';err.lineno=node.lineno;err.offset=node.col_offset;err.text=repr(node);err.node=node;raise err
|
|
|
return _convert(node_or_string)
|
|
|
def _package_data(fn):
|
|
|
data={}
|
|
|
with open(fn,**open_kw)as fp:
|
|
|
parsing=_C;lines=[]
|
|
|
for line in fp.readlines():
|
|
|
if sys.version_info<(3,):line=line.decode(_E)
|
|
|
if line.startswith('_package_data'):
|
|
|
if'dict('in line:parsing=_G;lines.append('dict(\n')
|
|
|
elif line.endswith('= {\n'):parsing=_G;lines.append('{\n')
|
|
|
else:raise NotImplementedError
|
|
|
continue
|
|
|
if not parsing:continue
|
|
|
if parsing==_G:
|
|
|
if line.startswith(')')or line.startswith('}'):
|
|
|
lines.append(line)
|
|
|
try:data=literal_eval(''.join(lines))
|
|
|
except SyntaxError as e:
|
|
|
context=2;from_line=e.lineno-(context+1);to_line=e.lineno+(context-1);w=len(str(to_line))
|
|
|
for(index,line)in enumerate(lines):
|
|
|
if from_line<=index<=to_line:
|
|
|
print('{0:{1}}: {2}'.format(index,w,line).encode(_E),end='')
|
|
|
if index==e.lineno-1:print('{0:{1}} {2}^--- {3}'.format(' ',w,' '*e.offset,e.node))
|
|
|
raise
|
|
|
break
|
|
|
lines.append(line)
|
|
|
else:raise NotImplementedError
|
|
|
return data
|
|
|
pkg_data=_package_data(__file__.replace(_F,_H))
|
|
|
exclude_files=[_F]
|
|
|
def _check_convert_version(tup):
|
|
|
ret_val=str(tup[0]);next_sep=_B;nr_digits=0;post_dev=_C
|
|
|
for x in tup[1:]:
|
|
|
if isinstance(x,int):
|
|
|
nr_digits+=1
|
|
|
if nr_digits>2:raise ValueError('too many consecutive digits after '+ret_val)
|
|
|
ret_val+=next_sep+str(x);next_sep=_B;continue
|
|
|
first_letter=x[0].lower();next_sep=''
|
|
|
if first_letter in'abcr':
|
|
|
if post_dev:raise ValueError('release level specified after post/dev: '+x)
|
|
|
nr_digits=0;ret_val+='rc'if first_letter=='r'else first_letter
|
|
|
elif first_letter in'pd':nr_digits=1;post_dev=_D;ret_val+='.post'if first_letter=='p'else'.dev'
|
|
|
else:raise ValueError('First letter of "'+x+'" not recognised')
|
|
|
if nr_digits==1 and post_dev:ret_val+='0'
|
|
|
return ret_val
|
|
|
version_info=pkg_data['version_info']
|
|
|
version_str=_check_convert_version(version_info)
|
|
|
class MyInstallLib(install_lib.install_lib):
|
|
|
def install(self):
|
|
|
fpp=pkg_data[_I].split(_B);full_exclude_files=[os.path.join(*fpp+[x])for x in exclude_files];alt_files=[];outfiles=install_lib.install_lib.install(self)
|
|
|
for x in outfiles:
|
|
|
for full_exclude_file in full_exclude_files:
|
|
|
if full_exclude_file in x:os.remove(x);break
|
|
|
else:alt_files.append(x)
|
|
|
return alt_files
|
|
|
class MySdist(_sdist):
|
|
|
def initialize_options(self):
|
|
|
_sdist.initialize_options(self);dist_base=os.environ.get(_N);fpn=getattr(getattr(self,'nsp',self),_I,_A)
|
|
|
if fpn and dist_base:print(_O.format(dist_base,fpn));self.dist_dir=os.path.join(dist_base,fpn)
|
|
|
try:
|
|
|
from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
|
|
|
class MyBdistWheel(_bdist_wheel):
|
|
|
def initialize_options(self):
|
|
|
_bdist_wheel.initialize_options(self);dist_base=os.environ.get(_N);fpn=getattr(getattr(self,'nsp',self),_I,_A)
|
|
|
if fpn and dist_base:print(_O.format(dist_base,fpn));self.dist_dir=os.path.join(dist_base,fpn)
|
|
|
_bdist_wheel_available=_D
|
|
|
except ImportError:_bdist_wheel_available=_C
|
|
|
class NameSpacePackager:
|
|
|
def __init__(self,pkg_data):
|
|
|
assert isinstance(pkg_data,dict);self._pkg_data=pkg_data;self.full_package_name=self.pn(self._pkg_data[_I]);self._split=_A;self.depth=self.full_package_name.count(_B);self.nested=self._pkg_data.get(_P,_C)
|
|
|
if self.nested:NameSpaceInstaller.install_namespaces=lambda x:_A
|
|
|
self.command=_A;self.python_version();self._pkg=[_A,_A]
|
|
|
if sys.argv[0]==_F and sys.argv[1]==_J and'--single-version-externally-managed'not in sys.argv:
|
|
|
if os.environ.get('READTHEDOCS',_A)=='True':os.system('pip install .');sys.exit(0)
|
|
|
if not os.environ.get('RUAMEL_NO_PIP_INSTALL_CHECK',_C):print('error: you have to install with "pip install ."');sys.exit(1)
|
|
|
if self._pkg_data.get(_Q):Distribution.is_pure=lambda*args:_D
|
|
|
else:Distribution.is_pure=lambda*args:_C
|
|
|
for x in sys.argv:
|
|
|
if x[0]=='-'or x==_F:continue
|
|
|
self.command=x;break
|
|
|
def pn(self,s):
|
|
|
if sys.version_info<(3,)and isinstance(s,unicode):return s.encode(_E)
|
|
|
return s
|
|
|
@property
|
|
|
def split(self):
|
|
|
skip=[]
|
|
|
if self._split is _A:
|
|
|
fpn=self.full_package_name.split(_B);self._split=[]
|
|
|
while fpn:self._split.insert(0,_B.join(fpn));fpn=fpn[:-1]
|
|
|
for d in sorted(os.listdir(_B)):
|
|
|
if not os.path.isdir(d)or d==self._split[0]or d[0]in'._':continue
|
|
|
x=os.path.join(d,_H)
|
|
|
if os.path.exists(x):
|
|
|
pd=_package_data(x)
|
|
|
if pd.get(_P,_C):skip.append(d);continue
|
|
|
self._split.append(self.full_package_name+_B+d)
|
|
|
if sys.version_info<(3,):self._split=[y.encode(_E)if isinstance(y,unicode)else y for y in self._split]
|
|
|
if skip:0
|
|
|
return self._split
|
|
|
@property
|
|
|
def namespace_packages(self):return self.split[:self.depth]
|
|
|
def namespace_directories(self,depth=_A):
|
|
|
res=[]
|
|
|
for(index,d)in enumerate(self.split[:depth]):
|
|
|
if index>0:d=os.path.join(*d.split(_B))
|
|
|
res.append(_B+d)
|
|
|
return res
|
|
|
@property
|
|
|
def package_dir(self):
|
|
|
d={self.full_package_name:_B}
|
|
|
if _R in self._pkg_data:return d
|
|
|
if len(self.split)>1:d[self.split[0]]=self.namespace_directories(1)[0]
|
|
|
return d
|
|
|
def create_dirs(self):
|
|
|
directories=self.namespace_directories(self.depth)
|
|
|
if not directories:return
|
|
|
if not os.path.exists(directories[0]):
|
|
|
for d in directories:
|
|
|
os.mkdir(d)
|
|
|
with open(os.path.join(d,_H),'w')as fp:fp.write('import pkg_resources\npkg_resources.declare_namespace(__name__)\n')
|
|
|
def python_version(self):
|
|
|
supported=self._pkg_data.get('supported')
|
|
|
if supported is _A:return
|
|
|
if len(supported)==1:minimum=supported[0]
|
|
|
else:
|
|
|
for x in supported:
|
|
|
if x[0]==sys.version_info[0]:minimum=x;break
|
|
|
else:return
|
|
|
if sys.version_info<minimum:print('minimum python version(s): '+str(supported));sys.exit(1)
|
|
|
def check(self):
|
|
|
A='develop'
|
|
|
try:from pip.exceptions import InstallationError
|
|
|
except ImportError:return
|
|
|
if self.command not in[_J,A]:return
|
|
|
prefix=self.split[0];prefixes=set([prefix,prefix.replace('_','-')])
|
|
|
for p in sys.path:
|
|
|
if not p:continue
|
|
|
if os.path.exists(os.path.join(p,_F)):continue
|
|
|
if not os.path.isdir(p):continue
|
|
|
if p.startswith('/tmp/'):continue
|
|
|
for fn in os.listdir(p):
|
|
|
for pre in prefixes:
|
|
|
if fn.startswith(pre):break
|
|
|
else:continue
|
|
|
full_name=os.path.join(p,fn)
|
|
|
if fn==prefix and os.path.isdir(full_name):
|
|
|
if self.command==A:raise InstallationError('Cannot mix develop (pip install -e),\nwith non-develop installs for package name {0}'.format(fn))
|
|
|
elif fn==prefix:raise InstallationError('non directory package {0} in {1}'.format(fn,p))
|
|
|
for pre in[x+_B for x in prefixes]:
|
|
|
if fn.startswith(pre):break
|
|
|
else:continue
|
|
|
if fn.endswith('-link')and self.command==_J:raise InstallationError('Cannot mix non-develop with develop\n(pip install -e) installs for package name {0}'.format(fn))
|
|
|
def entry_points(self,script_name=_A,package_name=_A):
|
|
|
A='console_scripts'
|
|
|
def pckg_entry_point(name):return'{0}{1}:main'.format(name,'.__main__'if os.path.exists('__main__.py')else'')
|
|
|
ep=self._pkg_data.get('entry_points',_D)
|
|
|
if isinstance(ep,dict):return ep
|
|
|
if ep is _A:return
|
|
|
if ep not in[_D,1]:
|
|
|
if'='in ep:return{A:[ep]}
|
|
|
script_name=ep
|
|
|
if package_name is _A:package_name=self.full_package_name
|
|
|
if not script_name:script_name=package_name.split(_B)[-1]
|
|
|
return{A:['{0} = {1}'.format(script_name,pckg_entry_point(package_name))]}
|
|
|
@property
|
|
|
def url(self):
|
|
|
url=self._pkg_data.get('url')
|
|
|
if url:return url
|
|
|
sp=self.full_package_name
|
|
|
for ch in'_.':sp=sp.replace(ch,'-')
|
|
|
return'https://sourceforge.net/p/{0}/code/ci/default/tree'.format(sp)
|
|
|
@property
|
|
|
def author(self):return self._pkg_data['author']
|
|
|
@property
|
|
|
def author_email(self):return self._pkg_data['author_email']
|
|
|
@property
|
|
|
def license(self):
|
|
|
lic=self._pkg_data.get('license')
|
|
|
if lic is _A:return'MIT license'
|
|
|
return lic
|
|
|
def has_mit_lic(self):return'MIT'in self.license
|
|
|
@property
|
|
|
def description(self):return self._pkg_data['description']
|
|
|
@property
|
|
|
def status(self):
|
|
|
status=self._pkg_data.get('status','β').lower()
|
|
|
if status in['α','alpha']:return 3,'Alpha'
|
|
|
elif status in['β','beta']:return 4,'Beta'
|
|
|
elif'stable'in status.lower():return 5,'Production/Stable'
|
|
|
raise NotImplementedError
|
|
|
@property
|
|
|
def classifiers(self):
|
|
|
attr='_'+sys._getframe().f_code.co_name
|
|
|
if not hasattr(self,attr):setattr(self,attr,self._setup_classifiers())
|
|
|
return getattr(self,attr)
|
|
|
def _setup_classifiers(self):return sorted(set(['Development Status :: {0} - {1}'.format(*self.status),'Intended Audience :: Developers','License :: '+('OSI Approved :: MIT'if self.has_mit_lic()else'Other/Proprietary')+' License','Operating System :: OS Independent','Programming Language :: Python']+[self.pn(x)for x in self._pkg_data.get('classifiers',[])]))
|
|
|
@property
|
|
|
def keywords(self):return self.pn(self._pkg_data.get('keywords',[]))
|
|
|
@property
|
|
|
def install_requires(self):return self._analyse_packages[0]
|
|
|
@property
|
|
|
def install_pre(self):return self._analyse_packages[1]
|
|
|
@property
|
|
|
def _analyse_packages(self):
|
|
|
if self._pkg[0]is _A:self._pkg[0]=[];self._pkg[1]=[]
|
|
|
ir=self._pkg_data.get('install_requires')
|
|
|
if ir is _A:return self._pkg
|
|
|
if isinstance(ir,list):self._pkg[0]=ir;return self._pkg
|
|
|
packages=ir.get('any',[])
|
|
|
if isinstance(packages,string_type):packages=packages.split()
|
|
|
if self.nested:
|
|
|
parent_pkg=self.full_package_name.rsplit(_B,1)[0]
|
|
|
if parent_pkg not in packages:packages.append(parent_pkg)
|
|
|
implementation=platform.python_implementation()
|
|
|
if implementation=='CPython':pyver='py{0}{1}'.format(*sys.version_info)
|
|
|
elif implementation=='PyPy':pyver='pypy'if sys.version_info<(3,)else'pypy3'
|
|
|
elif implementation==_K:pyver='jython'
|
|
|
packages.extend(ir.get(pyver,[]))
|
|
|
for p in packages:
|
|
|
if p[0]=='*':p=p[1:];self._pkg[1].append(p)
|
|
|
self._pkg[0].append(p)
|
|
|
return self._pkg
|
|
|
@property
|
|
|
def extras_require(self):ep=self._pkg_data.get('extras_require');return ep
|
|
|
@property
|
|
|
def package_data(self):
|
|
|
df=self._pkg_data.get('data_files',[])
|
|
|
if self.has_mit_lic():df.append(_L);exclude_files.append(_L)
|
|
|
if self._pkg_data.get('binary_only',_C):exclude_files.append(_H)
|
|
|
debug('testing<<<<<')
|
|
|
if'Typing :: Typed'in self.classifiers:debug('appending');df.append('py.typed')
|
|
|
pd=self._pkg_data.get('package_data',{})
|
|
|
if df:pd[self.full_package_name]=df
|
|
|
if sys.version_info<(3,):
|
|
|
for k in pd:
|
|
|
if isinstance(k,unicode):pd[str(k)]=pd.pop(k)
|
|
|
return pd
|
|
|
@property
|
|
|
def packages(self):s=self.split;return s+self._pkg_data.get(_R,[])
|
|
|
@property
|
|
|
def python_requires(self):return self._pkg_data.get('python_requires',_A)
|
|
|
@property
|
|
|
def ext_modules(self):
|
|
|
I='Exception:';H='link error';G='compile error:';F='Windows';E='lib';D='src';C='ext_modules';B='test';A='name'
|
|
|
if hasattr(self,'_ext_modules'):return self._ext_modules
|
|
|
if _S in sys.argv:return
|
|
|
if platform.python_implementation()==_K:return
|
|
|
try:
|
|
|
plat=sys.argv.index('--plat-name')
|
|
|
if'win'in sys.argv[plat+1]:return
|
|
|
except ValueError:pass
|
|
|
self._ext_modules=[];no_test_compile=_C
|
|
|
if'--restructuredtext'in sys.argv:no_test_compile=_D
|
|
|
elif'sdist'in sys.argv:no_test_compile=_D
|
|
|
if no_test_compile:
|
|
|
for target in self._pkg_data.get(C,[]):ext=Extension(self.pn(target[A]),sources=[self.pn(x)for x in target[D]],libraries=[self.pn(x)for x in target.get(E)]);self._ext_modules.append(ext)
|
|
|
return self._ext_modules
|
|
|
print('sys.argv',sys.argv);import tempfile,shutil;from textwrap import dedent;import distutils.sysconfig,distutils.ccompiler;from distutils.errors import CompileError,LinkError
|
|
|
for target in self._pkg_data.get(C,[]):
|
|
|
ext=Extension(self.pn(target[A]),sources=[self.pn(x)for x in target[D]],libraries=[self.pn(x)for x in target.get(E)])
|
|
|
if B not in target:self._ext_modules.append(ext);continue
|
|
|
if sys.version_info[:2]==(3,4)and platform.system()==F:
|
|
|
if'FORCE_C_BUILD_TEST'not in os.environ:self._ext_modules.append(ext);continue
|
|
|
c_code=dedent(target[B])
|
|
|
try:
|
|
|
tmp_dir=tempfile.mkdtemp(prefix='tmp_ruamel_');bin_file_name=B+self.pn(target[A]);print('test compiling',bin_file_name);file_name=os.path.join(tmp_dir,bin_file_name+'.c')
|
|
|
with open(file_name,'w')as fp:fp.write(c_code)
|
|
|
compiler=distutils.ccompiler.new_compiler();assert isinstance(compiler,distutils.ccompiler.CCompiler);distutils.sysconfig.customize_compiler(compiler);compiler.add_include_dir(os.getcwd())
|
|
|
if sys.version_info<(3,):tmp_dir=tmp_dir.encode(_E)
|
|
|
compile_out_dir=tmp_dir
|
|
|
try:compiler.link_executable(compiler.compile([file_name],output_dir=compile_out_dir),bin_file_name,output_dir=tmp_dir,libraries=ext.libraries)
|
|
|
except CompileError:debug(G,file_name);print(G,file_name);continue
|
|
|
except LinkError:debug(H,file_name);print(H,file_name);continue
|
|
|
self._ext_modules.append(ext)
|
|
|
except Exception as e:
|
|
|
debug(I,e);print(I,e)
|
|
|
if sys.version_info[:2]==(3,4)and platform.system()==F:traceback.print_exc()
|
|
|
finally:shutil.rmtree(tmp_dir)
|
|
|
return self._ext_modules
|
|
|
@property
|
|
|
def test_suite(self):return self._pkg_data.get('test_suite')
|
|
|
def wheel(self,kw,setup):
|
|
|
if _T not in sys.argv:return _C
|
|
|
file_name='setup.cfg'
|
|
|
if os.path.exists(file_name):return _C
|
|
|
with open(file_name,'w')as fp:
|
|
|
if os.path.exists(_L):fp.write('[metadata]\nlicense-file = LICENSE\n')
|
|
|
else:print('\n\n>>>>>> LICENSE file not found <<<<<\n\n')
|
|
|
if self._pkg_data.get(_Q):fp.write('[bdist_wheel]\nuniversal = 1\n')
|
|
|
try:setup(**kw)
|
|
|
except Exception:raise
|
|
|
finally:os.remove(file_name)
|
|
|
return _D
|
|
|
def main():
|
|
|
A='tarfmt';dump_kw='--dump-kw'
|
|
|
if dump_kw in sys.argv:import wheel,distutils,setuptools;print('python: ',sys.version);print('setuptools:',setuptools.__version__);print('distutils: ',distutils.__version__);print('wheel: ',wheel.__version__)
|
|
|
nsp=NameSpacePackager(pkg_data);nsp.check();nsp.create_dirs();MySdist.nsp=nsp
|
|
|
if pkg_data.get(A):MySdist.tarfmt=pkg_data.get(A)
|
|
|
cmdclass=dict(install_lib=MyInstallLib,sdist=MySdist)
|
|
|
if _bdist_wheel_available:MyBdistWheel.nsp=nsp;cmdclass[_T]=MyBdistWheel
|
|
|
kw=dict(name=nsp.full_package_name,namespace_packages=nsp.namespace_packages,version=version_str,packages=nsp.packages,python_requires=nsp.python_requires,url=nsp.url,author=nsp.author,author_email=nsp.author_email,cmdclass=cmdclass,package_dir=nsp.package_dir,entry_points=nsp.entry_points(),description=nsp.description,install_requires=nsp.install_requires,extras_require=nsp.extras_require,license=nsp.license,classifiers=nsp.classifiers,keywords=nsp.keywords,package_data=nsp.package_data,ext_modules=nsp.ext_modules,test_suite=nsp.test_suite)
|
|
|
if _S not in sys.argv and('--verbose'in sys.argv or dump_kw in sys.argv):
|
|
|
for k in sorted(kw):v=kw[k];print(' "{0}": "{1}",'.format(k,v))
|
|
|
if dump_kw in sys.argv:sys.argv.remove(dump_kw)
|
|
|
try:
|
|
|
with open('README.rst')as fp:kw['long_description']=fp.read();kw['long_description_content_type']='text/x-rst'
|
|
|
except Exception:pass
|
|
|
if nsp.wheel(kw,setup):return
|
|
|
for x in['-c','egg_info','--egg-base','pip-egg-info']:
|
|
|
if x not in sys.argv:break
|
|
|
else:
|
|
|
for p in nsp.install_pre:
|
|
|
import subprocess;setup_path=os.path.join(*p.split(_B)+[_F]);try_dir=os.path.dirname(sys.executable)
|
|
|
while len(try_dir)>1:
|
|
|
full_path_setup_py=os.path.join(try_dir,setup_path)
|
|
|
if os.path.exists(full_path_setup_py):pip=sys.executable.replace(_G,'pip');cmd=[pip,_J,os.path.dirname(full_path_setup_py)];subprocess.check_output(cmd);break
|
|
|
try_dir=os.path.dirname(try_dir)
|
|
|
setup(**kw)
|
|
|
main() |