@@ -0,0 +1,1046 @@
+import contextlib%0Aimport itertools%0Aimport os%0Aimport pathlib%0Aimport re%0Aimport subprocess%0A%0Aimport attr%0A%0A%0A@attr.s%0Aclass Installation:%0A%0A    path = attr.ib(convert=pathlib.Path)%0A%0A    @property%0A    def python(self):%0A        return self.path.joinpath('python.exe')%0A%0A    @property%0A    def scripts_dir(self):%0A        return self.path.joinpath('Scripts')%0A%0A    @property%0A    def pip(self):%0A        return self.scripts_dir.joinpath('pip.exe')%0A%0A    def get_version_info(self):%0A        output = subprocess.check_output(%0A            %5Bstr(self.python), '--version'%5D, encoding='ascii',%0A        ).strip()%0A        match = re.match(r'%5EPython (%5Cd+)%5C.(%5Cd+)%5C.(%5Cd+)$', output)%0A        return match.groups()%0A%0A    def find_script(self, name):%0A        names = itertools.chain(%5Bname%5D, (%0A            '%7B%7D%7B%7D'.format(name, ext)%0A            for ext in os.environ%5B'PATHEXT'%5D.split(';')%0A        ))%0A        for name in names:%0A            with contextlib.suppress(FileNotFoundError):%0A                return self.scripts_dir.join(name).resolve()%0A        raise FileNotFoundError(name)%0A

Fix missing installations checkin