We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[CT-2518] Make ProjectDependency a config that allows miscellaneous keys
Update ProjectDependency to subclass AdditionalPropertiesMixin


--- END ISSUE ---

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

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/core/dbt/contracts/publication.py b/core/dbt/contracts/publication.py
--- a/core/dbt/contracts/publication.py
+++ b/core/dbt/contracts/publication.py
@@ -1,18 +1,25 @@
-from typing import Optional, List, Dict, Any
+from typing import Any, Dict, List, Optional
 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.util import (
+    AdditionalPropertiesMixin,
+    ArtifactMixin,
+    BaseArtifactMetadata,
+    schema_version,
+)
 from dbt.contracts.graph.unparsed import NodeVersion
 from dbt.contracts.graph.nodes import ManifestOrPublicNode
-from dbt.node_types import NodeType, AccessType
+from dbt.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin
+from dbt.node_types import AccessType, NodeType
 
 
 @dataclass
-class ProjectDependency(dbtClassMixin):
+class ProjectDependency(AdditionalPropertiesMixin, ExtensibleDbtClassMixin):
     name: str
+    _extra: Dict[str, Any] = field(default_factory=dict)
 
 
 @dataclass

{"golden_diff": "diff --git a/core/dbt/contracts/publication.py b/core/dbt/contracts/publication.py\n--- a/core/dbt/contracts/publication.py\n+++ b/core/dbt/contracts/publication.py\n@@ -1,18 +1,25 @@\n-from typing import Optional, List, Dict, Any\n+from typing import Any, Dict, List, Optional\n from datetime import datetime\n-from dbt.dataclass_schema import dbtClassMixin\n+\n \n from dataclasses import dataclass, field\n \n-from dbt.contracts.util import BaseArtifactMetadata, ArtifactMixin, schema_version\n+from dbt.contracts.util import (\n+    AdditionalPropertiesMixin,\n+    ArtifactMixin,\n+    BaseArtifactMetadata,\n+    schema_version,\n+)\n from dbt.contracts.graph.unparsed import NodeVersion\n from dbt.contracts.graph.nodes import ManifestOrPublicNode\n-from dbt.node_types import NodeType, AccessType\n+from dbt.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin\n+from dbt.node_types import AccessType, NodeType\n \n \n @dataclass\n-class ProjectDependency(dbtClassMixin):\n+class ProjectDependency(AdditionalPropertiesMixin, ExtensibleDbtClassMixin):\n     name: str\n+    _extra: Dict[str, Any] = field(default_factory=dict)\n \n \n @dataclass\n", "issue": "[CT-2518] Make ProjectDependency a config that allows miscellaneous keys\nUpdate ProjectDependency to subclass AdditionalPropertiesMixin\r\n\n", "before_files": [{"content": "from typing import Optional, List, Dict, Any\nfrom datetime import datetime\nfrom dbt.dataclass_schema import dbtClassMixin\n\nfrom dataclasses import dataclass, field\n\nfrom dbt.contracts.util import BaseArtifactMetadata, ArtifactMixin, schema_version\nfrom dbt.contracts.graph.unparsed import NodeVersion\nfrom dbt.contracts.graph.nodes import ManifestOrPublicNode\nfrom dbt.node_types import NodeType, AccessType\n\n\n@dataclass\nclass ProjectDependency(dbtClassMixin):\n    name: str\n\n\n@dataclass\nclass ProjectDependencies(dbtClassMixin):\n    projects: List[ProjectDependency] = field(default_factory=list)\n\n\n@dataclass\nclass PublicationMetadata(BaseArtifactMetadata):\n    dbt_schema_version: str = field(\n        default_factory=lambda: str(PublicationArtifact.dbt_schema_version)\n    )\n    adapter_type: Optional[str] = None\n    quoting: Dict[str, Any] = field(default_factory=dict)\n\n\n@dataclass\nclass PublicModel(dbtClassMixin, ManifestOrPublicNode):\n    \"\"\"Used to represent cross-project models\"\"\"\n\n    name: str\n    package_name: str\n    unique_id: str\n    relation_name: str\n    database: Optional[str] = None\n    schema: Optional[str] = None\n    identifier: Optional[str] = None\n    version: Optional[NodeVersion] = None\n    latest_version: Optional[NodeVersion] = None\n    # list of model unique_ids\n    public_node_dependencies: List[str] = field(default_factory=list)\n    generated_at: datetime = field(default_factory=datetime.utcnow)\n    deprecation_date: Optional[datetime] = None\n\n    @property\n    def is_latest_version(self) -> bool:\n        return self.version is not None and self.version == self.latest_version\n\n    # Needed for ref resolution code\n    @property\n    def resource_type(self):\n        return NodeType.Model\n\n    # Needed for ref resolution code\n    @property\n    def access(self):\n        return AccessType.Public\n\n    @property\n    def search_name(self):\n        if self.version is None:\n            return self.name\n        else:\n            return f\"{self.name}.v{self.version}\"\n\n    @property\n    def depends_on_nodes(self):\n        return []\n\n    @property\n    def depends_on_public_nodes(self):\n        return []\n\n    @property\n    def is_public_node(self):\n        return True\n\n    @property\n    def is_versioned(self):\n        return self.version is not None\n\n    @property\n    def alias(self):\n        return self.identifier\n\n\n@dataclass\nclass PublicationMandatory:\n    project_name: str\n\n\n@dataclass\n@schema_version(\"publication\", 1)\nclass PublicationArtifact(ArtifactMixin, PublicationMandatory):\n    public_models: Dict[str, PublicModel] = field(default_factory=dict)\n    metadata: PublicationMetadata = field(default_factory=PublicationMetadata)\n    # list of project name strings\n    dependencies: List[str] = field(default_factory=list)\n\n\n@dataclass\nclass PublicationConfig(ArtifactMixin, PublicationMandatory):\n    \"\"\"This is for the part of the publication artifact which is stored in\n    the internal manifest. The public_nodes are stored separately in the manifest,\n    and just the unique_ids of the public models are stored here.\"\"\"\n\n    metadata: PublicationMetadata = field(default_factory=PublicationMetadata)\n    # list of project name strings\n    dependencies: List[str] = field(default_factory=list)\n    public_node_ids: List[str] = field(default_factory=list)\n\n    @classmethod\n    def from_publication(cls, publication: PublicationArtifact):\n        return cls(\n            project_name=publication.project_name,\n            metadata=publication.metadata,\n            dependencies=publication.dependencies,\n            public_node_ids=list(publication.public_models.keys()),\n        )\n", "path": "core/dbt/contracts/publication.py"}], "after_files": [{"content": "from typing import Any, Dict, List, Optional\nfrom datetime import datetime\n\n\nfrom dataclasses import dataclass, field\n\nfrom dbt.contracts.util import (\n    AdditionalPropertiesMixin,\n    ArtifactMixin,\n    BaseArtifactMetadata,\n    schema_version,\n)\nfrom dbt.contracts.graph.unparsed import NodeVersion\nfrom dbt.contracts.graph.nodes import ManifestOrPublicNode\nfrom dbt.dataclass_schema import dbtClassMixin, ExtensibleDbtClassMixin\nfrom dbt.node_types import AccessType, NodeType\n\n\n@dataclass\nclass ProjectDependency(AdditionalPropertiesMixin, ExtensibleDbtClassMixin):\n    name: str\n    _extra: Dict[str, Any] = field(default_factory=dict)\n\n\n@dataclass\nclass ProjectDependencies(dbtClassMixin):\n    projects: List[ProjectDependency] = field(default_factory=list)\n\n\n@dataclass\nclass PublicationMetadata(BaseArtifactMetadata):\n    dbt_schema_version: str = field(\n        default_factory=lambda: str(PublicationArtifact.dbt_schema_version)\n    )\n    adapter_type: Optional[str] = None\n    quoting: Dict[str, Any] = field(default_factory=dict)\n\n\n@dataclass\nclass PublicModel(dbtClassMixin, ManifestOrPublicNode):\n    \"\"\"Used to represent cross-project models\"\"\"\n\n    name: str\n    package_name: str\n    unique_id: str\n    relation_name: str\n    database: Optional[str] = None\n    schema: Optional[str] = None\n    identifier: Optional[str] = None\n    version: Optional[NodeVersion] = None\n    latest_version: Optional[NodeVersion] = None\n    # list of model unique_ids\n    public_node_dependencies: List[str] = field(default_factory=list)\n    generated_at: datetime = field(default_factory=datetime.utcnow)\n    deprecation_date: Optional[datetime] = None\n\n    @property\n    def is_latest_version(self) -> bool:\n        return self.version is not None and self.version == self.latest_version\n\n    # Needed for ref resolution code\n    @property\n    def resource_type(self):\n        return NodeType.Model\n\n    # Needed for ref resolution code\n    @property\n    def access(self):\n        return AccessType.Public\n\n    @property\n    def search_name(self):\n        if self.version is None:\n            return self.name\n        else:\n            return f\"{self.name}.v{self.version}\"\n\n    @property\n    def depends_on_nodes(self):\n        return []\n\n    @property\n    def depends_on_public_nodes(self):\n        return []\n\n    @property\n    def is_public_node(self):\n        return True\n\n    @property\n    def is_versioned(self):\n        return self.version is not None\n\n    @property\n    def alias(self):\n        return self.identifier\n\n\n@dataclass\nclass PublicationMandatory:\n    project_name: str\n\n\n@dataclass\n@schema_version(\"publication\", 1)\nclass PublicationArtifact(ArtifactMixin, PublicationMandatory):\n    public_models: Dict[str, PublicModel] = field(default_factory=dict)\n    metadata: PublicationMetadata = field(default_factory=PublicationMetadata)\n    # list of project name strings\n    dependencies: List[str] = field(default_factory=list)\n\n\n@dataclass\nclass PublicationConfig(ArtifactMixin, PublicationMandatory):\n    \"\"\"This is for the part of the publication artifact which is stored in\n    the internal manifest. The public_nodes are stored separately in the manifest,\n    and just the unique_ids of the public models are stored here.\"\"\"\n\n    metadata: PublicationMetadata = field(default_factory=PublicationMetadata)\n    # list of project name strings\n    dependencies: List[str] = field(default_factory=list)\n    public_node_ids: List[str] = field(default_factory=list)\n\n    @classmethod\n    def from_publication(cls, publication: PublicationArtifact):\n        return cls(\n            project_name=publication.project_name,\n            metadata=publication.metadata,\n            dependencies=publication.dependencies,\n            public_node_ids=list(publication.public_models.keys()),\n        )\n", "path": "core/dbt/contracts/publication.py"}]}