text:
<!doctype html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <link rel="prefetch" href="../../../../ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js">

    <meta name="application-name" content="Python.org">
    <meta name="msapplication-tooltip" content="The official home of the Python Programming Language">
    <meta name="apple-mobile-web-app-title" content="Python.org">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="HandheldFriendly" content="True">
    <meta name="format-detection" content="telephone=no">
    <meta http-equiv="cleartype" content="on">
    <meta http-equiv="imagetoolbar" content="false">

    <link href="../../../static/stylesheets/style.css" rel="stylesheet" type="text/css" title="default" />
    <link href="../../../static/stylesheets/mq.css" rel="stylesheet" type="text/css" media="not print, braille, embossed, speech, tty" />

    <link rel="icon" type="image/x-icon" href="https://www.python.org/static/favicon.ico">
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../../../static/apple-touch-icon-144x144-precomposed.png">
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../../../static/apple-touch-icon-114x114-precomposed.png">
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../../../static/apple-touch-icon-72x72-precomposed.png">
    <link rel="apple-touch-icon-precomposed" href="../../../static/apple-touch-icon-precomposed.png">
    <link rel="apple-touch-icon" href="../../../static/apple-touch-icon-precomposed.png">

    <meta name="msapplication-TileImage" content="/static/metro-icon-144x144-precomposed.png">
    <meta name="msapplication-TileColor" content="#3673a5">
    <meta name="msapplication-navbutton-color" content="#3673a5">

    <meta property="og:site_name" content="Python.org">
    <meta property="og:type" content="website">

    <title>PEP 0453 -- Explicit bootstrapping of pip in Python installations | Python.org</title>
    <meta property="og:title" content="Welcome to Python.org">

    <meta name="description" content="The official home of the Python Programming Language">
    <meta name="og:description" content="The official home of the Python Programming Language">
    <meta name="keywords" content="Python programming language object oriented web free open source software license documentation download community">
    <meta property="og:tag" content="Python programming language object oriented web free open source software license documentation download community">
    <meta property="og:published_time" content="">
    <meta property="og:modified_time" content="">
    <meta property="og:author" content="">
    <meta property="og:section" content="">
    <meta property="og:url" content="">
    <meta property="og:image" content="">
    <meta property="og:video" content="">

    <link rel="author" href="https://www.python.org/static/humans.txt">

Notice: While Javascript is not essential for this website, your interaction with the content will be limited. Please turn Javascript on for the full experience.

                    Skip to content

                    ▼ Close

        Python

        PSF

        Docs

        PyPI

        Jobs

        Community

                    ▲ The Python Network

                    ≡ Menu<form class="search-the-site" action="https://www.python.org/search/" method="get">
                        <fieldset title="Search Python.org">

                            Search This Site
                            <input id="id-search-field" name="q" type="search" role="textbox" class="search-field" placeholder="Search" value="" tabindex="1">

                            <button type="submit" name="submit" id="submit" class="search-button" title="Submit this Search" tabindex="3">
                                GO
                            </button>

                        </fieldset>
                    </form>

                                A A

Smaller

Larger

Reset

                                Socialize

Google+

Facebook

Twitter

Chat on IRC

                                Sign In

Sign Up / Register

Sign In

        About

Applications

Quotes

Getting Started

Help

        Downloads

All releases

Source code

Windows

Mac OS X

Other Platforms

License

Alternative Implementations

        Documentation

Docs

Audio/Visual Talks

Beginner's Guide

Developer's Guide

FAQ

Non-English Docs

PEP Index

Python Books

        Community

Diversity

IRC

Mailing Lists

Python Conferences

Special Interest Groups

Python Wiki

Python Logo

Merchandise

Community Awards

        Success Stories

Arts

Business

Education

Engineering

Government

Scientific

Software Development

        News

Python News

Community News

PSF News

PyCon News

        Events

Python Events

User Group Events

Python Events Archive

User Group Events Archive

Submit an Event

        Python>>>

        Python Developer's Guide>>>

        PEP Index>>>

PEP 0453 -- Explicit bootstrapping of pip in Python installations

PEP 0453 -- Explicit bootstrapping of pip in Python installations

   <col class="field-name">
   </col>
   <col class="field-body">
   </col>

      PEP:

      453

      Title:

      Explicit bootstrapping of pip in Python installations

      Author:

      Donald Stufft <donald at stufft.io>,
Nick Coghlan <ncoghlan at gmail.com>

      BDFL-Delegate:

      Martin von Löwis

      Status:

      Final

      Type:

      Standards Track

      Created:

      10-Aug-2013

      Post-History:

      30-Aug-2013, 15-Sep-2013, 18-Sep-2013, 19-Sep-2013,
23-Sep-2013, 29-Sep-2013, 13-Oct-2013, 20-Oct-2013

      Resolution:

       https://mail.python.org/pipermail/python-dev/2013-October/129810.html

    Contents

      Abstract

      PEP Acceptance

      Rationale

        Improving the new user experience

        Enabling the evolution of the broader Python packaging ecosystem

        Why pip?

      Proposal Overview

      Explicit bootstrapping mechanism

        Security considerations

        Reliability considerations

        Implementation strategy

        Integration timeline

        Proposed CLI

        Proposed module API

        Invocation from the CPython installers

        Installing from source

        Changes to virtual environments

        Documentation

        Bundling CA certificates with CPython

        Automatic installation of setuptools

        Updating the private copy of pip

        Updating the ensurepip module API and CLI

      Uninstallation

      Script Execution on Windows

      Recommendations for Downstream Distributors

      Policies & Governance

        Backwards Compatibility

        Security Releases

        Licensing

      Appendix: Rejected Proposals

        Changing the name of the scripts directory on Windows

        Including ensurepip in Python 2.7, and 3.3

        Automatically contacting PyPI when bootstrapping pip

        Implicit bootstrap

        Including pip directly in the standard library

        Defaulting to --user installation

      References

      Copyright

     Abstract

    This PEP proposes that the

     Installing Python Modules

    guide in
Python 2.7, 3.3 and 3.4 be updated to officially recommend the use of
    <tt class="docutils literal">
     pip
    </tt>
    as the default installer for Python packages, and that appropriate technical
changes be made in Python 3.4 to provide
    <tt class="docutils literal">
     pip
    </tt>
    by default in support of
that recommendation.

     PEP Acceptance

    This PEP was accepted for inclusion in Python 3.4 by Martin von Löwis on
Tuesday 22nd October, 2013.

     Issue 19347

    has been created to
track the implementation of this PEP.

     Rationale

    There are two related, but distinct rationales for the proposal in this
PEP. The first relates to the experience of new users, while the second
relates to better enabling the evolution of the broader Python packaging
ecosystem.

      Improving the new user experience

     Currently, on systems without a platform package manager and repository,
installing a third-party Python package into a freshly installed Python
requires first identifying an appropriate package manager and then
installing it.

     Even on systems that

      do

     have a platform package manager, it is unlikely to
include every package that is available on the Python Package Index, and
even when a desired third-party package is available, the correct name in
the platform package manager may not be clear.

     This means that, to work effectively with the Python Package Index
ecosystem, users must know which package manager to install, where to get
it, and how to install it. The effect of this is that third-party Python
projects are currently required to choose from a variety of undesirable
alternatives:

      Assume the user already has a suitable cross-platform package manager
installed.

      Duplicate the instructions and tell their users how to install the
package manager.

      Completely forgo the use of dependencies to ease installation concerns
for their users.

     All of these available options have significant drawbacks.

     If a project simply assumes a user already has the tooling then beginning
users may get a confusing error message when the installation command
doesn't work. Some operating systems may ease this pain by providing a
global hook that looks for commands that don't exist and suggest an OS
package they can install to make the command work, but that only works
on systems with platform package managers that include a package that
provides the relevant cross-platform installer command (such as many major
Linux distributions). No such assistance is available for Windows and
Mac OS X users, or more conservative Linux distributions. The challenges
of dealing with this problem for beginners (who are often also completely
new to programming, the use of command line tools and editing system
environment variables) are a regular feature of feedback the core Python
developers receive from professional educators and others introducing new
users to Python.

     If a project chooses to duplicate the installation instructions and tell
their users how to install the package manager before telling them how to
install their own project then whenever these instructions need updates
they need updating by every project that has duplicated them. This is
particular problematic when there are multiple competing installation
tools available, and different projects recommend different tools.

     This specific problem can be partially alleviated by strongly promoting
     <tt class="docutils literal">
      pip
     </tt>
     as the default installer and recommending that other projects
reference

      pip's own bootstrapping instructions

     rather than
duplicating them. However the user experience created by this approach
still isn't particularly good (although there is an effort under way to
create a combined Windows installer for
     <tt class="docutils literal">
      pip
     </tt>
     and its dependencies that
should improve matters on that platform, and Mac OS X and *nix platforms
generally have
     <tt class="docutils literal">
      wget
     </tt>
     and hence the ability to easily download and run the
bootstrap scripts from the command line).

     The projects that have decided to forgo dependencies altogether are forced
