def __init__(self, pypi=None, pipfile=True, chdir=False): self.pypi = pypi self.original_umask = os.umask(0o007) self.original_dir = os.path.abspath(os.curdir) self._path = TemporaryDirectory(suffix='-project', prefix='pipenv-') path = Path(self._path.name) try: self.path = str(path.resolve()) except OSError: self.path = str(path.absolute()) # set file creation perms self.pipfile_path = None self.chdir = chdir if self.pypi: os.environ['PIPENV_TEST_INDEX'] = '{0}/simple'.format( self.pypi.url) if pipfile: p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'a'): os.utime(p_path, None) self.chdir = False or chdir self.pipfile_path = p_path
def __init__(self, pypi=None, pipfile=True, chdir=False, path=None, home_dir=None): self.pypi = pypi self.original_umask = os.umask(0o007) self.original_dir = os.path.abspath(os.curdir) os.environ["PIPENV_NOSPIN"] = fs_str("1") os.environ["CI"] = fs_str("1") warnings.simplefilter("ignore", category=ResourceWarning) warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*<ssl.SSLSocket.*>") path = os.environ.get("PIPENV_PROJECT_DIR", None) if not path: self._path = TemporaryDirectory(suffix='-project', prefix='pipenv-') path = Path(self._path.name) try: self.path = str(path.resolve()) except OSError: self.path = str(path.absolute()) else: self._path = None self.path = path # set file creation perms self.pipfile_path = None self.chdir = chdir if self.pypi: os.environ['PIPENV_TEST_INDEX'] = fs_str('{0}/simple'.format(self.pypi.url)) if pipfile: p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'a'): os.utime(p_path, None) self.chdir = False or chdir self.pipfile_path = p_path
def pipenv(self, cmd, block=True): if self.pipfile_path and os.path.isfile(self.pipfile_path): os.environ['PIPENV_PIPFILE'] = fs_str(self.pipfile_path) # a bit of a hack to make sure the virtualenv is created with TemporaryDirectory(prefix='pipenv-', suffix='-cache') as tempdir: os.environ['PIPENV_CACHE_DIR'] = fs_str(tempdir.name) c = delegator.run('pipenv {0}'.format(cmd), block=block, cwd=os.path.abspath(self.path)) if 'PIPENV_CACHE_DIR' in os.environ: del os.environ['PIPENV_CACHE_DIR'] if 'PIPENV_PIPFILE' in os.environ: del os.environ['PIPENV_PIPFILE'] # Pretty output for failing tests. if block: print('$ pipenv {0}'.format(cmd)) print(c.out) print(c.err) if c.return_code != 0: print("Command failed...") # Where the action happens. return c
def __init__(self, pypi=None, pipfile=True, chdir=False, path=None, home_dir=None, venv_root=None, ignore_virtualenvs=True, venv_in_project=True, name=None): self.pypi = pypi if ignore_virtualenvs: os.environ["PIPENV_IGNORE_VIRTUALENVS"] = fs_str("1") if venv_root: os.environ["VIRTUAL_ENV"] = venv_root if venv_in_project: os.environ["PIPENV_VENV_IN_PROJECT"] = fs_str("1") else: os.environ.pop("PIPENV_VENV_IN_PROJECT", None) self.original_dir = os.path.abspath(os.curdir) path = path if path else os.environ.get("PIPENV_PROJECT_DIR", None) if name is not None: path = Path(os.environ["HOME"]) / "projects" / name path.mkdir(exist_ok=True) if not path: path = TemporaryDirectory(suffix='-project', prefix='pipenv-') if isinstance(path, TemporaryDirectory): self._path = path path = Path(self._path.name) try: self.path = str(path.resolve()) except OSError: self.path = str(path.absolute()) elif isinstance(path, Path): self._path = path try: self.path = str(path.resolve()) except OSError: self.path = str(path.absolute()) else: self._path = path self.path = path # set file creation perms self.pipfile_path = None self.chdir = chdir if self.pypi: os.environ['PIPENV_PYPI_URL'] = fs_str('{0}'.format(self.pypi.url)) os.environ['PIPENV_TEST_INDEX'] = fs_str('{0}/simple'.format( self.pypi.url)) if pipfile: p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'a'): os.utime(p_path, None) self.chdir = False or chdir self.pipfile_path = p_path self._pipfile = _Pipfile(Path(p_path))
def test_venv_file(venv_name, PipenvInstance, pypi): """Tests virtualenv creation when a .venv file exists at the project root and contains a venv name. """ with PipenvInstance(pypi=pypi, chdir=True) as p: file_path = os.path.join(p.path, '.venv') with open(file_path, 'w') as f: f.write(venv_name) with temp_environ(), TemporaryDirectory( prefix='pipenv-', suffix='temp_workon_home' ) as workon_home: os.environ['WORKON_HOME'] = workon_home.name if 'PIPENV_VENV_IN_PROJECT' in os.environ: del os.environ['PIPENV_VENV_IN_PROJECT'] c = p.pipenv('install') assert c.return_code == 0 c = p.pipenv('--venv') assert c.return_code == 0 venv_loc = Path(c.out.strip()).absolute() assert venv_loc.exists() assert venv_loc.joinpath('.project').exists() venv_path = venv_loc.as_posix() if os.path.sep in venv_name: venv_expected_path = Path(p.path).joinpath(venv_name).absolute().as_posix() else: venv_expected_path = Path(workon_home.name).joinpath(venv_name).absolute().as_posix() assert venv_path == venv_expected_path
def test_load_dot_env_warns_if_file_doesnt_exist(capsys): with temp_environ(), TemporaryDirectory(prefix='pipenv-', suffix='') as tempdir: dotenv_path = os.path.join(tempdir.name, 'does-not-exist.env') with mock.patch('pipenv.environments.PIPENV_DOTENV_LOCATION', dotenv_path): load_dot_env() output, err = capsys.readouterr() assert 'Warning' in err
def pip_src_dir(request): old_src_dir = os.environ.get('PIP_SRC', '') new_src_dir = TemporaryDirectory(prefix='pipenv-', suffix='-testsrc') os.environ['PIP_SRC'] = new_src_dir.name def finalize(): new_src_dir.cleanup() os.environ['PIP_SRC'] = old_src_dir request.addfinalizer(finalize) return request
def test_load_dot_env_warns_if_file_doesnt_exist(monkeypatch, capsys, project): with temp_environ(), monkeypatch.context() as m, TemporaryDirectory( prefix='pipenv-', suffix='') as tempdir: if os.name == "nt": import click is_console = False m.setattr(click._winconsole, "_is_console", lambda x: is_console) dotenv_path = os.path.join(tempdir.name, 'does-not-exist.env') project.s.PIPENV_DOTENV_LOCATION = str(dotenv_path) load_dot_env(project) output, err = capsys.readouterr() assert 'Warning' in err
def test_load_dot_env_from_environment_variable_location(capsys): with temp_environ(), TemporaryDirectory(prefix='pipenv-', suffix='') as tempdir: dotenv_path = os.path.join(tempdir.name, 'test.env') key, val = 'SOME_KEY', 'some_value' with open(dotenv_path, 'w') as f: f.write('{}={}'.format(key, val)) with mock.patch('pipenv.environments.PIPENV_DOTENV_LOCATION', dotenv_path): load_dot_env() assert os.environ[key] == val
def test_install_venv_project_directory(PipenvInstance, pypi): """Test the project functionality during virtualenv creation. """ with PipenvInstance(pypi=pypi, chdir=True) as p: with temp_environ(), TemporaryDirectory( prefix="pipenv-", suffix="temp_workon_home" ) as workon_home: os.environ["WORKON_HOME"] = workon_home.name if "PIPENV_VENV_IN_PROJECT" in os.environ: del os.environ["PIPENV_VENV_IN_PROJECT"] c = p.pipenv("install six") assert c.return_code == 0 project = Project() assert Path(project.virtualenv_location).joinpath(".project").exists()
def vendor_passa(ctx): with TemporaryDirectory(prefix='passa') as passa_dir: vendor_dir = _get_vendor_dir(ctx).absolute().as_posix() ctx.run("git clone https://github.com/sarugaku/passa.git {0}".format( passa_dir.name)) with ctx.cd("{0}".format(passa_dir.name)): # ctx.run("git checkout 0.3.0") ctx.run( "pip install plette[validation] requirementslib distlib pip-shims -q --exists-action=i" ) log("Packing Passa") ctx.run("invoke pack") log("Moving pack to vendor dir!") ctx.run("mv pack/passa.zip {0}".format(vendor_dir)) log("Successfully vendored passa!")
def test_install_venv_project_directory(PipenvInstance, pypi): """Test pew's project functionality during virtualenv creation. Since .venv virtualenvs are not created with pew, we need to swap to a workon_home based virtualenv for this test""" with PipenvInstance(pypi=pypi, chdir=True) as p: with temp_environ(), TemporaryDirectory( prefix='pipenv-', suffix='temp_workon_home') as workon_home: os.environ['WORKON_HOME'] = workon_home.name if 'PIPENV_VENV_IN_PROJECT' in os.environ: del os.environ['PIPENV_VENV_IN_PROJECT'] c = p.pipenv('install six') assert c.return_code == 0 project = Project() assert Path( project.virtualenv_location).joinpath('.project').exists()
def test_load_dot_env_from_environment_variable_location( monkeypatch, capsys, project): with temp_environ(), monkeypatch.context() as m, TemporaryDirectory( prefix='pipenv-', suffix='') as tempdir: if os.name == "nt": import click is_console = False m.setattr(click._winconsole, "_is_console", lambda x: is_console) dotenv_path = os.path.join(tempdir.name, 'test.env') key, val = 'SOME_KEY', 'some_value' with open(dotenv_path, 'w') as f: f.write(f'{key}={val}') project.s.PIPENV_DOTENV_LOCATION = str(dotenv_path) load_dot_env(project) assert os.environ[key] == val
def test_doesnt_load_dot_env_if_disabled(capsys): with temp_environ(), TemporaryDirectory(prefix='pipenv-', suffix='') as tempdir: dotenv_path = os.path.join(tempdir.name, 'test.env') key, val = 'SOME_KEY', 'some_value' with open(dotenv_path, 'w') as f: f.write('{}={}'.format(key, val)) with mock.patch('pipenv.environments.PIPENV_DOTENV_LOCATION', dotenv_path): with mock.patch('pipenv.environments.PIPENV_DONT_LOAD_ENV', '1'): load_dot_env() assert key not in os.environ load_dot_env() assert key in os.environ
def test_install_venv_project_directory(PipenvInstance): """Test the project functionality during virtualenv creation. """ with PipenvInstance(chdir=True) as p: with temp_environ(), TemporaryDirectory( prefix="pipenv-", suffix="temp_workon_home") as workon_home: os.environ["WORKON_HOME"] = workon_home.name if "PIPENV_VENV_IN_PROJECT" in os.environ: del os.environ["PIPENV_VENV_IN_PROJECT"] c = p.pipenv("install six") assert c.return_code == 0 venv_loc = None for line in c.err.splitlines(): if line.startswith("Virtualenv location:"): venv_loc = Path(line.split(":", 1)[-1].strip()) assert venv_loc is not None assert venv_loc.joinpath(".project").exists()
def test_doesnt_load_dot_env_if_disabled(monkeypatch, capsys): with temp_environ(), monkeypatch.context() as m, TemporaryDirectory( prefix='pipenv-', suffix='') as tempdir: if os.name == "nt": import click is_console = False m.setattr(click._winconsole, "_is_console", lambda x: is_console) dotenv_path = os.path.join(tempdir.name, 'test.env') key, val = 'SOME_KEY', 'some_value' with open(dotenv_path, 'w') as f: f.write('{}={}'.format(key, val)) m.setenv("PIPENV_DOTENV_LOCATION", str(dotenv_path)) m.setattr("pipenv.environments.PIPENV_DOTENV_LOCATION", str(dotenv_path)) m.setattr("pipenv.environments.PIPENV_DONT_LOAD_ENV", True) load_dot_env() assert key not in os.environ m.setattr("pipenv.environments.PIPENV_DONT_LOAD_ENV", False) load_dot_env() assert key in os.environ
def pipenv(self, cmd, block=True): if self.pipfile_path: os.environ['PIPENV_PIPFILE'] = self.pipfile_path with TemporaryDirectory(prefix='pipenv-', suffix='-cache') as tempdir: os.environ['PIPENV_CACHE_DIR'] = tempdir.name c = delegator.run('pipenv {0}'.format(cmd), block=block) if 'PIPENV_CACHE_DIR' in os.environ: del os.environ['PIPENV_CACHE_DIR'] if 'PIPENV_PIPFILE' in os.environ: del os.environ['PIPENV_PIPFILE'] # Pretty output for failing tests. if block: print('$ pipenv {0}'.format(cmd)) print(c.out) print(c.err) # Where the action happens. return c
def test_venv_file_with_path(PipenvInstance): """Tests virtualenv creation when a .venv file exists at the project root and contains an absolute path. """ with temp_environ(), PipenvInstance(chdir=True) as p: with TemporaryDirectory(prefix='pipenv-', suffix='-test_venv') as venv_path: if 'PIPENV_VENV_IN_PROJECT' in os.environ: del os.environ['PIPENV_VENV_IN_PROJECT'] file_path = os.path.join(p.path, '.venv') with open(file_path, 'w') as f: f.write(venv_path.name) c = p.pipenv('install') assert c.return_code == 0 c = p.pipenv('--venv') assert c.return_code == 0 venv_loc = Path(c.out.strip()) assert venv_loc.joinpath('.project').exists() assert venv_loc == Path(venv_path.name)
def test_venv_file_exists(PipenvInstance, pypi): """Tests virtualenv creation & package installation when a .venv file exists at the project root. """ with PipenvInstance(pypi=pypi, chdir=True) as p: file_path = os.path.join(p.path, '.venv') with open(file_path, 'w') as f: f.write('') with temp_environ(), TemporaryDirectory( prefix='pipenv-', suffix='temp_workon_home') as workon_home: os.environ['WORKON_HOME'] = workon_home.name if 'PIPENV_VENV_IN_PROJECT' in os.environ: del os.environ['PIPENV_VENV_IN_PROJECT'] c = p.pipenv('install requests') assert c.return_code == 0 venv_loc = None for line in c.err.splitlines(): if line.startswith('Virtualenv location:'): venv_loc = Path(line.split(':', 1)[-1].strip()) assert venv_loc is not None assert venv_loc.joinpath('.project').exists()
def __init__(self, pypi=None, pipfile=True, chdir=False): self.pypi = pypi self.original_umask = os.umask(0o007) self.original_dir = os.path.abspath(os.curdir) self._path = TemporaryDirectory(suffix='-project', prefix='pipenv-') path = Path(self._path.name) try: self.path = str(path.resolve()) except OSError: self.path = str(path.absolute()) # set file creation perms self.pipfile_path = None self.chdir = chdir if self.pypi: os.environ['PIPENV_TEST_INDEX'] = '{0}/simple'.format(self.pypi.url) if pipfile: p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'a'): os.utime(p_path, None) self.chdir = False or chdir self.pipfile_path = p_path
class _PipenvInstance(object): """An instance of a Pipenv Project...""" def __init__(self, pypi=None, pipfile=True, chdir=False, path=None, home_dir=None): self.pypi = pypi self.original_umask = os.umask(0o007) self.original_dir = os.path.abspath(os.curdir) os.environ["PIPENV_NOSPIN"] = fs_str("1") os.environ["CI"] = fs_str("1") warnings.simplefilter("ignore", category=ResourceWarning) warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*<ssl.SSLSocket.*>") path = os.environ.get("PIPENV_PROJECT_DIR", None) if not path: self._path = TemporaryDirectory(suffix='-project', prefix='pipenv-') path = Path(self._path.name) try: self.path = str(path.resolve()) except OSError: self.path = str(path.absolute()) else: self._path = None self.path = path # set file creation perms self.pipfile_path = None self.chdir = chdir if self.pypi: os.environ['PIPENV_TEST_INDEX'] = fs_str('{0}/simple'.format(self.pypi.url)) if pipfile: p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'a'): os.utime(p_path, None) self.chdir = False or chdir self.pipfile_path = p_path def __enter__(self): os.environ['PIPENV_DONT_USE_PYENV'] = fs_str('1') os.environ['PIPENV_IGNORE_VIRTUALENVS'] = fs_str('1') os.environ['PIPENV_VENV_IN_PROJECT'] = fs_str('1') os.environ['PIPENV_NOSPIN'] = fs_str('1') if self.chdir: os.chdir(self.path) return self def __exit__(self, *args): warn_msg = 'Failed to remove resource: {!r}' if self.chdir: os.chdir(self.original_dir) self.path = None if self._path: try: self._path.cleanup() except OSError as e: _warn_msg = warn_msg.format(e) warnings.warn(_warn_msg, ResourceWarning) os.umask(self.original_umask) def pipenv(self, cmd, block=True): if self.pipfile_path: os.environ['PIPENV_PIPFILE'] = fs_str(self.pipfile_path) # a bit of a hack to make sure the virtualenv is created with TemporaryDirectory(prefix='pipenv-', suffix='-cache') as tempdir: os.environ['PIPENV_CACHE_DIR'] = fs_str(tempdir.name) c = delegator.run('pipenv {0}'.format(cmd), block=block) if 'PIPENV_CACHE_DIR' in os.environ: del os.environ['PIPENV_CACHE_DIR'] if 'PIPENV_PIPFILE' in os.environ: del os.environ['PIPENV_PIPFILE'] # Pretty output for failing tests. if block: print('$ pipenv {0}'.format(cmd)) print(c.out) print(c.err) if c.return_code != 0: print("Command failed...") # Where the action happens. return c @property def pipfile(self): p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'r') as f: return toml.loads(f.read()) @property def lockfile(self): p_path = self.lockfile_path with open(p_path, 'r') as f: return json.loads(f.read()) @property def lockfile_path(self): return os.sep.join([self.path, 'Pipfile.lock'])
def update_safety(ctx): ignore_subdeps = ['pip', 'pip-egg-info', 'bin'] ignore_files = ['pip-delete-this-directory.txt', 'PKG-INFO'] vendor_dir = _get_patched_dir(ctx) log('Using vendor dir: %s' % vendor_dir) log('Downloading safety package files...') build_dir = vendor_dir / 'build' download_dir = TemporaryDirectory(prefix='pipenv-', suffix='-safety') if build_dir.exists() and build_dir.is_dir(): drop_dir(build_dir) ctx.run( 'pip download -b {0} --no-binary=:all: --no-clean -d {1} safety pyyaml'.format( str(build_dir), str(download_dir.name), ) ) safety_dir = build_dir / 'safety' yaml_build_dir = build_dir / 'pyyaml' main_file = safety_dir / '__main__.py' main_content = """ import sys yaml_lib = 'yaml{0}'.format(sys.version_info[0]) locals()[yaml_lib] = __import__(yaml_lib) sys.modules['yaml'] = sys.modules[yaml_lib] from safety.cli import cli # Disable insecure warnings. import urllib3 from urllib3.exceptions import InsecureRequestWarning urllib3.disable_warnings(InsecureRequestWarning) cli(prog_name="safety") """.strip() with open(str(main_file), 'w') as fh: fh.write(main_content) with ctx.cd(str(safety_dir)): ctx.run('pip install --no-compile --no-binary=:all: -t . .') safety_dir = safety_dir.absolute() yaml_dir = safety_dir / 'yaml' if yaml_dir.exists(): version_choices = ['2', '3'] version_choices.remove(str(sys.version_info[0])) mkdir_p(str(safety_dir / 'yaml{0}'.format(sys.version_info[0]))) for fn in yaml_dir.glob('*.py'): fn.rename(str(safety_dir.joinpath('yaml{0}'.format(sys.version_info[0]), fn.name))) if version_choices[0] == '2': lib = yaml_build_dir / 'lib' / 'yaml' else: lib = yaml_build_dir / 'lib3' / 'yaml' shutil.copytree(str(lib.absolute()), str(safety_dir / 'yaml{0}'.format(version_choices[0]))) requests_dir = safety_dir / 'requests' cacert = vendor_dir / 'requests' / 'cacert.pem' if not cacert.exists(): from pipenv.vendor import requests cacert = Path(requests.certs.where()) target_cert = requests_dir / 'cacert.pem' target_cert.write_bytes(cacert.read_bytes()) ctx.run("sed -i 's/r = requests.get(url=url, timeout=REQUEST_TIMEOUT, headers=headers)/r = requests.get(url=url, timeout=REQUEST_TIMEOUT, headers=headers, verify=False)/g' {0}".format(str(safety_dir / 'safety' / 'safety.py'))) for egg in safety_dir.glob('*.egg-info'): drop_dir(egg.absolute()) for dep in ignore_subdeps: dep_dir = safety_dir / dep if dep_dir.exists(): drop_dir(dep_dir) for dep in ignore_files: fn = safety_dir / dep if fn.exists(): fn.unlink() zip_name = '{0}/safety'.format(str(vendor_dir)) shutil.make_archive(zip_name, format='zip', root_dir=str(safety_dir), base_dir='./') drop_dir(build_dir) download_dir.cleanup()
class _PipenvInstance(object): """An instance of a Pipenv Project...""" def __init__(self, pypi=None, pipfile=True, chdir=False): self.pypi = pypi self.original_umask = os.umask(0o007) self.original_dir = os.path.abspath(os.curdir) self._path = TemporaryDirectory(suffix='-project', prefix='pipenv-') self.path = str(Path(self._path.name).resolve()) # set file creation perms self.pipfile_path = None self.chdir = chdir if self.pypi: os.environ['PIPENV_TEST_INDEX'] = '{0}/simple'.format( self.pypi.url) if pipfile: p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'a'): os.utime(p_path, None) self.chdir = False or chdir self.pipfile_path = p_path def __enter__(self): os.environ['PIPENV_DONT_USE_PYENV'] = '1' os.environ['PIPENV_IGNORE_VIRTUALENVS'] = '1' os.environ['PIPENV_VENV_IN_PROJECT'] = '1' os.environ['PYPI_VENDOR_DIR'] = os.path.join(TESTS_ROOT, 'pypi') if self.chdir: os.chdir(self.path) return self def __exit__(self, *args): warn_msg = 'Failed to remove resource: {!r}' if self.chdir: os.chdir(self.original_dir) self.path = None try: self._path.cleanup() except OSError as e: _warn_msg = warn_msg.format(e) warnings.warn(_warn_msg, ResourceWarning) finally: os.umask(self.original_umask) def pipenv(self, cmd, block=True): if self.pipfile_path: os.environ['PIPENV_PIPFILE'] = self.pipfile_path with TemporaryDirectory(prefix='pipenv-', suffix='-cache') as tempdir: os.environ['PIPENV_CACHE_DIR'] = tempdir.name c = delegator.run('pipenv {0}'.format(cmd), block=block) if 'PIPENV_CACHE_DIR' in os.environ: del os.environ['PIPENV_CACHE_DIR'] if 'PIPENV_PIPFILE' in os.environ: del os.environ['PIPENV_PIPFILE'] # Pretty output for failing tests. if block: print('$ pipenv {0}'.format(cmd)) print(c.out) print(c.err) # Where the action happens. return c @property def pipfile(self): p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'r') as f: return toml.loads(f.read()) @property def lockfile(self): p_path = self.lockfile_path with open(p_path, 'r') as f: return json.loads(f.read()) @property def lockfile_path(self): return os.sep.join([self.path, 'Pipfile.lock'])
def update_safety(ctx): ignore_subdeps = ['pip', 'pip-egg-info', 'bin'] ignore_files = ['pip-delete-this-directory.txt', 'PKG-INFO'] vendor_dir = _get_patched_dir(ctx) log('Using vendor dir: %s' % vendor_dir) log('Downloading safety package files...') build_dir = vendor_dir / 'build' download_dir = TemporaryDirectory(prefix='pipenv-', suffix='-safety') if build_dir.exists() and build_dir.is_dir(): drop_dir(build_dir) ctx.run( 'pip download -b {0} --no-binary=:all: --no-clean -d {1} safety pyyaml' .format( str(build_dir), str(download_dir.name), )) safety_dir = build_dir / 'safety' yaml_build_dir = build_dir / 'pyyaml' main_file = safety_dir / '__main__.py' main_content = """ import sys yaml_lib = 'yaml{0}'.format(sys.version_info[0]) locals()[yaml_lib] = __import__(yaml_lib) sys.modules['yaml'] = sys.modules[yaml_lib] from safety.cli import cli # Disable insecure warnings. import urllib3 from urllib3.exceptions import InsecureRequestWarning urllib3.disable_warnings(InsecureRequestWarning) cli(prog_name="safety") """.strip() with open(str(main_file), 'w') as fh: fh.write(main_content) with ctx.cd(str(safety_dir)): ctx.run('pip install --no-compile --no-binary=:all: -t . .') safety_dir = safety_dir.absolute() yaml_dir = safety_dir / 'yaml' if yaml_dir.exists(): version_choices = ['2', '3'] version_choices.remove(str(sys.version_info[0])) mkdir_p(str(safety_dir / 'yaml{0}'.format(sys.version_info[0]))) for fn in yaml_dir.glob('*.py'): fn.rename( str( safety_dir.joinpath( 'yaml{0}'.format(sys.version_info[0]), fn.name))) if version_choices[0] == '2': lib = yaml_build_dir / 'lib' / 'yaml' else: lib = yaml_build_dir / 'lib3' / 'yaml' shutil.copytree( str(lib.absolute()), str(safety_dir / 'yaml{0}'.format(version_choices[0]))) requests_dir = safety_dir / 'requests' cacert = vendor_dir / 'requests' / 'cacert.pem' if not cacert.exists(): from pipenv.vendor import requests cacert = Path(requests.certs.where()) target_cert = requests_dir / 'cacert.pem' target_cert.write_bytes(cacert.read_bytes()) ctx.run( "sed -i 's/r = requests.get(url=url, timeout=REQUEST_TIMEOUT, headers=headers)/r = requests.get(url=url, timeout=REQUEST_TIMEOUT, headers=headers, verify=False)/g' {0}" .format(str(safety_dir / 'safety' / 'safety.py'))) for egg in safety_dir.glob('*.egg-info'): drop_dir(egg.absolute()) for dep in ignore_subdeps: dep_dir = safety_dir / dep if dep_dir.exists(): drop_dir(dep_dir) for dep in ignore_files: fn = safety_dir / dep if fn.exists(): fn.unlink() zip_name = '{0}/safety'.format(str(vendor_dir)) shutil.make_archive(zip_name, format='zip', root_dir=str(safety_dir), base_dir='./') drop_dir(build_dir) download_dir.cleanup()
class _PipenvInstance(object): """An instance of a Pipenv Project...""" def __init__(self, pypi=None, pipfile=True, chdir=False): self.pypi = pypi self.original_umask = os.umask(0o007) self.original_dir = os.path.abspath(os.curdir) self._path = TemporaryDirectory(suffix='-project', prefix='pipenv-') path = Path(self._path.name) try: self.path = str(path.resolve()) except OSError: self.path = str(path.absolute()) # set file creation perms self.pipfile_path = None self.chdir = chdir if self.pypi: os.environ['PIPENV_TEST_INDEX'] = '{0}/simple'.format(self.pypi.url) if pipfile: p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'a'): os.utime(p_path, None) self.chdir = False or chdir self.pipfile_path = p_path def __enter__(self): os.environ['PIPENV_DONT_USE_PYENV'] = '1' os.environ['PIPENV_IGNORE_VIRTUALENVS'] = '1' os.environ['PIPENV_VENV_IN_PROJECT'] = '1' os.environ['PYPI_VENDOR_DIR'] = os.path.join(TESTS_ROOT, 'pypi') if self.chdir: os.chdir(self.path) return self def __exit__(self, *args): warn_msg = 'Failed to remove resource: {!r}' if self.chdir: os.chdir(self.original_dir) self.path = None try: self._path.cleanup() except OSError as e: _warn_msg = warn_msg.format(e) warnings.warn(_warn_msg, ResourceWarning) finally: os.umask(self.original_umask) def pipenv(self, cmd, block=True): if self.pipfile_path: os.environ['PIPENV_PIPFILE'] = self.pipfile_path with TemporaryDirectory(prefix='pipenv-', suffix='-cache') as tempdir: os.environ['PIPENV_CACHE_DIR'] = tempdir.name c = delegator.run('pipenv {0}'.format(cmd), block=block) if 'PIPENV_CACHE_DIR' in os.environ: del os.environ['PIPENV_CACHE_DIR'] if 'PIPENV_PIPFILE' in os.environ: del os.environ['PIPENV_PIPFILE'] # Pretty output for failing tests. if block: print('$ pipenv {0}'.format(cmd)) print(c.out) print(c.err) # Where the action happens. return c @property def pipfile(self): p_path = os.sep.join([self.path, 'Pipfile']) with open(p_path, 'r') as f: return toml.loads(f.read()) @property def lockfile(self): p_path = self.lockfile_path with open(p_path, 'r') as f: return json.loads(f.read()) @property def lockfile_path(self): return os.sep.join([self.path, 'Pipfile.lock'])