This commit is contained in:
2017-01-19 22:52:32 -05:00
parent 82ce7fe922
commit b25c57ca5e
3 changed files with 66 additions and 13 deletions
+3 -4
View File
@@ -1,10 +1,9 @@
[[source]]
url = 'https://pypi.org/'
url = "https://pypi.org/"
verify_ssl = true
[requires]
[packages]
click = "*"
requests = "*"
crayons = "*"
"delegator.py" = "*"
click = "*"
+1
View File
@@ -0,0 +1 @@
{"_meta": {"sources": [{"url": "https://pypi.org/", "verify_ssl": true}], "requires": {}, "Pipfile-sha256": "f752128d0d355349e254f958151439c6d9c38b0b91e0579c6d5095ac45b3d102"}, "default": {"crayons": "*", "click": "*", "delegator.py": "*"}, "develop": {}}
+62 -9
View File
@@ -1,8 +1,10 @@
import codecs
import json
import os
import sys
import toml
import delegator
import click
import crayons
@@ -30,6 +32,28 @@ def ensure_virtualenv():
def add_package_to_pipfile(package_name, dev=False):
pipfile_path = pipfile.Pipfile.find()
# Read and append Pipfile.
with open(pipfile_path, 'r') as f:
p = toml.loads(f.read())
key = 'develop' if dev else 'packages'
if package_name not in p[key]:
# TODO: Support >1.0.1
p[key][package_name] = '*'
# Write Pipfile.
data = toml.dumps(p).split('\n')
for i, line in enumerate(data):
if i > 0:
if line.startswith('['):
data[i] = '\n{}'.format(line)
data = '\n'.join(data)
with open(pipfile_path, 'w') as f:
f.write(data)
@@ -49,6 +73,12 @@ def virtualenv_location():
def pipfile_location():
return pipfile.Pipfile.find()
def lockfile_location():
return '{}.freeze'.format(pipfile_location())
def lockfile_exists():
return os.path.isfile(lockfile_location())
def do_where(virtualenv=False, bare=True):
if not virtualenv:
@@ -90,6 +120,9 @@ def convert_deps(deps):
return dependencies
def which_pip():
return os.sep.join([virtualenv_location()] + ['bin/pip'])
@click.command()
@click.option('--dev', is_flag=True, default=False)
def prepare(dev=False):
@@ -104,11 +137,25 @@ def prepare(dev=False):
# Say where the virtualenv is.
do_where(virtualenv=True, bare=False)
click.echo(crayons.yellow('Installing dependencies from Pipfile...'))
# Write out the lockfile if it doesn't exist.
if lockfile_exists():
click.echo(crayons.yellow('Installing dependencies from Pipfile.freeze...'))
with codecs.open(lockfile_location(), 'r') as f:
lockfile = json.load(f)
# Load the pipfile.
p = pipfile.load(pipfile_location())
lockfile = json.loads(p.freeze())
# TODO: Update the lockfile if it is out-of-date.
p = pipfile.load(pipfile_location())
if not lockfile['_meta']['Pipfile-sha256'] == p.hash:
click.echo(crayons.red('Pipfile.freeze out of date, updating...'))
# Update the lockfile.
else:
# Load the pipfile.
click.echo(crayons.yellow('Installing dependencies from Pipfile...'))
p = pipfile.load(pipfile_location())
lockfile = json.loads(p.freeze())
# Install default dependencies, always.
deps = lockfile['default']
@@ -117,16 +164,22 @@ def prepare(dev=False):
if dev:
deps.update(lockfile['develop'])
# Convert the deps to pip-compatbile arguments.
deps = convert_deps(deps)
# Actually install each dependency into the virtualenv.
for package_name in deps:
click.echo('Installing {}...'.format(crayons.green(package_name)))
c = delegator.run('pip install {}'.format(package_name))
c = delegator.run('{} install {}'.format(which_pip(), package_name),)
click.echo(crayons.blue(c.out))
lockfile
if not lockfile['_meta']['Pipfile-sha256'] == p.hash:
click.echo(crayons.red('Pipfile.freeze out of date, updating...'))
# Write out the lockfile if it doesn't exist.
if not lockfile_exists():
click.echo(crayons.yellow('Pipfile.freeze not found, creating...'))
with codecs.open(lockfile_location(), 'w', 'utf-8') as f:
f.write(p.freeze())
@click.command()
@click.option('--virtualenv', is_flag=True, default=False)
@@ -142,7 +195,7 @@ def where(virtualenv=False, bare=False):
def install(package_name, dev=False):
click.echo('Installing {}...'.format(crayons.green(package_name)))
c = delegator.run('pip install {}'.format(package_name))
c = delegator.run('{} install {}'.format(which_pip(), package_name))
click.echo(crayons.blue(c.out))
click.echo('Adding {} to Pipfile...'.format(crayons.green(package_name)))