to either duplicate the efforts of other projects by inventing their own
solutions to problems or are required to simply include the other projects
in their own source trees. Both of these options present their own problems
either in duplicating maintenance work across the ecosystem or potentially
leaving users vulnerable to security issues because the included code or
duplicated efforts are not automatically updated when upstream releases a new
version.

     By officially recommending and providing by default a specific cross-platform
package manager it will be easier for users trying to install these
third-party packages as well as easier for the people distributing them as
they should now be able to safely assume that most users will have the
appropriate installation tools available (or access to clear instructions on
how to obtain them). This is expected to become more important in the future
as the

      Wheel

      [17]

     package format (deliberately) does not have a built in
"installer" in the form of
     <tt class="docutils literal">
      setup.py
     </tt>
     so users wishing to install
from a wheel file will want an installer even in the simplest cases.

     Reducing the burden of actually installing a third-party package should
also decrease the pressure to add every useful module to the standard
library. This will allow additions to the standard library to focus more
on why Python should have a particular tool out of the box, and why it
is reasonable for that package to adopt the standard library's 18-24 month
feature release cycle, instead of using the general difficulty of installing
third-party packages as justification for inclusion.

     Providing a standard installation system also helps with bootstrapping
alternate build and installer systems, such as
     <tt class="docutils literal">
      zc.buildout
     </tt>
     ,
     <tt class="docutils literal">
      hashdist
     </tt>
     and
     <tt class="docutils literal">
      conda
     </tt>
     . So long as
     <tt class="docutils literal">
      pip install <tool>
     </tt>
     works, then a standard
Python-specific installer provides a reasonably secure, cross platform
mechanism to get access to these utilities.

      Enabling the evolution of the broader Python packaging ecosystem

     As no new packaging standard can achieve widespread adoption without a
transition strategy that covers the versions of Python that are in
widespread

      current

     use (rather than merely future versions, like most
language features), the change proposed in this PEP is considered a
necessary step in the evolution of the Python packaging ecosystem

     The broader community has embraced the Python Package Index as a mechanism
for distributing and installing Python software, but the different concerns
of language evolution and secure software distribution mean that a faster
feature release cycle that encompasses older versions is needed to properly
support the latter.

     In addition, the core CPython development team have the luxury of
dropping support for earlier Python versions well before the rest of the
community, as downstream commercial redistributors pick up the task of
providing support for those versions to users that still need it, while
many third party libraries maintain compatibility with those versions as
long as they remain in widespread use.

     This means that the current
     <tt class="docutils literal">
      setup.py install
     </tt>
     based model for package
installation poses serious difficulties for the development and adoption
of new packaging standards, as, depending on how a project writes their
     <tt class="docutils literal">
      setup.py
     </tt>
     file, the installation command (along with other operations)
may end up invoking the standard library's
     <tt class="docutils literal">
      distutils
     </tt>
     package.

     As an indicator of how this may cause problems for the broader ecosystem,
consider that the feature set of
     <tt class="docutils literal">
      distutils
     </tt>
     in Python 2.6 was frozen
in June 2008 (with the release of Python 2.6b1), while the feature set of
     <tt class="docutils literal">
      distutils
     </tt>
     in Python 2.7 was frozen in April 2010 (with the release of
Python 2.7b1).

     By contrast, using a separate installer application like
     <tt class="docutils literal">
      pip
     </tt>
     (which
ensures that even
     <tt class="docutils literal">
      setup.py
     </tt>
     files that invoke
     <tt class="docutils literal">
      distutils
     </tt>
     directly
still support the new packaging standards) makes it possible to support
new packaging standards in older versions of Python, just by upgrading
     <tt class="docutils literal">
      pip
     </tt>
     (which receives new feature releases roughly every 6 months). The
situation on older versions of Python is further improved by making it
easier for end users to install and upgrade newer build systems like
     <tt class="docutils literal">
      setuptools
     </tt>
     or improved PyPI upload utilities like
     <tt class="docutils literal">
      twine
     </tt>
     .

     It is not coincidental that this proposed model of using a separate installer
program with more metadata heavy and less active distribution formats matches
that used by most operating systems (including Windows since the introduction
of the installer service and the MSI file format), as well as many other
language specific installers.

     For Python 2.6, this compatibility issue is largely limited to various
enterprise Linux distributions (and their downstream derivatives). These
distributions often have even slower update cycles than CPython, so they
offer full support for versions of Python that are considered "security
fix only" versions upstream (and sometimes may even be to the point where
the core development team no longer support them at all - you can still get
commercial support for Python 2.3 if you really need it!).

     In practice, the fact that tools like
     <tt class="docutils literal">
      wget
     </tt>
     and
     <tt class="docutils literal">
      curl
     </tt>
     are readily
available on Linux systems, that most users of Python on Linux are
already familiar with the command line, and that most Linux distributions
ship with a default configuration that makes running Python scripts easy,
means that the existing
     <tt class="docutils literal">
      pip
     </tt>
     bootstrapping instructions for any *nix
system are already quite straightforward. Even if
     <tt class="docutils literal">
      pip
     </tt>
     isn't provided by
the system package manager, then using
     <tt class="docutils literal">
      wget
     </tt>
     or
     <tt class="docutils literal">
      curl
     </tt>
     to retrieve the
bootstrap script from www.pip-installer.org and then running it is just a
couple of shell commands that can easily be copied and pasted as necessary.

     Accordingly, for any version of Python on any *nix system, the need to
bootstrap
     <tt class="docutils literal">
      pip
     </tt>
     in older versions isn't considered a major barrier to
adoption of new packaging standards, since it's just one more small
speedbump encountered by users of these long term stable releases. For
*nix systems, this PEP's formal endorsement of
     <tt class="docutils literal">
      pip
     </tt>
     as the preferred
default packaging tool is seen as more important than the underlying
technical details involved in making
     <tt class="docutils literal">
      pip
     </tt>
     available by default, since
it shifts the nature of the conversation between the developers of
     <tt class="docutils literal">
      pip
     </tt>
     and downstream repackagers of both
     <tt class="docutils literal">
      pip
     </tt>
     and CPython.

     For Python 2.7, on the other hand, the compatibility issue for adopting new
metadata standards is far more widespread, as it affects the python.org
binary installers for Windows and Mac OS X, as well as even relatively
fast moving *nix platforms.

     Firstly, and unlike Python 2.6, Python 2.7 is still a fully supported
upstream version, and will remain so until the release of Python 2.7.9
(currently scheduled for May 2015), at which time it is expected to enter
the usual "security fix only" mode. That means there are at least another
19 months where Python 2.7 is a deployment target for Python applications
that enjoys full upstream support. Even after the core development team
switches 2.7 to security release only mode in 2015, Python 2.7 will likely
remain a commercially supported legacy target out beyond 2020.

     While Python 3 already presents a compelling alternative over Python 2 for

      new

     Python applications and deployments without an existing investment
in Python 2 and without a dependency on specific Python 2 only third party
modules (a set which is getting ever smaller over time), it is going to take
longer to create compelling business cases to update existing Python 2.7
based infrastructure to Python 3, especially in situations where the culture
of automated testing is weak (or nonexistent), making it difficult to
effectively use the available migration utilities.

     While this PEP only proposes documentation changes for Python 2.7, once
     <tt class="docutils literal">
      pip
     </tt>
     has a Windows installer available, a separate PEP will be created
and submitted proposing the creation and distribution of aggregate installers
for future CPython 2.7 maintenance releases that combine the CPython,
     <tt class="docutils literal">
      pip
     </tt>
     and Python Launcher for Windows installers into a single download
(the separate downloads would still remain available - the aggregate
installers would be provided as a convenience, and as a clear indication
of the recommended operating environment for Python in Windows systems).

      Why pip?

     <tt class="docutils literal">
      pip
     </tt>
     has been chosen as the preferred default installer, as it is an
already popular tool that addresses several design and user experience
issues with its predecessor
     <tt class="docutils literal">
      easy_install
     </tt>
     (these issues can't readily
be fixed in
     <tt class="docutils literal">
      easy_install
     </tt>
     itself due to backwards compatibility
concerns).
     <tt class="docutils literal">
      pip
     </tt>
     is also well suited to working within the bounds of
a single Python runtime installation (including associated virtual
environments), which is a desirable feature for a tool bundled with CPython.

     Other tools like
     <tt class="docutils literal">
      zc.buildout
     </tt>
     and
     <tt class="docutils literal">
      conda
     </tt>
     are more ambitious in their
aims (and hence substantially better than
     <tt class="docutils literal">
      pip
     </tt>
     at handling external
binary dependencies), so it makes sense for the Python ecosystem to treat
them more like platform package managers to interoperate with rather than
as the default cross-platform installation tool. This relationship is
similar to that between
     <tt class="docutils literal">
      pip
     </tt>
     and platform package management systems
like
     <tt class="docutils literal">
      apt
     </tt>
     and
     <tt class="docutils literal">
      yum
     </tt>
     (which are also designed to handle arbitrary
binary dependencies).

     Proposal Overview

    This PEP proposes that the

     Installing Python Modules

    guide be
