| OLD | NEW |
| (Empty) |
| 1 :mod:`modulegraph.modulegraph` --- Find modules used by a script | |
| 2 ================================================================ | |
| 3 | |
| 4 .. module:: modulegraph.modulegraph | |
| 5 :synopsis: Find modules used by a script | |
| 6 | |
| 7 This module defines :class:`ModuleGraph`, which is used to find | |
| 8 the dependencies of scripts using bytecode analysis. | |
| 9 | |
| 10 A number of APIs in this module refer to filesystem path. Those paths can refer
to | |
| 11 files inside zipfiles (for example when there are zipped egg files on :data:`sys
.path`). | |
| 12 Filenames referring to entries in a zipfile are not marked any way, if ``"somepa
th.zip"`` | |
| 13 refers to a zipfile, that is ``"somepath.zip/embedded/file"`` will be used to re
fer to | |
| 14 ``embedded/file`` inside the zipfile. | |
| 15 | |
| 16 The actual graph | |
| 17 ---------------- | |
| 18 | |
| 19 .. class:: ModuleGraph([path[, excludes[, replace_paths[, implies[, graph[, debu
g]]]]]]) | |
| 20 | |
| 21 Create a new ModuleGraph object. Use the :meth:`run_script` method to add scr
ipts, | |
| 22 and their dependencies to the graph. | |
| 23 | |
| 24 :param path: Python search path to use, defaults to :data:`sys.path` | |
| 25 :param excludes: Iterable with module names that should not be included as a
dependency | |
| 26 :param replace_paths: List of pathname rewrites ``(old, new)``. When this arg
ument is | |
| 27 supplied the ``co_filename`` attributes of code objects get rewritten befor
e scanning | |
| 28 them for dependencies. | |
| 29 :param implies: Implied module dependencies, a mapping from a module name to
the list | |
| 30 of modules it depends on. Use this to tell modulegraph about dependencies t
hat cannot | |
| 31 be found by code inspection (such as imports from C code or using the :func
:`__import__` | |
| 32 function). | |
| 33 :param graph: A precreated :class:`Graph <altgraph.Graph.Graph>` object to us
e, the | |
| 34 default is to create a new one. | |
| 35 :param debug: The :class:`ObjectGraph <altgraph.ObjectGraph.ObjectGraph>` deb
ug level. | |
| 36 | |
| 37 | |
| 38 .. method:: run_script(pathname[, caller]) | |
| 39 | |
| 40 Create, and return, a node by path (not module name). The *pathname* should | |
| 41 refer to a Python source file and will be scanned for dependencies. | |
| 42 | |
| 43 The optional argument *caller* is the the node that calls this script, | |
| 44 and is used to add a reference in the graph. | |
| 45 | |
| 46 .. method:: import_hook(name[[, caller[, fromlist[, level, [, attr]]]]) | |
| 47 | |
| 48 Import a module and analyse its dependencies | |
| 49 | |
| 50 :arg name: The module name | |
| 51 :arg caller: The node that caused the import to happen | |
| 52 :arg fromlist: The list of names to import, this is an empty list for | |
| 53 ``import name`` and a list of names for ``from name import a, b, c``. | |
| 54 :arg level: The import level. The value should be ``-1`` for classical Pyt
hon 2 | |
| 55 imports, ``0`` for absolute imports and a positive number for relative impo
rts ( | |
| 56 where the value is the number of leading dots in the imported name). | |
| 57 :arg attr: Attributes for the graph edge. | |
| 58 | |
| 59 | |
| 60 .. method:: implyNodeReference(node, other, edgeData=None) | |
| 61 | |
| 62 Explictly mark that *node* depends on *other*. Other is either | |
| 63 a :class:`node <Node>` or the name of a module that will be | |
| 64 searched for as if it were an absolute import. | |
| 65 | |
| 66 | |
| 67 .. method:: createReference(fromnode, tonode[, edge_data]) | |
| 68 | |
| 69 Create a reference from *fromnode* to *tonode*, with optional edge data. | |
| 70 | |
| 71 The default for *edge_data* is ``"direct"``. | |
| 72 | |
| 73 .. method:: getReferences(fromnode) | |
| 74 | |
| 75 Yield all nodes that *fromnode* refers to. That is, all modules imported | |
| 76 by *fromnode*. | |
| 77 | |
| 78 Node :data:`None` is the root of the graph, and refers to all notes that were | |
| 79 explicitly imported by :meth:`run_script` or :meth:`import_hook`, unless you
use | |
| 80 an explicit parent with those methods. | |
| 81 | |
| 82 .. versionadded:: 0.11 | |
| 83 | |
| 84 .. method:: getReferers(tonode, collapse_missing_modules=True) | |
| 85 | |
| 86 Yield all nodes that refer to *tonode*. That is, all modules that import | |
| 87 *tonode*. | |
| 88 | |
| 89 If *collapse_missing_modules* is false this includes refererences from | |
| 90 :class:`MissingModule` nodes, otherwise :class:`MissingModule` nodes | |
| 91 are replaced by the "real" nodes that reference this missing node. | |
| 92 | |
| 93 .. versionadded:: 0.12 | |
| 94 | |
| 95 .. method:: foldReferences(pkgnode) | |
| 96 | |
| 97 Hide all submodule nodes for package *pkgnode* and add ingoing and outgoing | |
| 98 edges to *pkgnode* based on the edges from the submodule nodes. | |
| 99 | |
| 100 This can be used to simplify a module graph: after folding 'email' all | |
| 101 references to modules in the 'email' package are references to the package. | |
| 102 | |
| 103 .. versionadded: 0.11 | |
| 104 | |
| 105 .. method:: findNode(name) | |
| 106 | |
| 107 Find a node by identifier. If a node by that identifier exists, it will be r
eturned. | |
| 108 | |
| 109 If a lazy node exists by that identifier with no dependencies (excluded), it
will be | |
| 110 instantiated and returned. | |
| 111 | |
| 112 If a lazy node exists by that identifier with dependencies, it and its | |
| 113 dependencies will be instantiated and scanned for additional depende | |
| 114 | |
| 115 | |
| 116 | |
| 117 .. method:: create_xref([out]) | |
| 118 | |
| 119 Write an HTML file to the *out* stream (defaulting to :data:`sys.stdout`). | |
| 120 | |
| 121 The HTML file contains a textual description of the dependency graph. | |
| 122 | |
| 123 | |
| 124 | |
| 125 .. method:: graphreport([fileobj[, flatpackages]]) | |
| 126 | |
| 127 .. todo:: To be documented | |
| 128 | |
| 129 | |
| 130 | |
| 131 .. method:: report() | |
| 132 | |
| 133 Print a report to stdout, listing the found modules with their | |
| 134 paths, as well as modules that are missing, or seem to be missing. | |
| 135 | |
| 136 | |
| 137 Mostly internal methods | |
| 138 ....................... | |
| 139 | |
| 140 The methods in this section should be considered as methods for subclassing at b
est, | |
| 141 please let us know if you need these methods in your code as they are on track t
o be | |
| 142 made private methods before the 1.0 release. | |
| 143 | |
| 144 .. warning:: The methods in this section will be refactored in a future release, | |
| 145 the current architecture makes it unnecessarily hard to write proper tests. | |
| 146 | |
| 147 .. method:: determine_parent(caller) | |
| 148 | |
| 149 Returns the node of the package root voor *caller*. If *caller* is a package | |
| 150 this is the node itself, if the node is a module in a package this is the | |
| 151 node of for the package and otherwise the *caller* is not a package and | |
| 152 the result is :data:`None`. | |
| 153 | |
| 154 .. method:: find_head_package(parent, name[, level]) | |
| 155 | |
| 156 .. todo:: To be documented | |
| 157 | |
| 158 | |
| 159 .. method:: load_tail(mod, tail) | |
| 160 | |
| 161 This method is called to load the rest of a dotted name after loading the roo
t | |
| 162 of a package. This will import all intermediate modules as well (using | |
| 163 :meth:`import_module`), and returns the module :class:`node <Node>` for the | |
| 164 requested node. | |
| 165 | |
| 166 .. note:: When *tail* is empty this will just return *mod*. | |
| 167 | |
| 168 :arg mod: A start module (instance of :class:`Node`) | |
| 169 :arg tail: The rest of a dotted name, can be empty | |
| 170 :raise ImportError: When the requested (or one of its parents) module cannot
be found | |
| 171 :returns: the requested module | |
| 172 | |
| 173 | |
| 174 | |
| 175 .. method:: ensure_fromlist(m, fromlist) | |
| 176 | |
| 177 Yield all submodules that would be imported when importing *fromlist* | |
| 178 from *m* (using ``from m import fromlist...``). | |
| 179 | |
| 180 *m* must be a package and not a regular module. | |
| 181 | |
| 182 .. method:: find_all_submodules(m) | |
| 183 | |
| 184 Yield the filenames for submodules of in the same package as *m*. | |
| 185 | |
| 186 | |
| 187 | |
| 188 .. method:: import_module(partname, fqname, parent) | |
| 189 | |
| 190 Perform import of the module with basename *partname* (``path``) and | |
| 191 full name *fqname* (``os.path``). Import is performed by *parent*. | |
| 192 | |
| 193 This will create a reference from the parent node to the | |
| 194 module node and will load the module node when it is not already | |
| 195 loaded. | |
| 196 | |
| 197 | |
| 198 | |
| 199 .. method:: load_module(fqname, fp, pathname, (suffix, mode, type)) | |
| 200 | |
| 201 Load the module named *fqname* from the given *pathame*. The | |
| 202 argument *fp* is either :data:`None`, or a stream where the | |
| 203 code for the Python module can be loaded (either byte-code or | |
| 204 the source code). The *(suffix, mode, type)* tuple are the | |
| 205 suffix of the source file, the open mode for the file and the | |
| 206 type of module. | |
| 207 | |
| 208 Creates a node of the right class and processes the dependencies | |
| 209 of the :class:`node <Node>` by scanning the byte-code for the node. | |
| 210 | |
| 211 Returns the resulting :class:`node <Node>`. | |
| 212 | |
| 213 | |
| 214 | |
| 215 .. method:: scan_code(code, m) | |
| 216 | |
| 217 Scan the *code* object for module *m* and update the dependencies of | |
| 218 *m* using the import statemets found in the code. | |
| 219 | |
| 220 This will automaticly scan the code for nested functions, generator | |
| 221 expressions and list comprehensions as well. | |
| 222 | |
| 223 | |
| 224 | |
| 225 .. method:: load_package(fqname, pathname) | |
| 226 | |
| 227 Load a package directory. | |
| 228 | |
| 229 | |
| 230 | |
| 231 .. method:: find_module(name, path[, parent]) | |
| 232 | |
| 233 Locates a module named *name* that is not yet part of the | |
| 234 graph. This method will raise :exc:`ImportError` when | |
| 235 the module cannot be found or when it is already part | |
| 236 of the graph. The *name* can not be a dotted name. | |
| 237 | |
| 238 The *path* is the search path used, or :data:`None` to | |
| 239 use the default path. | |
| 240 | |
| 241 When the *parent* is specified *name* refers to a | |
| 242 subpackage of *parent*, and *path* should be the | |
| 243 search path of the parent. | |
| 244 | |
| 245 Returns the result of the global function | |
| 246 :func:`find_module <modulegraph.modulegraph.find_module>`. | |
| 247 | |
| 248 | |
| 249 .. method:: itergraphreport([name[, flatpackages]]) | |
| 250 | |
| 251 .. todo:: To be documented | |
| 252 | |
| 253 | |
| 254 | |
| 255 .. method:: replace_paths_in_code(co) | |
| 256 | |
| 257 Replace the filenames in code object *co* using the *replace_paths* value tha
t | |
| 258 was passed to the contructor. Returns the rewritten code object. | |
| 259 | |
| 260 | |
| 261 | |
| 262 .. method:: calc_setuptools_nspackages() | |
| 263 | |
| 264 Returns a mapping from package name to a list of paths where that package | |
| 265 can be found in ``--single-version-externally-managed`` form. | |
| 266 | |
| 267 This method is used to be able to find those packages: these use | |
| 268 a magic ``.pth`` file to ensure that the package is added to :data:`sys.path`
, | |
| 269 as they do not contain an ``___init__.py`` file. | |
| 270 | |
| 271 Packages in this form are used by system packages and the "pip" | |
| 272 installer. | |
| 273 | |
| 274 | |
| 275 Graph nodes | |
| 276 ----------- | |
| 277 | |
| 278 The :class:`ModuleGraph` contains nodes that represent the various types of modu
les. | |
| 279 | |
| 280 .. class:: Alias(value) | |
| 281 | |
| 282 This is a subclass of string that is used to mark module aliases. | |
| 283 | |
| 284 | |
| 285 | |
| 286 .. class:: Node(identifier) | |
| 287 | |
| 288 Base class for nodes, which provides the common functionality. | |
| 289 | |
| 290 Nodes can by used as mappings for storing arbitrary data in the node. | |
| 291 | |
| 292 Nodes are compared by comparing their *identifier*. | |
| 293 | |
| 294 .. data:: debug | |
| 295 | |
| 296 Debug level (integer) | |
| 297 | |
| 298 .. data:: graphident | |
| 299 | |
| 300 The node identifier, this is the value of the *identifier* argument | |
| 301 to the constructor. | |
| 302 | |
| 303 .. data:: identifier | |
| 304 | |
| 305 The node identifier, this is the value of the *identifier* argument | |
| 306 to the constructor. | |
| 307 | |
| 308 .. data:: filename | |
| 309 | |
| 310 The filename associated with this node. | |
| 311 | |
| 312 .. data:: packagepath | |
| 313 | |
| 314 The value of ``__path__`` for this node. | |
| 315 | |
| 316 .. data:: code | |
| 317 | |
| 318 The :class:`code object <types.CodeObject>` associated with this node | |
| 319 | |
| 320 .. data:: globalnames | |
| 321 | |
| 322 The set of global names that are assigned to in this module. This | |
| 323 includes those names imported through startimports of Python modules. | |
| 324 | |
| 325 .. data:: startimports | |
| 326 | |
| 327 The set of startimports this module did that could not be resolved, | |
| 328 ie. a startimport from a non-Python module. | |
| 329 | |
| 330 | |
| 331 .. method:: __contains__(name) | |
| 332 | |
| 333 Return if there is a value associated with *name*. | |
| 334 | |
| 335 This method is usually accessed as ``name in aNode``. | |
| 336 | |
| 337 .. method:: __setitem__(name, value) | |
| 338 | |
| 339 Set the value of *name* to *value*. | |
| 340 | |
| 341 This method is usually accessed as ``aNode[name] = value``. | |
| 342 | |
| 343 .. method:: __getitem__(name) | |
| 344 | |
| 345 Returns the value of *name*, raises :exc:`KeyError` when | |
| 346 it cannot be found. | |
| 347 | |
| 348 This method is usually accessed as ``value = aNode[name]``. | |
| 349 | |
| 350 .. method:: get(name[, default]) | |
| 351 | |
| 352 Returns the value of *name*, or the default value when it | |
| 353 cannot be found. The *default* is :data:`None` when not specified. | |
| 354 | |
| 355 .. method:: infoTuple() | |
| 356 | |
| 357 Returns a tuple with information used in the :func:`repr` | |
| 358 output for the node. Subclasses can add additional informations | |
| 359 to the result. | |
| 360 | |
| 361 | |
| 362 .. class:: AliasNode (name, node) | |
| 363 | |
| 364 A node that represents an alias from a name to another node. | |
| 365 | |
| 366 The value of attribute *graphident* for this node will be the | |
| 367 value of *name*, the other :class:`Node` attributed are | |
| 368 references to those attributed in *node*. | |
| 369 | |
| 370 .. class:: BadModule(identifier) | |
| 371 | |
| 372 Base class for nodes that should be ignored for some reason | |
| 373 | |
| 374 .. class:: ExcludedModule(identifier) | |
| 375 | |
| 376 A module that is explicitly excluded. | |
| 377 | |
| 378 .. class:: MissingModule(identifier) | |
| 379 | |
| 380 A module that is imported but cannot be located. | |
| 381 | |
| 382 | |
| 383 | |
| 384 .. class:: Script(filename) | |
| 385 | |
| 386 A python script. | |
| 387 | |
| 388 .. data:: filename | |
| 389 | |
| 390 The filename for the script | |
| 391 | |
| 392 .. class:: BaseModule(name[, filename[, path]]) | |
| 393 | |
| 394 The base class for actual modules. The *name* is | |
| 395 the possibly dotted module name, *filename* is the | |
| 396 filesystem path to the module and *path* is the | |
| 397 value of ``__path__`` for the module. | |
| 398 | |
| 399 .. data:: graphident | |
| 400 | |
| 401 The name of the module | |
| 402 | |
| 403 .. data:: filename | |
| 404 | |
| 405 The filesystem path to the module. | |
| 406 | |
| 407 .. data:: path | |
| 408 | |
| 409 The value of ``__path__`` for this module. | |
| 410 | |
| 411 .. class:: BuiltinModule(name) | |
| 412 | |
| 413 A built-in module (on in :data:`sys.builtin_module_names`). | |
| 414 | |
| 415 .. class:: SourceModule(name) | |
| 416 | |
| 417 A module for which the python source code is available. | |
| 418 | |
| 419 .. class:: InvalidSourceModule(name) | |
| 420 | |
| 421 A module for which the python source code is available, but where | |
| 422 that source code cannot be compiled (due to syntax errors). | |
| 423 | |
| 424 This is a subclass of :class:`SourceModule`. | |
| 425 | |
| 426 .. versionadded:: 0.12 | |
| 427 | |
| 428 .. class:: CompiledModule(name) | |
| 429 | |
| 430 A module for which only byte-code is available. | |
| 431 | |
| 432 .. class:: Package(name) | |
| 433 | |
| 434 Represents a python package | |
| 435 | |
| 436 .. class:: NamespacePackage(name) | |
| 437 | |
| 438 Represents a python namespace package. | |
| 439 | |
| 440 This is a subclass of :class:`Package`. | |
| 441 | |
| 442 .. class:: Extension(name) | |
| 443 | |
| 444 A native extension | |
| 445 | |
| 446 | |
| 447 .. warning:: A number of other node types are defined in the module. Those modul
es aren't | |
| 448 used by modulegraph and will be removed in a future version. | |
| 449 | |
| 450 | |
| 451 Edge data | |
| 452 --------- | |
| 453 | |
| 454 The edges in a module graph by default contain information about the edge, repre
sented | |
| 455 by an instance of :class:`DependencyInfo`. | |
| 456 | |
| 457 .. class:: DependencyInfo(conditional, function, tryexcept, fromlist) | |
| 458 | |
| 459 This class is a :func:`namedtuple <collections.namedtuple>` for representing | |
| 460 the information on a dependency between two modules. | |
| 461 | |
| 462 All attributes can be used to deduce if a dependency is essential or not, and | |
| 463 are particularly useful when reporting on missing modules (dependencies on | |
| 464 :class:`MissingModule`). | |
| 465 | |
| 466 .. data:: fromlist | |
| 467 | |
| 468 A boolean that is true iff the target of the edge is named in the "import" | |
| 469 list of a "from" import ("from package import module"). | |
| 470 | |
| 471 When the target module is imported multiple times this attribute is false | |
| 472 unless all imports are in "import" list of a "from" import. | |
| 473 | |
| 474 .. data:: function | |
| 475 | |
| 476 A boolean that is true iff the import is done inside a function definition
, | |
| 477 and is false for imports in module scope (or class scope for classes that | |
| 478 aren't definined in a function). | |
| 479 | |
| 480 .. data:: tryexcept | |
| 481 | |
| 482 A boolean that is true iff the import that is done in the "try" or "except
" | |
| 483 block of a try statement (but not in the "else" block). | |
| 484 | |
| 485 .. data:: conditional | |
| 486 | |
| 487 A boolean that is true iff the import is done in either block of an "if" | |
| 488 statement. | |
| 489 | |
| 490 When the target of the edge is imported multiple times the :data:`function`, | |
| 491 :data:`tryexcept` and :data:`conditional` attributes of all imports are | |
| 492 merged: when there is an import where all these attributes are false the | |
| 493 attributes are false, otherwise each attribute is set to true if it is | |
| 494 true for at least one of the imports. | |
| 495 | |
| 496 For example, when a module is imported both in a try-except statement and | |
| 497 furthermore is imported in a function (in two separate statements), | |
| 498 both :data:`tryexcept` and :data:`function` will be true. But if there | |
| 499 is a third unconditional toplevel import for that module as well all | |
| 500 three attributes are false. | |
| 501 | |
| 502 .. warning:: | |
| 503 | |
| 504 All attributes but :data:`fromlist` will be false when the source of | |
| 505 a dependency is scanned from a byte-compiled module instead of a python | |
| 506 source file. The :data:`fromlist` attribute will stil be set correctly. | |
| 507 | |
| 508 Utility functions | |
| 509 ----------------- | |
| 510 | |
| 511 .. function:: find_module(name[, path]) | |
| 512 | |
| 513 A version of :func:`imp.find_module` that works with zipped packages (and oth
er | |
| 514 :pep:`302` importers). | |
| 515 | |
| 516 .. function:: moduleInfoForPath(path) | |
| 517 | |
| 518 Return the module name, readmode and type for the file at *path*, or | |
| 519 None if it doesn't seem to be a valid module (based on its name). | |
| 520 | |
| 521 .. function:: addPackagePath(packagename, path) | |
| 522 | |
| 523 Add *path* to the value of ``__path__`` for the package named *packagename*. | |
| 524 | |
| 525 .. function:: replacePackage(oldname, newname) | |
| 526 | |
| 527 Rename *oldname* to *newname* when it is found by the module finder. This | |
| 528 is used as a workaround for the hack that the ``_xmlplus`` package uses | |
| 529 to inject itself in the ``xml`` namespace. | |
| 530 | |
| 531 | |
| OLD | NEW |