Esempio n. 1
0
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
            )
Esempio n. 2
0
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()