updated to officially recommend the use of
    <tt class="docutils literal">
     pip
    </tt>
    as the default
installer for Python packages, rather than the current approach of
recommending the direct invocation of the
    <tt class="docutils literal">
     setup.py install
    </tt>
    command.

    However, to avoid recommending a tool that CPython does not provide, it is
further proposed that the

     pip

     [18]

    package manager be made available by
default when installing CPython 3.4 or later and when creating virtual
environments using the standard library's
    <tt class="docutils literal">
     venv
    </tt>
    module via the
    <tt class="docutils literal">
     pyvenv
    </tt>
    command line utility.

    To support that end, this PEP proposes the inclusion of an
    <tt class="docutils literal">
     ensurepip
    </tt>
    bootstrapping module in Python 3.4, as well as automatic invocation of that
module from
    <tt class="docutils literal">
     pyvenv
    </tt>
    and changes to the way Python installed scripts are
handled on Windows. Using a bootstrap module rather than providing
    <tt class="docutils literal">
     pip
    </tt>
    directly helps to clearly demarcate development responsibilities, and to
avoid inadvertently downgrading
    <tt class="docutils literal">
     pip
    </tt>
    when updating CPython.

    To provide clear guidance for new users of Python that may not be
starting with the latest release, this PEP also proposes that the
"Installing Python Modules" guides in Python 2.7 and 3.3 be updated to
recommend installing and using
    <tt class="docutils literal">
     pip
    </tt>
    , rather than invoking
    <tt class="docutils literal">
     distutils
    </tt>
    directly. It does

     not

    propose backporting any of the code changes that
are being proposed for Python 3.4.

    Finally, the PEP also strongly recommends that CPython redistributors and
other Python implementations ensure that
    <tt class="docutils literal">
     pip
    </tt>
    is available by default, or
at the very least, explicitly document the fact that it is not included.

    This PEP does

     not

    propose making pip (or any dependencies) directly
available as part of the standard library. Instead, pip will be a
bundled application provided along with CPython for the convenience
of Python users, but subject to its own development life cycle and able
to be upgraded independently of the core interpreter and standard library.

     Explicit bootstrapping mechanism

    An additional module called
    <tt class="docutils literal">
     ensurepip
    </tt>
    will be added to the standard
library whose purpose is to install pip and any of its dependencies into the
appropriate location (most commonly site-packages). It will expose a
callable named
    <tt class="docutils literal">
     bootstrap()
    </tt>
    as well as offer direct execution via
    <tt class="docutils literal">
     python

      -m

     ensurepip
    </tt>
    .

    The bootstrap will

     not

    contact PyPI, but instead rely on a private copy
of pip stored inside the standard library. Accordingly, only options
related to the installation location will be supported (
    <tt class="docutils literal">

      --user

    </tt>
    ,
    <tt class="docutils literal">

      --root

    </tt>
    , etc).

    It is considered desirable that users be strongly encouraged to use the
latest available version of
    <tt class="docutils literal">
     pip
    </tt>
    , in order to take advantage of the
ongoing efforts to improve the security of the PyPI based ecosystem, as
well as benefiting from the efforts to improve the speed, reliability and
flexibility of that ecosystem.

    In order to satisfy this goal of providing the most recent version of
    <tt class="docutils literal">
     pip
    </tt>
    by default, the private copy of
    <tt class="docutils literal">
     pip
    </tt>
    will be updated in CPython
maintenance releases, which should align well with the 6-month cycle used
for new
    <tt class="docutils literal">
     pip
    </tt>
    releases.

      Security considerations

     The design in this PEP has been deliberately chosen to avoid making any
significant changes to the trust model of CPython for end users that do
not subsequently run the command
     <tt class="docutils literal">
      pip install

       --upgrade

      pip
     </tt>
     .

     The installers will contain all the components of a fully functioning
version of Python, including the
     <tt class="docutils literal">
      pip
     </tt>
     installer. The installation
process will

      not

     require network access, and will

      not

     rely on
trusting the security of the network connection established between
     <tt class="docutils literal">
      pip
     </tt>
     and the Python package index.

     Only users that choose to use
     <tt class="docutils literal">
      pip
     </tt>
     to communicate with PyPI will
need to pay attention to the additional security considerations that come
with doing so.

     However, the core CPython team will still assist with reviewing and
resolving at least the

      certificate update management issue

     currently
affecting the
     <tt class="docutils literal">
      requests
     </tt>
     project (and hence
     <tt class="docutils literal">
      pip
     </tt>
     ), and may also be
able to offer assistance in resolving other identified security concerns

      [6]

     .

      Reliability considerations

     By including the bootstrap as part of the standard library (rather than
solely as a feature of the binary installers), the correct operation of
the bootstrap command can be easily tested using the existing CPython
buildbot infrastructure rather than adding significantly to the testing
burden for the installers themselves.

      Implementation strategy

     To ensure there is no need for network access when installing Python or
creating virtual environments, the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module will, as an
implementation detail, include a complete private copy of pip and its
dependencies which will be used to extract pip and install it into the target
environment. It is important to stress that this private copy of pip is

      only

     an implementation detail and it should

      not

     be relied on or
assumed to exist beyond the public capabilities exposed through the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module (and indirectly through
     <tt class="docutils literal">
      venv
     </tt>
     ).

     There is not yet a reference
     <tt class="docutils literal">
      ensurepip
     </tt>
     implementation. The existing
     <tt class="docutils literal">

       get-pip.py

     </tt>
     bootstrap script demonstrates an earlier variation of the
general concept, but the standard library version would take advantage of
the improved distribution capabilities offered by the CPython installers
to include private copies of
     <tt class="docutils literal">
      pip
     </tt>
     and
     <tt class="docutils literal">
      setuptools
     </tt>
     as wheel files
(rather than as embedded base64 encoded data), and would not try to
contact PyPI (instead installing directly from the private wheel files).

     Rather than including separate code to handle the bootstrapping, the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module will manipulate
     <tt class="docutils literal">
      sys.path
     </tt>
     appropriately to allow
the wheel files to be used to install themselves, either into the current
Python installation or into a virtual environment (as determined by the
options passed to the bootstrap command).

     It is proposed that the implementation be carried out in five separate
steps (all steps after the first two are independent of each other and
can be carried out in any order):

      the first step would update the "Installing Python Modules" documentation
to recommend the use of
      <tt class="docutils literal">
       pip
      </tt>
      and reference the
      <tt class="docutils literal">
       pip
      </tt>
      team's
instructions for downloading and installing it. This change would be
applied to Python 2.7, 3.3, and 3.4.

      the
      <tt class="docutils literal">
       ensurepip
      </tt>
      module and the private copies of the most recently
released versions of pip and setuptools would be added to Python 3.4
and the 3.4 "Installing Python Modules" documentation updated accordingly.

      the CPython Windows installer would be updated to offer the new
      <tt class="docutils literal">
       pip
      </tt>
      installation option for Python 3.4.

      the CPython Mac OS X installer would be updated to offer the new
      <tt class="docutils literal">
       pip
      </tt>
      installation option for Python 3.4.

      the
      <tt class="docutils literal">
       venv
      </tt>
      module and
      <tt class="docutils literal">
       pyvenv
      </tt>
      command would be updated to make use
of
      <tt class="docutils literal">
       ensurepip
      </tt>
      in Python 3.4

      the PATH handling on Windows would be updated for Python 3.4+

      Integration timeline

     If this PEP is accepted, the proposed time frame for integration of
     <tt class="docutils literal">
      pip
     </tt>
     into the CPython release is as follows:

      as soon as possible after the release of 3.4.0 alpha 4

        Documentation updated and
        <tt class="docutils literal">
         ensurepip
        </tt>
        implemented based on a
pre-release version of
        <tt class="docutils literal">
         pip
        </tt>
        1.5.

        All other proposed functional changes for Python 3.4 implemented,
including the installer updates to invoke
        <tt class="docutils literal">
         ensurepip
        </tt>
        .

      by November 20th (3 days prior to the scheduled date of 3.4.0 beta 1)

        <tt class="docutils literal">
         ensurepip
        </tt>
        updated to use a
        <tt class="docutils literal">
         pip
        </tt>
        1.5 release candidate.

         PEP 101

        updated to cover ensuring the bundled version of
        <tt class="docutils literal">
         pip
        </tt>
        is up
to date.

      by November 24th (scheduled date of 3.4.0 beta 1)

        As with any other new feature, all proposed functional changes for
Python 3.4 must be implemented prior to the beta feature freeze.

      by December 29th (1 week prior to the scheduled date of 3.4.0 beta 2)

        <tt class="docutils literal">
         requests
        </tt>
        certificate management issue resolved

        <tt class="docutils literal">
         ensurepip
        </tt>
        updated to the final release of
        <tt class="docutils literal">
         pip
        </tt>
        1.5, or a
