{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cell-23-11-00",
   "metadata": {},
   "source": [
    "# 23-11 · classify() i niestandardowe kategorie\n",
    "\n",
    "Praktyka do sekcji [„Określ kategorię pliku” `projects/python/safesort/src/safesort/classifier.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-01",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Sztuka `classify()` i sprawdzić, że klasyfikacja według rozszerzenia jest nieczuła na wielkość liter, a nieznane rozszerzenie zawsze otrzymuje kategorię `\"other\"`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-02",
   "metadata": {},
   "source": [
    "## Example"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-23-11-03",
   "metadata": {},
   "outputs": [],
   "source": [
    "OTHER_CATEGORY = \"other\"\n",
    "\n",
    "DEFAULT_EXTENSIONS = {\n",
    "    \"documents\": [\".pdf\", \".docx\", \".txt\", \".odt\"],\n",
    "    \"images\": [\".jpg\", \".jpeg\", \".png\", \".webp\"],\n",
    "    \"video\": [\".mp4\", \".mkv\", \".mov\"],\n",
    "    \"audio\": [\".mp3\", \".wav\", \".flac\"],\n",
    "    \"archives\": [\".zip\", \".tar\", \".gz\", \".7z\"],\n",
    "    \"code\": [\".py\", \".js\", \".ts\", \".rs\", \".java\"],\n",
    "    \"data\": [\".json\", \".csv\", \".xml\"],\n",
    "}\n",
    "\n",
    "\n",
    "def classify(extension, mapping):\n",
    "    normalized = extension.lower()\n",
    "    for category, extensions in mapping.items():\n",
    "        lowered = {ext.lower() for ext in extensions}\n",
    "        if normalized in lowered:\n",
    "            return category\n",
    "    return OTHER_CATEGORY\n",
    "\n",
    "\n",
    "print(classify(\".pdf\", DEFAULT_EXTENSIONS))\n",
    "print(classify(\".PDF\", DEFAULT_EXTENSIONS))\n",
    "print(classify(\".exe\", DEFAULT_EXTENSIONS))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-04",
   "metadata": {},
   "source": [
    "## Sprawdzenie wyniku"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "cell-23-11-05",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert classify(\".pdf\", DEFAULT_EXTENSIONS) == \"documents\"\n",
    "assert classify(\".PNG\", DEFAULT_EXTENSIONS) == \"images\"\n",
    "assert classify(\".py\", DEFAULT_EXTENSIONS) == \"code\"\n",
    "assert classify(\".exe\", DEFAULT_EXTENSIONS) == \"other\"\n",
    "print(\"Верно: сравнение расширений регистронезависимо, а неизвестное расширение попадает в other.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-06",
   "metadata": {},
   "source": [
    "## Starter\n",
    "\n",
    "Wypełnij zaznaczone miejsce. Niezmieniony starter nie przechodzi tests."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "task-23-11",
   "metadata": {
    "tags": [
     "exercise",
     "starter"
    ]
   },
   "outputs": [],
   "source": [
    "def dobavit_presentations(mapping):\n",
    "    # TODO: return a new dictionary with .pptx and .key.\n",
    "    raise NotImplementedError\n",
    "\n",
    "\n",
    "svoi_kategorii = dobavit_presentations(DEFAULT_EXTENSIONS)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-08",
   "metadata": {},
   "source": [
    "## Task\n",
    "\n",
    "Zwróć nowy mapping z kategorią `presentations`bez zmiany DEFAULT_EXTENSIONS."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-09",
   "metadata": {},
   "source": [
    "## Tests\n",
    "\n",
    "Run After task cell: jest podstawowy przykład i przynajmniej jeden skrajny przypadek."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "tests-23-11",
   "metadata": {
    "tags": [
     "exercise-tests"
    ]
   },
   "outputs": [],
   "source": [
    "assert classify(\".pptx\", svoi_kategorii) == \"presentations\"\n",
    "assert classify(\".KEY\", svoi_kategorii) == \"presentations\"\n",
    "assert classify(\".pdf\", svoi_kategorii) == \"documents\"\n",
    "assert \"presentations\" not in DEFAULT_EXTENSIONS\n",
    "print(\"Tests passed\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-11",
   "metadata": {},
   "source": [
    "## Hint\n",
    "\n",
    "Rozpiąć oryginalny słownik `{**mapping, ...}`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-23-11-12",
   "metadata": {},
   "source": [
    "## Solution\n",
    "\n",
    "Pokaż rozwiązanie po własnej próbie</summary>\n",
    "\n",
    "```python\n",
    "def dobavit_presentations(mapping):\n",
    "    return {**mapping, \"presentations\": [\".pptx\", \".key\"]}\n",
    "\n",
    "\n",
    "svoi_kategorii = dobavit_presentations(DEFAULT_EXTENSIONS)\n",
    "```\n",
    "\n",
    "</details>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
