Best Python code snippet using autotest_python
external_packages.py
Source:external_packages.py  
...142            raise Error('Missing OS requirements for %s.  (see above)' %143                        self.name)144    def _build_and_install_current_dir_setup_py(self, install_dir):145        """For use as a _build_and_install_current_dir implementation."""146        egg_path = self._build_egg_using_setup_py(setup_py='setup.py')147        if not egg_path:148            return False149        return self._install_from_egg(install_dir, egg_path)150    def _build_and_install_current_dir_setupegg_py(self, install_dir):151        """For use as a _build_and_install_current_dir implementation."""152        egg_path = self._build_egg_using_setup_py(setup_py='setupegg.py')153        if not egg_path:154            return False155        return self._install_from_egg(install_dir, egg_path)156    def _build_and_install_current_dir_noegg(self, install_dir):157        if not self._build_using_setup_py():158            return False159        return self._install_using_setup_py_and_rsync(install_dir)160    def _build_and_install_from_package(self, install_dir):161        """162        This method may be used as a _build_and_install() implementation163        for subclasses if they implement _build_and_install_current_dir().164        Extracts the .tar.gz file, chdirs into the extracted directory165        (which is assumed to match the tar filename) and calls166        _build_and_isntall_current_dir from there.167        Afterwards the build (regardless of failure) extracted .tar.gz168        directory is cleaned up.169        :return: True on success, False otherwise.170        :raise OSError If the expected extraction directory does not exist.171        """172        self._extract_compressed_package()173        if self.verified_package.endswith('.tar.gz'):174            extension = '.tar.gz'175        elif self.verified_package.endswith('.tar.bz2'):176            extension = '.tar.bz2'177        elif self.verified_package.endswith('.zip'):178            extension = '.zip'179        else:180            raise Error('Unexpected package file extension on %s' %181                        self.verified_package)182        os.chdir(os.path.dirname(self.verified_package))183        os.chdir(self.local_filename[:-len(extension)])184        extracted_dir = os.getcwd()185        try:186            return self._build_and_install_current_dir(install_dir)187        finally:188            os.chdir(os.path.join(extracted_dir, '..'))189            shutil.rmtree(extracted_dir)190    def _extract_compressed_package(self):191        """Extract the fetched compressed .tar or .zip within its directory."""192        if not self.verified_package:193            raise Error('Package must have been fetched first.')194        os.chdir(os.path.dirname(self.verified_package))195        if self.verified_package.endswith('gz'):196            status = system("tar -xzf '%s'" % self.verified_package)197        elif self.verified_package.endswith('bz2'):198            status = system("tar -xjf '%s'" % self.verified_package)199        elif self.verified_package.endswith('zip'):200            status = system("unzip '%s'" % self.verified_package)201        else:202            raise Error('Unknown compression suffix on %s.' %203                        self.verified_package)204        if status:205            raise Error('tar failed with %s' % (status,))206    def _build_using_setup_py(self, setup_py='setup.py'):207        """208        Assuming the cwd is the extracted python package, execute a simple209        python setup.py build.210        :param setup_py - The name of the setup.py file to execute.211        :return: True on success, False otherwise.212        """213        if not os.path.exists(setup_py):214            raise Error('%s does not exist in %s' % (setup_py, os.getcwd()))215        status = system("'%s' %s build" % (sys.executable, setup_py))216        if status:217            logging.error('%s build failed.' % self.name)218            return False219        return True220    def _build_egg_using_setup_py(self, setup_py='setup.py'):221        """222        Assuming the cwd is the extracted python package, execute a simple223        python setup.py bdist_egg.224        :param setup_py - The name of the setup.py file to execute.225        :return: The relative path to the resulting egg file or '' on failure.226        """227        if not os.path.exists(setup_py):228            raise Error('%s does not exist in %s' % (setup_py, os.getcwd()))229        egg_subdir = 'dist'230        if os.path.isdir(egg_subdir):231            shutil.rmtree(egg_subdir)232        status = system("'%s' %s bdist_egg" % (sys.executable, setup_py))233        if status:234            logging.error('bdist_egg of setuptools failed.')235            return ''236        # I've never seen a bdist_egg lay multiple .egg files.237        for filename in os.listdir(egg_subdir):238            if filename.endswith('.egg'):239                return os.path.join(egg_subdir, filename)240    def _install_from_egg(self, install_dir, egg_path):241        """242        Install a module from an egg file by unzipping the necessary parts243        into install_dir.244        :param install_dir - The installation directory.245        :param egg_path - The pathname of the egg file.246        """247        status = system("unzip -q -o -d '%s' '%s'" % (install_dir, egg_path))248        if status:249            logging.error('unzip of %s failed', egg_path)250            return False251        egg_info = os.path.join(install_dir, 'EGG-INFO')252        if os.path.isdir(egg_info):253            shutil.rmtree(egg_info)254        return True255    def _get_temp_dir(self):256        return tempfile.mkdtemp(dir='/var/tmp')257    def _site_packages_path(self, temp_dir):258        # This makes assumptions about what python setup.py install259        # does when given a prefix.  Is this always correct?260        python_xy = 'python%s' % sys.version[:3]261        return os.path.join(temp_dir, 'lib', python_xy, 'site-packages')262    def _install_using_setup_py_and_rsync(self, install_dir,263                                          setup_py='setup.py',264                                          temp_dir=None):265        """266        Assuming the cwd is the extracted python package, execute a simple:267          python setup.py install --prefix=BLA268        BLA will be a temporary directory that everything installed will269        be picked out of and rsynced to the appropriate place under270        install_dir afterwards.271        Afterwards, it deconstructs the extra lib/pythonX.Y/site-packages/272        directory tree that setuptools created and moves all installed273        site-packages directly up into install_dir itself.274        :param install_dir the directory for the install to happen under.275        :param setup_py - The name of the setup.py file to execute.276        :return: True on success, False otherwise.277        """278        if not os.path.exists(setup_py):279            raise Error('%s does not exist in %s' % (setup_py, os.getcwd()))280        if temp_dir is None:281            temp_dir = self._get_temp_dir()282        try:283            status = system("'%s' %s install --no-compile --prefix='%s'"284                            % (sys.executable, setup_py, temp_dir))285            if status:286                logging.error('%s install failed.' % self.name)287                return False288            if os.path.isdir(os.path.join(temp_dir, 'lib')):289                # NOTE: This ignores anything outside of the lib/ dir that290                # was installed.291                temp_site_dir = self._site_packages_path(temp_dir)292            else:293                temp_site_dir = temp_dir294            status = system("rsync -r '%s/' '%s/'" %295                            (temp_site_dir, install_dir))296            if status:297                logging.error('%s rsync to install_dir failed.' % self.name)298                return False299            return True300        finally:301            shutil.rmtree(temp_dir)302    def _build_using_make(self, install_dir):303        """Build the current package using configure/make.304        :return: True on success, False otherwise.305        """306        install_prefix = os.path.join(install_dir, 'usr', 'local')307        status = system('./configure --prefix=%s' % install_prefix)308        if status:309            logging.error('./configure failed for %s', self.name)310            return False311        status = system('make')312        if status:313            logging.error('make failed for %s', self.name)314            return False315        status = system('make check')316        if status:317            logging.error('make check failed for %s', self.name)318            return False319        return True320    def _install_using_make(self):321        """Install the current package using make install.322        Assumes the install path was set up while running ./configure (in323        _build_using_make()).324        :return: True on success, False otherwise.325        """326        status = system('make install')327        return status == 0328    def fetch(self, dest_dir):329        """330        Fetch the package from one its URLs and save it in dest_dir.331        If the the package already exists in dest_dir and the checksum332        matches this code will not fetch it again.333        Sets the 'verified_package' attribute with the destination pathname.334        :param dest_dir - The destination directory to save the local file.335            If it does not exist it will be created.336        :return: A boolean indicating if we the package is now in dest_dir.337        :raise FetchError - When something unexpected happens.338        """339        if not os.path.exists(dest_dir):340            os.makedirs(dest_dir)341        local_path = os.path.join(dest_dir, self.local_filename)342        # If the package exists, verify its checksum and be happy if it is good.343        if os.path.exists(local_path):344            actual_hex_sum = _checksum_file(local_path)345            if self.hex_sum == actual_hex_sum:346                logging.info('Good checksum for existing %s package.',347                             self.name)348                self.verified_package = local_path349                return True350            logging.warning('Bad checksum for existing %s package.  '351                            'Re-downloading', self.name)352            os.rename(local_path, local_path + '.wrong-checksum')353        # Download the package from one of its urls, rejecting any if the354        # checksum does not match.355        for url in self.urls:356            logging.info('Fetching %s', url)357            try:358                url_file = urllib2.urlopen(url)359            except (urllib2.URLError, EnvironmentError):360                logging.warning('Could not fetch %s package from %s.',361                                self.name, url)362                continue363            data_length = int(url_file.info().get('Content-Length',364                                                  _MAX_PACKAGE_SIZE))365            if data_length <= 0 or data_length > _MAX_PACKAGE_SIZE:366                raise FetchError('%s from %s fails Content-Length %d '367                                 'sanity check.' % (self.name, url,368                                                    data_length))369            checksum = utils.hash('sha1')370            total_read = 0371            output = open(local_path, 'wb')372            try:373                while total_read < data_length:374                    data = url_file.read(_READ_SIZE)375                    if not data:376                        break377                    output.write(data)378                    checksum.update(data)379                    total_read += len(data)380            finally:381                output.close()382            if self.hex_sum != checksum.hexdigest():383                logging.warning('Bad checksum for %s fetched from %s.',384                                self.name, url)385                logging.warning('Got %s', checksum.hexdigest())386                logging.warning('Expected %s', self.hex_sum)387                os.unlink(local_path)388                continue389            logging.info('Good checksum.')390            self.verified_package = local_path391            return True392        else:393            return False394# NOTE: This class definition must come -before- all other ExternalPackage395# classes that need to use this version of setuptools so that is is inserted396# into the ExternalPackage.subclasses list before them.397class SetuptoolsPackage(ExternalPackage):398    # For all known setuptools releases a string compare works for the399    # version string.  Hopefully they never release a 0.10.  (Their own400    # version comparison code would break if they did.)401    # Any system with setuptools > 0.6 is fine. If none installed, then402    # try to install the latest found on the upstream.403    minimum_version = '0.6'404    version = '0.6c11'405    urls = ('http://pypi.python.org/packages/source/s/setuptools/'406            'setuptools-%s.tar.gz' % (version,),)407    local_filename = 'setuptools-%s.tar.gz' % version408    hex_sum = '8d1ad6384d358c547c50c60f1bfdb3362c6c4a7d'409    SUDO_SLEEP_DELAY = 15410    def _build_and_install(self, install_dir):411        """Install setuptools on the system."""412        logging.info('NOTE: setuptools install does not use install_dir.')413        return self._build_and_install_from_package(install_dir)414    def _build_and_install_current_dir(self, install_dir):415        egg_path = self._build_egg_using_setup_py()416        if not egg_path:417            return False418        print '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n'419        print 'About to run sudo to install setuptools', self.version420        print 'on your system for use by', sys.executable, '\n'421        print '!! ^C within', self.SUDO_SLEEP_DELAY, 'seconds to abort.\n'422        time.sleep(self.SUDO_SLEEP_DELAY)423        # Copy the egg to the local filesystem /var/tmp so that root can424        # access it properly (avoid NFS squashroot issues).425        temp_dir = self._get_temp_dir()426        try:427            shutil.copy(egg_path, temp_dir)428            egg_name = os.path.split(egg_path)[1]429            temp_egg = os.path.join(temp_dir, egg_name)...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
