| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952 |
- =============================================================
- Package Discovery and Resource Access using ``pkg_resources``
- =============================================================
- The ``pkg_resources`` module distributed with ``setuptools`` provides an API
- for Python libraries to access their resource files, and for extensible
- applications and frameworks to automatically discover plugins. It also
- provides runtime support for using C extensions that are inside zipfile-format
- eggs, support for merging packages that have separately-distributed modules or
- subpackages, and APIs for managing Python's current "working set" of active
- packages.
- .. contents:: **Table of Contents**
- --------
- Overview
- --------
- The ``pkg_resources`` module provides runtime facilities for finding,
- introspecting, activating and using installed Python distributions. Some
- of the more advanced features (notably the support for parallel installation
- of multiple versions) rely specifically on the "egg" format (either as a
- zip archive or subdirectory), while others (such as plugin discovery) will
- work correctly so long as "egg-info" metadata directories are available for
- relevant distributions.
- Eggs are a distribution format for Python modules, similar in concept to
- Java's "jars" or Ruby's "gems", or the "wheel" format defined in PEP 427.
- However, unlike a pure distribution format, eggs can also be installed and
- added directly to ``sys.path`` as an import location. When installed in
- this way, eggs are *discoverable*, meaning that they carry metadata that
- unambiguously identifies their contents and dependencies. This means that
- an installed egg can be *automatically* found and added to ``sys.path`` in
- response to simple requests of the form, "get me everything I need to use
- docutils' PDF support". This feature allows mutually conflicting versions of
- a distribution to co-exist in the same Python installation, with individual
- applications activating the desired version at runtime by manipulating the
- contents of ``sys.path`` (this differs from the virtual environment
- approach, which involves creating isolated environments for each
- application).
- The following terms are needed in order to explain the capabilities offered
- by this module:
- project
- A library, framework, script, plugin, application, or collection of data
- or other resources, or some combination thereof. Projects are assumed to
- have "relatively unique" names, e.g. names registered with PyPI.
- release
- A snapshot of a project at a particular point in time, denoted by a version
- identifier.
- distribution
- A file or files that represent a particular release.
- importable distribution
- A file or directory that, if placed on ``sys.path``, allows Python to
- import any modules contained within it.
- pluggable distribution
- An importable distribution whose filename unambiguously identifies its
- release (i.e. project and version), and whose contents unambiguously
- specify what releases of other projects will satisfy its runtime
- requirements.
- extra
- An "extra" is an optional feature of a release, that may impose additional
- runtime requirements. For example, if docutils PDF support required a
- PDF support library to be present, docutils could define its PDF support as
- an "extra", and list what other project releases need to be available in
- order to provide it.
- environment
- A collection of distributions potentially available for importing, but not
- necessarily active. More than one distribution (i.e. release version) for
- a given project may be present in an environment.
- working set
- A collection of distributions actually available for importing, as on
- ``sys.path``. At most one distribution (release version) of a given
- project may be present in a working set, as otherwise there would be
- ambiguity as to what to import.
- eggs
- Eggs are pluggable distributions in one of the three formats currently
- supported by ``pkg_resources``. There are built eggs, development eggs,
- and egg links. Built eggs are directories or zipfiles whose name ends
- with ``.egg`` and follows the egg naming conventions, and contain an
- ``EGG-INFO`` subdirectory (zipped or otherwise). Development eggs are
- normal directories of Python code with one or more ``ProjectName.egg-info``
- subdirectories. The development egg format is also used to provide a
- default version of a distribution that is available to software that
- doesn't use ``pkg_resources`` to request specific versions. Egg links
- are ``*.egg-link`` files that contain the name of a built or
- development egg, to support symbolic linking on platforms that do not
- have native symbolic links (or where the symbolic link support is
- limited).
- (For more information about these terms and concepts, see also this
- `architectural overview`_ of ``pkg_resources`` and Python Eggs in general.)
- .. _architectural overview: http://mail.python.org/pipermail/distutils-sig/2005-June/004652.html
- .. -----------------
- .. Developer's Guide
- .. -----------------
- .. This section isn't written yet. Currently planned topics include
- Accessing Resources
- Finding and Activating Package Distributions
- get_provider()
- require()
- WorkingSet
- iter_distributions
- Running Scripts
- Configuration
- Namespace Packages
- Extensible Applications and Frameworks
- Locating entry points
- Activation listeners
- Metadata access
- Extended Discovery and Installation
- Supporting Custom PEP 302 Implementations
- .. For now, please check out the extensive `API Reference`_ below.
- -------------
- API Reference
- -------------
- Namespace Package Support
- =========================
- A namespace package is a package that only contains other packages and modules,
- with no direct contents of its own. Such packages can be split across
- multiple, separately-packaged distributions. They are normally used to split
- up large packages produced by a single organization, such as in the ``zope``
- namespace package for Zope Corporation packages, and the ``peak`` namespace
- package for the Python Enterprise Application Kit.
- To create a namespace package, you list it in the ``namespace_packages``
- argument to ``setup()``, in your project's ``setup.py``. (See the `setuptools
- documentation on namespace packages`_ for more information on this.) Also,
- you must add a ``declare_namespace()`` call in the package's ``__init__.py``
- file(s):
- ``declare_namespace(name)``
- Declare that the dotted package name `name` is a "namespace package" whose
- contained packages and modules may be spread across multiple distributions.
- The named package's ``__path__`` will be extended to include the
- corresponding package in all distributions on ``sys.path`` that contain a
- package of that name. (More precisely, if an importer's
- ``find_module(name)`` returns a loader, then it will also be searched for
- the package's contents.) Whenever a Distribution's ``activate()`` method
- is invoked, it checks for the presence of namespace packages and updates
- their ``__path__`` contents accordingly.
- Applications that manipulate namespace packages or directly alter ``sys.path``
- at runtime may also need to use this API function:
- ``fixup_namespace_packages(path_item)``
- Declare that `path_item` is a newly added item on ``sys.path`` that may
- need to be used to update existing namespace packages. Ordinarily, this is
- called for you when an egg is automatically added to ``sys.path``, but if
- your application modifies ``sys.path`` to include locations that may
- contain portions of a namespace package, you will need to call this
- function to ensure they are added to the existing namespace packages.
- Although by default ``pkg_resources`` only supports namespace packages for
- filesystem and zip importers, you can extend its support to other "importers"
- compatible with PEP 302 using the ``register_namespace_handler()`` function.
- See the section below on `Supporting Custom Importers`_ for details.
- .. _setuptools documentation on namespace packages: http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
- ``WorkingSet`` Objects
- ======================
- The ``WorkingSet`` class provides access to a collection of "active"
- distributions. In general, there is only one meaningful ``WorkingSet``
- instance: the one that represents the distributions that are currently active
- on ``sys.path``. This global instance is available under the name
- ``working_set`` in the ``pkg_resources`` module. However, specialized
- tools may wish to manipulate working sets that don't correspond to
- ``sys.path``, and therefore may wish to create other ``WorkingSet`` instances.
- It's important to note that the global ``working_set`` object is initialized
- from ``sys.path`` when ``pkg_resources`` is first imported, but is only updated
- if you do all future ``sys.path`` manipulation via ``pkg_resources`` APIs. If
- you manually modify ``sys.path``, you must invoke the appropriate methods on
- the ``working_set`` instance to keep it in sync. Unfortunately, Python does
- not provide any way to detect arbitrary changes to a list object like
- ``sys.path``, so ``pkg_resources`` cannot automatically update the
- ``working_set`` based on changes to ``sys.path``.
- ``WorkingSet(entries=None)``
- Create a ``WorkingSet`` from an iterable of path entries. If `entries`
- is not supplied, it defaults to the value of ``sys.path`` at the time
- the constructor is called.
- Note that you will not normally construct ``WorkingSet`` instances
- yourself, but instead you will implicitly or explicitly use the global
- ``working_set`` instance. For the most part, the ``pkg_resources`` API
- is designed so that the ``working_set`` is used by default, such that you
- don't have to explicitly refer to it most of the time.
- All distributions available directly on ``sys.path`` will be activated
- automatically when ``pkg_resources`` is imported. This behaviour can cause
- version conflicts for applications which require non-default versions of
- those distributions. To handle this situation, ``pkg_resources`` checks for a
- ``__requires__`` attribute in the ``__main__`` module when initializing the
- default working set, and uses this to ensure a suitable version of each
- affected distribution is activated. For example::
- __requires__ = ["CherryPy < 3"] # Must be set before pkg_resources import
- import pkg_resources
- Basic ``WorkingSet`` Methods
- ----------------------------
- The following methods of ``WorkingSet`` objects are also available as module-
- level functions in ``pkg_resources`` that apply to the default ``working_set``
- instance. Thus, you can use e.g. ``pkg_resources.require()`` as an
- abbreviation for ``pkg_resources.working_set.require()``:
- ``require(*requirements)``
- Ensure that distributions matching `requirements` are activated
- `requirements` must be a string or a (possibly-nested) sequence
- thereof, specifying the distributions and versions required. The
- return value is a sequence of the distributions that needed to be
- activated to fulfill the requirements; all relevant distributions are
- included, even if they were already activated in this working set.
- For the syntax of requirement specifiers, see the section below on
- `Requirements Parsing`_.
- In general, it should not be necessary for you to call this method
- directly. It's intended more for use in quick-and-dirty scripting and
- interactive interpreter hacking than for production use. If you're creating
- an actual library or application, it's strongly recommended that you create
- a "setup.py" script using ``setuptools``, and declare all your requirements
- there. That way, tools like EasyInstall can automatically detect what
- requirements your package has, and deal with them accordingly.
- Note that calling ``require('SomePackage')`` will not install
- ``SomePackage`` if it isn't already present. If you need to do this, you
- should use the ``resolve()`` method instead, which allows you to pass an
- ``installer`` callback that will be invoked when a needed distribution
- can't be found on the local machine. You can then have this callback
- display a dialog, automatically download the needed distribution, or
- whatever else is appropriate for your application. See the documentation
- below on the ``resolve()`` method for more information, and also on the
- ``obtain()`` method of ``Environment`` objects.
- ``run_script(requires, script_name)``
- Locate distribution specified by `requires` and run its `script_name`
- script. `requires` must be a string containing a requirement specifier.
- (See `Requirements Parsing`_ below for the syntax.)
- The script, if found, will be executed in *the caller's globals*. That's
- because this method is intended to be called from wrapper scripts that
- act as a proxy for the "real" scripts in a distribution. A wrapper script
- usually doesn't need to do anything but invoke this function with the
- correct arguments.
- If you need more control over the script execution environment, you
- probably want to use the ``run_script()`` method of a ``Distribution``
- object's `Metadata API`_ instead.
- ``iter_entry_points(group, name=None)``
- Yield entry point objects from `group` matching `name`
- If `name` is None, yields all entry points in `group` from all
- distributions in the working set, otherwise only ones matching both
- `group` and `name` are yielded. Entry points are yielded from the active
- distributions in the order that the distributions appear in the working
- set. (For the global ``working_set``, this should be the same as the order
- that they are listed in ``sys.path``.) Note that within the entry points
- advertised by an individual distribution, there is no particular ordering.
- Please see the section below on `Entry Points`_ for more information.
- ``WorkingSet`` Methods and Attributes
- -------------------------------------
- These methods are used to query or manipulate the contents of a specific
- working set, so they must be explicitly invoked on a particular ``WorkingSet``
- instance:
- ``add_entry(entry)``
- Add a path item to the ``entries``, finding any distributions on it. You
- should use this when you add additional items to ``sys.path`` and you want
- the global ``working_set`` to reflect the change. This method is also
- called by the ``WorkingSet()`` constructor during initialization.
- This method uses ``find_distributions(entry,True)`` to find distributions
- corresponding to the path entry, and then ``add()`` them. `entry` is
- always appended to the ``entries`` attribute, even if it is already
- present, however. (This is because ``sys.path`` can contain the same value
- more than once, and the ``entries`` attribute should be able to reflect
- this.)
- ``__contains__(dist)``
- True if `dist` is active in this ``WorkingSet``. Note that only one
- distribution for a given project can be active in a given ``WorkingSet``.
- ``__iter__()``
- Yield distributions for non-duplicate projects in the working set.
- The yield order is the order in which the items' path entries were
- added to the working set.
- ``find(req)``
- Find a distribution matching `req` (a ``Requirement`` instance).
- If there is an active distribution for the requested project, this
- returns it, as long as it meets the version requirement specified by
- `req`. But, if there is an active distribution for the project and it
- does *not* meet the `req` requirement, ``VersionConflict`` is raised.
- If there is no active distribution for the requested project, ``None``
- is returned.
- ``resolve(requirements, env=None, installer=None)``
- List all distributions needed to (recursively) meet `requirements`
- `requirements` must be a sequence of ``Requirement`` objects. `env`,
- if supplied, should be an ``Environment`` instance. If
- not supplied, an ``Environment`` is created from the working set's
- ``entries``. `installer`, if supplied, will be invoked with each
- requirement that cannot be met by an already-installed distribution; it
- should return a ``Distribution`` or ``None``. (See the ``obtain()`` method
- of `Environment Objects`_, below, for more information on the `installer`
- argument.)
- ``add(dist, entry=None)``
- Add `dist` to working set, associated with `entry`
- If `entry` is unspecified, it defaults to ``dist.location``. On exit from
- this routine, `entry` is added to the end of the working set's ``.entries``
- (if it wasn't already present).
- `dist` is only added to the working set if it's for a project that
- doesn't already have a distribution active in the set. If it's
- successfully added, any callbacks registered with the ``subscribe()``
- method will be called. (See `Receiving Change Notifications`_, below.)
- Note: ``add()`` is automatically called for you by the ``require()``
- method, so you don't normally need to use this method directly.
- ``entries``
- This attribute represents a "shadow" ``sys.path``, primarily useful for
- debugging. If you are experiencing import problems, you should check
- the global ``working_set`` object's ``entries`` against ``sys.path``, to
- ensure that they match. If they do not, then some part of your program
- is manipulating ``sys.path`` without updating the ``working_set``
- accordingly. IMPORTANT NOTE: do not directly manipulate this attribute!
- Setting it equal to ``sys.path`` will not fix your problem, any more than
- putting black tape over an "engine warning" light will fix your car! If
- this attribute is out of sync with ``sys.path``, it's merely an *indicator*
- of the problem, not the cause of it.
- Receiving Change Notifications
- ------------------------------
- Extensible applications and frameworks may need to receive notification when
- a new distribution (such as a plug-in component) has been added to a working
- set. This is what the ``subscribe()`` method and ``add_activation_listener()``
- function are for.
- ``subscribe(callback)``
- Invoke ``callback(distribution)`` once for each active distribution that is
- in the set now, or gets added later. Because the callback is invoked for
- already-active distributions, you do not need to loop over the working set
- yourself to deal with the existing items; just register the callback and
- be prepared for the fact that it will be called immediately by this method.
- Note that callbacks *must not* allow exceptions to propagate, or they will
- interfere with the operation of other callbacks and possibly result in an
- inconsistent working set state. Callbacks should use a try/except block
- to ignore, log, or otherwise process any errors, especially since the code
- that caused the callback to be invoked is unlikely to be able to handle
- the errors any better than the callback itself.
- ``pkg_resources.add_activation_listener()`` is an alternate spelling of
- ``pkg_resources.working_set.subscribe()``.
- Locating Plugins
- ----------------
- Extensible applications will sometimes have a "plugin directory" or a set of
- plugin directories, from which they want to load entry points or other
- metadata. The ``find_plugins()`` method allows you to do this, by scanning an
- environment for the newest version of each project that can be safely loaded
- without conflicts or missing requirements.
- ``find_plugins(plugin_env, full_env=None, fallback=True)``
- Scan `plugin_env` and identify which distributions could be added to this
- working set without version conflicts or missing requirements.
- Example usage::
- distributions, errors = working_set.find_plugins(
- Environment(plugin_dirlist)
- )
- map(working_set.add, distributions) # add plugins+libs to sys.path
- print "Couldn't load", errors # display errors
- The `plugin_env` should be an ``Environment`` instance that contains only
- distributions that are in the project's "plugin directory" or directories.
- The `full_env`, if supplied, should be an ``Environment`` instance that
- contains all currently-available distributions.
- If `full_env` is not supplied, one is created automatically from the
- ``WorkingSet`` this method is called on, which will typically mean that
- every directory on ``sys.path`` will be scanned for distributions.
- This method returns a 2-tuple: (`distributions`, `error_info`), where
- `distributions` is a list of the distributions found in `plugin_env` that
- were loadable, along with any other distributions that are needed to resolve
- their dependencies. `error_info` is a dictionary mapping unloadable plugin
- distributions to an exception instance describing the error that occurred.
- Usually this will be a ``DistributionNotFound`` or ``VersionConflict``
- instance.
- Most applications will use this method mainly on the master ``working_set``
- instance in ``pkg_resources``, and then immediately add the returned
- distributions to the working set so that they are available on sys.path.
- This will make it possible to find any entry points, and allow any other
- metadata tracking and hooks to be activated.
- The resolution algorithm used by ``find_plugins()`` is as follows. First,
- the project names of the distributions present in `plugin_env` are sorted.
- Then, each project's eggs are tried in descending version order (i.e.,
- newest version first).
- An attempt is made to resolve each egg's dependencies. If the attempt is
- successful, the egg and its dependencies are added to the output list and to
- a temporary copy of the working set. The resolution process continues with
- the next project name, and no older eggs for that project are tried.
- If the resolution attempt fails, however, the error is added to the error
- dictionary. If the `fallback` flag is true, the next older version of the
- plugin is tried, until a working version is found. If false, the resolution
- process continues with the next plugin project name.
- Some applications may have stricter fallback requirements than others. For
- example, an application that has a database schema or persistent objects
- may not be able to safely downgrade a version of a package. Others may want
- to ensure that a new plugin configuration is either 100% good or else
- revert to a known-good configuration. (That is, they may wish to revert to
- a known configuration if the `error_info` return value is non-empty.)
- Note that this algorithm gives precedence to satisfying the dependencies of
- alphabetically prior project names in case of version conflicts. If two
- projects named "AaronsPlugin" and "ZekesPlugin" both need different versions
- of "TomsLibrary", then "AaronsPlugin" will win and "ZekesPlugin" will be
- disabled due to version conflict.
- ``Environment`` Objects
- =======================
- An "environment" is a collection of ``Distribution`` objects, usually ones
- that are present and potentially importable on the current platform.
- ``Environment`` objects are used by ``pkg_resources`` to index available
- distributions during dependency resolution.
- ``Environment(search_path=None, platform=get_supported_platform(), python=PY_MAJOR)``
- Create an environment snapshot by scanning `search_path` for distributions
- compatible with `platform` and `python`. `search_path` should be a
- sequence of strings such as might be used on ``sys.path``. If a
- `search_path` isn't supplied, ``sys.path`` is used.
- `platform` is an optional string specifying the name of the platform
- that platform-specific distributions must be compatible with. If
- unspecified, it defaults to the current platform. `python` is an
- optional string naming the desired version of Python (e.g. ``'2.4'``);
- it defaults to the currently-running version.
- You may explicitly set `platform` (and/or `python`) to ``None`` if you
- wish to include *all* distributions, not just those compatible with the
- running platform or Python version.
- Note that `search_path` is scanned immediately for distributions, and the
- resulting ``Environment`` is a snapshot of the found distributions. It
- is not automatically updated if the system's state changes due to e.g.
- installation or removal of distributions.
- ``__getitem__(project_name)``
- Returns a list of distributions for the given project name, ordered
- from newest to oldest version. (And highest to lowest format precedence
- for distributions that contain the same version of the project.) If there
- are no distributions for the project, returns an empty list.
- ``__iter__()``
- Yield the unique project names of the distributions in this environment.
- The yielded names are always in lower case.
- ``add(dist)``
- Add `dist` to the environment if it matches the platform and python version
- specified at creation time, and only if the distribution hasn't already
- been added. (i.e., adding the same distribution more than once is a no-op.)
- ``remove(dist)``
- Remove `dist` from the environment.
- ``can_add(dist)``
- Is distribution `dist` acceptable for this environment? If it's not
- compatible with the ``platform`` and ``python`` version values specified
- when the environment was created, a false value is returned.
- ``__add__(dist_or_env)`` (``+`` operator)
- Add a distribution or environment to an ``Environment`` instance, returning
- a *new* environment object that contains all the distributions previously
- contained by both. The new environment will have a ``platform`` and
- ``python`` of ``None``, meaning that it will not reject any distributions
- from being added to it; it will simply accept whatever is added. If you
- want the added items to be filtered for platform and Python version, or
- you want to add them to the *same* environment instance, you should use
- in-place addition (``+=``) instead.
- ``__iadd__(dist_or_env)`` (``+=`` operator)
- Add a distribution or environment to an ``Environment`` instance
- *in-place*, updating the existing instance and returning it. The
- ``platform`` and ``python`` filter attributes take effect, so distributions
- in the source that do not have a suitable platform string or Python version
- are silently ignored.
- ``best_match(req, working_set, installer=None)``
- Find distribution best matching `req` and usable on `working_set`
- This calls the ``find(req)`` method of the `working_set` to see if a
- suitable distribution is already active. (This may raise
- ``VersionConflict`` if an unsuitable version of the project is already
- active in the specified `working_set`.) If a suitable distribution isn't
- active, this method returns the newest distribution in the environment
- that meets the ``Requirement`` in `req`. If no suitable distribution is
- found, and `installer` is supplied, then the result of calling
- the environment's ``obtain(req, installer)`` method will be returned.
- ``obtain(requirement, installer=None)``
- Obtain a distro that matches requirement (e.g. via download). In the
- base ``Environment`` class, this routine just returns
- ``installer(requirement)``, unless `installer` is None, in which case
- None is returned instead. This method is a hook that allows subclasses
- to attempt other ways of obtaining a distribution before falling back
- to the `installer` argument.
- ``scan(search_path=None)``
- Scan `search_path` for distributions usable on `platform`
- Any distributions found are added to the environment. `search_path` should
- be a sequence of strings such as might be used on ``sys.path``. If not
- supplied, ``sys.path`` is used. Only distributions conforming to
- the platform/python version defined at initialization are added. This
- method is a shortcut for using the ``find_distributions()`` function to
- find the distributions from each item in `search_path`, and then calling
- ``add()`` to add each one to the environment.
- ``Requirement`` Objects
- =======================
- ``Requirement`` objects express what versions of a project are suitable for
- some purpose. These objects (or their string form) are used by various
- ``pkg_resources`` APIs in order to find distributions that a script or
- distribution needs.
- Requirements Parsing
- --------------------
- ``parse_requirements(s)``
- Yield ``Requirement`` objects for a string or iterable of lines. Each
- requirement must start on a new line. See below for syntax.
- ``Requirement.parse(s)``
- Create a ``Requirement`` object from a string or iterable of lines. A
- ``ValueError`` is raised if the string or lines do not contain a valid
- requirement specifier, or if they contain more than one specifier. (To
- parse multiple specifiers from a string or iterable of strings, use
- ``parse_requirements()`` instead.)
- The syntax of a requirement specifier is defined in full in PEP 508.
- Some examples of valid requirement specifiers::
- FooProject >= 1.2
- Fizzy [foo, bar]
- PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
- SomethingWhoseVersionIDontCareAbout
- SomethingWithMarker[foo]>1.0;python_version<"2.7"
- The project name is the only required portion of a requirement string, and
- if it's the only thing supplied, the requirement will accept any version
- of that project.
- The "extras" in a requirement are used to request optional features of a
- project, that may require additional project distributions in order to
- function. For example, if the hypothetical "Report-O-Rama" project offered
- optional PDF support, it might require an additional library in order to
- provide that support. Thus, a project needing Report-O-Rama's PDF features
- could use a requirement of ``Report-O-Rama[PDF]`` to request installation
- or activation of both Report-O-Rama and any libraries it needs in order to
- provide PDF support. For example, you could use::
- easy_install.py Report-O-Rama[PDF]
- To install the necessary packages using the EasyInstall program, or call
- ``pkg_resources.require('Report-O-Rama[PDF]')`` to add the necessary
- distributions to sys.path at runtime.
- The "markers" in a requirement are used to specify when a requirement
- should be installed -- the requirement will be installed if the marker
- evaluates as true in the current environment. For example, specifying
- ``argparse;python_version<"2.7"`` will not install in an Python 2.7 or 3.3
- environment, but will in a Python 2.6 environment.
- ``Requirement`` Methods and Attributes
- --------------------------------------
- ``__contains__(dist_or_version)``
- Return true if `dist_or_version` fits the criteria for this requirement.
- If `dist_or_version` is a ``Distribution`` object, its project name must
- match the requirement's project name, and its version must meet the
- requirement's version criteria. If `dist_or_version` is a string, it is
- parsed using the ``parse_version()`` utility function. Otherwise, it is
- assumed to be an already-parsed version.
- The ``Requirement`` object's version specifiers (``.specs``) are internally
- sorted into ascending version order, and used to establish what ranges of
- versions are acceptable. Adjacent redundant conditions are effectively
- consolidated (e.g. ``">1, >2"`` produces the same results as ``">2"``, and
- ``"<2,<3"`` produces the same results as``"<2"``). ``"!="`` versions are
- excised from the ranges they fall within. The version being tested for
- acceptability is then checked for membership in the resulting ranges.
- ``__eq__(other_requirement)``
- A requirement compares equal to another requirement if they have
- case-insensitively equal project names, version specifiers, and "extras".
- (The order that extras and version specifiers are in is also ignored.)
- Equal requirements also have equal hashes, so that requirements can be
- used in sets or as dictionary keys.
- ``__str__()``
- The string form of a ``Requirement`` is a string that, if passed to
- ``Requirement.parse()``, would return an equal ``Requirement`` object.
- ``project_name``
- The name of the required project
- ``key``
- An all-lowercase version of the ``project_name``, useful for comparison
- or indexing.
- ``extras``
- A tuple of names of "extras" that this requirement calls for. (These will
- be all-lowercase and normalized using the ``safe_extra()`` parsing utility
- function, so they may not exactly equal the extras the requirement was
- created with.)
- ``specs``
- A list of ``(op,version)`` tuples, sorted in ascending parsed-version
- order. The `op` in each tuple is a comparison operator, represented as
- a string. The `version` is the (unparsed) version number.
- ``marker``
- An instance of ``packaging.markers.Marker`` that allows evaluation
- against the current environment. May be None if no marker specified.
- ``url``
- The location to download the requirement from if specified.
- Entry Points
- ============
- Entry points are a simple way for distributions to "advertise" Python objects
- (such as functions or classes) for use by other distributions. Extensible
- applications and frameworks can search for entry points with a particular name
- or group, either from a specific distribution or from all active distributions
- on sys.path, and then inspect or load the advertised objects at will.
- Entry points belong to "groups" which are named with a dotted name similar to
- a Python package or module name. For example, the ``setuptools`` package uses
- an entry point named ``distutils.commands`` in order to find commands defined
- by distutils extensions. ``setuptools`` treats the names of entry points
- defined in that group as the acceptable commands for a setup script.
- In a similar way, other packages can define their own entry point groups,
- either using dynamic names within the group (like ``distutils.commands``), or
- possibly using predefined names within the group. For example, a blogging
- framework that offers various pre- or post-publishing hooks might define an
- entry point group and look for entry points named "pre_process" and
- "post_process" within that group.
- To advertise an entry point, a project needs to use ``setuptools`` and provide
- an ``entry_points`` argument to ``setup()`` in its setup script, so that the
- entry points will be included in the distribution's metadata. For more
- details, see the ``setuptools`` documentation. (XXX link here to setuptools)
- Each project distribution can advertise at most one entry point of a given
- name within the same entry point group. For example, a distutils extension
- could advertise two different ``distutils.commands`` entry points, as long as
- they had different names. However, there is nothing that prevents *different*
- projects from advertising entry points of the same name in the same group. In
- some cases, this is a desirable thing, since the application or framework that
- uses the entry points may be calling them as hooks, or in some other way
- combining them. It is up to the application or framework to decide what to do
- if multiple distributions advertise an entry point; some possibilities include
- using both entry points, displaying an error message, using the first one found
- in sys.path order, etc.
- Convenience API
- ---------------
- In the following functions, the `dist` argument can be a ``Distribution``
- instance, a ``Requirement`` instance, or a string specifying a requirement
- (i.e. project name, version, etc.). If the argument is a string or
- ``Requirement``, the specified distribution is located (and added to sys.path
- if not already present). An error will be raised if a matching distribution is
- not available.
- The `group` argument should be a string containing a dotted identifier,
- identifying an entry point group. If you are defining an entry point group,
- you should include some portion of your package's name in the group name so as
- to avoid collision with other packages' entry point groups.
- ``load_entry_point(dist, group, name)``
- Load the named entry point from the specified distribution, or raise
- ``ImportError``.
- ``get_entry_info(dist, group, name)``
- Return an ``EntryPoint`` object for the given `group` and `name` from
- the specified distribution. Returns ``None`` if the distribution has not
- advertised a matching entry point.
- ``get_entry_map(dist, group=None)``
- Return the distribution's entry point map for `group`, or the full entry
- map for the distribution. This function always returns a dictionary,
- even if the distribution advertises no entry points. If `group` is given,
- the dictionary maps entry point names to the corresponding ``EntryPoint``
- object. If `group` is None, the dictionary maps group names to
- dictionaries that then map entry point names to the corresponding
- ``EntryPoint`` instance in that group.
- ``iter_entry_points(group, name=None)``
- Yield entry point objects from `group` matching `name`.
- If `name` is None, yields all entry points in `group` from all
- distributions in the working set on sys.path, otherwise only ones matching
- both `group` and `name` are yielded. Entry points are yielded from
- the active distributions in the order that the distributions appear on
- sys.path. (Within entry points for a particular distribution, however,
- there is no particular ordering.)
- (This API is actually a method of the global ``working_set`` object; see
- the section above on `Basic WorkingSet Methods`_ for more information.)
- Creating and Parsing
- --------------------
- ``EntryPoint(name, module_name, attrs=(), extras=(), dist=None)``
- Create an ``EntryPoint`` instance. `name` is the entry point name. The
- `module_name` is the (dotted) name of the module containing the advertised
- object. `attrs` is an optional tuple of names to look up from the
- module to obtain the advertised object. For example, an `attrs` of
- ``("foo","bar")`` and a `module_name` of ``"baz"`` would mean that the
- advertised object could be obtained by the following code::
- import baz
- advertised_object = baz.foo.bar
- The `extras` are an optional tuple of "extra feature" names that the
- distribution needs in order to provide this entry point. When the
- entry point is loaded, these extra features are looked up in the `dist`
- argument to find out what other distributions may need to be activated
- on sys.path; see the ``load()`` method for more details. The `extras`
- argument is only meaningful if `dist` is specified. `dist` must be
- a ``Distribution`` instance.
- ``EntryPoint.parse(src, dist=None)`` (classmethod)
- Parse a single entry point from string `src`
- Entry point syntax follows the form::
- name = some.module:some.attr [extra1,extra2]
- The entry name and module name are required, but the ``:attrs`` and
- ``[extras]`` parts are optional, as is the whitespace shown between
- some of the items. The `dist` argument is passed through to the
- ``EntryPoint()`` constructor, along with the other values parsed from
- `src`.
- ``EntryPoint.parse_group(group, lines, dist=None)`` (classmethod)
- Parse `lines` (a string or sequence of lines) to create a dictionary
- mapping entry point names to ``EntryPoint`` objects. ``ValueError`` is
- raised if entry point names are duplicated, if `group` is not a valid
- entry point group name, or if there are any syntax errors. (Note: the
- `group` parameter is used only for validation and to create more
- informative error messages.) If `dist` is provided, it will be used to
- set the ``dist`` attribute of the created ``EntryPoint`` objects.
- ``EntryPoint.parse_map(data, dist=None)`` (classmethod)
- Parse `data` into a dictionary mapping group names to dictionaries mapping
- entry point names to ``EntryPoint`` objects. If `data` is a dictionary,
- then the keys are used as group names and the values are passed to
- ``parse_group()`` as the `lines` argument. If `data` is a string or
- sequence of lines, it is first split into .ini-style sections (using
- the ``split_sections()`` utility function) and the section names are used
- as group names. In either case, the `dist` argument is passed through to
- ``parse_group()`` so that the entry points will be linked to the specified
- distribution.
- ``EntryPoint`` Objects
- ----------------------
- For simple introspection, ``EntryPoint`` objects have attributes that
- correspond exactly to the constructor argument names: ``name``,
- ``module_name``, ``attrs``, ``extras``, and ``dist`` are all available. In
- addition, the following methods are provided:
- ``load(require=True, env=None, installer=None)``
- Load the entry point, returning the advertised Python object, or raise
- ``ImportError`` if it cannot be obtained. If `require` is a true value,
- then ``require(env, installer)`` is called before attempting the import.
- ``require(env=None, installer=None)``
- Ensure that any "extras" needed by the entry point are available on
- sys.path. ``UnknownExtra`` is raised if the ``EntryPoint`` has ``extras``,
- but no ``dist``, or if the named extras are not defined by the
- distribution. If `env` is supplied, it must be an ``Environment``, and it
- will be used to search for needed distributions if they are not already
- present on sys.path. If `installer` is supplied, it must be a callable
- taking a ``Requirement`` instance and returning a matching importable
- ``Distribution`` instance or None.
- ``__str__()``
- The string form of an ``EntryPoint`` is a string that could be passed to
- ``EntryPoint.parse()`` to produce an equivalent ``EntryPoint``.
- ``Distribution`` Objects
- ========================
- ``Distribution`` objects represent collections of Python code that may or may
- not be importable, and may or may not have metadata and resources associated
- with them. Their metadata may include information such as what other projects
- the distribution depends on, what entry points the distribution advertises, and
- so on.
- Getting or Creating Distributions
- ---------------------------------
- Most commonly, you'll obtain ``Distribution`` objects from a ``WorkingSet`` or
- an ``Environment``. (See the sections above on `WorkingSet Objects`_ and
- `Environment Objects`_, which are containers for active distributions and
- available distributions, respectively.) You can also obtain ``Distribution``
- objects from one of these high-level APIs:
- ``find_distributions(path_item, only=False)``
- Yield distributions accessible via `path_item`. If `only` is true, yield
- only distributions whose ``location`` is equal to `path_item`. In other
- words, if `only` is true, this yields any distributions that would be
- importable if `path_item` were on ``sys.path``. If `only` is false, this
- also yields distributions that are "in" or "under" `path_item`, but would
- not be importable unless their locations were also added to ``sys.path``.
- ``get_distribution(dist_spec)``
- Return a ``Distribution`` object for a given ``Requirement`` or string.
- If `dist_spec` is already a ``Distribution`` instance, it is returned.
- If it is a ``Requirement`` object or a string that can be parsed into one,
- it is used to locate and activate a matching distribution, which is then
- returned.
- However, if you're creating specialized tools for working with distributions,
- or creating a new distribution format, you may also need to create
- ``Distribution`` objects directly, using one of the three constructors below.
- These constructors all take an optional `metadata` argument, which is used to
- access any resources or metadata associated with the distribution. `metadata`
- must be an object that implements the ``IResourceProvider`` interface, or None.
- If it is None, an ``EmptyProvider`` is used instead. ``Distribution`` objects
- implement both the `IResourceProvider`_ and `IMetadataProvider Methods`_ by
- delegating them to the `metadata` object.
- ``Distribution.from_location(location, basename, metadata=None, **kw)`` (classmethod)
- Create a distribution for `location`, which must be a string such as a
- URL, filename, or other string that might be used on ``sys.path``.
- `basename` is a string naming the distribution, like ``Foo-1.2-py2.4.egg``.
- If `basename` ends with ``.egg``, then the project's name, version, python
- version and platform are extracted from the filename and used to set those
- properties of the created distribution. Any additional keyword arguments
- are forwarded to the ``Distribution()`` constructor.
- ``Distribution.from_filename(filename, metadata=None**kw)`` (classmethod)
- Create a distribution by parsing a local filename. This is a shorter way
- of saying ``Distribution.from_location(normalize_path(filename),
- os.path.basename(filename), metadata)``. In other words, it creates a
- distribution whose location is the normalize form of the filename, parsing
- name and version information from the base portion of the filename. Any
- additional keyword arguments are forwarded to the ``Distribution()``
- constructor.
- ``Distribution(location,metadata,project_name,version,py_version,platform,precedence)``
- Create a distribution by setting its properties. All arguments are
- optional and default to None, except for `py_version` (which defaults to
- the current Python version) and `precedence` (which defaults to
- ``EGG_DIST``; for more details see ``precedence`` under `Distribution
- Attributes`_ below). Note that it's usually easier to use the
- ``from_filename()`` or ``from_location()`` constructors than to specify
- all these arguments individually.
- ``Distribution`` Attributes
- ---------------------------
- location
- A string indicating the distribution's location. For an importable
- distribution, this is the string that would be added to ``sys.path`` to
- make it actively importable. For non-importable distributions, this is
- simply a filename, URL, or other way of locating the distribution.
- project_name
- A string, naming the project that this distribution is for. Project names
- are defined by a project's setup script, and they are used to identify
- projects on PyPI. When a ``Distribution`` is constructed, the
- `project_name` argument is passed through the ``safe_name()`` utility
- function to filter out any unacceptable characters.
- key
- ``dist.key`` is short for ``dist.project_name.lower()``. It's used for
- case-insensitive comparison and indexing of distributions by project name.
- extras
- A list of strings, giving the names of extra features defined by the
- project's dependency list (the ``extras_require`` argument specified in
- the project's setup script).
- version
- A string denoting what release of the project this distribution contains.
- When a ``Distribution`` is constructed, the `version` argument is passed
- through the ``safe_version()`` utility function to filter out any
- unacceptable characters. If no `version` is specified at construction
- time, then attempting to access this attribute later will cause the
- ``Distribution`` to try to discover its version by reading its ``PKG-INFO``
- metadata file. If ``PKG-INFO`` is unavailable or can't be parsed,
- ``ValueError`` is raised.
- parsed_version
- The ``parsed_version`` is an object representing a "parsed" form of the
- distribution's ``version``. ``dist.parsed_version`` is a shortcut for
- calling ``parse_version(dist.version)``. It is used to compare or sort
- distributions by version. (See the `Parsing Utilities`_ section below for
- more information on the ``parse_version()`` function.) Note that accessing
- ``parsed_version`` may result in a ``ValueError`` if the ``Distribution``
- was constructed without a `version` and without `metadata` capable of
- supplying the missing version info.
- py_version
- The major/minor Python version the distribution supports, as a string.
- For example, "2.7" or "3.4". The default is the current version of Python.
- platform
- A string representing the platform the distribution is intended for, or
- ``None`` if the distribution is "pure Python" and therefore cross-platform.
- See `Platform Utilities`_ below for more information on platform strings.
- precedence
- A distribution's ``precedence`` is used to determine the relative order of
- two distributions that have the same ``project_name`` and
- ``parsed_version``. The default precedence is ``pkg_resources.EGG_DIST``,
- which is the highest (i.e. most preferred) precedence. The full list
- of predefined precedences, from most preferred to least preferred, is:
- ``EGG_DIST``, ``BINARY_DIST``, ``SOURCE_DIST``, ``CHECKOUT_DIST``, and
- ``DEVELOP_DIST``. Normally, precedences other than ``EGG_DIST`` are used
- only by the ``setuptools.package_index`` module, when sorting distributions
- found in a package index to determine their suitability for installation.
- "System" and "Development" eggs (i.e., ones that use the ``.egg-info``
- format), however, are automatically given a precedence of ``DEVELOP_DIST``.
- ``Distribution`` Methods
- ------------------------
- ``activate(path=None)``
- Ensure distribution is importable on `path`. If `path` is None,
- ``sys.path`` is used instead. This ensures that the distribution's
- ``location`` is in the `path` list, and it also performs any necessary
- namespace package fixups or declarations. (That is, if the distribution
- contains namespace packages, this method ensures that they are declared,
- and that the distribution's contents for those namespace packages are
- merged with the contents provided by any other active distributions. See
- the section above on `Namespace Package Support`_ for more information.)
- ``pkg_resources`` adds a notification callback to the global ``working_set``
- that ensures this method is called whenever a distribution is added to it.
- Therefore, you should not normally need to explicitly call this method.
- (Note that this means that namespace packages on ``sys.path`` are always
- imported as soon as ``pkg_resources`` is, which is another reason why
- namespace packages should not contain any code or import statements.)
- ``as_requirement()``
- Return a ``Requirement`` instance that matches this distribution's project
- name and version.
- ``requires(extras=())``
- List the ``Requirement`` objects that specify this distribution's
- dependencies. If `extras` is specified, it should be a sequence of names
- of "extras" defined by the distribution, and the list returned will then
- include any dependencies needed to support the named "extras".
- ``clone(**kw)``
- Create a copy of the distribution. Any supplied keyword arguments override
- the corresponding argument to the ``Distribution()`` constructor, allowing
- you to change some of the copied distribution's attributes.
- ``egg_name()``
- Return what this distribution's standard filename should be, not including
- the ".egg" extension. For example, a distribution for project "Foo"
- version 1.2 that runs on Python 2.3 for Windows would have an ``egg_name()``
- of ``Foo-1.2-py2.3-win32``. Any dashes in the name or version are
- converted to underscores. (``Distribution.from_location()`` will convert
- them back when parsing a ".egg" file name.)
- ``__cmp__(other)``, ``__hash__()``
- Distribution objects are hashed and compared on the basis of their parsed
- version and precedence, followed by their key (lowercase project name),
- location, Python version, and platform.
- The following methods are used to access ``EntryPoint`` objects advertised
- by the distribution. See the section above on `Entry Points`_ for more
- detailed information about these operations:
- ``get_entry_info(group, name)``
- Return the ``EntryPoint`` object for `group` and `name`, or None if no
- such point is advertised by this distribution.
- ``get_entry_map(group=None)``
- Return the entry point map for `group`. If `group` is None, return
- a dictionary mapping group names to entry point maps for all groups.
- (An entry point map is a dictionary of entry point names to ``EntryPoint``
- objects.)
- ``load_entry_point(group, name)``
- Short for ``get_entry_info(group, name).load()``. Returns the object
- advertised by the named entry point, or raises ``ImportError`` if
- the entry point isn't advertised by this distribution, or there is some
- other import problem.
- In addition to the above methods, ``Distribution`` objects also implement all
- of the `IResourceProvider`_ and `IMetadataProvider Methods`_ (which are
- documented in later sections):
- * ``has_metadata(name)``
- * ``metadata_isdir(name)``
- * ``metadata_listdir(name)``
- * ``get_metadata(name)``
- * ``get_metadata_lines(name)``
- * ``run_script(script_name, namespace)``
- * ``get_resource_filename(manager, resource_name)``
- * ``get_resource_stream(manager, resource_name)``
- * ``get_resource_string(manager, resource_name)``
- * ``has_resource(resource_name)``
- * ``resource_isdir(resource_name)``
- * ``resource_listdir(resource_name)``
- If the distribution was created with a `metadata` argument, these resource and
- metadata access methods are all delegated to that `metadata` provider.
- Otherwise, they are delegated to an ``EmptyProvider``, so that the distribution
- will appear to have no resources or metadata. This delegation approach is used
- so that supporting custom importers or new distribution formats can be done
- simply by creating an appropriate `IResourceProvider`_ implementation; see the
- section below on `Supporting Custom Importers`_ for more details.
- ``ResourceManager`` API
- =======================
- The ``ResourceManager`` class provides uniform access to package resources,
- whether those resources exist as files and directories or are compressed in
- an archive of some kind.
- Normally, you do not need to create or explicitly manage ``ResourceManager``
- instances, as the ``pkg_resources`` module creates a global instance for you,
- and makes most of its methods available as top-level names in the
- ``pkg_resources`` module namespace. So, for example, this code actually
- calls the ``resource_string()`` method of the global ``ResourceManager``::
- import pkg_resources
- my_data = pkg_resources.resource_string(__name__, "foo.dat")
- Thus, you can use the APIs below without needing an explicit
- ``ResourceManager`` instance; just import and use them as needed.
- Basic Resource Access
- ---------------------
- In the following methods, the `package_or_requirement` argument may be either
- a Python package/module name (e.g. ``foo.bar``) or a ``Requirement`` instance.
- If it is a package or module name, the named module or package must be
- importable (i.e., be in a distribution or directory on ``sys.path``), and the
- `resource_name` argument is interpreted relative to the named package. (Note
- that if a module name is used, then the resource name is relative to the
- package immediately containing the named module. Also, you should not use use
- a namespace package name, because a namespace package can be spread across
- multiple distributions, and is therefore ambiguous as to which distribution
- should be searched for the resource.)
- If it is a ``Requirement``, then the requirement is automatically resolved
- (searching the current ``Environment`` if necessary) and a matching
- distribution is added to the ``WorkingSet`` and ``sys.path`` if one was not
- already present. (Unless the ``Requirement`` can't be satisfied, in which
- case an exception is raised.) The `resource_name` argument is then interpreted
- relative to the root of the identified distribution; i.e. its first path
- segment will be treated as a peer of the top-level modules or packages in the
- distribution.
- Note that resource names must be ``/``-separated paths and cannot be absolute
- (i.e. no leading ``/``) or contain relative names like ``".."``. Do *not* use
- ``os.path`` routines to manipulate resource paths, as they are *not* filesystem
- paths.
- ``resource_exists(package_or_requirement, resource_name)``
- Does the named resource exist? Return ``True`` or ``False`` accordingly.
- ``resource_stream(package_or_requirement, resource_name)``
- Return a readable file-like object for the specified resource; it may be
- an actual file, a ``StringIO``, or some similar object. The stream is
- in "binary mode", in the sense that whatever bytes are in the resource
- will be read as-is.
- ``resource_string(package_or_requirement, resource_name)``
- Return the specified resource as a string. The resource is read in
- binary fashion, such that the returned string contains exactly the bytes
- that are stored in the resource.
- ``resource_isdir(package_or_requirement, resource_name)``
- Is the named resource a directory? Return ``True`` or ``False``
- accordingly.
- ``resource_listdir(package_or_requirement, resource_name)``
- List the contents of the named resource directory, just like ``os.listdir``
- except that it works even if the resource is in a zipfile.
- Note that only ``resource_exists()`` and ``resource_isdir()`` are insensitive
- as to the resource type. You cannot use ``resource_listdir()`` on a file
- resource, and you can't use ``resource_string()`` or ``resource_stream()`` on
- directory resources. Using an inappropriate method for the resource type may
- result in an exception or undefined behavior, depending on the platform and
- distribution format involved.
- Resource Extraction
- -------------------
- ``resource_filename(package_or_requirement, resource_name)``
- Sometimes, it is not sufficient to access a resource in string or stream
- form, and a true filesystem filename is needed. In such cases, you can
- use this method (or module-level function) to obtain a filename for a
- resource. If the resource is in an archive distribution (such as a zipped
- egg), it will be extracted to a cache directory, and the filename within
- the cache will be returned. If the named resource is a directory, then
- all resources within that directory (including subdirectories) are also
- extracted. If the named resource is a C extension or "eager resource"
- (see the ``setuptools`` documentation for details), then all C extensions
- and eager resources are extracted at the same time.
- Archived resources are extracted to a cache location that can be managed by
- the following two methods:
- ``set_extraction_path(path)``
- Set the base path where resources will be extracted to, if needed.
- If you do not call this routine before any extractions take place, the
- path defaults to the return value of ``get_default_cache()``. (Which is
- based on the ``PYTHON_EGG_CACHE`` environment variable, with various
- platform-specific fallbacks. See that routine's documentation for more
- details.)
- Resources are extracted to subdirectories of this path based upon
- information given by the resource provider. You may set this to a
- temporary directory, but then you must call ``cleanup_resources()`` to
- delete the extracted files when done. There is no guarantee that
- ``cleanup_resources()`` will be able to remove all extracted files. (On
- Windows, for example, you can't unlink .pyd or .dll files that are still
- in use.)
- Note that you may not change the extraction path for a given resource
- manager once resources have been extracted, unless you first call
- ``cleanup_resources()``.
- ``cleanup_resources(force=False)``
- Delete all extracted resource files and directories, returning a list
- of the file and directory names that could not be successfully removed.
- This function does not have any concurrency protection, so it should
- generally only be called when the extraction path is a temporary
- directory exclusive to a single process. This method is not
- automatically called; you must call it explicitly or register it as an
- ``atexit`` function if you wish to ensure cleanup of a temporary
- directory used for extractions.
- "Provider" Interface
- --------------------
- If you are implementing an ``IResourceProvider`` and/or ``IMetadataProvider``
- for a new distribution archive format, you may need to use the following
- ``IResourceManager`` methods to co-ordinate extraction of resources to the
- filesystem. If you're not implementing an archive format, however, you have
- no need to use these methods. Unlike the other methods listed above, they are
- *not* available as top-level functions tied to the global ``ResourceManager``;
- you must therefore have an explicit ``ResourceManager`` instance to use them.
- ``get_cache_path(archive_name, names=())``
- Return absolute location in cache for `archive_name` and `names`
- The parent directory of the resulting path will be created if it does
- not already exist. `archive_name` should be the base filename of the
- enclosing egg (which may not be the name of the enclosing zipfile!),
- including its ".egg" extension. `names`, if provided, should be a
- sequence of path name parts "under" the egg's extraction location.
- This method should only be called by resource providers that need to
- obtain an extraction location, and only for names they intend to
- extract, as it tracks the generated names for possible cleanup later.
- ``extraction_error()``
- Raise an ``ExtractionError`` describing the active exception as interfering
- with the extraction process. You should call this if you encounter any
- OS errors extracting the file to the cache path; it will format the
- operating system exception for you, and add other information to the
- ``ExtractionError`` instance that may be needed by programs that want to
- wrap or handle extraction errors themselves.
- ``postprocess(tempname, filename)``
- Perform any platform-specific postprocessing of `tempname`.
- Resource providers should call this method ONLY after successfully
- extracting a compressed resource. They must NOT call it on resources
- that are already in the filesystem.
- `tempname` is the current (temporary) name of the file, and `filename`
- is the name it will be renamed to by the caller after this routine
- returns.
- Metadata API
- ============
- The metadata API is used to access metadata resources bundled in a pluggable
- distribution. Metadata resources are virtual files or directories containing
- information about the distribution, such as might be used by an extensible
- application or framework to connect "plugins". Like other kinds of resources,
- metadata resource names are ``/``-separated and should not contain ``..`` or
- begin with a ``/``. You should not use ``os.path`` routines to manipulate
- resource paths.
- The metadata API is provided by objects implementing the ``IMetadataProvider``
- or ``IResourceProvider`` interfaces. ``Distribution`` objects implement this
- interface, as do objects returned by the ``get_provider()`` function:
- ``get_provider(package_or_requirement)``
- If a package name is supplied, return an ``IResourceProvider`` for the
- package. If a ``Requirement`` is supplied, resolve it by returning a
- ``Distribution`` from the current working set (searching the current
- ``Environment`` if necessary and adding the newly found ``Distribution``
- to the working set). If the named package can't be imported, or the
- ``Requirement`` can't be satisfied, an exception is raised.
- NOTE: if you use a package name rather than a ``Requirement``, the object
- you get back may not be a pluggable distribution, depending on the method
- by which the package was installed. In particular, "development" packages
- and "single-version externally-managed" packages do not have any way to
- map from a package name to the corresponding project's metadata. Do not
- write code that passes a package name to ``get_provider()`` and then tries
- to retrieve project metadata from the returned object. It may appear to
- work when the named package is in an ``.egg`` file or directory, but
- it will fail in other installation scenarios. If you want project
- metadata, you need to ask for a *project*, not a package.
- ``IMetadataProvider`` Methods
- -----------------------------
- The methods provided by objects (such as ``Distribution`` instances) that
- implement the ``IMetadataProvider`` or ``IResourceProvider`` interfaces are:
- ``has_metadata(name)``
- Does the named metadata resource exist?
- ``metadata_isdir(name)``
- Is the named metadata resource a directory?
- ``metadata_listdir(name)``
- List of metadata names in the directory (like ``os.listdir()``)
- ``get_metadata(name)``
- Return the named metadata resource as a string. The data is read in binary
- mode; i.e., the exact bytes of the resource file are returned.
- ``get_metadata_lines(name)``
- Yield named metadata resource as list of non-blank non-comment lines. This
- is short for calling ``yield_lines(provider.get_metadata(name))``. See the
- section on `yield_lines()`_ below for more information on the syntax it
- recognizes.
- ``run_script(script_name, namespace)``
- Execute the named script in the supplied namespace dictionary. Raises
- ``ResolutionError`` if there is no script by that name in the ``scripts``
- metadata directory. `namespace` should be a Python dictionary, usually
- a module dictionary if the script is being run as a module.
- Exceptions
- ==========
- ``pkg_resources`` provides a simple exception hierarchy for problems that may
- occur when processing requests to locate and activate packages::
- ResolutionError
- DistributionNotFound
- VersionConflict
- UnknownExtra
- ExtractionError
- ``ResolutionError``
- This class is used as a base class for the other three exceptions, so that
- you can catch all of them with a single "except" clause. It is also raised
- directly for miscellaneous requirement-resolution problems like trying to
- run a script that doesn't exist in the distribution it was requested from.
- ``DistributionNotFound``
- A distribution needed to fulfill a requirement could not be found.
- ``VersionConflict``
- The requested version of a project conflicts with an already-activated
- version of the same project.
- ``UnknownExtra``
- One of the "extras" requested was not recognized by the distribution it
- was requested from.
- ``ExtractionError``
- A problem occurred extracting a resource to the Python Egg cache. The
- following attributes are available on instances of this exception:
- manager
- The resource manager that raised this exception
- cache_path
- The base directory for resource extraction
- original_error
- The exception instance that caused extraction to fail
- Supporting Custom Importers
- ===========================
- By default, ``pkg_resources`` supports normal filesystem imports, and
- ``zipimport`` importers. If you wish to use the ``pkg_resources`` features
- with other (PEP 302-compatible) importers or module loaders, you may need to
- register various handlers and support functions using these APIs:
- ``register_finder(importer_type, distribution_finder)``
- Register `distribution_finder` to find distributions in ``sys.path`` items.
- `importer_type` is the type or class of a PEP 302 "Importer" (``sys.path``
- item handler), and `distribution_finder` is a callable that, when passed a
- path item, the importer instance, and an `only` flag, yields
- ``Distribution`` instances found under that path item. (The `only` flag,
- if true, means the finder should yield only ``Distribution`` objects whose
- ``location`` is equal to the path item provided.)
- See the source of the ``pkg_resources.find_on_path`` function for an
- example finder function.
- ``register_loader_type(loader_type, provider_factory)``
- Register `provider_factory` to make ``IResourceProvider`` objects for
- `loader_type`. `loader_type` is the type or class of a PEP 302
- ``module.__loader__``, and `provider_factory` is a function that, when
- passed a module object, returns an `IResourceProvider`_ for that module,
- allowing it to be used with the `ResourceManager API`_.
- ``register_namespace_handler(importer_type, namespace_handler)``
- Register `namespace_handler` to declare namespace packages for the given
- `importer_type`. `importer_type` is the type or class of a PEP 302
- "importer" (sys.path item handler), and `namespace_handler` is a callable
- with a signature like this::
- def namespace_handler(importer, path_entry, moduleName, module):
- # return a path_entry to use for child packages
- Namespace handlers are only called if the relevant importer object has
- already agreed that it can handle the relevant path item. The handler
- should only return a subpath if the module ``__path__`` does not already
- contain an equivalent subpath. Otherwise, it should return None.
- For an example namespace handler, see the source of the
- ``pkg_resources.file_ns_handler`` function, which is used for both zipfile
- importing and regular importing.
- IResourceProvider
- -----------------
- ``IResourceProvider`` is an abstract class that documents what methods are
- required of objects returned by a `provider_factory` registered with
- ``register_loader_type()``. ``IResourceProvider`` is a subclass of
- ``IMetadataProvider``, so objects that implement this interface must also
- implement all of the `IMetadataProvider Methods`_ as well as the methods
- shown here. The `manager` argument to the methods below must be an object
- that supports the full `ResourceManager API`_ documented above.
- ``get_resource_filename(manager, resource_name)``
- Return a true filesystem path for `resource_name`, coordinating the
- extraction with `manager`, if the resource must be unpacked to the
- filesystem.
- ``get_resource_stream(manager, resource_name)``
- Return a readable file-like object for `resource_name`.
- ``get_resource_string(manager, resource_name)``
- Return a string containing the contents of `resource_name`.
- ``has_resource(resource_name)``
- Does the package contain the named resource?
- ``resource_isdir(resource_name)``
- Is the named resource a directory? Return a false value if the resource
- does not exist or is not a directory.
- ``resource_listdir(resource_name)``
- Return a list of the contents of the resource directory, ala
- ``os.listdir()``. Requesting the contents of a non-existent directory may
- raise an exception.
- Note, by the way, that your provider classes need not (and should not) subclass
- ``IResourceProvider`` or ``IMetadataProvider``! These classes exist solely
- for documentation purposes and do not provide any useful implementation code.
- You may instead wish to subclass one of the `built-in resource providers`_.
- Built-in Resource Providers
- ---------------------------
- ``pkg_resources`` includes several provider classes that are automatically used
- where appropriate. Their inheritance tree looks like this::
- NullProvider
- EggProvider
- DefaultProvider
- PathMetadata
- ZipProvider
- EggMetadata
- EmptyProvider
- FileMetadata
- ``NullProvider``
- This provider class is just an abstract base that provides for common
- provider behaviors (such as running scripts), given a definition for just
- a few abstract methods.
- ``EggProvider``
- This provider class adds in some egg-specific features that are common
- to zipped and unzipped eggs.
- ``DefaultProvider``
- This provider class is used for unpacked eggs and "plain old Python"
- filesystem modules.
- ``ZipProvider``
- This provider class is used for all zipped modules, whether they are eggs
- or not.
- ``EmptyProvider``
- This provider class always returns answers consistent with a provider that
- has no metadata or resources. ``Distribution`` objects created without
- a ``metadata`` argument use an instance of this provider class instead.
- Since all ``EmptyProvider`` instances are equivalent, there is no need
- to have more than one instance. ``pkg_resources`` therefore creates a
- global instance of this class under the name ``empty_provider``, and you
- may use it if you have need of an ``EmptyProvider`` instance.
- ``PathMetadata(path, egg_info)``
- Create an ``IResourceProvider`` for a filesystem-based distribution, where
- `path` is the filesystem location of the importable modules, and `egg_info`
- is the filesystem location of the distribution's metadata directory.
- `egg_info` should usually be the ``EGG-INFO`` subdirectory of `path` for an
- "unpacked egg", and a ``ProjectName.egg-info`` subdirectory of `path` for
- a "development egg". However, other uses are possible for custom purposes.
- ``EggMetadata(zipimporter)``
- Create an ``IResourceProvider`` for a zipfile-based distribution. The
- `zipimporter` should be a ``zipimport.zipimporter`` instance, and may
- represent a "basket" (a zipfile containing multiple ".egg" subdirectories)
- a specific egg *within* a basket, or a zipfile egg (where the zipfile
- itself is a ".egg"). It can also be a combination, such as a zipfile egg
- that also contains other eggs.
- ``FileMetadata(path_to_pkg_info)``
- Create an ``IResourceProvider`` that provides exactly one metadata
- resource: ``PKG-INFO``. The supplied path should be a distutils PKG-INFO
- file. This is basically the same as an ``EmptyProvider``, except that
- requests for ``PKG-INFO`` will be answered using the contents of the
- designated file. (This provider is used to wrap ``.egg-info`` files
- installed by vendor-supplied system packages.)
- Utility Functions
- =================
- In addition to its high-level APIs, ``pkg_resources`` also includes several
- generally-useful utility routines. These routines are used to implement the
- high-level APIs, but can also be quite useful by themselves.
- Parsing Utilities
- -----------------
- ``parse_version(version)``
- Parsed a project's version string as defined by PEP 440. The returned
- value will be an object that represents the version. These objects may
- be compared to each other and sorted. The sorting algorithm is as defined
- by PEP 440 with the addition that any version which is not a valid PEP 440
- version will be considered less than any valid PEP 440 version and the
- invalid versions will continue sorting using the original algorithm.
- .. _yield_lines():
- ``yield_lines(strs)``
- Yield non-empty/non-comment lines from a string/unicode or a possibly-
- nested sequence thereof. If `strs` is an instance of ``basestring``, it
- is split into lines, and each non-blank, non-comment line is yielded after
- stripping leading and trailing whitespace. (Lines whose first non-blank
- character is ``#`` are considered comment lines.)
- If `strs` is not an instance of ``basestring``, it is iterated over, and
- each item is passed recursively to ``yield_lines()``, so that an arbitrarily
- nested sequence of strings, or sequences of sequences of strings can be
- flattened out to the lines contained therein. So for example, passing
- a file object or a list of strings to ``yield_lines`` will both work.
- (Note that between each string in a sequence of strings there is assumed to
- be an implicit line break, so lines cannot bridge two strings in a
- sequence.)
- This routine is used extensively by ``pkg_resources`` to parse metadata
- and file formats of various kinds, and most other ``pkg_resources``
- parsing functions that yield multiple values will use it to break up their
- input. However, this routine is idempotent, so calling ``yield_lines()``
- on the output of another call to ``yield_lines()`` is completely harmless.
- ``split_sections(strs)``
- Split a string (or possibly-nested iterable thereof), yielding ``(section,
- content)`` pairs found using an ``.ini``-like syntax. Each ``section`` is
- a whitespace-stripped version of the section name ("``[section]``")
- and each ``content`` is a list of stripped lines excluding blank lines and
- comment-only lines. If there are any non-blank, non-comment lines before
- the first section header, they're yielded in a first ``section`` of
- ``None``.
- This routine uses ``yield_lines()`` as its front end, so you can pass in
- anything that ``yield_lines()`` accepts, such as an open text file, string,
- or sequence of strings. ``ValueError`` is raised if a malformed section
- header is found (i.e. a line starting with ``[`` but not ending with
- ``]``).
- Note that this simplistic parser assumes that any line whose first nonblank
- character is ``[`` is a section heading, so it can't support .ini format
- variations that allow ``[`` as the first nonblank character on other lines.
- ``safe_name(name)``
- Return a "safe" form of a project's name, suitable for use in a
- ``Requirement`` string, as a distribution name, or a PyPI project name.
- All non-alphanumeric runs are condensed to single "-" characters, such that
- a name like "The $$$ Tree" becomes "The-Tree". Note that if you are
- generating a filename from this value you should combine it with a call to
- ``to_filename()`` so all dashes ("-") are replaced by underscores ("_").
- See ``to_filename()``.
- ``safe_version(version)``
- This will return the normalized form of any PEP 440 version, if the version
- string is not PEP 440 compatible than it is similar to ``safe_name()``
- except that spaces in the input become dots, and dots are allowed to exist
- in the output. As with ``safe_name()``, if you are generating a filename
- from this you should replace any "-" characters in the output with
- underscores.
- ``safe_extra(extra)``
- Return a "safe" form of an extra's name, suitable for use in a requirement
- string or a setup script's ``extras_require`` keyword. This routine is
- similar to ``safe_name()`` except that non-alphanumeric runs are replaced
- by a single underbar (``_``), and the result is lowercased.
- ``to_filename(name_or_version)``
- Escape a name or version string so it can be used in a dash-separated
- filename (or ``#egg=name-version`` tag) without ambiguity. You
- should only pass in values that were returned by ``safe_name()`` or
- ``safe_version()``.
- Platform Utilities
- ------------------
- ``get_build_platform()``
- Return this platform's identifier string. For Windows, the return value
- is ``"win32"``, and for Mac OS X it is a string of the form
- ``"macosx-10.4-ppc"``. All other platforms return the same uname-based
- string that the ``distutils.util.get_platform()`` function returns.
- This string is the minimum platform version required by distributions built
- on the local machine. (Backward compatibility note: setuptools versions
- prior to 0.6b1 called this function ``get_platform()``, and the function is
- still available under that name for backward compatibility reasons.)
- ``get_supported_platform()`` (New in 0.6b1)
- This is the similar to ``get_build_platform()``, but is the maximum
- platform version that the local machine supports. You will usually want
- to use this value as the ``provided`` argument to the
- ``compatible_platforms()`` function.
- ``compatible_platforms(provided, required)``
- Return true if a distribution built on the `provided` platform may be used
- on the `required` platform. If either platform value is ``None``, it is
- considered a wildcard, and the platforms are therefore compatible.
- Likewise, if the platform strings are equal, they're also considered
- compatible, and ``True`` is returned. Currently, the only non-equal
- platform strings that are considered compatible are Mac OS X platform
- strings with the same hardware type (e.g. ``ppc``) and major version
- (e.g. ``10``) with the `provided` platform's minor version being less than
- or equal to the `required` platform's minor version.
- ``get_default_cache()``
- Determine the default cache location for extracting resources from zipped
- eggs. This routine returns the ``PYTHON_EGG_CACHE`` environment variable,
- if set. Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of
- the user's "Application Data" directory. On all other systems, it returns
- ``os.path.expanduser("~/.python-eggs")`` if ``PYTHON_EGG_CACHE`` is not
- set.
- PEP 302 Utilities
- -----------------
- ``get_importer(path_item)``
- Retrieve a PEP 302 "importer" for the given path item (which need not
- actually be on ``sys.path``). This routine simulates the PEP 302 protocol
- for obtaining an "importer" object. It first checks for an importer for
- the path item in ``sys.path_importer_cache``, and if not found it calls
- each of the ``sys.path_hooks`` and caches the result if a good importer is
- found. If no importer is found, this routine returns an ``ImpWrapper``
- instance that wraps the builtin import machinery as a PEP 302-compliant
- "importer" object. This ``ImpWrapper`` is *not* cached; instead a new
- instance is returned each time.
- (Note: When run under Python 2.5, this function is simply an alias for
- ``pkgutil.get_importer()``, and instead of ``pkg_resources.ImpWrapper``
- instances, it may return ``pkgutil.ImpImporter`` instances.)
- File/Path Utilities
- -------------------
- ``ensure_directory(path)``
- Ensure that the parent directory (``os.path.dirname``) of `path` actually
- exists, using ``os.makedirs()`` if necessary.
- ``normalize_path(path)``
- Return a "normalized" version of `path`, such that two paths represent
- the same filesystem location if they have equal ``normalized_path()``
- values. Specifically, this is a shortcut for calling ``os.path.realpath``
- and ``os.path.normcase`` on `path`. Unfortunately, on certain platforms
- (notably Cygwin and Mac OS X) the ``normcase`` function does not accurately
- reflect the platform's case-sensitivity, so there is always the possibility
- of two apparently-different paths being equal on such platforms.
- History
- -------
- 0.6c9
- * Fix ``resource_listdir('')`` always returning an empty list for zipped eggs.
- 0.6c7
- * Fix package precedence problem where single-version eggs installed in
- ``site-packages`` would take precedence over ``.egg`` files (or directories)
- installed in ``site-packages``.
- 0.6c6
- * Fix extracted C extensions not having executable permissions under Cygwin.
- * Allow ``.egg-link`` files to contain relative paths.
- * Fix cache dir defaults on Windows when multiple environment vars are needed
- to construct a path.
- 0.6c4
- * Fix "dev" versions being considered newer than release candidates.
- 0.6c3
- * Python 2.5 compatibility fixes.
- 0.6c2
- * Fix a problem with eggs specified directly on ``PYTHONPATH`` on
- case-insensitive filesystems possibly not showing up in the default
- working set, due to differing normalizations of ``sys.path`` entries.
- 0.6b3
- * Fixed a duplicate path insertion problem on case-insensitive filesystems.
- 0.6b1
- * Split ``get_platform()`` into ``get_supported_platform()`` and
- ``get_build_platform()`` to work around a Mac versioning problem that caused
- the behavior of ``compatible_platforms()`` to be platform specific.
- * Fix entry point parsing when a standalone module name has whitespace
- between it and the extras.
- 0.6a11
- * Added ``ExtractionError`` and ``ResourceManager.extraction_error()`` so that
- cache permission problems get a more user-friendly explanation of the
- problem, and so that programs can catch and handle extraction errors if they
- need to.
- 0.6a10
- * Added the ``extras`` attribute to ``Distribution``, the ``find_plugins()``
- method to ``WorkingSet``, and the ``__add__()`` and ``__iadd__()`` methods
- to ``Environment``.
- * ``safe_name()`` now allows dots in project names.
- * There is a new ``to_filename()`` function that escapes project names and
- versions for safe use in constructing egg filenames from a Distribution
- object's metadata.
- * Added ``Distribution.clone()`` method, and keyword argument support to other
- ``Distribution`` constructors.
- * Added the ``DEVELOP_DIST`` precedence, and automatically assign it to
- eggs using ``.egg-info`` format.
- 0.6a9
- * Don't raise an error when an invalid (unfinished) distribution is found
- unless absolutely necessary. Warn about skipping invalid/unfinished eggs
- when building an Environment.
- * Added support for ``.egg-info`` files or directories with version/platform
- information embedded in the filename, so that system packagers have the
- option of including ``PKG-INFO`` files to indicate the presence of a
- system-installed egg, without needing to use ``.egg`` directories, zipfiles,
- or ``.pth`` manipulation.
- * Changed ``parse_version()`` to remove dashes before pre-release tags, so
- that ``0.2-rc1`` is considered an *older* version than ``0.2``, and is equal
- to ``0.2rc1``. The idea that a dash *always* meant a post-release version
- was highly non-intuitive to setuptools users and Python developers, who
- seem to want to use ``-rc`` version numbers a lot.
- 0.6a8
- * Fixed a problem with ``WorkingSet.resolve()`` that prevented version
- conflicts from being detected at runtime.
- * Improved runtime conflict warning message to identify a line in the user's
- program, rather than flagging the ``warn()`` call in ``pkg_resources``.
- * Avoid giving runtime conflict warnings for namespace packages, even if they
- were declared by a different package than the one currently being activated.
- * Fix path insertion algorithm for case-insensitive filesystems.
- * Fixed a problem with nested namespace packages (e.g. ``peak.util``) not
- being set as an attribute of their parent package.
- 0.6a6
- * Activated distributions are now inserted in ``sys.path`` (and the working
- set) just before the directory that contains them, instead of at the end.
- This allows e.g. eggs in ``site-packages`` to override unmanaged modules in
- the same location, and allows eggs found earlier on ``sys.path`` to override
- ones found later.
- * When a distribution is activated, it now checks whether any contained
- non-namespace modules have already been imported and issues a warning if
- a conflicting module has already been imported.
- * Changed dependency processing so that it's breadth-first, allowing a
- depender's preferences to override those of a dependee, to prevent conflicts
- when a lower version is acceptable to the dependee, but not the depender.
- * Fixed a problem extracting zipped files on Windows, when the egg in question
- has had changed contents but still has the same version number.
- 0.6a4
- * Fix a bug in ``WorkingSet.resolve()`` that was introduced in 0.6a3.
- 0.6a3
- * Added ``safe_extra()`` parsing utility routine, and use it for Requirement,
- EntryPoint, and Distribution objects' extras handling.
- 0.6a1
- * Enhanced performance of ``require()`` and related operations when all
- requirements are already in the working set, and enhanced performance of
- directory scanning for distributions.
- * Fixed some problems using ``pkg_resources`` w/PEP 302 loaders other than
- ``zipimport``, and the previously-broken "eager resource" support.
- * Fixed ``pkg_resources.resource_exists()`` not working correctly, along with
- some other resource API bugs.
- * Many API changes and enhancements:
- * Added ``EntryPoint``, ``get_entry_map``, ``load_entry_point``, and
- ``get_entry_info`` APIs for dynamic plugin discovery.
- * ``list_resources`` is now ``resource_listdir`` (and it actually works)
- * Resource API functions like ``resource_string()`` that accepted a package
- name and resource name, will now also accept a ``Requirement`` object in
- place of the package name (to allow access to non-package data files in
- an egg).
- * ``get_provider()`` will now accept a ``Requirement`` instance or a module
- name. If it is given a ``Requirement``, it will return a corresponding
- ``Distribution`` (by calling ``require()`` if a suitable distribution
- isn't already in the working set), rather than returning a metadata and
- resource provider for a specific module. (The difference is in how
- resource paths are interpreted; supplying a module name means resources
- path will be module-relative, rather than relative to the distribution's
- root.)
- * ``Distribution`` objects now implement the ``IResourceProvider`` and
- ``IMetadataProvider`` interfaces, so you don't need to reference the (no
- longer available) ``metadata`` attribute to get at these interfaces.
- * ``Distribution`` and ``Requirement`` both have a ``project_name``
- attribute for the project name they refer to. (Previously these were
- ``name`` and ``distname`` attributes.)
- * The ``path`` attribute of ``Distribution`` objects is now ``location``,
- because it isn't necessarily a filesystem path (and hasn't been for some
- time now). The ``location`` of ``Distribution`` objects in the filesystem
- should always be normalized using ``pkg_resources.normalize_path()``; all
- of the setuptools and EasyInstall code that generates distributions from
- the filesystem (including ``Distribution.from_filename()``) ensure this
- invariant, but if you use a more generic API like ``Distribution()`` or
- ``Distribution.from_location()`` you should take care that you don't
- create a distribution with an un-normalized filesystem path.
- * ``Distribution`` objects now have an ``as_requirement()`` method that
- returns a ``Requirement`` for the distribution's project name and version.
- * Distribution objects no longer have an ``installed_on()`` method, and the
- ``install_on()`` method is now ``activate()`` (but may go away altogether
- soon). The ``depends()`` method has also been renamed to ``requires()``,
- and ``InvalidOption`` is now ``UnknownExtra``.
- * ``find_distributions()`` now takes an additional argument called ``only``,
- that tells it to only yield distributions whose location is the passed-in
- path. (It defaults to False, so that the default behavior is unchanged.)
- * ``AvailableDistributions`` is now called ``Environment``, and the
- ``get()``, ``__len__()``, and ``__contains__()`` methods were removed,
- because they weren't particularly useful. ``__getitem__()`` no longer
- raises ``KeyError``; it just returns an empty list if there are no
- distributions for the named project.
- * The ``resolve()`` method of ``Environment`` is now a method of
- ``WorkingSet`` instead, and the ``best_match()`` method now uses a working
- set instead of a path list as its second argument.
- * There is a new ``pkg_resources.add_activation_listener()`` API that lets
- you register a callback for notifications about distributions added to
- ``sys.path`` (including the distributions already on it). This is
- basically a hook for extensible applications and frameworks to be able to
- search for plugin metadata in distributions added at runtime.
- 0.5a13
- * Fixed a bug in resource extraction from nested packages in a zipped egg.
- 0.5a12
- * Updated extraction/cache mechanism for zipped resources to avoid inter-
- process and inter-thread races during extraction. The default cache
- location can now be set via the ``PYTHON_EGGS_CACHE`` environment variable,
- and the default Windows cache is now a ``Python-Eggs`` subdirectory of the
- current user's "Application Data" directory, if the ``PYTHON_EGGS_CACHE``
- variable isn't set.
- 0.5a10
- * Fix a problem with ``pkg_resources`` being confused by non-existent eggs on
- ``sys.path`` (e.g. if a user deletes an egg without removing it from the
- ``easy-install.pth`` file).
- * Fix a problem with "basket" support in ``pkg_resources``, where egg-finding
- never actually went inside ``.egg`` files.
- * Made ``pkg_resources`` import the module you request resources from, if it's
- not already imported.
- 0.5a4
- * ``pkg_resources.AvailableDistributions.resolve()`` and related methods now
- accept an ``installer`` argument: a callable taking one argument, a
- ``Requirement`` instance. The callable must return a ``Distribution``
- object, or ``None`` if no distribution is found. This feature is used by
- EasyInstall to resolve dependencies by recursively invoking itself.
- 0.4a4
- * Fix problems with ``resource_listdir()``, ``resource_isdir()`` and resource
- directory extraction for zipped eggs.
- 0.4a3
- * Fixed scripts not being able to see a ``__file__`` variable in ``__main__``
- * Fixed a problem with ``resource_isdir()`` implementation that was introduced
- in 0.4a2.
- 0.4a1
- * Fixed a bug in requirements processing for exact versions (i.e. ``==`` and
- ``!=``) when only one condition was included.
- * Added ``safe_name()`` and ``safe_version()`` APIs to clean up handling of
- arbitrary distribution names and versions found on PyPI.
- 0.3a4
- * ``pkg_resources`` now supports resource directories, not just the resources
- in them. In particular, there are ``resource_listdir()`` and
- ``resource_isdir()`` APIs.
- * ``pkg_resources`` now supports "egg baskets" -- .egg zipfiles which contain
- multiple distributions in subdirectories whose names end with ``.egg``.
- Having such a "basket" in a directory on ``sys.path`` is equivalent to
- having the individual eggs in that directory, but the contained eggs can
- be individually added (or not) to ``sys.path``. Currently, however, there
- is no automated way to create baskets.
- * Namespace package manipulation is now protected by the Python import lock.
- 0.3a1
- * Initial release.
|