docspan 0.1.0__py3-none-any.whl
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.
- docspan/__init__.py +3 -0
- docspan/__main__.py +0 -0
- docspan/backends/__init__.py +19 -0
- docspan/backends/base.py +85 -0
- docspan/backends/confluence/__init__.py +0 -0
- docspan/backends/confluence/adf/__init__.py +14 -0
- docspan/backends/confluence/adf/comparator.py +427 -0
- docspan/backends/confluence/adf/converter.py +119 -0
- docspan/backends/confluence/adf/converters.py +1449 -0
- docspan/backends/confluence/adf/interfaces.py +191 -0
- docspan/backends/confluence/adf/nodes.py +2085 -0
- docspan/backends/confluence/adf/parser.py +400 -0
- docspan/backends/confluence/adf/validators.py +161 -0
- docspan/backends/confluence/adf/visitors.py +495 -0
- docspan/backends/confluence/backend.py +227 -0
- docspan/backends/confluence/client.py +44 -0
- docspan/backends/confluence/config/__init__.py +21 -0
- docspan/backends/confluence/config/loader.py +107 -0
- docspan/backends/confluence/config/models.py +167 -0
- docspan/backends/confluence/config/validation.py +297 -0
- docspan/backends/confluence/markdown/__init__.py +22 -0
- docspan/backends/confluence/markdown/ast.py +819 -0
- docspan/backends/confluence/markdown/extensions/__init__.py +5 -0
- docspan/backends/confluence/markdown/extensions/frontmatter.py +80 -0
- docspan/backends/confluence/markdown/extensions/mermaid.py +64 -0
- docspan/backends/confluence/markdown/extensions/wikilinks.py +179 -0
- docspan/backends/confluence/markdown/inline_parser.py +495 -0
- docspan/backends/confluence/markdown/parser.py +1006 -0
- docspan/backends/confluence/models/__init__.py +18 -0
- docspan/backends/confluence/models/markdown_file.py +402 -0
- docspan/backends/confluence/models/page.py +212 -0
- docspan/backends/confluence/models/path_utils.py +34 -0
- docspan/backends/confluence/models/results.py +28 -0
- docspan/backends/confluence/models/sync_status.py +382 -0
- docspan/backends/confluence/services/__init__.py +0 -0
- docspan/backends/confluence/services/confluence/__init__.py +40 -0
- docspan/backends/confluence/services/confluence/attachment_client.py +147 -0
- docspan/backends/confluence/services/confluence/base_client.py +420 -0
- docspan/backends/confluence/services/confluence/client.py +376 -0
- docspan/backends/confluence/services/confluence/comment_client.py +682 -0
- docspan/backends/confluence/services/confluence/crawler.py +587 -0
- docspan/backends/confluence/services/confluence/label_client.py +130 -0
- docspan/backends/confluence/services/confluence/page_client.py +1288 -0
- docspan/backends/confluence/services/confluence/space_client.py +179 -0
- docspan/backends/confluence/services/confluence/url_parser.py +106 -0
- docspan/backends/google_docs/__init__.py +0 -0
- docspan/backends/google_docs/auth.py +143 -0
- docspan/backends/google_docs/backend.py +140 -0
- docspan/backends/google_docs/client.py +665 -0
- docspan/backends/google_docs/converter.py +471 -0
- docspan/backends/google_docs/docs_request_builder.py +232 -0
- docspan/backends/google_docs/docs_structure_parser.py +120 -0
- docspan/backends/google_docs/markdown_to_paragraph_parser.py +145 -0
- docspan/cli/__init__.py +0 -0
- docspan/cli/main.py +408 -0
- docspan/config.py +62 -0
- docspan/core/__init__.py +49 -0
- docspan/core/merge.py +30 -0
- docspan/core/orchestrator.py +332 -0
- docspan/core/paths.py +8 -0
- docspan/core/state.py +53 -0
- docspan-0.1.0.dist-info/METADATA +273 -0
- docspan-0.1.0.dist-info/RECORD +65 -0
- docspan-0.1.0.dist-info/WHEEL +4 -0
- docspan-0.1.0.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Interfaces for ADF conversion components.
|
|
3
|
+
|
|
4
|
+
This module defines the interfaces and base classes for the ADF converter
|
|
5
|
+
components, enabling a clean separation of concerns and extensibility.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import abc
|
|
9
|
+
from typing import Any, Dict, List, Optional, Protocol, TypeVar, runtime_checkable
|
|
10
|
+
|
|
11
|
+
from docspan.backends.confluence.adf.nodes import AdfNode
|
|
12
|
+
from docspan.backends.confluence.markdown.ast import MarkdownNode
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@runtime_checkable
|
|
16
|
+
class NodeVisitor(Protocol):
|
|
17
|
+
"""
|
|
18
|
+
Protocol for node visitors that process Markdown nodes.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def visit(self, node: MarkdownNode) -> AdfNode:
|
|
22
|
+
"""
|
|
23
|
+
Visit a markdown node and convert it to an ADF node.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
node: Markdown node to convert
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
Converted ADF node
|
|
30
|
+
"""
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class BaseNodeVisitor(abc.ABC):
|
|
35
|
+
"""
|
|
36
|
+
Base class for node visitors.
|
|
37
|
+
|
|
38
|
+
Attributes:
|
|
39
|
+
node_type: The type of node this visitor can process
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
node_type: str
|
|
43
|
+
|
|
44
|
+
@abc.abstractmethod
|
|
45
|
+
def visit(self, node: MarkdownNode) -> AdfNode:
|
|
46
|
+
"""
|
|
47
|
+
Visit a markdown node and convert it to an ADF node.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
node: Markdown node to convert
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Converted ADF node
|
|
54
|
+
"""
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class NodeConverter(abc.ABC):
|
|
59
|
+
"""
|
|
60
|
+
Base class for node converters.
|
|
61
|
+
|
|
62
|
+
A node converter is responsible for converting a specific type of Markdown node
|
|
63
|
+
to its ADF representation.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
@abc.abstractmethod
|
|
67
|
+
def convert(self, node: MarkdownNode) -> AdfNode:
|
|
68
|
+
"""
|
|
69
|
+
Convert a markdown node to an ADF node.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
node: Markdown node to convert
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Converted ADF node
|
|
76
|
+
"""
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
T = TypeVar('T', bound=MarkdownNode)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class TypedNodeConverter(NodeConverter, abc.ABC):
|
|
84
|
+
"""
|
|
85
|
+
Base class for type-specific node converters.
|
|
86
|
+
|
|
87
|
+
This class provides a type-safe interface for converting nodes of a specific type.
|
|
88
|
+
|
|
89
|
+
Attributes:
|
|
90
|
+
node_type: The type of node this converter can process
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
node_type: str
|
|
94
|
+
|
|
95
|
+
@abc.abstractmethod
|
|
96
|
+
def convert_typed(self, node: T) -> AdfNode:
|
|
97
|
+
"""
|
|
98
|
+
Convert a typed markdown node to an ADF node.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
node: Typed markdown node to convert
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
Converted ADF node
|
|
105
|
+
"""
|
|
106
|
+
pass
|
|
107
|
+
|
|
108
|
+
def convert(self, node: MarkdownNode) -> AdfNode:
|
|
109
|
+
"""
|
|
110
|
+
Convert a markdown node to an ADF node.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
node: Markdown node to convert
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Converted ADF node
|
|
117
|
+
|
|
118
|
+
Raises:
|
|
119
|
+
TypeError: If the node type doesn't match the expected type
|
|
120
|
+
"""
|
|
121
|
+
if node.type != self.node_type:
|
|
122
|
+
raise TypeError(f"Expected node of type {self.node_type}, got {node.type}")
|
|
123
|
+
return self.convert_typed(node)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class NodeRegistry(abc.ABC):
|
|
127
|
+
"""
|
|
128
|
+
Interface for node converter registries.
|
|
129
|
+
|
|
130
|
+
A registry maintains a collection of node converters and provides
|
|
131
|
+
access to them by node type.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
@abc.abstractmethod
|
|
135
|
+
def register(self, node_type: str, converter: NodeConverter) -> None:
|
|
136
|
+
"""
|
|
137
|
+
Register a converter for a specific node type.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
node_type: Node type
|
|
141
|
+
converter: Converter for the node type
|
|
142
|
+
"""
|
|
143
|
+
pass
|
|
144
|
+
|
|
145
|
+
@abc.abstractmethod
|
|
146
|
+
def get(self, node_type: str) -> Optional[NodeConverter]:
|
|
147
|
+
"""
|
|
148
|
+
Get the converter for a specific node type.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
node_type: Node type
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Converter for the node type, or None if not found
|
|
155
|
+
"""
|
|
156
|
+
pass
|
|
157
|
+
|
|
158
|
+
@abc.abstractmethod
|
|
159
|
+
def has(self, node_type: str) -> bool:
|
|
160
|
+
"""
|
|
161
|
+
Check if a converter exists for a specific node type.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
node_type: Node type
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
True if a converter exists, False otherwise
|
|
168
|
+
"""
|
|
169
|
+
pass
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class AdfDocumentBuilder(abc.ABC):
|
|
173
|
+
"""
|
|
174
|
+
Interface for building ADF documents.
|
|
175
|
+
|
|
176
|
+
An ADF document builder is responsible for assembling ADF nodes into
|
|
177
|
+
a complete document.
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
@abc.abstractmethod
|
|
181
|
+
def build_document(self, nodes: List[AdfNode]) -> Dict[str, Any]:
|
|
182
|
+
"""
|
|
183
|
+
Build an ADF document from a list of ADF nodes.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
nodes: List of ADF nodes
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
ADF document as a dictionary
|
|
190
|
+
"""
|
|
191
|
+
pass
|