backlogops 1.0__tar.gz → 1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {backlogops-1.0 → backlogops-1.1}/PKG-INFO +5 -5
- {backlogops-1.0 → backlogops-1.1}/README_pypi.md +2 -2
- {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/PKG-INFO +5 -5
- {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/requires.txt +2 -2
- {backlogops-1.0 → backlogops-1.1}/setup.py +3 -3
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_ops_config.py +21 -2
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/config_editing.py +30 -10
- {backlogops-1.0 → backlogops-1.1}/LICENSE.txt +0 -0
- {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/SOURCES.txt +0 -0
- {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/dependency_links.txt +0 -0
- {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/top_level.txt +0 -0
- {backlogops-1.0 → backlogops-1.1}/pyproject.toml +0 -0
- {backlogops-1.0 → backlogops-1.1}/setup.cfg +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/__init__.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/apply_format_rules.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/available_teams.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/available_teams_config.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_helpers.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_in_release_order.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_ops_wizard.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_releases.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_releases_io.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/blo_version_reporter.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/config_descriptions.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/config_file_io.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/date_ranges.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/demo_backlog.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/estimate_ready_date.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/format_rules.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/io_config.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/io_preset_wizard.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_connect.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_io_config.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_order_releases.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rank_backlog.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rank_by_keys.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rank_move_keys.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_read.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rename_releases.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_search.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_token.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_update_backlog.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_update_releases.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_wizard.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write_fields.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write_format.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write_releases.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/key_list_io.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/levels.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/move_keys_first.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/name_list_io.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/no_text_io.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/order_by_dependencies.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/person.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/py.typed +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/release_backlog_updates.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/release_change_io.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/releases.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/rename_list_io.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/table_create.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/table_rows.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/team.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/wizard_forms.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/wizard_helpers.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/wizard_navigator.py +0 -0
- {backlogops-1.0 → backlogops-1.1}/src/backlogops/work_hours.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: backlogops
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1
|
|
4
4
|
Summary: Library with backlog operations.
|
|
5
5
|
Author: Tom Björkholm
|
|
6
6
|
Author-email: Tom Björkholm <klausuler_linnet0q@icloud.com>
|
|
@@ -22,13 +22,13 @@ Requires-Python: >=3.12
|
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
License-File: LICENSE.txt
|
|
24
24
|
Requires-Dist: config-as-json>=1.5
|
|
25
|
-
Requires-Dist: cryptography>=50.0.
|
|
25
|
+
Requires-Dist: cryptography>=50.0.1
|
|
26
26
|
Requires-Dist: jira[cli,opt]>=3.10.5
|
|
27
27
|
Requires-Dist: tableio>=1.1
|
|
28
28
|
Requires-Dist: tableio-cfg-json>=1.3
|
|
29
29
|
Requires-Dist: wizard-ui-bridge[textual]>=1.3
|
|
30
30
|
Requires-Dist: versionreporter>=0.4
|
|
31
|
-
Requires-Dist: edit-cfg-json
|
|
31
|
+
Requires-Dist: edit-cfg-json>=0.1.0
|
|
32
32
|
Dynamic: author
|
|
33
33
|
Dynamic: license-file
|
|
34
34
|
Dynamic: requires-dist
|
|
@@ -325,10 +325,10 @@ For the full set of public names see the API documentation linked above.
|
|
|
325
325
|
|
|
326
326
|
## Test summary
|
|
327
327
|
|
|
328
|
-
- Test result:
|
|
328
|
+
- Test result: 2298 passed, 1 deselected in 57s
|
|
329
329
|
- No flake8 warnings.
|
|
330
330
|
- No mypy errors found.
|
|
331
331
|
- No pylint warnings.
|
|
332
332
|
- No python layout warnings.
|
|
333
|
-
- Built version(s): 1.
|
|
333
|
+
- Built version(s): 1.1
|
|
334
334
|
- Build and test using Python 3.14.7
|
|
@@ -289,10 +289,10 @@ For the full set of public names see the API documentation linked above.
|
|
|
289
289
|
|
|
290
290
|
## Test summary
|
|
291
291
|
|
|
292
|
-
- Test result:
|
|
292
|
+
- Test result: 2298 passed, 1 deselected in 57s
|
|
293
293
|
- No flake8 warnings.
|
|
294
294
|
- No mypy errors found.
|
|
295
295
|
- No pylint warnings.
|
|
296
296
|
- No python layout warnings.
|
|
297
|
-
- Built version(s): 1.
|
|
297
|
+
- Built version(s): 1.1
|
|
298
298
|
- Build and test using Python 3.14.7
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: backlogops
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1
|
|
4
4
|
Summary: Library with backlog operations.
|
|
5
5
|
Author: Tom Björkholm
|
|
6
6
|
Author-email: Tom Björkholm <klausuler_linnet0q@icloud.com>
|
|
@@ -22,13 +22,13 @@ Requires-Python: >=3.12
|
|
|
22
22
|
Description-Content-Type: text/markdown
|
|
23
23
|
License-File: LICENSE.txt
|
|
24
24
|
Requires-Dist: config-as-json>=1.5
|
|
25
|
-
Requires-Dist: cryptography>=50.0.
|
|
25
|
+
Requires-Dist: cryptography>=50.0.1
|
|
26
26
|
Requires-Dist: jira[cli,opt]>=3.10.5
|
|
27
27
|
Requires-Dist: tableio>=1.1
|
|
28
28
|
Requires-Dist: tableio-cfg-json>=1.3
|
|
29
29
|
Requires-Dist: wizard-ui-bridge[textual]>=1.3
|
|
30
30
|
Requires-Dist: versionreporter>=0.4
|
|
31
|
-
Requires-Dist: edit-cfg-json
|
|
31
|
+
Requires-Dist: edit-cfg-json>=0.1.0
|
|
32
32
|
Dynamic: author
|
|
33
33
|
Dynamic: license-file
|
|
34
34
|
Dynamic: requires-dist
|
|
@@ -325,10 +325,10 @@ For the full set of public names see the API documentation linked above.
|
|
|
325
325
|
|
|
326
326
|
## Test summary
|
|
327
327
|
|
|
328
|
-
- Test result:
|
|
328
|
+
- Test result: 2298 passed, 1 deselected in 57s
|
|
329
329
|
- No flake8 warnings.
|
|
330
330
|
- No mypy errors found.
|
|
331
331
|
- No pylint warnings.
|
|
332
332
|
- No python layout warnings.
|
|
333
|
-
- Built version(s): 1.
|
|
333
|
+
- Built version(s): 1.1
|
|
334
334
|
- Build and test using Python 3.14.7
|
|
@@ -5,7 +5,7 @@ from setuptools import setup
|
|
|
5
5
|
|
|
6
6
|
setup(
|
|
7
7
|
name='backlogops',
|
|
8
|
-
version='1.
|
|
8
|
+
version='1.1',
|
|
9
9
|
description='Library with backlog operations.',
|
|
10
10
|
author='Tom Björkholm',
|
|
11
11
|
author_email='klausuler_linnet0q@icloud.com',
|
|
@@ -15,12 +15,12 @@ setup(
|
|
|
15
15
|
package_data={'backlogops': ['src/py.typed']},
|
|
16
16
|
install_requires=[
|
|
17
17
|
'config-as-json >= 1.5',
|
|
18
|
-
'cryptography >= 50.0.
|
|
18
|
+
'cryptography >= 50.0.1',
|
|
19
19
|
'jira[cli,opt] >= 3.10.5',
|
|
20
20
|
'tableio >= 1.1',
|
|
21
21
|
'tableio-cfg-json >= 1.3',
|
|
22
22
|
'wizard-ui-bridge[textual] >= 1.3',
|
|
23
23
|
'versionreporter >= 0.4',
|
|
24
|
-
'edit-cfg-json
|
|
24
|
+
'edit-cfg-json >= 0.1.0',
|
|
25
25
|
]
|
|
26
26
|
)
|
|
@@ -17,7 +17,10 @@ item levels:
|
|
|
17
17
|
:class:`backlogops.jira_io_config.JiraIOConfig`;
|
|
18
18
|
* ``levels`` is the optional list of backlog item levels. It is omitted
|
|
19
19
|
from the file while it is ``None``; :meth:`BacklogOpsConfig.get_levels`
|
|
20
|
-
then falls back to :data:`backlogops.levels.DEFAULT_LEVELS`.
|
|
20
|
+
then falls back to :data:`backlogops.levels.DEFAULT_LEVELS`. An empty
|
|
21
|
+
list is refused, because it would mean no levels at all where the
|
|
22
|
+
omitted member means the built-in ones, and the configuration editor
|
|
23
|
+
offers giving that member an empty list.
|
|
21
24
|
|
|
22
25
|
Earlier file versions stored the workforce members (``persons``,
|
|
23
26
|
``teams`` and ``company_work_hours``) at the top level next to the
|
|
@@ -96,6 +99,12 @@ def _level_from_obj(name: str, value: object, stderr_file: TextIO) -> Level:
|
|
|
96
99
|
return _level_from_dict(value, stderr_file)
|
|
97
100
|
|
|
98
101
|
|
|
102
|
+
_NO_LEVELS = ('no levels at all; a configuration that leaves the levels out '
|
|
103
|
+
'uses the built-in ones, so take the member away rather than '
|
|
104
|
+
'emptying it')
|
|
105
|
+
"""Why an empty list of levels is not a configuration with no levels."""
|
|
106
|
+
|
|
107
|
+
|
|
99
108
|
# pylint: disable-next=too-few-public-methods
|
|
100
109
|
class _LevelsMember(MemberValidator):
|
|
101
110
|
"""Convert the optional ``levels`` member into a list of ``Level``."""
|
|
@@ -104,13 +113,23 @@ class _LevelsMember(MemberValidator):
|
|
|
104
113
|
def validate_member(self, config: Config, member_name: str,
|
|
105
114
|
member_value: object,
|
|
106
115
|
stderr_file: TextIO = sys.stderr) -> Optional[object]:
|
|
107
|
-
"""Return the levels as a list of ``Level``, or ``None``.
|
|
116
|
+
"""Return the levels as a list of ``Level``, or ``None``.
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
TypeError: The member holds something that is no list of
|
|
120
|
+
levels.
|
|
121
|
+
ValueError: The member holds an empty list, which is not a
|
|
122
|
+
configuration of the levels; leaving the member out is.
|
|
123
|
+
"""
|
|
108
124
|
_ = config
|
|
109
125
|
if member_value is None:
|
|
110
126
|
return None
|
|
111
127
|
if not isinstance(member_value, list):
|
|
112
128
|
report_wrong_type(member_name, member_value, list, stderr_file,
|
|
113
129
|
'BacklogOps config')
|
|
130
|
+
if not member_value:
|
|
131
|
+
report_bad_value(member_name, member_value, _NO_LEVELS,
|
|
132
|
+
stderr_file, 'BacklogOps config')
|
|
114
133
|
return [_level_from_obj(f'{member_name}[{index}]', element,
|
|
115
134
|
stderr_file)
|
|
116
135
|
for index, element in enumerate(member_value)]
|
|
@@ -27,19 +27,39 @@ toolkit mounts the editor itself — ``edit_cfg_json_tk.TkEditorPanel`` in a
|
|
|
27
27
|
window of the application, ``edit_cfg_json_textual.edit`` in a terminal of
|
|
28
28
|
its own — and hands those two answers to it.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
How many things a member holds is the editor's to change as well, so a
|
|
31
|
+
named preset, a Jira connection, a person, a team, a membership, an
|
|
32
|
+
exception, a level and an entry of any of the maps can each be added beside
|
|
33
|
+
the ones that are there, taken out again, and moved within a list. A new
|
|
34
|
+
element is never invented: it is an object of the class the declaration
|
|
35
|
+
names, a copy of what the container holds now, or the empty value that the
|
|
36
|
+
declared type of the member says an element is. That is what the first of
|
|
37
|
+
the notes below follows from.
|
|
38
|
+
|
|
39
|
+
Four things are worth knowing before the editor is offered instead of the
|
|
40
|
+
wizard:
|
|
41
|
+
|
|
42
|
+
* One entry of the Jira column maps and of the issue-type maps is a map of
|
|
43
|
+
its own, which the class does not name a type for, so there is no pattern
|
|
44
|
+
for one until the file holds one to copy: an empty map of those offers
|
|
45
|
+
nothing and says why below itself. Every other container can be given its
|
|
46
|
+
first element, because the class names the type of one or its declared
|
|
47
|
+
type says what an element is.
|
|
48
|
+
* The levels keep a row in a configuration that leaves them out, because a
|
|
49
|
+
member the class omits is still a member. What that row offers is an
|
|
50
|
+
empty list, which is not what leaving the levels out means and is
|
|
51
|
+
refused as such: the row's other control puts the member back to holding
|
|
52
|
+
nothing, which is the built-in levels. Writing the levels the first time
|
|
53
|
+
is the wizard's.
|
|
40
54
|
* A person is keyed by their own name in lower case, so renaming one means
|
|
41
55
|
adding an entry under the new key and removing the old one; editing the
|
|
42
56
|
name alone leaves a configuration the class refuses.
|
|
57
|
+
* The editor reads the declarations of a class and not the insides of its
|
|
58
|
+
validators, so it offers a change that this library then refuses where
|
|
59
|
+
only a validator knows better: a week day taken out of the company
|
|
60
|
+
schedule, or a level that loses its name, because a level is a plain
|
|
61
|
+
object in the file rather than a nested configuration class. What the
|
|
62
|
+
class said is shown at the member it is about.
|
|
43
63
|
"""
|
|
44
64
|
|
|
45
65
|
# Copyright (c) 2026, Tom Björkholm
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|