Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: tools/telemetry/third_party/modulegraph/doc/modulegraph.rst

Issue 1647513002: Delete tools/telemetry. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW
« no previous file with comments | « tools/telemetry/third_party/modulegraph/doc/license.rst ('k') | tools/telemetry/third_party/modulegraph/doc/util.rst » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698