prompt: 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()
  
  ```
  
golden_diff: 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
  
verification_info: {"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"}]}