subsequent maintenance release (including a suitably updated vendored
copy of
        <tt class="docutils literal">
         requests
        </tt>
        )

     (See

      PEP 429

     for the current official scheduled dates of each release. Dates
listed above are accurate as of October 20th, 2013.)

     If there is no final or maintenance release of
     <tt class="docutils literal">
      pip
     </tt>
     1.5 with a suitable
updated version of
     <tt class="docutils literal">
      requests
     </tt>
     available by one week before the scheduled
Python 3.4 beta 2 release, then implementation of this PEP will
be deferred to Python 3.5. Note that this scenario is considered unlikely -
the tentative date for the
     <tt class="docutils literal">
      pip
     </tt>
     1.5 release is currently December 1st.

     In future CPython releases, this kind of coordinated scheduling shouldn't be
needed: the CPython release manager will be able to just update to the latest
released version of
     <tt class="docutils literal">
      pip
     </tt>
     . However, in this case, some fixes are needed in
     <tt class="docutils literal">
      pip
     </tt>
     in order to allow the bundling to work correctly, and the
certificate update mechanism for
     <tt class="docutils literal">
      requests
     </tt>
     needs to be improved, so the
     <tt class="docutils literal">
      pip
     </tt>
     1.5 release cycle needs to be properly aligned with the CPython 3.4
beta releases.

      Proposed CLI

     The proposed CLI is based on a subset of the existing
     <tt class="docutils literal">
      pip install
     </tt>
     options:

Usage:
  python -m ensurepip [options]

General Options:
  -h, --help          Show help.
  -v, --verbose       Give more output. Option is additive, and can be used up to 3 times.
  -V, --version       Show the pip version that would be extracted and exit.
  -q, --quiet         Give less output.

Installation Options:
  -U, --upgrade       Upgrade pip and dependencies, even if already installed
  --user              Install using the user scheme.
  --root <dir>        Install everything relative to this alternate root directory.

     In most cases, end users won't need to use this CLI directly, as
     <tt class="docutils literal">
      pip
     </tt>
     should have been installed automatically when installing Python or when
creating a virtual environment. However, it is formally documented as a
public interface to support at least these known use cases:

      Windows and Mac OS X installations where the "Install pip" option was

       not

      chosen during installation

      any installation where the user previously ran "pip uninstall pip"

     Users that want to retrieve the latest version from PyPI, or otherwise
need more flexibility, can then invoke the extracted
     <tt class="docutils literal">
      pip
     </tt>
     appropriately.

      Proposed module API

     The proposed
     <tt class="docutils literal">
      ensurepip
     </tt>
     module API consists of the following two
functions:

def version():
    """
    Returns a string specifying the bundled version of pip.
    """

def bootstrap(root=None, upgrade=False, user=False, verbosity=0):
    """
    Bootstrap pip into the current Python installation (or the given root
    directory).
    """

      Invocation from the CPython installers

     The CPython Windows and Mac OS X installers will each gain a new option:

      Install pip (the default Python package management utility)?

     This option will be checked by default.

     If the option is checked, then the installer will invoke the following
command with the just installed Python:

python -m ensurepip --upgrade

     This ensures that, by default, installing or updating CPython will ensure
that the installed version of pip is at least as recent as the one included
with that version of CPython. If a newer version of pip has already been
installed then
     <tt class="docutils literal">
      python

       -m

      ensurepip

       --upgrade

     </tt>
     will simply return without
doing anything.

      Installing from source

     Just as the prebuilt binary installers will be updated to run
     <tt class="docutils literal">
      python

       -m

      ensurepip
     </tt>
     by default, a similar change will be made to the
     <tt class="docutils literal">
      make install
     </tt>
     and
     <tt class="docutils literal">
      make altinstall
     </tt>
     commands of the source
distribution. The directory settings in the
     <tt class="docutils literal">
      sysconfig
     </tt>
     module should
ensure the
     <tt class="docutils literal">
      pip
     </tt>
     components are automatically installed to the expected
locations.

     <tt class="docutils literal">
      ensurepip
     </tt>
     itself (including the private copy of
     <tt class="docutils literal">
      pip
     </tt>
     and its
dependencies) will always be installed normally (as it is a regular
part of the standard library), but an option will be provided to skip
the invocation of
     <tt class="docutils literal">
      ensurepip
     </tt>
     .

     This means that even installing from source will provide
     <tt class="docutils literal">
      pip
     </tt>
     by default,
but redistributors provide
     <tt class="docutils literal">
      pip
     </tt>
     by other means (or not providing it at
all) will still be able to opt out of installing it using
     <tt class="docutils literal">
      ensurepip
     </tt>
     .

      Changes to virtual environments

     Python 3.3 included a standard library approach to virtual Python environments
through the
     <tt class="docutils literal">
      venv
     </tt>
     module. Since its release it has become clear that very
few users have been willing to use this feature directly, in part due to the
lack of an installer present by default inside of the virtual environment.
They have instead opted to continue using the
     <tt class="docutils literal">
      virtualenv
     </tt>
     package which

      does

     include pip installed by default.

     To make the
     <tt class="docutils literal">
      venv
     </tt>
     more useful to users it will be modified to issue the
pip bootstrap by default inside of the new environment while creating it. This
will allow people the same convenience inside of the virtual environment as
this PEP provides outside of it as well as bringing the
     <tt class="docutils literal">
      venv
     </tt>
     module closer
to feature parity with the external
     <tt class="docutils literal">
      virtualenv
     </tt>
     package, making it a more
suitable replacement.

     To handle cases where a user does not wish to have pip bootstrapped into
their virtual environment a
     <tt class="docutils literal">

       --without-pip

     </tt>
     option will be
added.

     The
     <tt class="docutils literal">
      venv.EnvBuilder
     </tt>
     and
     <tt class="docutils literal">
      venv.create
     </tt>
     APIs will be updated to accept
one new parameter:
     <tt class="docutils literal">
      with_pip
     </tt>
     (defaulting to
     <tt class="docutils literal">
      False
     </tt>
     ).

     The new default for the module API is chosen for backwards compatibility
with the current behaviour (as it is assumed that most invocation of the
     <tt class="docutils literal">
      venv
     </tt>
     module happens through third part tools that likely will not
want
     <tt class="docutils literal">
      pip
     </tt>
     installed without explicitly requesting it), while the
default for the command line interface is chosen to try to ensure
     <tt class="docutils literal">
      pip
     </tt>
     is available in most virtual environments without additional action on the
part of the end user.

     As this change will only benefit Python 3.4 and later versions, the
third-party
     <tt class="docutils literal">
      virtualenv
     </tt>
     project will still be needed to obtain a
consistent cross-version experience in Python 3.3 and 2.7.

      Documentation

     The "Installing Python Modules" section of the standard library
documentation in Python 2.7, 3.3 and 3.4 will be updated to recommend
the use of the
     <tt class="docutils literal">
      pip
     </tt>
     installer, either provided by default in Python 3.4
or retrieved and installed by the user in Python 2.7 or 3.3. It will give
a brief description of the most common commands and options, but delegate
to the externally maintained
     <tt class="docutils literal">
      pip
     </tt>
     documentation for the full details.

     In Python 3.4, the
     <tt class="docutils literal">
      pyvenv
     </tt>
     and
     <tt class="docutils literal">
      venv
     </tt>
     documentation will also be
updated to reference the revised module installation guide.

     The existing content of the module installation guide will be retained in
all versions, but under a new "Invoking distutils directly" subsection.

      Bundling CA certificates with CPython

     The
     <tt class="docutils literal">
      ensurepip
     </tt>
     implementation will include the
     <tt class="docutils literal">
      pip
     </tt>
     CA bundle along
with the rest of
     <tt class="docutils literal">
      pip
     </tt>
     . This means CPython effectively includes
a CA bundle that is used solely by
     <tt class="docutils literal">
      pip
     </tt>
     after it has been extracted.

     This is considered preferable to relying solely on the system
certificate stores, as it ensures that
     <tt class="docutils literal">
      pip
     </tt>
     will behave the same
across all supported versions of Python, even those prior to Python 3.4
that cannot access the system certificate store on Windows.

      Automatic installation of setuptools

     <tt class="docutils literal">
      pip
     </tt>
     currently depends on
     <tt class="docutils literal">
      setuptools
     </tt>
     to handle metadata generation
during the build process, along with some other features. While work is
ongoing to reduce or eliminate this dependency, it is not clear if that
work will be complete for pip 1.5 (which is the version likely to be current
when Python 3.4.0 is released).

     This PEP proposes that, if pip still requires it as a dependency,
     <tt class="docutils literal">
      ensurepip
     </tt>
     will include a private copy of
     <tt class="docutils literal">
      setuptools
     </tt>
     (in addition
to the private copy of
     <tt class="docutils literal">
      ensurepip
     </tt>
     ).
     <tt class="docutils literal">
      python

       -m

      ensurepip
     </tt>
     will then
install the private copy in addition to installing
     <tt class="docutils literal">
      pip
     </tt>
     itself.

     However, this behavior is officially considered an implementation
detail. Other projects which explicitly require
     <tt class="docutils literal">
      setuptools
     </tt>
     must still
