def convert_contribution_to_pack(contrib_converter: ContributionConverter) -> None: """Create or updates a pack in the content repo from the contents of a contribution zipfile Args: contrib_converter (ContributionConverter): Contribution contributor object """ # only create pack_metadata.json and base pack files if creating a new pack if contrib_converter.create_new: if contrib_converter.contribution: # create pack metadata file with zipfile.ZipFile(contrib_converter.contribution) as zipped_contrib: with zipped_contrib.open('metadata.json') as metadata_file: metadata = json.loads(metadata_file.read()) contrib_converter.create_metadata_file(metadata) # create base files contrib_converter.create_pack_base_files = types.MethodType(_create_pack_base_files, contrib_converter) contrib_converter.create_pack_base_files() # unpack contrib_converter.unpack_contribution_to_dst_pack_directory() # convert unpacked_contribution_dirs = get_child_directories(contrib_converter.pack_dir_path) for unpacked_contribution_dir in unpacked_contribution_dirs: contrib_converter.convert_contribution_dir_to_pack_contents(unpacked_contribution_dir) # extract to package format for pack_subdir in get_child_directories(contrib_converter.pack_dir_path): basename = os.path.basename(pack_subdir) if basename in {SCRIPTS_DIR, INTEGRATIONS_DIR}: contrib_converter.content_item_to_package_format = types.MethodType(content_item_to_package_format, contrib_converter) contrib_converter.content_item_to_package_format( pack_subdir, del_unified=True, source_mapping=None )
def test_convert_contribution_dir_to_pack_contents(tmp_path): """ Scenario: convert a directory which was unarchived from a contribution zip into the content pack directory into which the contribution is intended to update, and the contribution includes a file that already exists in the pack Given - The pack's original content contains incident field files and appears like so ├── IncidentFields │ └── incidentfield-SomeIncidentField.json When - After the contribution zip files have been unarchived to the destination pack the pack directory tree appears like so ├── IncidentFields │ └── incidentfield-SomeIncidentField.json ├── incidentfield │ └── incidentfield-SomeIncidentField.json Then - Ensure the file '.../incidentfield/incidentfield-SomeIncidentField.json' is moved to '.../IncidentFields/incidentfield-SomeIncidentField.json' and overwrites the existing file """ fake_pack_subdir = tmp_path / 'IncidentFields' fake_pack_subdir.mkdir() extant_file = fake_pack_subdir / 'incidentfield-SomeIncidentField.json' old_json = {"field": "old_value"} extant_file.write_text(json.dumps(old_json)) fake_pack_extracted_dir = tmp_path / 'incidentfield' fake_pack_extracted_dir.mkdir() update_file = fake_pack_extracted_dir / 'incidentfield-SomeIncidentField.json' new_json = {"field": "new_value"} update_file.write_text(json.dumps(new_json)) cc = ContributionConverter() cc.pack_dir_path = tmp_path cc.convert_contribution_dir_to_pack_contents(fake_pack_extracted_dir) assert json.loads(extant_file.read_text()) == new_json assert not fake_pack_extracted_dir.exists()