Overview
Comment:update docs
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 33c3bc16bbe751216415710fe11fd32d09ac46676c32dc777560f7e3b1ca1e7c
User & Date: mario on 2022-10-28 21:59:24
Other Links: manifest | tags
Context
2022-10-28
22:31
introduce ConfigList() for config: key access check-in: fec593dcbd user: mario tags: trunk
21:59
update docs check-in: 33c3bc16bb user: mario tags: trunk
08:42
add graphics to docs check-in: e8bd4d1278 user: mario tags: trunk
Changes

Modified html/flit.html from [a3bfda8900] to [105608d01f].

1
2
3
4
5
6
7
8


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25










26
27
28
29
30
31
32
1
2
3
4
5
6
7

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42






-
+
+
















-
+
+
+
+
+
+
+
+
+
+







<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>pluginconf.flit API documentation</title>
<meta name="description" content="monkeypatches flint to use pluginconf sources for packaging …" />
<meta name="description" content="monkeypatches flit to use pluginconf sources for packaging with a
`pyproject.toml` like: …" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>pluginconf.flit</code></h1>
</header>
<section id="section-intro">
<p>monkeypatches flint to use pluginconf sources for packaging</p>
<p>monkeypatches flit to use pluginconf sources for packaging with a
<code>pyproject.toml</code> like:</p>
<pre><code>[build-system]
requires = ["pluginconf", "flit"]
build-backend = "pluginconf.flit"

[project]
name = "foobar"
</code></pre>
<p>Can be invoked per <code>flit-pluginconf build</code> or <code>python -m build</code>.</p>
<p><img alt="flit - can't believe it's not setup.py!!" src="https://i.imgur.com/82cTkcq.gif"></p>
</section>
<section>
</section>
<section>
</section>
<section>

Modified html/index.html from [9982a8f1ca] to [381d830594].

19
20
21
22
23
24
25







26
27
28
29
30
31
32
33
34
35
36
37


38
39
40
41
42
43
44
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

44
45
46
47
48
49
50
51
52






+
+
+
+
+
+
+











-
+
+







<main>
<article id="content">
<header>
<h1 class="title">Package <code>pluginconf</code></h1>
</header>
<section id="section-intro">
<p>Plugin meta extraction and module lookup</p>
<ul>
<li>Main function <code>plugin_meta(filename=…)</code> unpacks
<a href="https://fossil.include-once.org/pluginspec/">meta fields</a>
into dictionaries.</li>
<li>Other utility code is about module location, but requires
some initialization.</li>
</ul>
<p><img alt="#" src="https://fossil.include-once.org/pluginspec/logo"></p>
</section>
<section>
<h2 class="section-title" id="header-submodules">Sub-modules</h2>
<dl>
<dt><code class="name"><a title="pluginconf.depends" href="depends.html">pluginconf.depends</a></code></dt>
<dd>
<div class="desc"><p>Dependency validation and consistency checker for updates</p></div>
</dd>
<dt><code class="name"><a title="pluginconf.flit" href="flit.html">pluginconf.flit</a></code></dt>
<dd>
<div class="desc"><p>monkeypatches flint to use pluginconf sources for packaging …</p></div>
<div class="desc"><p>monkeypatches flit to use pluginconf sources for packaging with a
<code>pyproject.toml</code> like: …</p></div>
</dd>
<dt><code class="name"><a title="pluginconf.gui" href="gui.html">pluginconf.gui</a></code></dt>
<dd>
<div class="desc"><p>PySimpleGUI window to populate config dict via plugin options …</p></div>
</dd>
<dt><code class="name"><a title="pluginconf.setup" href="setup.html">pluginconf.setup</a></code></dt>
<dd>
65
66
67
68
69
70
71













72
73
74
75
76
77
78
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99






+
+
+
+
+
+
+
+
+
+
+
+
+