provide an appropriate dependency declaration, rather than assuming
     <tt class="docutils literal">
      setuptools
     </tt>
     will always be installed alongside
     <tt class="docutils literal">
      pip
     </tt>
     .

     Once pip is able to run
     <tt class="docutils literal">
      pip install

       --upgrade

      pip
     </tt>
     without needing
     <tt class="docutils literal">
      setuptools
     </tt>
     installed first, then the private copy of
     <tt class="docutils literal">
      setuptools
     </tt>
     will be removed from
     <tt class="docutils literal">
      ensurepip
     </tt>
     in subsequent CPython releases.

     As long as setuptools is needed, it will be a completely unmodified copy of
the latest upstream setuptools release, including the
     <tt class="docutils literal">
      easy_install
     </tt>
     script if the upstream setuptools continues to include it. The installation
of
     <tt class="docutils literal">
      easy_install
     </tt>
     along with
     <tt class="docutils literal">
      pip
     </tt>
     isn't considered desirable, but
installing a broken setuptools would be worse. This problem will
naturally resolve itself once the
     <tt class="docutils literal">
      pip
     </tt>
     developers have managed to
eliminate their dependency on
     <tt class="docutils literal">
      setuptools
     </tt>
     and the private copy of
     <tt class="docutils literal">
      setuptools
     </tt>
     can be removed entirely from CPython.

      Updating the private copy of pip

     In order to keep up with evolutions in packaging as well as providing users
with as recent version a possible the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module will be
regularly updated to the latest versions of everything it bootstraps.

     After each new
     <tt class="docutils literal">
      pip
     </tt>
     release, and again during the preparation for any
release of Python (including feature releases), a script, provided as part
of the implementation for this PEP, will be run to ensure the private
copies stored in the CPython source repository have been updated to the
latest versions.

      Updating the ensurepip module API and CLI

     Like
     <tt class="docutils literal">
      venv
     </tt>
     and
     <tt class="docutils literal">
      pyvenv
     </tt>
     , the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module API and CLI
will be governed by the normal rules for the standard library: no
new features are permitted in maintenance releases.

     However, the embedded components may be updated as noted above, so
the extracted
     <tt class="docutils literal">
      pip
     </tt>
     may offer additional functionality in maintenance
releases.

     Uninstallation

    No changes are proposed to the CPython uninstallation process by this PEP.
The bootstrapped pip will be installed the same way as any other pip
installed packages, and will be handled in the same way as any other
post-install additions to the Python environment.

    At least on Windows, that means the bootstrapped files will be
left behind after uninstallation, since those files won't be associated
with the Python MSI installer.

    While the case can be made for the CPython installers clearing out these
directories automatically, changing that behaviour is considered outside
the scope of this PEP.

     Script Execution on Windows

    While the Windows installer was updated in Python 3.3 to optionally
make
    <tt class="docutils literal">
     python
    </tt>
    available on the PATH, no such change was made to
include the script installation directory returned by
    <tt class="docutils literal">

      sysconfig.get_path("scripts")

    </tt>
    .

    Accordingly, in addition to adding the option to extract and install
    <tt class="docutils literal">
     pip
    </tt>
    during installation, this PEP proposes that the Windows installer in
Python 3.4 and later be updated to also add the path returned by
    <tt class="docutils literal">

      sysconfig.get_path("scripts")

    </tt>
    to the Windows PATH when the PATH
modification option is enabled during installation

    Note that this change will only be available in Python 3.4 and later.

    This means that, for Python 3.3, the most reliable way to invoke pip globally
on Windows (without tinkering manually with PATH) will still remain
    <tt class="docutils literal">
     py

      -m

     pip
    </tt>
    (or
    <tt class="docutils literal">
     py

      -3

      -m

     pip
    </tt>
    to select the Python 3 version if both
Python 2 and 3 are installed) rather than simply calling
    <tt class="docutils literal">
     pip
    </tt>
    . This
works because Python 3.3 provides the Python Launcher for
Windows (and the associated
    <tt class="docutils literal">
     py
    </tt>
    command) by default.

    For Python 2.7 and 3.2, the most reliable mechanism will be to install the
Python Launcher for Windows using the standalone installer and then use
    <tt class="docutils literal">
     py

      -m

     pip
    </tt>
    as noted above.

    Adding the scripts directory to the system PATH will mean that
    <tt class="docutils literal">
     pip
    </tt>
    works reliably in the "only one Python installation on the system PATH"
case, with
    <tt class="docutils literal">
     py

      -m

     pip
    </tt>
    ,
    <tt class="docutils literal">
     pipX
    </tt>
    , or
    <tt class="docutils literal">
     pipX.Y
    </tt>
    needed only to select a
non-default version in the parallel installation case (and outside a virtual
environment). This change should also make the
    <tt class="docutils literal">
     pyvenv
    </tt>
    command substantially
easier to invoke on Windows, along with all scripts installed by
    <tt class="docutils literal">
     pip
    </tt>
    ,
    <tt class="docutils literal">
     easy_install
    </tt>
    and similar tools.

    While the script invocations on recent versions of Python will run through
the Python launcher for Windows, this shouldn't cause any issues, as long
as the Python files in the Scripts directory correctly specify a Python version
in their shebang line or have an adjacent Windows executable (as
    <tt class="docutils literal">
     easy_install
    </tt>
    and
    <tt class="docutils literal">
     pip
    </tt>
    do).

     Recommendations for Downstream Distributors

    A common source of Python installations are through downstream distributors
such as the various Linux Distributions

     [8]

     [9]

     [10]

    , OSX
package managers

     [11]

     [12]

     [13]

    , and commercial Python
redistributors

     [14]

     [15]

     [16]

    . In order to
provide a consistent, user-friendly experience to all users of Python
regardless of how they obtained Python this PEP recommends and asks that
downstream distributors:

     Ensure that whenever Python is installed
     <tt class="docutils literal">
      pip
     </tt>
     is either installed or is
otherwise made readily available to end users.

       For redistributors using binary installers, this may take the form of
optionally executing the
       <tt class="docutils literal">
        ensurepip
       </tt>
       bootstrap during installation,
similar to the CPython installers.

       For redistributors using package management systems, it may take the
form of separate packages with dependencies on each other so that
installing the Python package installs the pip package and installing
the pip package installs the Python package.

       Another reasonable way to implement this is to package pip separately but
ensure that there is some sort of global hook that will recommend
installing the separate pip package when a user executes
       <tt class="docutils literal">
        pip
       </tt>
       without
it being installed. Systems that choose this option should ensure that
the
       <tt class="docutils literal">
        ensurepip
       </tt>
       module still installs pip directly when invoked inside
a virtual environment, but may modify the module in the system Python
installation to redirect to the platform provided mechanism when
installing
       <tt class="docutils literal">
        pip
       </tt>
       globally.

     Even if pip is made available globally by other means, do not remove the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module in Python 3.4 or later.

       <tt class="docutils literal">
        ensurepip
       </tt>
       will be required for automatic installation of pip into
virtual environments by the
       <tt class="docutils literal">
        venv
       </tt>
       module.

       This is similar to the existing
       <tt class="docutils literal">
        virtualenv
       </tt>
       package for which many
downstream distributors have already made exception to the common
"debundling" policy.

       This does mean that if
       <tt class="docutils literal">
        pip
       </tt>
       needs to be updated due to a security
issue, so does the private copy in the
       <tt class="docutils literal">
        ensurepip
       </tt>
       bootstrap module

       However, altering the private copy of pip to remove the embedded
CA certificate bundle and rely on the system CA bundle instead is a
reasonable change.

     Ensure that all features of this PEP continue to work with any modifications
made to the redistributed version of Python.

       Checking the version of pip that will be bootstrapped using
       <tt class="docutils literal">
        python

         -m

        ensurepip

         --version

       </tt>
       or
       <tt class="docutils literal">
        ensurepip.version()
       </tt>
       .

       Installation of pip into a global or virtual python environment using
       <tt class="docutils literal">
        python

         -m

        ensurepip
       </tt>
       or
       <tt class="docutils literal">
        ensurepip.bootstrap()
       </tt>
       .

       <tt class="docutils literal">
        pip install

         --upgrade

        pip
       </tt>
       in a global installation should not affect
any already created virtual environments (but is permitted to affect
future virtual environments, even though it will not do so when using
the standard implementation of
       <tt class="docutils literal">
        ensurepip
       </tt>
       ).

       <tt class="docutils literal">
        pip install

         --upgrade

        pip
       </tt>
       in a virtual environment should not affect
the global installation.

     Migrate build systems to utilize

      pip

      [18]

     and

      Wheel

      [17]

     wherever feasible
and avoid directly invoking
     <tt class="docutils literal">
      setup.py
     </tt>
     .

       This will help ensure a smoother and more timely migration to improved
metadata formats as the Python packaging ecosystem continues to evolve.

    In the event that a Python redistributor chooses

     not

    to follow these
