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.
Files changed (65) hide show
  1. docspan/__init__.py +3 -0
  2. docspan/__main__.py +0 -0
  3. docspan/backends/__init__.py +19 -0
  4. docspan/backends/base.py +85 -0
  5. docspan/backends/confluence/__init__.py +0 -0
  6. docspan/backends/confluence/adf/__init__.py +14 -0
  7. docspan/backends/confluence/adf/comparator.py +427 -0
  8. docspan/backends/confluence/adf/converter.py +119 -0
  9. docspan/backends/confluence/adf/converters.py +1449 -0
  10. docspan/backends/confluence/adf/interfaces.py +191 -0
  11. docspan/backends/confluence/adf/nodes.py +2085 -0
  12. docspan/backends/confluence/adf/parser.py +400 -0
  13. docspan/backends/confluence/adf/validators.py +161 -0
  14. docspan/backends/confluence/adf/visitors.py +495 -0
  15. docspan/backends/confluence/backend.py +227 -0
  16. docspan/backends/confluence/client.py +44 -0
  17. docspan/backends/confluence/config/__init__.py +21 -0
  18. docspan/backends/confluence/config/loader.py +107 -0
  19. docspan/backends/confluence/config/models.py +167 -0
  20. docspan/backends/confluence/config/validation.py +297 -0
  21. docspan/backends/confluence/markdown/__init__.py +22 -0
  22. docspan/backends/confluence/markdown/ast.py +819 -0
  23. docspan/backends/confluence/markdown/extensions/__init__.py +5 -0
  24. docspan/backends/confluence/markdown/extensions/frontmatter.py +80 -0
  25. docspan/backends/confluence/markdown/extensions/mermaid.py +64 -0
  26. docspan/backends/confluence/markdown/extensions/wikilinks.py +179 -0
  27. docspan/backends/confluence/markdown/inline_parser.py +495 -0
  28. docspan/backends/confluence/markdown/parser.py +1006 -0
  29. docspan/backends/confluence/models/__init__.py +18 -0
  30. docspan/backends/confluence/models/markdown_file.py +402 -0
  31. docspan/backends/confluence/models/page.py +212 -0
  32. docspan/backends/confluence/models/path_utils.py +34 -0
  33. docspan/backends/confluence/models/results.py +28 -0
  34. docspan/backends/confluence/models/sync_status.py +382 -0
  35. docspan/backends/confluence/services/__init__.py +0 -0
  36. docspan/backends/confluence/services/confluence/__init__.py +40 -0
  37. docspan/backends/confluence/services/confluence/attachment_client.py +147 -0
  38. docspan/backends/confluence/services/confluence/base_client.py +420 -0
  39. docspan/backends/confluence/services/confluence/client.py +376 -0
  40. docspan/backends/confluence/services/confluence/comment_client.py +682 -0
  41. docspan/backends/confluence/services/confluence/crawler.py +587 -0
  42. docspan/backends/confluence/services/confluence/label_client.py +130 -0
  43. docspan/backends/confluence/services/confluence/page_client.py +1288 -0
  44. docspan/backends/confluence/services/confluence/space_client.py +179 -0
  45. docspan/backends/confluence/services/confluence/url_parser.py +106 -0
  46. docspan/backends/google_docs/__init__.py +0 -0
  47. docspan/backends/google_docs/auth.py +143 -0
  48. docspan/backends/google_docs/backend.py +140 -0
  49. docspan/backends/google_docs/client.py +665 -0
  50. docspan/backends/google_docs/converter.py +471 -0
  51. docspan/backends/google_docs/docs_request_builder.py +232 -0
  52. docspan/backends/google_docs/docs_structure_parser.py +120 -0
  53. docspan/backends/google_docs/markdown_to_paragraph_parser.py +145 -0
  54. docspan/cli/__init__.py +0 -0
  55. docspan/cli/main.py +408 -0
  56. docspan/config.py +62 -0
  57. docspan/core/__init__.py +49 -0
  58. docspan/core/merge.py +30 -0
  59. docspan/core/orchestrator.py +332 -0
  60. docspan/core/paths.py +8 -0
  61. docspan/core/state.py +53 -0
  62. docspan-0.1.0.dist-info/METADATA +273 -0
  63. docspan-0.1.0.dist-info/RECORD +65 -0
  64. docspan-0.1.0.dist-info/WHEEL +4 -0
  65. 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