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.
Files changed (68) hide show
  1. {backlogops-1.0 → backlogops-1.1}/PKG-INFO +5 -5
  2. {backlogops-1.0 → backlogops-1.1}/README_pypi.md +2 -2
  3. {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/PKG-INFO +5 -5
  4. {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/requires.txt +2 -2
  5. {backlogops-1.0 → backlogops-1.1}/setup.py +3 -3
  6. {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_ops_config.py +21 -2
  7. {backlogops-1.0 → backlogops-1.1}/src/backlogops/config_editing.py +30 -10
  8. {backlogops-1.0 → backlogops-1.1}/LICENSE.txt +0 -0
  9. {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/SOURCES.txt +0 -0
  10. {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/dependency_links.txt +0 -0
  11. {backlogops-1.0 → backlogops-1.1}/backlogops.egg-info/top_level.txt +0 -0
  12. {backlogops-1.0 → backlogops-1.1}/pyproject.toml +0 -0
  13. {backlogops-1.0 → backlogops-1.1}/setup.cfg +0 -0
  14. {backlogops-1.0 → backlogops-1.1}/src/backlogops/__init__.py +0 -0
  15. {backlogops-1.0 → backlogops-1.1}/src/backlogops/apply_format_rules.py +0 -0
  16. {backlogops-1.0 → backlogops-1.1}/src/backlogops/available_teams.py +0 -0
  17. {backlogops-1.0 → backlogops-1.1}/src/backlogops/available_teams_config.py +0 -0
  18. {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog.py +0 -0
  19. {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_helpers.py +0 -0
  20. {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_in_release_order.py +0 -0
  21. {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_ops_wizard.py +0 -0
  22. {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_releases.py +0 -0
  23. {backlogops-1.0 → backlogops-1.1}/src/backlogops/backlog_releases_io.py +0 -0
  24. {backlogops-1.0 → backlogops-1.1}/src/backlogops/blo_version_reporter.py +0 -0
  25. {backlogops-1.0 → backlogops-1.1}/src/backlogops/config_descriptions.py +0 -0
  26. {backlogops-1.0 → backlogops-1.1}/src/backlogops/config_file_io.py +0 -0
  27. {backlogops-1.0 → backlogops-1.1}/src/backlogops/date_ranges.py +0 -0
  28. {backlogops-1.0 → backlogops-1.1}/src/backlogops/demo_backlog.py +0 -0
  29. {backlogops-1.0 → backlogops-1.1}/src/backlogops/estimate_ready_date.py +0 -0
  30. {backlogops-1.0 → backlogops-1.1}/src/backlogops/format_rules.py +0 -0
  31. {backlogops-1.0 → backlogops-1.1}/src/backlogops/io_config.py +0 -0
  32. {backlogops-1.0 → backlogops-1.1}/src/backlogops/io_preset_wizard.py +0 -0
  33. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_connect.py +0 -0
  34. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_io_config.py +0 -0
  35. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_order_releases.py +0 -0
  36. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rank_backlog.py +0 -0
  37. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rank_by_keys.py +0 -0
  38. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rank_move_keys.py +0 -0
  39. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_read.py +0 -0
  40. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_rename_releases.py +0 -0
  41. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_search.py +0 -0
  42. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_token.py +0 -0
  43. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_update_backlog.py +0 -0
  44. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_update_releases.py +0 -0
  45. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_wizard.py +0 -0
  46. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write.py +0 -0
  47. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write_fields.py +0 -0
  48. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write_format.py +0 -0
  49. {backlogops-1.0 → backlogops-1.1}/src/backlogops/jira_write_releases.py +0 -0
  50. {backlogops-1.0 → backlogops-1.1}/src/backlogops/key_list_io.py +0 -0
  51. {backlogops-1.0 → backlogops-1.1}/src/backlogops/levels.py +0 -0
  52. {backlogops-1.0 → backlogops-1.1}/src/backlogops/move_keys_first.py +0 -0
  53. {backlogops-1.0 → backlogops-1.1}/src/backlogops/name_list_io.py +0 -0
  54. {backlogops-1.0 → backlogops-1.1}/src/backlogops/no_text_io.py +0 -0
  55. {backlogops-1.0 → backlogops-1.1}/src/backlogops/order_by_dependencies.py +0 -0
  56. {backlogops-1.0 → backlogops-1.1}/src/backlogops/person.py +0 -0
  57. {backlogops-1.0 → backlogops-1.1}/src/backlogops/py.typed +0 -0
  58. {backlogops-1.0 → backlogops-1.1}/src/backlogops/release_backlog_updates.py +0 -0
  59. {backlogops-1.0 → backlogops-1.1}/src/backlogops/release_change_io.py +0 -0
  60. {backlogops-1.0 → backlogops-1.1}/src/backlogops/releases.py +0 -0
  61. {backlogops-1.0 → backlogops-1.1}/src/backlogops/rename_list_io.py +0 -0
  62. {backlogops-1.0 → backlogops-1.1}/src/backlogops/table_create.py +0 -0
  63. {backlogops-1.0 → backlogops-1.1}/src/backlogops/table_rows.py +0 -0
  64. {backlogops-1.0 → backlogops-1.1}/src/backlogops/team.py +0 -0
  65. {backlogops-1.0 → backlogops-1.1}/src/backlogops/wizard_forms.py +0 -0
  66. {backlogops-1.0 → backlogops-1.1}/src/backlogops/wizard_helpers.py +0 -0
  67. {backlogops-1.0 → backlogops-1.1}/src/backlogops/wizard_navigator.py +0 -0
  68. {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.0
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.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==0.0.4
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: 2234 passed, 1 deselected in 45s
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.0
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: 2234 passed, 1 deselected in 45s
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.0
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.0
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.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==0.0.4
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: 2234 passed, 1 deselected in 45s
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.0
333
+ - Built version(s): 1.1
334
334
  - Build and test using Python 3.14.7
@@ -1,8 +1,8 @@
1
1
  config-as-json>=1.5
2
- cryptography>=50.0.0
2
+ cryptography>=50.0.1
3
3
  jira[cli,opt]>=3.10.5
4
4
  tableio>=1.1
5
5
  tableio-cfg-json>=1.3
6
6
  wizard-ui-bridge[textual]>=1.3
7
7
  versionreporter>=0.4
8
- edit-cfg-json==0.0.4
8
+ edit-cfg-json>=0.1.0
@@ -5,7 +5,7 @@ from setuptools import setup
5
5
 
6
6
  setup(
7
7
  name='backlogops',
8
- version='1.0',
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.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 == 0.0.4'
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
- Three things the editor cannot do are worth knowing before it is offered
31
- instead of the wizard, and all three are of ``edit_cfg_json`` itself rather
32
- than of this configuration:
33
-
34
- * A dict whose keys the application validates for itself cannot gain or
35
- lose a key. That is the status map, the column-name maps of a preset and
36
- of the display, and the Jira column and issue-type maps: their values are
37
- editable, and a new entry is the wizard's to create.
38
- * A member left out of the file has no row, so the levels can be edited
39
- only in a configuration that already states them.
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