recommendations, we request that they explicitly document this fact and
provide their users with suitable guidance on translating upstream
    <tt class="docutils literal">
     pip
    </tt>
    based installation instructions into something appropriate for the platform.

    Other Python implementations are also encouraged to follow these guidelines
where applicable.

     Policies & Governance

    The maintainers of the bootstrapped software and the CPython core team will
work together in order to address the needs of both. The bootstrapped
software will still remain external to CPython and this PEP does not
include CPython subsuming the development responsibilities or design
decisions of the bootstrapped software. This PEP aims to decrease the
burden on end users wanting to use third-party packages and the
decisions inside it are pragmatic ones that represent the trust that the
Python community has already placed in the Python Packaging Authority as
the authors and maintainers of
    <tt class="docutils literal">
     pip
    </tt>
    ,
    <tt class="docutils literal">
     setuptools
    </tt>
    , PyPI,
    <tt class="docutils literal">
     virtualenv
    </tt>
    and other related projects.

      Backwards Compatibility

     The public API and CLI of the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module itself will fall under
the typical backwards compatibility policy of Python for its standard
library. The externally developed software that this PEP bundles does not.

     Most importantly, this means that the bootstrapped version of pip may gain
new features in CPython maintenance releases, and pip continues to operate on
its own 6 month release cycle rather than CPython's 18-24 month cycle.

      Security Releases

     Any security update that affects the
     <tt class="docutils literal">
      ensurepip
     </tt>
     module will be shared
prior to release with the Python Security Response Team
(

      security@python.org

     ). The PSRT will then decide if the reported issue
warrants a security release of CPython with an updated private copy of
     <tt class="docutils literal">
      pip
     </tt>
     .

      Licensing

     <tt class="docutils literal">
      pip
     </tt>
     is currently licensed as 1 Clause BSD, and it contains code taken
from other projects. Additionally this PEP will include setuptools until
such time as pip no longer requires it. The licenses for these appear in
the table below.

     <colgroup>
      <col width="59%">
      </col>
      <col width="41%">
      </col>
     </colgroup>

        Project

        License

        requests

        Apache 2.0

        six

        1 Clause BSD

        html5lib

        1 Clause BSD

        distlib

        PSF

        colorama

        3 Clause BSD

        Mozilla CA Bundle

        LGPL

        setuptools

        PSF

     All of these licenses should be compatible with the PSF license. Additionally
it is unclear if a CA Bundle is copyrightable material and thus if it needs
or can be licensed at all.

     Appendix: Rejected Proposals

      Changing the name of the scripts directory on Windows

     Earlier versions of this PEP proposed changing the name of the script
installation directory on Windows from "Scripts" to "bin" in order to
improve the cross-platform consistency of the virtual environments created
by
     <tt class="docutils literal">
      pyvenv
     </tt>
     .

     However, Paul Moore determined that this change was likely backwards
incompatible with cross-version Windows installers created with previous
versions of Python, so the change has been removed from this PEP

      [7]

     .

      Including ensurepip in Python 2.7, and 3.3

     Earlier versions of this PEP made the case that the challenges of getting
     <tt class="docutils literal">
      pip
     </tt>
     bootstrapped for new users posed a significant enough barrier to
Python's future growth that it justified adding
     <tt class="docutils literal">
      ensurepip
     </tt>
     as a new
feature in the upcoming Python 2.7 and 3.3 maintenance releases.

     While the proposal to provide
     <tt class="docutils literal">
      pip
     </tt>
     with Python 3.4 was universally
popular, this part of the proposal was highly controversial and ultimately

      rejected by MvL as BDFL-Delegate

     .

     Accordingly, the proposal to backport
     <tt class="docutils literal">
      ensurepip
     </tt>
     to Python 2.7 and 3.3
has been removed from this PEP in favour of creating a Windows installer
for
     <tt class="docutils literal">
      pip
     </tt>
     and a possible future PEP suggesting creation of an aggregate
installer for Python 2.7 that combines CPython 2.7,
     <tt class="docutils literal">
      pip
     </tt>
     and the Python
Launcher for Windows.

      Automatically contacting PyPI when bootstrapping pip

     Earlier versions of this PEP called the bootstrapping module
     <tt class="docutils literal">
      getpip
     </tt>
     and
defaulted to downloading and installing
     <tt class="docutils literal">
      pip
     </tt>
     from PyPI, with the private
copy used only as a fallback option or when explicitly requested.

     This resulted in several complex edge cases, along with difficulties in
defining a clean API and CLI for the bootstrap module. It also significantly
altered the default trust model for the binary installers published on
python.org, as end users would need to explicitly

      opt-out

     of trusting
the security of the PyPI ecosystem (rather than opting in to it by
explicitly invoking
     <tt class="docutils literal">
      pip
     </tt>
     following installation).

     As a result, the PEP was simplified to the current design, where the
bootstrapping

      always

     uses the private copy of
     <tt class="docutils literal">
      pip
     </tt>
     . Contacting PyPI
is now always an explicit separate step, with direct access to the full
pip interface.

     Removing the implicit attempt to access PyPI also made it feasible to
invoke
     <tt class="docutils literal">
      ensurepip
     </tt>
     by default when installing from a custom source build.

      Implicit bootstrap

      PEP439

      [19]

     , the predecessor for this PEP, proposes its own solution. Its
solution involves shipping a fake
     <tt class="docutils literal">
      pip
     </tt>
     command that when executed would
implicitly bootstrap and install pip if it does not already exist. This has
been rejected because it is too "magical". It hides from the end user when
exactly the pip command will be installed or that it is being installed at
all. It also does not provide any recommendations or considerations towards
downstream packagers who wish to manage the globally installed pip through
the mechanisms typical for their system.

     The implicit bootstrap mechanism also ran into possible permissions issues,
if a user inadvertently attempted to bootstrap pip without write access to
the appropriate installation directories.

      Including pip directly in the standard library

     Similar to this PEP is the proposal of just including pip in the standard
library. This would ensure that Python always includes pip and fixes all of the
end user facing problems with not having pip present by default. This has been
rejected because we've learned, through the inclusion and history of
     <tt class="docutils literal">
      distutils
     </tt>
     in the standard library, that losing the ability to update the
packaging tools independently can leave the tooling in a state of constant
limbo. Making it unable to ever reasonably evolve in a time frame that actually
affects users as any new features will not be available to the general
population for

      years

     .

     Allowing the packaging tools to progress separately from the Python release
and adoption schedules allows the improvements to be used by

      all

     members
of the Python community and not just those able to live on the bleeding edge
of Python releases.

     There have also been issues in the past with the "dual maintenance" problem
if a project continues to be maintained externally while

      also

     having a
fork maintained in the standard library. Since external maintenance of
     <tt class="docutils literal">
      pip
     </tt>
     will always be needed to support earlier Python versions, the
proposed bootstrapping mechanism will becoming the explicit responsibility
of the CPython core developers (assisted by the pip developers), while
pip issues reported to the CPython tracker will be migrated to the pip
issue tracker. There will no doubt still be some user confusion over which
tracker to use, but hopefully less than has been seen historically when
including complete public copies of third-party projects in the standard
library.

     The approach described in this PEP also avoids some technical issues
related to handling CPython maintenance updates when pip has been
independently updated to a more recent version. The proposed pip-based
bootstrapping mechanism handles that automatically, since pip and the
system installer never get into a fight about who owns the pip
installation (it is always managed through pip, either directly, or
indirectly via the
     <tt class="docutils literal">
      ensurepip
     </tt>
     bootstrap module).

     Finally, the separate bootstrapping step means it is also easy to avoid
installing
     <tt class="docutils literal">
      pip
     </tt>
     at all if end users so desire. This is often the case
if integrators are using system packages to handle installation of
components written in multiple languages using a common set of tools.

      Defaulting to --user installation

     Some consideration was given to bootstrapping pip into the per-user
site-packages directory by default. However, this behavior would be
surprising (as it differs from the default behavior of pip itself)
and is also not currently considered reliable (there are some edge cases
which are not handled correctly when pip is installed into the user
site-packages directory rather than the system site-packages).

     References

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

       [1]

       Discussion thread 1 (distutils-sig)
(

        https://mail.python.org/pipermail/distutils-sig/2013-August/022529.html

       )

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

       [2]

       Discussion thread 2 (distutils-sig)
(

        https://mail.python.org/pipermail/distutils-sig/2013-September/022702.html

       )

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

       [3]

       Discussion thread 3 (python-dev)
(

        https://mail.python.org/pipermail/python-dev/2013-September/128723.html

       )

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

       [4]

       Discussion thread 4 (python-dev)
(

        https://mail.python.org/pipermail/python-dev/2013-September/128780.html

       )

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

       [5]

       Discussion thread 5 (python-dev)
(

        https://mail.python.org/pipermail/python-dev/2013-September/128894.html

       )

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [6]

       pip/requests certificate management concerns
(

        https://mail.python.org/pipermail/python-dev/2013-October/129755.html

       )

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [7]

       Windows installer compatibility concerns
