-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathpublication.py
More file actions
124 lines (96 loc) · 3.55 KB
/
publication.py
File metadata and controls
124 lines (96 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from typing import Optional, List, Dict, Any
from datetime import datetime
from dbt.dataclass_schema import dbtClassMixin
from dataclasses import dataclass, field
from dbt.contracts.util import BaseArtifactMetadata, ArtifactMixin, schema_version
from dbt.contracts.graph.unparsed import NodeVersion
from dbt.contracts.graph.nodes import ManifestOrPublicNode
from dbt.node_types import NodeType, AccessType
@dataclass
class ProjectDependency(dbtClassMixin):
name: str
@dataclass
class ProjectDependencies(dbtClassMixin):
projects: List[ProjectDependency] = field(default_factory=list)
@dataclass
class PublicationMetadata(BaseArtifactMetadata):
dbt_schema_version: str = field(
default_factory=lambda: str(PublicationArtifact.dbt_schema_version)
)
adapter_type: Optional[str] = None
quoting: Dict[str, Any] = field(default_factory=dict)
@dataclass
class PublicModel(dbtClassMixin, ManifestOrPublicNode):
"""Used to represent cross-project models"""
name: str
package_name: str
unique_id: str
relation_name: str
database: Optional[str] = None
schema: Optional[str] = None
identifier: Optional[str] = None
version: Optional[NodeVersion] = None
latest_version: Optional[NodeVersion] = None
# list of model unique_ids
public_node_dependencies: List[str] = field(default_factory=list)
generated_at: datetime = field(default_factory=datetime.utcnow)
deprecation_date: Optional[datetime] = None
@property
def is_latest_version(self) -> bool:
return self.version is not None and self.version == self.latest_version
# Needed for ref resolution code
@property
def resource_type(self):
return NodeType.Model
# Needed for ref resolution code
@property
def access(self):
return AccessType.Public
@property
def search_name(self):
if self.version is None:
return self.name
else:
return f"{self.name}.v{self.version}"
@property
def depends_on_nodes(self):
return []
@property
def depends_on_public_nodes(self):
return []
@property
def is_public_node(self):
return True
@property
def is_versioned(self):
return self.version is not None
@property
def alias(self):
return self.identifier
@dataclass
class PublicationMandatory:
project_name: str
@dataclass
@schema_version("publication", 1)
class PublicationArtifact(ArtifactMixin, PublicationMandatory):
public_models: Dict[str, PublicModel] = field(default_factory=dict)
metadata: PublicationMetadata = field(default_factory=PublicationMetadata)
# list of project name strings
dependencies: List[str] = field(default_factory=list)
@dataclass
class PublicationConfig(ArtifactMixin, PublicationMandatory):
"""This is for the part of the publication artifact which is stored in
the internal manifest. The public_nodes are stored separately in the manifest,
and just the unique_ids of the public models are stored here."""
metadata: PublicationMetadata = field(default_factory=PublicationMetadata)
# list of project name strings
dependencies: List[str] = field(default_factory=list)
public_node_ids: List[str] = field(default_factory=list)
@classmethod
def from_publication(cls, publication: PublicationArtifact):
return cls(
project_name=publication.project_name,
metadata=publication.metadata,
dependencies=publication.dependencies,
public_node_ids=list(publication.public_models.keys()),
)