<dt><strong><code>conf_plugins</code></strong> :&ensp;<code>dict : input/output</code></dt>
<dd>enable status based on plugin state/priority:</dd>
<dt><strong><code>meta</code></strong> :&ensp;<code>dict</code></dt>
<dd>input plugin meta data (invoke once per plugin)</dd>
<dt><strong><code>module</code></strong> :&ensp;<code>str</code></dt>
<dd>basename of meta: blocks plugin file</dd>
</dl></div>
</dd>
<dt id="pluginconf.all_plugin_meta"><code class="name flex">
<span>def <span class="ident">all_plugin_meta</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>This is a trivial wrapper to assemble a complete dictionary
of available/installed plugins. It associates each plugin name
with a its meta{} fields.</p>
<h2 id="returns">Returns</h2>
<dl>
<dt><strong><code>dict</code></strong> :&ensp;<code>names to meta data dict</code></dt>
<dd>&nbsp;</dd>
</dl></div>
</dd>
<dt id="pluginconf.get_data"><code class="name flex">
<span>def <span class="ident">get_data</span></span>(<span>filename, decode=False, gzip=False, file_base=None)</span>
</code></dt>
<dd>
<div class="desc"><p>Fetches file content from install path or from within PYZ
archive. This is just an alias and convenience wrapper for
116
117
118
119
120
121
122
123

124
125

126
127

128
129

130
131

132
133

134
135
136
137

138
139
140
141
142
143
















144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162

163
164
165







166
167
168
169
170
171
172
173
174
175
137
138
139
140
141
142
143

144
145

146
147

148
149

150
151

152
153

154
155
156
157

158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220






-
+

-
+

-
+

-
+

-
+

-
+



-
+






+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



















+



+
+
+
+
+
+
+










<span>def <span class="ident">plugin_meta</span></span>(<span>filename=None, src=None, module=None, frame=1, **kwargs)</span>
</code></dt>
<dd>
<div class="desc"><p>Extract plugin meta data block from different sources:</p>
<h2 id="parameters">Parameters</h2>
<dl>
<dt><strong><code>filename</code></strong> :&ensp;<code>str</code></dt>
<dd>read literal files, or .pyz contents</dd>
<dd>Read literal files, or .pyz contents.</dd>
<dt><strong><code>src</code></strong> :&ensp;<code>str</code></dt>
<dd>from already uncovered script code</dd>
<dd>From already uncovered script code.</dd>
<dt><strong><code>module</code></strong> :&ensp;<code>str</code></dt>
<dd>lookup per pkgutil, from plugin_base or top-level modules</dd>
<dd>Lookup per pkgutil, from plugin_base or top-level modules.</dd>
<dt><strong><code>frame</code></strong> :&ensp;<code>int</code></dt>
<dd>extract comment header of caller (default)</dd>
<dd>Extract comment header of caller (default).</dd>
<dt><strong><code>extra_base</code></strong> :&ensp;<code>list</code></dt>
<dd>additional search directories</dd>
<dd>Additional search directories.</dd>
<dt><strong><code>max_length</code></strong> :&ensp;<code>list</code></dt>
<dd>maximum size to read from files</dd>
<dd>Maximum size to read from files.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
<dt><strong><code>dict</code></strong> :&ensp;<code>key-value pairs</code> of <code>comment fields, config: preparsed</code></dt>
<dt><strong><code>dict</code></strong> :&ensp;<code>Extracted comment fields, with config: preparsed</code></dt>
<dd>&nbsp;</dd>
</dl></div>
</dd>
</dl>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="pluginconf.PluginMeta"><code class="flex name class">
<span>class <span class="ident">PluginMeta</span></span>
<span>(</span><span>*args, **kwargs)</span>
</code></dt>
<dd>
<div class="desc"><p>Plugin meta data, as dictionary with alternative .property access.
Returned for each <code><a title="pluginconf.plugin_meta" href="#pluginconf.plugin_meta">plugin_meta()</a></code> result, and config: options.
Non-existent .fieldnames just resolve to <code>""</code>.</p></div>
<h3>Ancestors</h3>
<ul class="hlist">
<li>builtins.dict</li>
</ul>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
<ul>
<li><code><a title="pluginconf.depends" href="depends.html">pluginconf.depends</a></code></li>
<li><code><a title="pluginconf.flit" href="flit.html">pluginconf.flit</a></code></li>
<li><code><a title="pluginconf.gui" href="gui.html">pluginconf.gui</a></code></li>
<li><code><a title="pluginconf.setup" href="setup.html">pluginconf.setup</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="pluginconf.add_plugin_defaults" href="#pluginconf.add_plugin_defaults">add_plugin_defaults</a></code></li>
<li><code><a title="pluginconf.all_plugin_meta" href="#pluginconf.all_plugin_meta">all_plugin_meta</a></code></li>
<li><code><a title="pluginconf.get_data" href="#pluginconf.get_data">get_data</a></code></li>
<li><code><a title="pluginconf.module_list" href="#pluginconf.module_list">module_list</a></code></li>
<li><code><a title="pluginconf.plugin_meta" href="#pluginconf.plugin_meta">plugin_meta</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="pluginconf.PluginMeta" href="#pluginconf.PluginMeta">PluginMeta</a></code></h4>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>