(

        https://mail.python.org/pipermail/distutils-sig/2013-October/022855.html

       )

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [8]

        Ubuntu <http://www.ubuntu.com/>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [9]

        Debian <http://www.debian.org>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [10]

        Fedora <https://fedoraproject.org/>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [11]

        Homebrew <http://brew.sh/>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [12]

        MacPorts <http://macports.org>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [13]

        Fink <http://finkproject.org>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [14]

        Anaconda <https://store.continuum.io/cshop/anaconda/>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [15]

        ActivePython <http://www.activestate.com/activepython>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [16]

        Enthought Canopy <https://www.enthought.com/products/canopy/>

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

       [17]

        (

         1

        ,

         2

        )

        http://www.python.org/dev/peps/pep-0427/

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

       [18]

        (

         1

        ,

         2

        )

        http://www.pip-installer.org

    <colgroup>
     <col class="label">
     </col>
     <col>
     </col>
    </colgroup>

        [19]

        http://www.python.org/dev/peps/pep-0439/

     Copyright

    This document has been placed in the public domain.

Source: https://hg.python.org/peps/file/tip/pep-0453.txt

        Tweets by @ThePSF

The PSF

The Python Software Foundation is the organization behind Python. Become a member of the PSF and help advance the software and our mission.

                    ▲ Back to Top

        About

Applications

Quotes

Getting Started

Help

        Downloads

All releases

Source code

Windows

Mac OS X

Other Platforms

License

Alternative Implementations

        Documentation

Docs

Audio/Visual Talks

Beginner's Guide

Developer's Guide

FAQ

Non-English Docs

PEP Index

Python Books

        Community

Diversity

IRC

Mailing Lists

Python Conferences

Special Interest Groups

Python Wiki

Python Logo

Merchandise

Community Awards

        Success Stories

Arts

Business

Education

Engineering

Government

Scientific

Software Development

        News

Python News

Community News

PSF News

PyCon News

        Events

Python Events

User Group Events

Python Events Archive

User Group Events Archive

Submit an Event

        Contributing

Developer's Guide

Issue Tracker

python-dev list

Core Mentorship

                    ▲ Back to Top

Help & General Contact

Diversity Initiatives

Submit Website Bug

                            Copyright ©2001-2015.
                             Python Software Foundation
                             Legal Statements
                             Privacy Policy


text:
Medaille erstellen

<form action="?p=admin&s=new-medal&token=<?= $token ?>" method="post" enctype="multipart/form-data">

Name:

			<input type="text" name="name" value="<?= $name ?>" />

Beschreibung:

			<input type="text" name="description" value="<?= $description ?>" />

Kategorie:

					<select name="category">
						<?php foreach ($categories as $category): ?>
							<option
									value="<?= $category['id'] ?>" <?= ($categoryId === $category['id']) ?
								'selected="selected"' : '' ?>><?= $category['name'] ?></option>
						<?php endforeach; ?>
					</select>

Verleihung:

					<select name="award-condition">
						<?php foreach ($awardConditions as $name => $caption): ?>
							<option
									value="<?= $name ?>" <?= ($awardCondition === $name) ? 'selected="selected"' :
								'' ?>><?= $caption ?></option>
						<?php endforeach; ?>
					</select>

Wert:

Der Wert, ab dem die Medaille verliehen wird — nur nötig, wenn die Verleihung nicht manuell
					erfolgt.

Die Registrierungszeit in Sekunden angeben!

				<input type="number" name="value" value="<?= $value ?>" />

Bild:

Das Bild, das für diese Medaille verwendet werden soll. Wenn du ein neues Bild hochlädst, wird ein
					Bild mit demselben Dateinamen gegebenenfalls überschrieben.

					<select name="image-filename">
						<?php foreach ($imageFilenames as $filename): ?>
							<option
									value="<?= $filename ?>" <?= ($filename === $imageFilename) ?
								'selected="selected"' : '' ?>><?= $filename ?></option>
						<?php endforeach; ?>
					</select>

					<input class="custom-checkbox" type="checkbox" name="upload-image" id="upload-image" />
					 neues Bild hochladen

					<input type="file" class="file-input" name="medal-image" />

Geheim:

Geheime Medaillen werden nur den Nutzern angezeigt, die sie bereits haben.

						<input class="custom-checkbox" type="checkbox" name="secret" id="secret" <?= $secret ?
							'checked="checked"' : '' ?> />
						 geheim

	<button class="primary" type="submit" name="submit">Medaille erstellen</button>
</form>

redpajama_set_name: RedPajamaGithub


text:
ACCEPTED

#### According to
Index Fungorum

#### Published in
null

#### Original name
Micropeltis dissociabilis var. garciniae Bat. & J.L. Bezerra

### Remarks
null


text:
package com.ajah.user.achievement.data;

import java.util.List;

import com.ajah.spring.jdbc.AjahDao;
import com.ajah.spring.jdbc.err.DataOperationException;
import com.ajah.user.achievement.AchievementId;
import com.ajah.user.achievement.AchievementTag;
import com.ajah.user.achievement.AchievementTagId;
import com.ajah.user.achievement.AchievementTagStatus;
import com.ajah.user.achievement.AchievementTagType;

/**
 * DAO interface for {@link AchievementTag}.
 *
 * @author Eric F. Savage <code@efsavage.com>
 *
 */
public interface AchievementTagDao extends AjahDao<AchievementTagId, AchievementTag> {

	/**
	 * Returns a list of {@link AchievementTag}s that match the specified
	 * criteria.
	 *
	 * @param type
	 *            The type of achievementTag, optional.
	 * @param status
	 *            The status of the achievementTag, optional.
	 * @param page
	 *            The page of results to fetch.
	 * @param count
	 *            The number of results per page.
	 * @return A list of {@link AchievementTag}s, which may be empty.
	 * @throws DataOperationException
	 *             If the query could not be executed.
	 */
	List<AchievementTag> list(final AchievementTagType type, final AchievementTagStatus status, final long page, final long count) throws DataOperationException;

	/**
	 * Counts the records available that match the criteria.
	 *
	 * @param type
	 *            The achievementTag type to limit to, optional.
	 * @param status
	 *            The status to limit to, optional.
	 * @return The number of matching records.
	 * @throws DataOperationException
	 *             If the query could not be executed.
	 */
	long count(final AchievementTagType type, final AchievementTagStatus status) throws DataOperationException;

	/**
	 * Lists the tags matching an achievement.
	 *
	 * @param achievementId
	 *            The ID of the achievement to match.
	 * @return The list of tags, which may be empty.
	 * @throws DataOperationException
	 *             If the query could not be executed.
	 */
	List<AchievementTag> list(AchievementId achievementId) throws DataOperationException;

}


text:
package org.apache.beam.runners.flink.translation.wrappers;

import static com.google.common.base.Preconditions.checkState;

import org.apache.beam.sdk.util.WindowedValue;
import org.apache.flink.api.common.io.DefaultInputSplitAssigner;
import org.apache.flink.api.common.io.RichInputFormat;
import org.apache.flink.api.common.io.statistics.BaseStatistics;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.core.io.GenericInputSplit;
import org.apache.flink.core.io.InputSplitAssigner;

/** Flink input format that implements impulses. */
public class ImpulseInputFormat extends RichInputFormat<WindowedValue<byte[]>, GenericInputSplit> {

  // Whether the input format has remaining output that has not yet been read.
  private boolean availableOutput = false;

  public ImpulseInputFormat() {}

  @Override
  public void configure(Configuration configuration) {
    // Do nothing.
  }

  @Override
  public BaseStatistics getStatistics(BaseStatistics baseStatistics) {
    return new BaseStatistics() {
      @Override
      public long getTotalInputSize() {
        return 1;
      }

      @Override
      public long getNumberOfRecords() {
        return 1;
      }

      @Override
      public float getAverageRecordWidth() {
        return 1;
      }
    };
  }

  @Override
  public GenericInputSplit[] createInputSplits(int numSplits) {
    // Always return a single split because only one global "impulse" will ever be sent.
    return new GenericInputSplit[]{new GenericInputSplit(1, 1)};
  }

  @Override
  public InputSplitAssigner getInputSplitAssigner(GenericInputSplit[] genericInputSplits) {
    return new DefaultInputSplitAssigner(genericInputSplits);
  }

  @Override
  public void open(GenericInputSplit genericInputSplit) {
    availableOutput = true;
  }

  @Override
  public boolean reachedEnd() {
    return !availableOutput;
  }

  @Override
  public WindowedValue<byte[]> nextRecord(WindowedValue<byte[]> windowedValue) {
    checkState(availableOutput);
    availableOutput = false;
    if (windowedValue != null) {
      return windowedValue;
    }
    return WindowedValue.valueInGlobalWindow(new byte[0]);
  }

  @Override
  public void close() {
    // Do nothing.
  }

}


