• Stars
    star
    109
  • Rank 319,077 (Top 7 %)
  • Language
    Python
  • License
    MIT License
  • Created about 5 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

sync pipfile/lockfile to setup.py or check dependency and versioning conflicts

Pipenv-Setup

travis-badge ci PyPI pyversions codecov PyPI version Very popular Code style: black

A beautiful python package development tool: sync dependencies in Pipfile or Pipfile.lock to setup.py.

Never need again to change dependencies manually in setup.py, and enjoy the same dependency locking or semantic versioning.

Or just check whether setup.py and Pipfile are consistent and sync dependency when necessary.

Installation

Create a command line entry point pipenv-setup, and add pipenv-setup as a dev package in Pipfile:

pipenv install --dev pipenv-setup

Additionally, black can be included as package extras:

pipenv install --dev "pipenv-setup[black]"  

Features

Beautiful pipenv flavored help

$ pipenv-setup

help

Sync to setup.py

  • supports assorted package configuration. You can have a pipfile as ugly as you want:

    [package]
    requests = { extras = ['socks'] }
    records = '>0.5.0'
    django = { git = 'https://github.com/django/django.git', ref = '1.11.4', editable = true }
    "e682b37" = {file = "https://github.com/divio/django-cms/archive/release/3.4.x.zip"}
    "e1839a8" = {path = ".", editable = true}
    pywinusb = { version = "*", os_name = "=='nt'", index="pypi"}
    

    pipenv-setup will still figure things out:

    $ pipenv-setup sync
    package e1839a8 is local, omitted in setup.py
    setup.py successfully updated
    23 packages from Pipfile.lock synced to setup.py

    And things will be where they should be:

    # setup.py
    setup(...,
      install_requires=[
          "requests[socks]",
          "records>0.5.0",
          "django @ git+https://github.com/django/[email protected]",
          "https://github.com/divio/django-cms/archive/release/3.4.x.zip",
          "pywinusb; os_name == 'nt'",
      ]
    )
  • provide --dev flag to sync development packages with extras_require:

    $ pipenv-setup sync --dev
    setup.py successfully updated
    1 default packages from Pipfile.lock synced to setup.py
    1 dev packages from Pipfile.lock synced to setup.py
    # produced setup.py
    setup(...,
        extras_require={"dev": ["pytest==1.1.3",]},
        install_requires=["xml-subsetter==0.0.1"],
    )
  • produce beautiful Blackened setup.py file

  • Template generation with filled dependencies in the absence of a setup file.

    $ pipenv-setup sync
    setup.py not found under current directory
    Creating boilerplate setup.py...
    setup.py was successfully generated
    23 packages synced from Pipfile.lock to setup.py
    Please edit the required fields in the generated file

    Note: by default, pipenv-setup syncs lockfile instead of pipfile

Sync Pipfile vs. Pipfile.lock

Provide --pipfile flag to sync Pipfile instead of Pipfile.lock.

pipenv-setup will perform a liquid sync using semantic versioning taken from Pipfile (instead of using frozen pinned versions from Pipfile.lock):

$ pipenv-setup sync --pipfile
setup.py was successfully updated
23 packages synced from Pipfile to setup.py

Checks Only

