def check_requirements(): if not os.path.exists(requirements): sys.exit( ansi.error() + ' %s is missing. Please check it in.' % ansi.underline(requirements) ) with open(requirements, 'r', encoding='utf-8') as f: dependencies = f.readlines() vcs = [d for d in dependencies if re.match(r'^(-e )?(git|svn|hg|bzr).*', d)] dependencies = list(set(dependencies) - set(vcs)) missing = [] try: pkg_resources.require(dependencies) except (pkg_resources.ContextualVersionConflict, DistributionNotFound, VersionConflict) as error: missing.append(str(error)) except pkg_resources.RequirementParseError: pass if missing: missing = ' missing requirement:\n ' + os.linesep.join(missing) if '--env-checked' in sys.argv: sys.exit(ansi.error() + missing + '\nRequirement installation failure, please check for errors in:\n $ lore install\n') else: print(ansi.warning() + missing) import lore.__main__ lore.__main__.install_requirements(None) reboot('--env-checked') else: return True
def validate(): """Display error messages and exit if no lore environment can be found. """ if not os.path.exists(os.path.join(ROOT, APP, '__init__.py')): message = ansi.error() + ' Python module not found.' if os.environ.get('LORE_APP') is None: message += ' $LORE_APP is not set. Should it be different than "%s"?' % APP else: message += ' $LORE_APP is set to "%s". Should it be different?' % APP sys.exit(message) if exists(): return if len(sys.argv) > 1: command = sys.argv[1] else: command = 'lore' sys.exit( ansi.error() + ' %s is only available in lore ' 'app directories (missing %s)' % ( ansi.bold(command), ansi.underline(VERSION_PATH) ) )
def install_requirements(args): source = env.REQUIREMENTS if not os.path.exists(source): sys.exit(ansi.error() + ' %s is missing. You should check it in to version ' 'control.' % ansi.underline(source)) pip_install(source, args) freeze_requirements()
def validate(): if not os.path.exists(os.path.join(root, project, '__init__.py')): sys.exit( ansi.error() + ' Python module not found. Do you need to change $LORE_PROJECT from "%s"?' % project) if exists(): return if len(sys.argv) > 1: command = sys.argv[1] else: command = 'lore' sys.exit(ansi.error() + ' %s is only available in lore ' 'project directories (missing %s)' % (ansi.bold(command), ansi.underline(version_path)))
def freeze_requirements(): source = env.requirements print( ansi.success('EXECUTE') + ' ' + env.bin_python + ' -m pip freeze -r ' + source) vcs = split_vcs_lines() pip = subprocess.Popen( (env.bin_python, '-m', 'pip', 'freeze', '-r', source), stdout=subprocess.PIPE, stderr=subprocess.PIPE) (stdout, stderr) = pip.communicate() pip.wait() restore_vcs_lines(vcs) present = stdout.decode('utf-8').split(os.linesep) errors = stderr.decode('utf-8').split(os.linesep) missing = [line for line in errors if 'package is not installed' in line] regex = re.compile(r'contains ([\w\-\_]+)') needed = [ m.group(1).lower() for l in missing for m in [regex.search(l)] if m ] added_index = present.index( '## The following requirements were added by pip freeze:') unsafe = None if added_index: added = present[added_index + 1:-1] present = set(present[0:added_index]) safe = set() unsafe = set() for package in added: name = package.split('==')[0] for bad in vcs: if name in bad: unsafe.add(package) continue if name.lower() in needed: needed.remove(name.lower()) safe.add(package) present |= safe present -= unsafe if needed: args = [env.bin_python, '-m', 'pip', 'install'] + needed print(ansi.success('EXECUTE ') + ' '.join(args)) subprocess.check_call(args) return freeze_requirements() if unsafe: if vcs: print(ansi.warning() + ' Non pypi packages were detected in your ' + ansi.underline('requirements.txt') + ' that can not be ' 'completely frozen by pip. ' + os.linesep + os.linesep + os.linesep.join(vcs)) print(ansi.info() + ' You should check the following packages in to ' + ansi.underline('requirements.txt') + ' or `lore pip uninstall` them') if vcs: print( ansi.warning('unless') + ' they are covered by the previously listed packages' ' that pip can not freeze.') print(os.linesep + os.linesep.join(unsafe) + os.linesep) with open(source, 'w', encoding='utf-8') as f: f.write( os.linesep.join(sorted(present, key=lambda s: s.lower())).strip() + os.linesep) if vcs: f.write(os.linesep.join(vcs) + os.linesep)