bazarr/libs/dynaconf/vendor/ruamel/yaml/setup.py

400 lines
18 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()