From 1bc1bd75ac57d33f2a92c28d103225352dd092ce Mon Sep 17 00:00:00 2001 From: Dan Ryan Date: Mon, 20 Apr 2020 18:26:31 -0400 Subject: [PATCH] Add pipenv vendor dirs to safety runtime paths - Fix configparser import and add patch in dparse - Update patch on safety to add paths Signed-off-by: Dan Ryan --- pipenv/patched/safety/__main__.py | 39 +++++++++++++ pipenv/vendor/dparse/parser.py | 2 +- .../patches/patched/safety-main.patch | 57 +++++++++++++++++++ .../patches/patched/safety-yaml.patch | 18 ------ .../patches/vendor/dparse-configparser.patch | 13 +++++ 5 files changed, 110 insertions(+), 19 deletions(-) create mode 100644 tasks/vendoring/patches/patched/safety-main.patch delete mode 100644 tasks/vendoring/patches/patched/safety-yaml.patch create mode 100644 tasks/vendoring/patches/vendor/dparse-configparser.patch diff --git a/pipenv/patched/safety/__main__.py b/pipenv/patched/safety/__main__.py index 83b8126b..f905408a 100644 --- a/pipenv/patched/safety/__main__.py +++ b/pipenv/patched/safety/__main__.py @@ -1,10 +1,49 @@ """Allow safety to be executable through `python -m safety`.""" from __future__ import absolute_import +import os import sys +import sysconfig + + +PATCHED_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +PIPENV_DIR = os.path.dirname(PATCHED_DIR) +VENDORED_DIR = os.path.join("PIPENV_DIR", "vendor") + + +def get_site_packages(): + prefixes = {sys.prefix, sysconfig.get_config_var('prefix')} + try: + prefixes.add(sys.real_prefix) + except AttributeError: + pass + form = sysconfig.get_path('purelib', expand=False) + py_version_short = '{0[0]}.{0[1]}'.format(sys.version_info) + return { + form.format(base=prefix, py_version_short=py_version_short) + for prefix in prefixes + } + + +def insert_before_site_packages(*paths): + site_packages = get_site_packages() + index = None + for i, path in enumerate(sys.path): + if path in site_packages: + index = i + break + if index is None: + sys.path += list(paths) + else: + sys.path = sys.path[:index] + list(paths) + sys.path[index:] + + +def insert_pipenv_dirs(): + insert_before_site_packages(os.path.dirname(PIPENV_DIR), PATCHED_DIR, VENDORED_DIR) if __name__ == "__main__": # pragma: no cover + insert_pipenv_dirs() yaml_lib = "pipenv.patched.yaml{0}".format(sys.version_info[0]) locals()[yaml_lib] = __import__(yaml_lib) sys.modules["yaml"] = sys.modules[yaml_lib] diff --git a/pipenv/vendor/dparse/parser.py b/pipenv/vendor/dparse/parser.py index c01ebab4..9b2a0728 100644 --- a/pipenv/vendor/dparse/parser.py +++ b/pipenv/vendor/dparse/parser.py @@ -6,7 +6,7 @@ import yaml from io import StringIO -from configparser import SafeConfigParser, NoOptionError +from six.moves.configparser import SafeConfigParser, NoOptionError from .regex import URL_REGEX, HASH_REGEX diff --git a/tasks/vendoring/patches/patched/safety-main.patch b/tasks/vendoring/patches/patched/safety-main.patch new file mode 100644 index 00000000..3d214863 --- /dev/null +++ b/tasks/vendoring/patches/patched/safety-main.patch @@ -0,0 +1,57 @@ +diff --git a/pipenv/patched/safety/__main__.py b/pipenv/patched/safety/__main__.py +index d9a0bdab..f905408a 100644 +--- a/pipenv/patched/safety/__main__.py ++++ b/pipenv/patched/safety/__main__.py +@@ -1,8 +1,51 @@ + """Allow safety to be executable through `python -m safety`.""" + from __future__ import absolute_import + +-from .cli import cli ++import os ++import sys ++import sysconfig ++ ++ ++PATCHED_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ++PIPENV_DIR = os.path.dirname(PATCHED_DIR) ++VENDORED_DIR = os.path.join("PIPENV_DIR", "vendor") ++ ++ ++def get_site_packages(): ++ prefixes = {sys.prefix, sysconfig.get_config_var('prefix')} ++ try: ++ prefixes.add(sys.real_prefix) ++ except AttributeError: ++ pass ++ form = sysconfig.get_path('purelib', expand=False) ++ py_version_short = '{0[0]}.{0[1]}'.format(sys.version_info) ++ return { ++ form.format(base=prefix, py_version_short=py_version_short) ++ for prefix in prefixes ++ } ++ ++ ++def insert_before_site_packages(*paths): ++ site_packages = get_site_packages() ++ index = None ++ for i, path in enumerate(sys.path): ++ if path in site_packages: ++ index = i ++ break ++ if index is None: ++ sys.path += list(paths) ++ else: ++ sys.path = sys.path[:index] + list(paths) + sys.path[index:] ++ ++ ++def insert_pipenv_dirs(): ++ insert_before_site_packages(os.path.dirname(PIPENV_DIR), PATCHED_DIR, VENDORED_DIR) + + + if __name__ == "__main__": # pragma: no cover ++ insert_pipenv_dirs() ++ yaml_lib = "pipenv.patched.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 + cli(prog_name="safety") diff --git a/tasks/vendoring/patches/patched/safety-yaml.patch b/tasks/vendoring/patches/patched/safety-yaml.patch deleted file mode 100644 index 59caa3d5..00000000 --- a/tasks/vendoring/patches/patched/safety-yaml.patch +++ /dev/null @@ -1,18 +0,0 @@ -diff --git a/pipenv/patched/safety/__main__.py b/pipenv/patched/safety/__main__.py -index d9a0bdab..0ab477d0 100644 ---- a/pipenv/patched/safety/__main__.py -+++ b/pipenv/patched/safety/__main__.py -@@ -1,8 +1,12 @@ - """Allow safety to be executable through `python -m safety`.""" - from __future__ import absolute_import - --from .cli import cli -+import sys - - - if __name__ == "__main__": # pragma: no cover -+ yaml_lib = "pipenv.patched.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 - cli(prog_name="safety") diff --git a/tasks/vendoring/patches/vendor/dparse-configparser.patch b/tasks/vendoring/patches/vendor/dparse-configparser.patch new file mode 100644 index 00000000..bc61a75e --- /dev/null +++ b/tasks/vendoring/patches/vendor/dparse-configparser.patch @@ -0,0 +1,13 @@ +diff --git a/pipenv/vendor/dparse/parser.py b/pipenv/vendor/dparse/parser.py +index c01ebab4..9b2a0728 100644 +--- a/pipenv/vendor/dparse/parser.py ++++ b/pipenv/vendor/dparse/parser.py +@@ -6,7 +6,7 @@ import yaml + + from io import StringIO + +-from configparser import SafeConfigParser, NoOptionError ++from six.moves.configparser import SafeConfigParser, NoOptionError + + + from .regex import URL_REGEX, HASH_REGEX