Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions cumulusci/tasks/create_package_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,11 @@ class CreatePackageVersion(BaseSalesforceApiTask):
"description": "If True, create unlocked packages for unpackaged metadata in this project and dependencies. "
"Defaults to False."
},
"unpackaged_metadata_path": {
"description": "Path to a directory of metadata to include as unpackaged metadata "
"in the package version. This metadata is deployed to the build org during package "
"version creation but is not included in the package itself."
},
}

def _init_options(self, kwargs):
Expand Down Expand Up @@ -429,6 +434,25 @@ def _create_version_request(
"settings.zip", settings_zip_builder.as_bytes()
)

# Add unpackaged metadata if provided
if "unpackaged_metadata_path" in self.options:
with convert_sfdx_source(
pathlib.Path(self.options["unpackaged_metadata_path"]),
None,
self.logger,
) as unpackaged_path:
unpackaged_metadata_zip_builder = MetadataPackageZipBuilder(
path=unpackaged_path,
context=self.context,
)
version_info.writestr(
"unpackaged-metadata.zip",
unpackaged_metadata_zip_builder.as_bytes(),
)
package_descriptor["unpackagedMetadata"] = {
"path": "unpackaged-metadata.zip"
}

# Add the dependencies for the package
is_dependency = package_config is not self.package_config
if (
Expand Down
90 changes: 90 additions & 0 deletions cumulusci/tasks/tests/test_create_package_version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import base64
import io
import json
import os
Expand Down Expand Up @@ -831,3 +832,92 @@ def test_prepare_cci_dependencies(self, task):
assert task._prepare_cci_dependencies(
{"ids": [{"subscriberPackageVersionId": "04t000000000000"}]}
) == [{"version_id": "04t000000000000"}]

@responses.activate
def test_create_version_request__with_unpackaged_metadata(self, get_task, tmp_path):
"""unpackaged-metadata.zip and unpackagedMetadata descriptor key are included."""
unpackaged_path = tmp_path / "unpackaged_metadata"
unpackaged_path.mkdir()
(unpackaged_path / "package.xml").write_text(
'<?xml version="1.0" encoding="utf-8"?>'
'<Package xmlns="http://soap.sforce.com/2006/04/metadata"></Package>'
)

task = get_task(
{
"package_type": "Managed",
"package_name": "Test Package",
"unpackaged_metadata_path": str(unpackaged_path),
}
)

responses.add( # query for existing Package2VersionCreateRequest
"GET",
f"{self.devhub_base_url}/tooling/query/",
json={"size": 0, "records": []},
)
responses.add( # query for base version number
"GET",
f"{self.devhub_base_url}/tooling/query/",
json={"size": 0, "records": []},
)
responses.add( # create Package2VersionCreateRequest
"POST",
f"{self.devhub_base_url}/tooling/sobjects/Package2VersionCreateRequest/",
json={"id": "08c000000000001AAA"},
)

from cumulusci.salesforce_api.package_zip import BasePackageZipBuilder

with mock.patch.object(task, "_get_dependencies", return_value=[]):
result = task._create_version_request(
"0Ho6g000000fy4ZCAQ",
task.package_config,
BasePackageZipBuilder(),
)
assert result == "08c000000000001AAA"

post_body = json.loads(responses.calls[-1].request.body)
version_info_zip = zipfile.ZipFile(
io.BytesIO(base64.b64decode(post_body["VersionInfo"]))
)
assert "unpackaged-metadata.zip" in version_info_zip.namelist()
descriptor = json.loads(version_info_zip.read("package2-descriptor.json"))
assert descriptor["unpackagedMetadata"] == {"path": "unpackaged-metadata.zip"}

@responses.activate
def test_create_version_request__without_unpackaged_metadata(self, task):
"""unpackaged-metadata.zip is absent when the option is not set."""
responses.add(
"GET",
f"{self.devhub_base_url}/tooling/query/",
json={"size": 0, "records": []},
)
responses.add(
"GET",
f"{self.devhub_base_url}/tooling/query/",
json={"size": 0, "records": []},
)
responses.add(
"POST",
f"{self.devhub_base_url}/tooling/sobjects/Package2VersionCreateRequest/",
json={"id": "08c000000000001AAA"},
)

from cumulusci.salesforce_api.package_zip import BasePackageZipBuilder

with mock.patch.object(task, "_get_dependencies", return_value=[]):
result = task._create_version_request(
"0Ho6g000000fy4ZCAQ",
task.package_config,
BasePackageZipBuilder(),
)
assert result == "08c000000000001AAA"

post_body = json.loads(responses.calls[-1].request.body)
version_info_zip = zipfile.ZipFile(
io.BytesIO(base64.b64decode(post_body["VersionInfo"]))
)
assert "unpackaged-metadata.zip" not in version_info_zip.namelist()
descriptor = json.loads(version_info_zip.read("package2-descriptor.json"))
assert "unpackagedMetadata" not in descriptor
Loading