예제 #1
0
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
예제 #2
0
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)
        )
    )
예제 #3
0
파일: __main__.py 프로젝트: tspannhw/lore
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()
예제 #4
0
파일: env.py 프로젝트: zmyer/lore
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)))
예제 #5
0
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)