Modified pluginconf/__init__.py from [9d008566c9] to [40c0c39483].

78
79
80
81
82
83
84






85
86
87
88
89
90
91
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97






+
+
+
+
+
+







#
# Using a plugin_state config dictionary in most cases can just list
# module basenames, if there's only one namespace to manage. (Plugin
# names unique across project.)

"""
Plugin meta extraction and module lookup

 * Main function `plugin_meta(filename=…)` unpacks
   [meta fields](https://fossil.include-once.org/pluginspec/)
   into dictionaries.
 * Other utility code is about module location, but requires
   some initialization.

![#](https://fossil.include-once.org/pluginspec/logo)
"""


import sys
import os
103
104
105
106
107
108
109
110


111
112
113
114
115
116
117
109
110
111
112
113
114
115

116
117
118
119
120
121
122
123
124






-
+
+







        def gzip_decode(bytestr):
            """ haphazard workaround """
            return zlib.decompress(bytestr, 16 + zlib.MAX_WBITS)
import zipfile
import argparse

__all__ = [
    "get_data", "module_list", "plugin_meta", "add_plugin_defaults"
    "plugin_meta", "get_data", "module_list", "add_plugin_defaults",
    "PluginMeta", "all_plugin_meta",
]


# Injectables
# ‾‾‾‾‾‾‾‾‾‾‾
""" injectable callback function for logging """
log_ERR = lambda *x: None
249
250
251
252
253
254
255
256

257
258

259
260

261
262

263
264

265
266

267
268
269
270

271
272
273
274
275
276
277
256
257
258
259
260
261
262

263
264

265
266

267
268

269
270

271
272

273
274
275
276

277
278
279
280
281
282
283
284






-
+

-
+

-
+

-
+

-
+

-
+



-
+







def plugin_meta(filename=None, src=None, module=None, frame=1, **kwargs):
    """
    Extract plugin meta data block from different sources:

    Parameters
    ----------
    filename : str
        read literal files, or .pyz contents
        Read literal files, or .pyz contents.
    src : str
        from already uncovered script code
        From already uncovered script code.
    module : str
        lookup per pkgutil, from plugin_base or top-level modules
        Lookup per pkgutil, from plugin_base or top-level modules.
    frame : int
        extract comment header of caller (default)
        Extract comment header of caller (default).
    extra_base : list
        additional search directories
        Additional search directories.
    max_length : list
        maximum size to read from files
        Maximum size to read from files.

    Returns
    -------
    dict : key-value pairs of comment fields, config: preparsed
    dict : Extracted comment fields, with config: preparsed
    """

    # Try via pkgutil first,
    # find any plugins.* modules, or main packages
    if module:
        filename = module
        for base in plugin_base + kwargs.get("extra_base", []):
312
313
314
315
316
317
318
319

320
321
322
323
324
325
326
319
320
321
322
323
324
325

326
327
328
329
330
331
332
333






-
+