run $ pipenv-setup check

  • checks four items

    • local package in default pipfile packages
    • Package version requirements in install_requires in setup.py that potentially violates Pipfile
    • Package version requirements in dependency_links in setup.py that differs from Pipfile
    • Default package in pipfile missing in install_requires or dependency_links in setup.py
  • exits with non-zero code when conflict found (can be used in travis-ci)

  • here is a somewhat extreme example:

    $ pipenv-setup check
    package 'numpy' has version string: >=1.2 in setup.py, which potentially violates >=1.5 in pipfile
    package 'pywinusb' has version string: ==0.4.2 in setup.py, which is disjoint from ~=0.3.0 in pipfile
    package 'records' has version string: >=0.4.2,<0.5 in setup.py, which is disjoint from >0.5.0 in pipfile
    package 'django' has branch/version 1.11.5 in dependency_links, which is different than 1.11.4 listed in pipfile
    package 'requests' in pipfile but not in install_requires
    package 'e682b37' has a url in pipfile but not in dependency_links
    (exits with 1)
  • provide --ignore-local flag to allow local packages in pipfile

    $ pipenv-setup check
    local package found in default dependency: e1839a8.
    Do you mean to make it dev dependency
    (exits with 1)
    $ pipenv-setup check --ignore-local
    No version conflict or missing packages/dependencies found in setup.py!
    (exits with 0)
  • provide --strict flag to only pass identical version requirements

    By default pipenv-setup check passes when the version setup.py specifies is "compatible" with Pipfile, i.e. is a subset of it. For example, a Pipfile specifying django~=1.1 with setup.py requiring django==1.2 is such a case.

    Provide --strict to allow only identical requirements; i.e. for Pipfile's django~=1.1, setup.py must require django>=1.1,<2.0

    Example output:

    $ pipenv-setup check --strict
    package 'pywinusb' has version string: ==0.4.2 in setup.py, which specifies a subset of * in pipfile
    package 'django' has version string: >=0.5 in setup.py, which is disjoint from ~=0.3.0 in pipfile
    package 'records' has version string: ==0.5.2 in setup.py, which specifies a subset of >0.5.0 in pipfile
    package 'requests' has version string: ==2.18.4 in setup.py, which specifies a subset of * in pipfile
    (exits with 1)
  • provide --lockfile flag to check setup.py against Pipfile.lock instead of Pipfile

    By default, pipenv-setup check compares the dependencies from setup.py against the dependencies listed in Pipfile. This works well for most cases, but there are some exceptions that break this strategy, including (but not necessarily limited to):

    • VCS dependencies with a mutable ref (e.g. - git branch name instead of a tag or commit sha)
      • Because these resolve to an immutable pointer (e.g. - commit sha) in setup.py, the dependency will no longer match between setup.py and Pipfile. However, Pipfile.lock will contain the same resolved pointer as setup.py.

Pre-commit integration

You can run pipenv-setup automatically using a pre-commit hook. To get started, add this configuration to your .pre-commit-config.yaml:

- repo: https://github.com/Madoshakalaka/pipenv-setup
  rev: "4.0.0a1" # pick a git hash / tag to point to
  hooks:
    - id: pipenv-setup

This configuration will execute pipenv-setup sync --pipfile on changes to Pipfile, Pipfile.lock, and setup.py.

You can also customize the default args ("--pipfile"). For example, to synchronize --dev extras:

- repo: # ...
  hooks:
    - id: pipenv-setup
      args: [--dev, --pipfile]

If using the hook during CI (or in another environment separate from a black installation), you can include the appropriate auto-formatter with the hook:

- repo: # ...
  hooks:
    - id: pipenv-setup
      additional_dependencies: [".[black]"]

Contributing

If you'd like to contribute to pipenv-setup, see Contribution Guide

More Repositories

1

yew-interop

Load Javascript and CSS asynchronously in yew
Rust
41
star
2

English-IPA

English to IPA with syllable correspondence
Python
10
star
3

unsafe-search

Google image search but NSFW ;)
Python
6
star
4

garbage-translator

translate to look-alike text in another language
Python
5
star
5

gnome-folding-at-screenlock

folding at home on GNOME but only when the screen is locked
Shell
4
star
6

icon-generator

Handy command line tool with optional GUI to crop and generate icons in different resolutions
Python
3
star
7

python-typing-to-typescript

convert python typing to interface
TypeScript
3
star
8

hfstol

hfst optimised lookup reimplemented in python. Including a wrapper to the original hfst-optimized-lookup
Python
2
star
9

bgAna

Background Analyzer. Heuristics to get the background color of any image.
Python
2
star
10

this-does-that

Handy command line tool that combines two images with an arrow in between
Python
2
star
11

akses

Make ctrl+i (tab), ctrl+j (enter), ctrl+n (down), ctrl+p (up), ctrl+[ (escape) work as expected. With app-specific remapping.
Rust
2
star
12

FaceReconstruction

For Multimedia 805
JavaScript
2
star
13

xkbpatch

user-specific xkb configuration
Rust
2
star
14

dark-python

hijack python built-in functions and libraries
Python
1
star
15

Dia

a dialog robot
Python
1
star
16

what-now

art
Rust
1
star
17

unikey

use the same set of hot keys everywhere
Rust
1
star
18

mental

Play magic the gathering on Discord
JavaScript
1
star
19

adhd

Keep myself highly focused on work
Python
1
star
20

django-slappy

run python interactively on slack
Python
1
star
21

pyckage

Cross-platform Python package boilerplate app. Configure travis ci testing and auto pypi release all in one keypress
JavaScript
1
star
22

whichimg

blazing fast template matching when possible images are all known
Python
1
star
23

Madoshakalaka.github.io

my blog of interesting things
HTML
1
star