Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pin pipenv requirements with brackets?

I just did:

pipenv install django[argon2]

And this changed my Pipfile:

-django = "==2.1.5"
+django = {extras = ["argon2"],version = "*"}

I want to pin the requirements. First I will pin django to 2.1.5:

django = {extras = ["argon2"],version = "==2.1.5"}

What about argon2? Is that a separate package? There is no such package when I do pip freeze:

$ pip freeze  | grep -i argon2
argon2-cffi==19.1.0

What is that? How do I fully pin django[argon2]?

like image 289
volingas Avatar asked Feb 07 '19 14:02

volingas


People also ask

What does Pipenv lock do?

$ pipenv lock is used to create a Pipfile. lock , which declares all dependencies (and sub-dependencies) of your project, their latest available versions, and the current hashes for the downloaded files. This ensures repeatable, and most importantly deterministic, builds.

What does -- ignore Pipfile do?

You might also want to add --ignore-pipfile to pipenv install , as to not accidentally modify the lock-file on each test run. This causes Pipenv to ignore changes to the Pipfile and (more importantly) prevents it from adding the current environment to Pipfile.

What is Pipfile and Pipfile lock?

☤ Example Pipfile & Pipfile. lock Pipfiles contain information for the dependencies of the project, and supersedes the requirements. txt file used in most Python projects. You should add a Pipfile in the Git repository.


2 Answers

In my Pipfile, I found this possible by double-quoting the package and the version

[packages]
"django[argon2]" = "==2.1.5"
like image 113
ti7 Avatar answered Oct 19 '22 17:10

ti7


From the Requirement Specifier docs for pip, you can combine these forms:

SomeProject == 1.3  
SomeProject >=1.2,<2.0  
SomeProject[foo, bar]

This means you can do this command:

pipenv install "django[argon2]==2.1.5"

Which generates this Pipfile entry:

django = {version = "==2.1.5", extras = ["argon2"]}

That command installs Django and:

  1. Pins Django at version 2.1.5 (or whatever is specified as ==VERSION)
  2. Includes Django's optional support for Argon2

There is no argon2 package. The [argon2] means it is an optional dependency or an optional feature of Django. What gets installed is the argon2-cffi and cffi packages, which are the optional dependencies Django needs to use Argon2. You can see this in the Pipfile.lock:

"argon2-cffi": {
    "hashes": [
        ...
    ],
    "version": "==20.1.0"
},
"cffi": {
    "hashes": [
        ...
    ],
    "version": "==1.14.6"
},
"django": {
    "extras": [
        "argon2"
    ],
    "hashes": [
        ...
    ],
    "index": "pypi",
    "version": "==2.1.5"
},

This is also mentioned in the Django docs:

To use Argon2 as your default storage algorithm, do the following:

  1. This can be done by running python -m pip install django[argon2], which is equivalent to python -m pip install argon2-cffi (along with any version requirement from Django’s setup.cfg)

The difference of doing pipenv install django[argon2] compared to installing django and argon2-cffi separately (as with this other answer) is that, during installation, you let Django's setuptools decide which version of argon2-cffi to use. This is better because the Django maintainers probably wrote and tested the code for Argon2 support using a compatible version of argon2-cffi.

This can be seen in Django's setup.cfg file (for Django 3.2.6 at the time of this writing):

[options.extras_require]
argon2 = argon2-cffi >= 19.1.0

which indicates that when using optional [argon2] feature it needs to install that range of version of argon2-cffi. As James O' Brien commented: "A specific version of django would require specific versions of the extras."

like image 24
Gino Mempin Avatar answered Oct 19 '22 17:10

Gino Mempin