# Comment and field extraction logic
# ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
@renamed_arguments({"fn": "filename"})
def plugin_meta_extract(src="", filename=None, literal=False):
    """
    Finds the first comment block. Splits key:value header
    fields from comment. Turns everything into an dict, with
    some stub fields if absent.
    some stub fields if absent. Dashes substituted for underscores.

    Parameters
    ----------
    src : str
        from existing source code
    filename : str
        set filename attribute
355
356
357
358
359
360
361
362

363
364
365
366
367
368
369
370

371




372
373
374
375

376
377
378
379
380
381
382
362
363
364
365
366
367
368

369
370
371
372
373
374
375
376
377
378

379
380
381
382
383
384
385

386
387
388
389
390
391
392
393






-
+








+
-
+
+
+
+



-
+







    # Split comment block
    if src.find("\n\n") > 0:
        src, meta["doc"] = src.split("\n\n", 1)

    # Turn key:value lines into dictionary
    for field in rx.keyval.findall(src):
        meta[field[0].replace("-", "_")] = field[1].strip()
        meta[field[0].replace("-", "_").lower()] = field[1].strip()
    meta["config"] = plugin_meta_config(meta.get("config") or "")

    return PluginMeta(meta)


# Dict wrapper
# ‾‾‾‾‾‾‾‾‾‾‾‾
class PluginMeta(dict):
    """
    """ Plugin meta data, convenience dict with property access """
    Plugin meta data, as dictionary with alternative .property access.
    Returned for each `plugin_meta()` result, and config: options.
    Non-existent .fieldnames just resolve to `""`.
    """

    def __getattr__(self, key):
        """ Return [key] for .property access, else None """
        return self.get(key)
        return self.get(key, "")

    def __hasattr__(self, key):
        """ Return [key] for .property access, else None """
        return key in self


# Unpack config: structures

Modified pluginconf/flit.py from [2a83c6ef38] to [fd547f8d0f].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

39




40



41
42





43
44
45
46
47
48

49
50
51
52
53
54
55
1
2
3
4
5
6
7
8
9
10
11
12
13











14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

29
30
31
32
33
34
35
36


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55












-
-
-
-
-
-
-
-
-
-
-














+
-
+
+
+
+

+
+
+
-
-
+
+
+
+
+






+







# encoding: utf-8
# api: pep517
# title: flit backend
# description: wraps flit_core.buildapi
# version: 0.3
# depends: python:flit (>=3.0, <4.0)
# license: BSD-3-Clause
# priority: extra
# pylint: disable=unused-import, wrong-import-position, wrong-import-order
#
# As alternative to pluginconf.setup, this module is using flit as
# pep517 build backend. But adding automagic field lookup of course.
#
# It can be invoked per `flit-pluginconfig build` and advises
# a `pyproject.toml` like:
#
#       [build-system]
#       requires = ["pluginconf>=0.8", "flit>=3.2", "setuptools"]
#       build-backend = "pluginconf.flit"
#
#       [project]
#       name = "foobar"
#       dynamic = ["version", "description"]
#
# Injecting attributes between ini reading and parameter collection
# turned out easier than expanding on flit_core.buildapi functions.
# And lastly, this just chains to flit.main() to handle collect and
# build tasks.
#
# Dynamic handling currently violates all the package tool requirements:
# <https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#dynamic>
# But it does have some interesting side effects.
#  * mixes the override text and file inclusion
#    license = { file = "LICENSE" }
#  * for setuptools compat a long dynamic field is required (but flit hates it)
#    dynamic = ["version", "description", "readme", "requires-python",
#              "license", "keywords", "classifiers", "urls", "entry-points"]
# Not sure yet if the pyproject.toml specs allow for reconcilation here.
# <https://github.com/pypa/flit/issues/605>
#

"""
monkeypatches flit to use pluginconf sources for packaging with a
`pyproject.toml` like:

    [build-system]
    requires = ["pluginconf", "flit"]
    build-backend = "pluginconf.flit"
"""
monkeypatches flint to use pluginconf sources for packaging

    [project]
    name = "foobar"

Can be invoked per `flit-pluginconf build` or `python -m build`.

![flit - can't believe it's not setup.py!!](https://i.imgur.com/82cTkcq.gif)
"""


import sys
import os
import re
import functools

import flit_core.common
import flit_core.config

import pluginconf
170
171
172
173
174
175
176

177
178
179
180
181
182
183

184
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186






+







+

    get_requires_for_build_editable,
    prepare_metadata_for_build_wheel,
    prepare_metadata_for_build_editable,
    build_wheel,
    build_editable,
    build_sdist,
)
import flit_core.buildapi  # also permit backend="pluginconf.flit:buildapi"

del inject  # omit from docs

#-- invocation point
from flit import main

if __name__ == "__main__":
    # os.environ["FLIT_ALLOW_INVALID"] = 1  # alternative to patch_flit_config?
    main(sys.argv)

Modified test/basic.py from [4798865c44] to [268d6cd46f].

21
22
23
24
25
26
27
28

29
30
31
21
22
23
24
25
26
27

28
29
30
31






-
+



def title_(pmd):
    assert pmd["title"] == "basic PMD"

def doc_(pmd):
    assert pmd["doc"] == "This the doc."

# Should probably migrate all to pmd.property access now that we have PluginMeta wrapper
# Should probably migrate all to PluginMeta.property access
def test_all_as_props(pmd):
    for key, val in pmd.items():
        assert getattr(pmd, key) == val