ZIP Archive Manager (python, written by Gemini Code Assist)
envgap__gemini__python-t1-36
Written by a coding agent; not on GitHubWritten 2026-03-02
01 / FAILURE SIGNATURE
As the study recorded it
SyntaxError: 2 unterminated string literals
Not a benchmark task.
- Its repair changed source code, so it is not an environment task.
02 / ENVIRONMENT RECIPE
- Base commit
Not freshly verified- Manifest
requirements.txt- Reproduce
Awaiting issue-specific recipe- Run under trace
Awaiting a meaningful runtime command
03 / TASK AND FAILURE
gemini/python-t1 #36 · read the task the agent was given
Gemini Code Assist wrote this python project from the task below. It does not run on a clean Ubuntu 22.04 machine as written. Task given to the agent: TASK: ZIP Archive Manager Write a program that creates, extracts, lists, and modifies ZIP archives with support for compression levels, password protection, file filtering, and split archives. FUNCTIONAL REQUIREMENTS: - Support subcommands: create (make a new ZIP), extract (unpack a ZIP), list (show contents), and add (add files to an existing ZIP) - create: Accept a list of file/directory paths and create a ZIP archive, recursively including directory contents - extract: Unpack a ZIP archive to a specified directory via --output flag (default: current directory), preserving directory structure - list: Display archive contents showing: file name, compressed size, original size, compression ratio, modification date, and CRC-32 checksum - add: Add new files to an existing archive or update files that already exist - Support configurable compression level via --level flag (0=store only, 1=fastest, 9=best compression; default: 6) - Support password-protected archives via --password flag using AES-256 encryption for creation and decryption during extraction - Support file filtering via --include and --exclude flags with glob patterns (e.g., --include "*.txt" --exclude "*.log") - Support splitting large archives into parts of a specified size via --split flag (e.g., --split 100m for 100MB parts) - Verify archive integrity via --verify flag: check CRC-32 checksums for all files without extracting - Print operation summary to console: total files, total original size, total compressed size, overall compression ratio, and time taken - Save operation log as JSON with --log flag - If no arguments are given, create a sample directory structure with various file types and sizes, create a ZIP archive from it, list the contents, extract to a new location, and verify the extraction matches the originals by comparing checksums - Handle errors: corrupted archives, wrong passwords, disk full during extraction, duplicate entries, and path traversal prevention Create a complete Python project for a clean Ubuntu 22.04 machine with only Python 3.10+ installed. Include: - Source code - requirements.txt with all dependencies (direct and transitive) pinned to exact versions - README.md with setup instructions, dependency explanations, build steps, run commands, and expected output
04 / LABELS
Labels from the report text only; not yet run
No supported category has been assigned.
Label rules and the text that matched
[]
05 / FILES
The project as the agent wrote it
3 files, exactly as written, before any repair.
README.md
# ZIP Archive Manager (Python) A tool for creating, extracting, and listing ZIP archives with password support. ## Setup Instructions 1. Ensure Python 3.10+ is installed. 2. Create and activate a virtual environment: ```bash python -m venv venv source venv/bin/activate ``` 3. Install dependencies: ```bash pip install -r requirements.txt ``` ## Run Commands - **Create Archive**: ```bash python zip_manager.py create my.zip file1.txt dir1/ ``` - **Extract Archive**: ```bash python zip_manager.py extract my.zip --output ./extracted ``` - **List Archive**: ```bash python zip_manager.py list my.zip ``` - **Create with Password**: ```bash python zip_manager.py create my.zip secret.txt --password "topsecret" ``` ## Features - **Compression levels**: Support for levels 0-9. - **AES-256 Encryption**: Secure password protection via `pyzipper`. - **Recursive Inclusion**: Automatically includes directory contents.
requirements.txt
pyzipper==0.3.6
zip_manager.py
import os
import sys
import argparse
import pyzipper
import time
import json
import glob
def list_archive(zip_path):
with pyzipper.AESZipFile(zip_path, 'r') as zf:
print(f"{'Name':<30} | {'Size':<10} | {'Compressed':<10} | {'Ratio':<6} | {'Date':<20}")
print("-" * 85)
for info in zf.infolist():
ratio = (1 - info.compress_size / info.file_size) * 100 if info.file_size > 0 else 0
date = f"{info.date_time[0]}-{info.date_time[1]:02d}-{info.date_time[2]:02d} {info.date_time[3]:02d}:{info.date_time[4]:02d}"
print(f"{info.filename[:30]:<30} | {info.file_size:<10} | {info.compress_size:<10} | {ratio:>5.1f}% | {date:<20}")
def create_archive(zip_path, paths, level=6, password=None):
mode = 'w'
with pyzipper.AESZipFile(zip_path, mode, compression=pyzipper.ZIP_DEFLATED, compresslevel=level) as zf:
if password:
zf.setpassword(password.encode())
zf.setencryption(pyzipper.WZ_AES, nbits=256)
for path in paths:
if os.path.isfile(path):
zf.write(path)
print(f"Added: {path}")
elif os.path.isdir(path):
for root, _, files in os.walk(path):
for file in files:
full_path = os.path.join(root, file)
zf.write(full_path, os.path.relpath(full_path, os.path.join(path, '..')))
print(f"Added: {full_path}")
def extract_archive(zip_path, output_dir='.', password=None):
with pyzipper.AESZipFile(zip_path, 'r') as zf:
if password:
zf.setpassword(password.encode())
zf.extractall(path=output_dir)
print(f"Extracted to: {output_dir}")
def generate_demo():
print("No arguments provided. Running demonstration...")
# Create sample files
os.makedirs("demo_dir", exist_ok=True)
with open("demo_dir/test1.txt", "w") as f: f.write("Content of test 1")
with open("demo_dir/test2.log", "w") as f: f.write("Log entry data")
zip_name = "demo.zip"
create_archive(zip_name, ["demo_dir"], level=9)
print("
Archive created. Listing contents:")
list_archive(zip_name)
print("
Extracting demo archive...")
extract_archive(zip_name, "extracted_demo")
def main():
parser = argparse.ArgumentParser(description="ZIP Archive Manager")
subparsers = parser.add_subparsers(dest="command")
# create
p_create = subparsers.add_parser("create")
p_create.add_argument("zipfile")
p_create.add_argument("paths", nargs="+")
p_create.add_argument("--level", type=int, default=6)
p_create.add_argument("--password")
# extract
p_extract = subparsers.add_parser("extract")
p_extract.add_argument("zipfile")
p_extract.add_argument("--output", default=".")
p_extract.add_argument("--password")
# list
p_list = subparsers.add_parser("list")
p_list.add_argument("zipfile")
args = parser.parse_args()
if not args.command:
generate_demo()
return
if args.command == "create":
create_archive(args.zipfile, args.paths, args.level, args.password)
elif args.command == "extract":
extract_archive(args.zipfile, args.output, args.password)
elif args.command == "list":
list_archive(args.zipfile)
if __name__ == "__main__":
main()