2
2
3
3
import argparse
4
4
from pathlib import Path
5
- from typing import TYPE_CHECKING , Callable , Dict , Union
5
+ from typing import TYPE_CHECKING , Callable , MutableMapping , Optional
6
6
7
7
import yaml
8
+ from element_tracking import ElementsInProgress
8
9
from import_backends import FakeTracBackend , GitHubBackend , RealTracBackend
9
10
from ticket_type import Ticket
10
11
@@ -79,7 +80,13 @@ def process(element_name: str, *, year: str, handle_dep: Callable[[str], int]) -
79
80
return ticket
80
81
81
82
82
- def add (element : str , backend : 'Backend' , year : str ) -> int :
83
+ def add (
84
+ element : str ,
85
+ backend : 'Backend' ,
86
+ year : str ,
87
+ * ,
88
+ known_elements : Optional [MutableMapping [str , int ]] = None ,
89
+ ) -> int :
83
90
"""
84
91
Add 'element' into the task tracker, along with all its dependencies.
85
92
@@ -92,22 +99,19 @@ def add(element: str, backend: 'Backend', year: str) -> int:
92
99
dependencies which have already been imported at the point they are
93
100
depended upon by a new parent.
94
101
"""
95
- CYCLE = object ()
96
- elements : Dict [str , Union [int , object ]] = {}
102
+ elements = ElementsInProgress (known_elements )
97
103
98
104
def _add (element : str ) -> int :
99
- if element in elements :
100
- previous = elements [element ]
101
- if previous is CYCLE :
102
- raise RuntimeError (f"cyclic dependency on { element } " )
103
- assert isinstance (previous , int )
105
+ previous = elements .get (element )
106
+ if previous :
104
107
return previous
105
- else :
106
- elements [ element ] = CYCLE
108
+
109
+ with elements . process ( element ) as record_id :
107
110
generated = process (element , year = year , handle_dep = _add )
108
111
ticket_id = backend .submit (generated )
109
- elements [element ] = ticket_id
110
- return ticket_id
112
+ record_id (ticket_id )
113
+
114
+ return ticket_id
111
115
112
116
return _add (element )
113
117
0 commit comments