text:
package com.example.administrator.yicheng.main.minef.login.register;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.design.widget.Snackbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.administrator.yicheng.R;
import com.example.administrator.yicheng.base.BaseActivity;
import com.example.administrator.yicheng.bean.RegisterPeople;
import com.example.administrator.yicheng.utils.LiteOrmUtils;
import com.example.administrator.yicheng.utils.SharedPreferenceUtils;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cn.bmob.sms.BmobSMS;
import cn.bmob.sms.exception.BmobException;
import cn.bmob.sms.listener.RequestSMSCodeListener;
import cn.bmob.sms.listener.VerifySMSCodeListener;

/**
 * Created by Administrator on 2016/8/2.
 */
public class RegisterActivity extends BaseActivity {
    @BindView(R.id.Register_et_PhoneNum)
    EditText RegisterEtPhoneNum;
    @BindView(R.id.Register_button_GetVerifycode)
    Button RegisterButtonGetVerifycode;
    @BindView(R.id.Register_et_secretCode)
    EditText RegisterEtSecretCode;
    @BindView(R.id.register_image_Lock)
    ImageView registerImageLock;
    @BindView(R.id.Register_et_InputVerifyCode)
    EditText RegisterEtInputVerifyCode;

    private static final String MODE_NAME="message";
    private Boolean LockImageFlag= true;
    private String phoneNum;

    private Handler mHandler= new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    Integer m= (Integer) msg.obj;
                    String i=String.valueOf(m);
                    if(!TextUtils.isEmpty(i)){
                        if(i.equals("1")){
                            RegisterButtonGetVerifycode.setText("重新获取");
                        }else {
                            if(i!=null) {
                                RegisterButtonGetVerifycode.setText(String.valueOf(i) + "S");
                            }
                        }
                    }

                    break;
            }
        }
    };

    @Override
    public int getLayoutId() {
        return R.layout.activity_register;
    }

    @Override
    public void initView() {
        BmobSMS.initialize(this,"ac66f212be27a6f0d9135f158f0d7533");
    }

    @Override
    public void initData() {

    }

    @OnClick({R.id.Register_toolBarIcon, R.id.Register_button_GetVerifycode,
            R.id.register_image_Lock, R.id.Register_button_ToRegister, R.id.Register_tv_userNeedKnow})
    public void onClick(final View view) {
        switch (view.getId()) {
            case R.id.Register_toolBarIcon:
                finish();
                overridePendingTransition(R.anim.in_from_left, R.anim.out_to_right);
                break;

            case R.id.Register_button_GetVerifycode:
                String phone = RegisterEtPhoneNum.getText().toString().trim();
                if (!phone.matches("[1][358]\\d{9}")) {
                    Toast.makeText(RegisterActivity.this, "请输入正确的手机号", Toast.LENGTH_SHORT).show();
                } else {
                    if (phoneIsInstance(phone)) {
                        Toast.makeText(RegisterActivity.this, "已注册,请直接登录", Toast.LENGTH_SHORT).show();
                        finish();
                        overridePendingTransition(R.anim.in_from_left, R.anim.out_to_right);
                    }
                else{
                BmobSMS.requestSMSCode(RegisterActivity.this, phone, MODE_NAME, new RequestSMSCodeListener() {
                    @Override
                    public void done(Integer smsId, BmobException ex) {
                        if (ex == null) {//验证码发送成功
                            Log.i("bmob", "短信id:" + smsId);//用于查询本次短信发送详情
                        }
                    }
                });
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int i = 60; i > 0; i--) {
                            try {
                                Thread.sleep(1000);
                                Message message = mHandler.obtainMessage(1, i);
                                mHandler.sendMessage(message);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
         }
                break;

            //点击设置密码是否可见
            case R.id.register_image_Lock:
                LockImageFlag=!LockImageFlag;
                if(LockImageFlag){
                    registerImageLock.setImageResource(R.drawable.register_icon_unview);
                    RegisterEtSecretCode.setTransformationMethod(PasswordTransformationMethod.getInstance());
                }else{
                    registerImageLock.setImageResource(R.drawable.register_icon_view);
                    RegisterEtSecretCode.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
                break;

            case R.id.Register_button_ToRegister:
                phoneNum = RegisterEtPhoneNum.getText().toString().trim();
              final String secretCode = RegisterEtSecretCode.getText().toString().trim();
               String  verifyCode = RegisterEtInputVerifyCode.getText().toString().trim();
                if(TextUtils.isEmpty(phoneNum)||TextUtils.isEmpty(secretCode)||TextUtils.isEmpty(verifyCode)){
                    showSnackBar(view,"以上信息不能为空!");
                }else {
                    if(phoneIsInstance(phoneNum)){//判断是否已经注册过了
                        Toast.makeText(RegisterActivity.this, "已注册,请直接登录", Toast.LENGTH_SHORT).show();
                        finish();
                        overridePendingTransition(R.anim.in_from_left,R.anim.out_to_right);
                    }else {
                        Log.i("bmob", "RegisterActivity.toRegister."+ phoneNum +secretCode+verifyCode);
                        BmobSMS.verifySmsCode(RegisterActivity.this, phoneNum, verifyCode, new VerifySMSCodeListener() {
                            @Override
                            public void done(BmobException ex) {
                                Log.i("bmob", "K开始验证");

                                if(ex==null){//短信验证码已验证成功
                                    Log.i("bmob", "验证通过");
                                    if(phoneNum !=null &&secretCode!=null){
                                        RegisterPeople people = new RegisterPeople();
                                        people.setNumber(phoneNum);
                                        people.setPassword(secretCode);
                                        String userName = getUserName(phoneNum).toString();
                                        people.setUserName(userName);
                                        LiteOrmUtils.save(people);//验证成功后,向数据库添加数据
                                        Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                                        finish();
                                        overridePendingTransition(R.anim.in_from_left,R.anim.out_to_right);
                                    }
                                    else{
                                        showSnackBar(view,"以上信息不能为空!");
                                    }
                                }else{//验证码错误
                                    showSnackBar(view,"验证码错误!");
                                }
                            }
                        });
                    }
                }

                break;
            case R.id.Register_tv_userNeedKnow://用户协议
                //TODO
                break;
        }
    }

    private boolean phoneIsInstance(String phoneNum) {//判断是否注册过了
        List<RegisterPeople> numbers = LiteOrmUtils.getQueryByWhere(RegisterPeople.class, "number", new String[]{phoneNum});
        if(numbers.size()==0){
            return false;
        }else {
            return true;
        }
    }

    private void showSnackBar(View view,String msg) {
        Snackbar snackbar = Snackbar.make(view, msg, Snackbar.LENGTH_SHORT);
        View view1 = snackbar.getView();    //获得弹出视图对象
        view1.setBackgroundColor(getResources().getColor(R.color.google_yellow));//设置该视图的背景
        snackbar.setActionTextColor(Color.RED).show();//文字颜色

    }

    private StringBuffer getUserName(String number) {//自动生成用户名
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(number.substring(0,3));
        stringBuffer.append("****");
        stringBuffer.append(number.substring(7,11));
        return stringBuffer;
    }
}


text:
require 'youtube/error'

module Youtube
  class Error
    # Raised when Youtube returns a 5xx HTTP status code
    class ServerError < Youtube::Error
      MESSAGE = "Server Error"

      # Create a new error from an HTTP environment
      #
      # @param response [Hash]
      # @return [Youtube::Error]
      def self.from_response(response={})
        new(response[:body].to_s, response[:response_headers])
      end

      # Initializes a new ServerError object
      #
      # @param message [String]
      # @param response_headers [Hash]
      # @return [Youtube::Error::ServerError]
      def initialize(message=nil, response_headers={})
        super((message || self.class.const_get(:MESSAGE)), response_headers)
      end

    end
  end
end


text:
<!DOCTYPE html>

    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    <link rel="stylesheet" type="text/css" href="/css/normalize.css">
    <link rel="stylesheet" type="text/css" href="/css/base.css">
    <link rel="stylesheet" type="text/css" href="/css/grid.css">
    <link rel="stylesheet" type="text/css" href="/css/forms.css">
    <link rel="stylesheet" type="text/css" href="/css/table.css">
    <link rel="stylesheet" type="text/css" href="/css/nav.css">
    <link rel="stylesheet" type="text/css" href="/css/panel.css">
    <link rel="stylesheet" type="text/css" href="/css/simple-sidebar.css">
    <link rel="stylesheet" type="text/css" href="/css/app.css">

    <title>JSbench - test your JavaScript code snippets</title>

JS Benchv2.5.0

Loading ...

Loading ...

Made by Bogdan Anton and Serban Ghita. Based on BenchmarkJS.


text:
import { css } from 'glamor';
import { themeConfig } from '@shopgate/pwa-common/helpers/config';

const { colors } = themeConfig;

const iconCircleEnabled = css({
  fill: colors.primary,
}).toString();

const iconArrowEnabled = css({
  fill: colors.light,
}).toString();

const iconCircleDisabled = css({
  fill: colors.shade7,
}).toString();

const iconArrowDisabled = css({
  fill: colors.shade4,
}).toString();

export default {
  iconCircleEnabled,
  iconArrowEnabled,
  iconCircleDisabled,
  iconArrowDisabled,
};